From: Jose R. Santos <[EMAIL PROTECTED]>

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 <[EMAIL PROTECTED]>
--

 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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to