diff options
| author | root <ngkaho1234@gmail.com> | 2015-09-21 23:33:49 +0000 |
|---|---|---|
| committer | root <ngkaho1234@gmail.com> | 2015-09-21 23:33:49 +0000 |
| commit | f4d662d77b4a0376d6a58475839f5a2a89b2c966 (patch) | |
| tree | a9d25adfd9118e12475eda51f63db4f9edc15925 | |
| parent | 0697bc2f9ff85fa341dc597495413b2160636d59 (diff) | |
Symlink now can be removed by ext4_fremove.
| -rw-r--r-- | lwext4/ext4.c | 16 | ||||
| -rw-r--r-- | lwext4/ext4_fs.c | 12 | ||||
| -rw-r--r-- | lwext4/ext4_inode.c | 3 |
3 files changed, 14 insertions, 17 deletions
diff --git a/lwext4/ext4.c b/lwext4/ext4.c index 3c701eb..3499f4c 100644 --- a/lwext4/ext4.c +++ b/lwext4/ext4.c @@ -1202,22 +1202,6 @@ static int ext4_ftruncate_no_lock(ext4_file *f, uint64_t size) goto Finish; } - if (ext4_inode_is_type(&f->mp->fs.sb, ref.inode, EXT4_INODE_MODE_SOFTLINK) - && f->fsize < sizeof(ref.inode->blocks) - && !ext4_inode_get_blocks_count(&f->mp->fs.sb, ref.inode)) { - char *content = (char *)ref.inode->blocks; - memset(content + size, 0, sizeof(ref.inode->blocks) - size); - ext4_inode_set_size(ref.inode, size); - ref.dirty = true; - - f->fsize = size; - if (f->fpos > size) - f->fpos = size; - - r = EOK; - goto Finish; - } - /*Start write back cache mode.*/ r = ext4_block_cache_write_back(f->mp->fs.bdev, 1); if (r != EOK) diff --git a/lwext4/ext4_fs.c b/lwext4/ext4_fs.c index e48f31c..6872e4b 100644 --- a/lwext4/ext4_fs.c +++ b/lwext4/ext4_fs.c @@ -895,6 +895,18 @@ int ext4_fs_truncate_inode(struct ext4_inode_ref *inode_ref, uint64_t new_size) if (old_size < new_size) return EINVAL; + if (ext4_inode_is_type(sb, inode_ref->inode, EXT4_INODE_MODE_SOFTLINK) + && old_size < sizeof(inode_ref->inode->blocks) + && !ext4_inode_get_blocks_count(sb, inode_ref->inode)) { + char *content = (char *)inode_ref->inode->blocks; + memset(content + new_size, 0, + sizeof(inode_ref->inode->blocks) - new_size); + ext4_inode_set_size(inode_ref->inode, new_size); + inode_ref->dirty = true; + + return EOK; + } + /* Compute how many blocks will be released */ uint64_t size_diff = old_size - new_size; uint32_t block_size = ext4_sb_get_block_size(sb); diff --git a/lwext4/ext4_inode.c b/lwext4/ext4_inode.c index 3bf20e0..114c5ad 100644 --- a/lwext4/ext4_inode.c +++ b/lwext4/ext4_inode.c @@ -327,7 +327,8 @@ bool ext4_inode_can_truncate(struct ext4_sblock *sb, struct ext4_inode *inode) return false; if ((ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_FILE)) || - (ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_DIRECTORY))) + (ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_DIRECTORY)) || + (ext4_inode_is_type(sb, inode, EXT4_INODE_MODE_SOFTLINK))) return true; return false; |
