fsck.f2fs: fix symlink correctly
authorChao Yu <yuchao0@huawei.com>
Mon, 12 Aug 2019 11:45:27 +0000 (19:45 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 27 Aug 2019 21:51:05 +0000 (14:51 -0700)
inode.i_blocks includes inode, xnode and data block count, so, only
fix in below condition:
- i_blocks := 3 (inode + xnode + data_block)
- i_blocks := 2 (inode + data_block)

In addition, it recovers symlink's i_size to 4k rather than i_blocks *
4k.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fsck/fsck.c

index f8fa624..2afbd2c 100644 (file)
@@ -1026,16 +1026,15 @@ skip_blkcnt_fix:
 
        free(en);
 
-       if (ftype == F2FS_FT_SYMLINK && i_blocks && i_size == 0) {
+       if (ftype == F2FS_FT_SYMLINK && i_size == 0 &&
+                       i_blocks == (i_xattr_nid ? 3 : 2)) {
                ASSERT_MSG("ino: 0x%x i_blocks: %lu with zero i_size\n",
                                                nid, (unsigned long)i_blocks);
                if (c.fix_on) {
-                       u64 i_size = i_blocks * F2FS_BLKSIZE;
-
-                       node_blk->i.i_size = cpu_to_le64(i_size);
+                       node_blk->i.i_size = cpu_to_le64(F2FS_BLKSIZE);
                        need_fix = 1;
                        FIX_MSG("Symlink: recover 0x%x with i_size=%lu",
-                                               nid, (unsigned long)i_size);
+                                       nid, (unsigned long)F2FS_BLKSIZE);
                }
        }