Skip to content

Commit 05872a1

Browse files
chaseyuJaegeuk Kim
authored and
Jaegeuk Kim
committed
f2fs: fix to do sanity check on sbi->total_valid_block_count
syzbot reported a f2fs bug as below: ------------[ cut here ]------------ kernel BUG at fs/f2fs/f2fs.h:2521! RIP: 0010:dec_valid_block_count+0x3b2/0x3c0 fs/f2fs/f2fs.h:2521 Call Trace: f2fs_truncate_data_blocks_range+0xc8c/0x11a0 fs/f2fs/file.c:695 truncate_dnode+0x417/0x740 fs/f2fs/node.c:973 truncate_nodes+0x3ec/0xf50 fs/f2fs/node.c:1014 f2fs_truncate_inode_blocks+0x8e3/0x1370 fs/f2fs/node.c:1197 f2fs_do_truncate_blocks+0x840/0x12b0 fs/f2fs/file.c:810 f2fs_truncate_blocks+0x10d/0x300 fs/f2fs/file.c:838 f2fs_truncate+0x417/0x720 fs/f2fs/file.c:888 f2fs_setattr+0xc4f/0x12f0 fs/f2fs/file.c:1112 notify_change+0xbca/0xe90 fs/attr.c:552 do_truncate+0x222/0x310 fs/open.c:65 handle_truncate fs/namei.c:3466 [inline] do_open fs/namei.c:3849 [inline] path_openat+0x2e4f/0x35d0 fs/namei.c:4004 do_filp_open+0x284/0x4e0 fs/namei.c:4031 do_sys_openat2+0x12b/0x1d0 fs/open.c:1429 do_sys_open fs/open.c:1444 [inline] __do_sys_creat fs/open.c:1522 [inline] __se_sys_creat fs/open.c:1516 [inline] __x64_sys_creat+0x124/0x170 fs/open.c:1516 do_syscall_x64 arch/x86/entry/syscall_64.c:63 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/syscall_64.c:94 The reason is: in fuzzed image, sbi->total_valid_block_count is inconsistent w/ mapped blocks indexed by inode, so, we should not trigger panic for such case, instead, let's print log and set fsck flag. Fixes: 39a53e0 ("f2fs: add superblock and major in-memory structure") Reported-by: [email protected] Closes: https://lore.kernel.org/linux-f2fs-devel/[email protected] Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent aa00c6d commit 05872a1

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

fs/f2fs/f2fs.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2526,8 +2526,14 @@ static inline void dec_valid_block_count(struct f2fs_sb_info *sbi,
25262526
blkcnt_t sectors = count << F2FS_LOG_SECTORS_PER_BLOCK;
25272527

25282528
spin_lock(&sbi->stat_lock);
2529-
f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count);
2530-
sbi->total_valid_block_count -= (block_t)count;
2529+
if (unlikely(sbi->total_valid_block_count < count)) {
2530+
f2fs_warn(sbi, "Inconsistent total_valid_block_count:%u, ino:%lu, count:%u",
2531+
sbi->total_valid_block_count, inode->i_ino, count);
2532+
sbi->total_valid_block_count = 0;
2533+
set_sbi_flag(sbi, SBI_NEED_FSCK);
2534+
} else {
2535+
sbi->total_valid_block_count -= count;
2536+
}
25312537
if (sbi->reserved_blocks &&
25322538
sbi->current_reserved_blocks < sbi->reserved_blocks)
25332539
sbi->current_reserved_blocks = min(sbi->reserved_blocks,

0 commit comments

Comments
 (0)