Symlink now can be removed by ext4_fremove.
authorroot <ngkaho1234@gmail.com>
Mon, 21 Sep 2015 23:33:49 +0000 (23:33 +0000)
committerroot <ngkaho1234@gmail.com>
Mon, 21 Sep 2015 23:33:49 +0000 (23:33 +0000)
lwext4/ext4.c
lwext4/ext4_fs.c
lwext4/ext4_inode.c

index 3c701eb04775eaba80635a20a23e93a0d699646f..3499f4cb6221a2f6774174c77123005f714c6a15 100644 (file)
@@ -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)
index e48f31c1e681230728a0d86c7418b337ae265814..6872e4b8706cdd47cf457e4725e2c82d97026318 100644 (file)
@@ -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);
index 3bf20e08f879a616869662cec5aeb13f9f336183..114c5ad668f3213c7a5f7a3ef9fd1f3409de89c4 100644 (file)
@@ -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;