Skip to content

Commit

Permalink
f2fs: should use inode when updating file offset
Browse files Browse the repository at this point in the history
In indirect or double indirect node blocks, we should use parent inode
information to check the offset.

This fixes the below complaint with a reproducer.

$ mount -t f2fs -o discard,compress_extension=* /dev/$DEV $TESTDIR
$ f2fs_io write 1 3944 4 zero buffered $TESTDIR/a
$ umount /dev/$DEV
$ fsck.f2fs /dev/$DEV
Info: MKFS version
  "Linux version 6.5.0-rc1-custom (root@file) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #19 SMP PREEMPT_DYNAMIC Mon Jul 10 19:18:40 UTC 2023"
Info: FSCK version
  from "Linux version 6.5.0-rc1-custom (root@file) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #19 SMP PREEMPT_DYNAMIC Mon Jul 10 19:18:40 UTC 2023"
    to "Linux version 6.5.0-rc1-custom (root@file) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #19 SMP PREEMPT_DYNAMIC Mon Jul 10 19:18:40 UTC 2023"
Info: superblock features = 3088 :  extra_attr quota casefold compression
Info: superblock encrypt level = 0, salt = 00000000000000000000000000000000
Info: Segments per section = 1
Info: Sections per zone = 1
Info: total FS sectors = 134217728 (65536 MB)
Info: CKPT version = 284f1e2f
Info: Checked valid nat_bits in checkpoint
Info: checkpoint state = c5 :  nat_bits crc compacted_summary unmount
[ASSERT] (fsck_chk_inode_blk:1189)  --> ino: 0x6 has i_blocks: 00000007, but has 6 blocks

[FSCK] Max image size: 378 MB, Free space: 65158 MB
[FSCK] Unreachable nat entries                        [Ok..] [0x0]
[FSCK] SIT valid block bitmap checking                [Ok..]
[FSCK] Hard link checking for regular file            [Ok..] [0x0]
[FSCK] valid_block_count matching with CP             [Fail] [0xf, 0xe]
[FSCK] valid_node_count matching with CP (de lookup)  [Ok..] [0x6]
[FSCK] valid_node_count matching with CP (nat lookup) [Ok..] [0x6]
[FSCK] valid_inode_count matched with CP              [Ok..] [0x4]
[FSCK] free segment_count matched with CP             [Ok..] [0x7f3f]
[FSCK] next block offset is free                      [Ok..]
[FSCK] fixing SIT types
[FSCK] other corrupted bugs                           [Fail]
Do you want to fix this partition? [Y/N]

Signed-off-by: Jaegeuk Kim <[email protected]>
  • Loading branch information
Jaegeuk Kim committed Jul 12, 2023
1 parent 6222c7a commit a35353d
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions fsck/fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -1430,7 +1430,7 @@ int fsck_chk_idnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode,
FIX_MSG("Set indirect node 0x%x -> 0", i);
}
skip:
child->pgofs += ADDRS_PER_BLOCK(&node_blk->i);
child->pgofs += ADDRS_PER_BLOCK(inode);
}
}

Expand Down Expand Up @@ -1472,8 +1472,7 @@ int fsck_chk_didnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode,
FIX_MSG("Set double indirect node 0x%x -> 0", i);
}
skip:
child->pgofs += ADDRS_PER_BLOCK(&node_blk->i) *
NIDS_PER_BLOCK;
child->pgofs += ADDRS_PER_BLOCK(inode) * NIDS_PER_BLOCK;
}
}

Expand Down

0 comments on commit a35353d

Please sign in to comment.