提交 780dcdb2 编写于 作者: E Eric Sandeen 提交者: Linus Torvalds

fix inode_table test in ext234_check_descriptors

ext[234]_check_descriptors sanity checks block group descriptor geometry at
mount time, testing whether the block bitmap, inode bitmap, and inode table
reside wholly within the blockgroup.  However, the inode table test is off
by one so that if the last block in the inode table resides on the last
block of the block group, the test incorrectly fails.  This is because it
tests the last block as (start + length) rather than (start + length - 1).

This can be seen by trying to mount a filesystem made such as:

 mkfs.ext2 -F -b 1024 -m 0 -g 256 -N 3744 fsfile 1024

which yields:

 EXT2-fs error (device loop0): ext2_check_descriptors: Inode table for group 0 not in group (block 101)!
 EXT2-fs: group descriptors corrupted!

There is a similar bug in e2fsprogs, patch already sent for that.

(I wonder if inside(), outside(), and/or in_range() should someday be
used in this and other tests throughout the ext filesystems...)
Signed-off-by: NEric Sandeen <sandeen@redhat.com>
Cc: <linux-ext4@vger.kernel.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 98ac0e53
...@@ -580,7 +580,7 @@ static int ext2_check_descriptors (struct super_block * sb) ...@@ -580,7 +580,7 @@ static int ext2_check_descriptors (struct super_block * sb)
return 0; return 0;
} }
if (le32_to_cpu(gdp->bg_inode_table) < first_block || if (le32_to_cpu(gdp->bg_inode_table) < first_block ||
le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group > le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group - 1 >
last_block) last_block)
{ {
ext2_error (sb, "ext2_check_descriptors", ext2_error (sb, "ext2_check_descriptors",
......
...@@ -1221,7 +1221,7 @@ static int ext3_check_descriptors (struct super_block * sb) ...@@ -1221,7 +1221,7 @@ static int ext3_check_descriptors (struct super_block * sb)
return 0; return 0;
} }
if (le32_to_cpu(gdp->bg_inode_table) < first_block || if (le32_to_cpu(gdp->bg_inode_table) < first_block ||
le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group > le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group - 1 >
last_block) last_block)
{ {
ext3_error (sb, "ext3_check_descriptors", ext3_error (sb, "ext3_check_descriptors",
......
...@@ -1283,7 +1283,7 @@ static int ext4_check_descriptors (struct super_block * sb) ...@@ -1283,7 +1283,7 @@ static int ext4_check_descriptors (struct super_block * sb)
} }
inode_table = ext4_inode_table(sb, gdp); inode_table = ext4_inode_table(sb, gdp);
if (inode_table < first_block || if (inode_table < first_block ||
inode_table + sbi->s_itb_per_group > last_block) inode_table + sbi->s_itb_per_group - 1 > last_block)
{ {
ext4_error (sb, "ext4_check_descriptors", ext4_error (sb, "ext4_check_descriptors",
"Inode table for group %d" "Inode table for group %d"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册