summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorroot <ngkaho1234@gmail.com>2015-09-21 23:33:49 +0000
committerroot <ngkaho1234@gmail.com>2015-09-21 23:33:49 +0000
commitf4d662d77b4a0376d6a58475839f5a2a89b2c966 (patch)
treea9d25adfd9118e12475eda51f63db4f9edc15925
parent0697bc2f9ff85fa341dc597495413b2160636d59 (diff)
Symlink now can be removed by ext4_fremove.
-rw-r--r--lwext4/ext4.c16
-rw-r--r--lwext4/ext4_fs.c12
-rw-r--r--lwext4/ext4_inode.c3
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;