From: Jose R. Santos <jrs@xxxxxxxxxx> Relax group descriptor checking. In order for tools such as dump2efs, e2fsck and debugfs to open a ext4 filesystem with FLEX_BG feature enable, some descriptor checking needs to be relaxed. This patch changes the group desciptor checking so that bitmaps and inode tables can be located anywhere in the partitions block range. Signed-off-by: Jose R. Santos <jrs@xxxxxxxxxx> -- e2fsck/super.c | 14 ++++++++++++-- lib/ext2fs/check_desc.c | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/e2fsck/super.c b/e2fsck/super.c index 00a131c..ed28732 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -463,6 +463,8 @@ void check_super_block(e2fsck_t ctx) int inodes_per_block; int ipg_max; int inode_size; + dgrp_t start_group; + int meta_bg_size; dgrp_t i; blk_t should_be; struct problem_context pctx; @@ -578,8 +580,16 @@ void check_super_block(e2fsck_t ctx) for (i = 0, gd=fs->group_desc; i < fs->group_desc_count; i++, gd++) { pctx.group = i; - first_block = ext2fs_group_first_block(fs, i); - last_block = ext2fs_group_last_block(fs, i); + if (EXT2_HAS_INCOMPAT_FEATURE (fs->super, + EXT4_FEATURE_INCOMPAT_FLEX_BG)) { + meta_bg_size = (fs->blocksize / sizeof (struct ext2_group_desc)); + start_group = (i / meta_bg_size) * meta_bg_size; + first_block = ext2fs_group_first_block(fs, start_group); + last_block = ext2fs_group_first_block(fs, start_group + meta_bg_size); + } else { + first_block = ext2fs_group_first_block(fs, i); + last_block = ext2fs_group_last_block(fs, i); + } if ((gd->bg_block_bitmap < first_block) || (gd->bg_block_bitmap > last_block)) { diff --git a/lib/ext2fs/check_desc.c b/lib/ext2fs/check_desc.c index 146f9e5..dbbcfb3 100644 --- a/lib/ext2fs/check_desc.c +++ b/lib/ext2fs/check_desc.c @@ -34,12 +34,23 @@ errcode_t ext2fs_check_desc(ext2_filsys fs) dgrp_t i; blk_t first_block = fs->super->s_first_data_block; blk_t last_block; + dgrp_t start_group; + int meta_bg_size; EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); for (i = 0; i < fs->group_desc_count; i++) { - first_block = ext2fs_group_first_block(fs, i); - last_block = ext2fs_group_last_block(fs, i); + if (EXT2_HAS_INCOMPAT_FEATURE (fs->super, + EXT4_FEATURE_INCOMPAT_FLEX_BG)) { + meta_bg_size = (fs->blocksize / sizeof (struct ext2_group_desc)); + start_group = (i / meta_bg_size) * meta_bg_size; + first_block = ext2fs_group_first_block(fs, start_group); + last_block = ext2fs_group_first_block(fs, start_group + meta_bg_size); + } + else { + first_block = ext2fs_group_first_block(fs, i); + last_block = ext2fs_group_last_block(fs, i); + } /* * Check to make sure block bitmap for group is - To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html