aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Sandeen <sandeen@redhat.com>2007-07-26 13:41:11 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-26 14:35:17 -0400
commit780dcdb21170ae8ad3faa640ede249261f216a8c (patch)
treec452df9f27ff6e1df8498f7b53763ef31279b3d0
parent98ac0e53facc851f8bc5110039ab05005c0c4736 (diff)
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: Eric Sandeen <sandeen@redhat.com> Cc: <linux-ext4@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--fs/ext2/super.c2
-rw-r--r--fs/ext3/super.c2
-rw-r--r--fs/ext4/super.c2
3 files changed, 3 insertions, 3 deletions
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index 68579a0ed3f0..639a32c3c9c1 100644
--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -580,7 +580,7 @@ static int ext2_check_descriptors (struct super_block * sb)
580 return 0; 580 return 0;
581 } 581 }
582 if (le32_to_cpu(gdp->bg_inode_table) < first_block || 582 if (le32_to_cpu(gdp->bg_inode_table) < first_block ||
583 le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group > 583 le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group - 1 >
584 last_block) 584 last_block)
585 { 585 {
586 ext2_error (sb, "ext2_check_descriptors", 586 ext2_error (sb, "ext2_check_descriptors",
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
index f0614e3f1fe8..22cfdd61c060 100644
--- a/fs/ext3/super.c
+++ b/fs/ext3/super.c
@@ -1221,7 +1221,7 @@ static int ext3_check_descriptors (struct super_block * sb)
1221 return 0; 1221 return 0;
1222 } 1222 }
1223 if (le32_to_cpu(gdp->bg_inode_table) < first_block || 1223 if (le32_to_cpu(gdp->bg_inode_table) < first_block ||
1224 le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group > 1224 le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group - 1 >
1225 last_block) 1225 last_block)
1226 { 1226 {
1227 ext3_error (sb, "ext3_check_descriptors", 1227 ext3_error (sb, "ext3_check_descriptors",
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 75adbb64e028..4550b83ab1c9 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1283,7 +1283,7 @@ static int ext4_check_descriptors (struct super_block * sb)
1283 } 1283 }
1284 inode_table = ext4_inode_table(sb, gdp); 1284 inode_table = ext4_inode_table(sb, gdp);
1285 if (inode_table < first_block || 1285 if (inode_table < first_block ||
1286 inode_table + sbi->s_itb_per_group > last_block) 1286 inode_table + sbi->s_itb_per_group - 1 > last_block)
1287 { 1287 {
1288 ext4_error (sb, "ext4_check_descriptors", 1288 ext4_error (sb, "ext4_check_descriptors",
1289 "Inode table for group %d" 1289 "Inode table for group %d"