ext4: correct validation check of inode table in ext4_valid_block_bitmap
authorKemeng Shi <shikemeng@huaweicloud.com>
Tue, 21 Feb 2023 11:59:14 +0000 (19:59 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 24 Mar 2023 03:00:08 +0000 (23:00 -0400)
1.Last valid cluster of inode table is EXT4_B2C(sbi, offset +
sbi->s_itb_per_group - 1). We should make sure last valid cluster is <
max_bit, i.e., EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) is <
max_bit rather than EXT4_B2C(sbi, offset + sbi->s_itb_per_group) is
< max_bit.

2.Bit search length should be last valid cluster plus 1, i.e.,
EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) + 1 rather than
EXT4_B2C(sbi, offset + sbi->s_itb_per_group).

Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Link: https://lore.kernel.org/r/20230221115919.1918161-3-shikemeng@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/balloc.c

index 10cab74..22be5cd 100644 (file)
@@ -350,13 +350,13 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb,
        blk = ext4_inode_table(sb, desc);
        offset = blk - group_first_block;
        if (offset < 0 || EXT4_B2C(sbi, offset) >= max_bit ||
-           EXT4_B2C(sbi, offset + sbi->s_itb_per_group) >= max_bit)
+           EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) >= max_bit)
                return blk;
        next_zero_bit = ext4_find_next_zero_bit(bh->b_data,
-                       EXT4_B2C(sbi, offset + sbi->s_itb_per_group),
+                       EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) + 1,
                        EXT4_B2C(sbi, offset));
        if (next_zero_bit <
-           EXT4_B2C(sbi, offset + sbi->s_itb_per_group))
+           EXT4_B2C(sbi, offset + sbi->s_itb_per_group - 1) + 1)
                /* bad bitmap for inode tables */
                return blk;
        return 0;