Whamcloud - gitweb
build: update version to 1.46.2.wc3
[tools/e2fsprogs.git] / e2fsck / pass5.c
index 8100909..23a4746 100644 (file)
@@ -76,6 +76,42 @@ void e2fsck_pass5(e2fsck_t ctx)
        ext2fs_free_block_bitmap(ctx->block_metadata_map);
        ctx->block_metadata_map = 0;
 
+       if (ctx->flags & E2F_FLAG_EXPAND_EISIZE) {
+               int min_extra_isize;
+
+               if (!ctx->expand_eisize_map)
+                       goto set_min_extra_isize;
+
+               for (pctx.ino = 1; pctx.ino < ctx->fs->super->s_inodes_count;
+                    pctx.ino++) {
+                       if (ext2fs_test_inode_bitmap2(ctx->expand_eisize_map,
+                           pctx.ino)) {
+                               fix_problem(ctx, PR_5_EXPAND_EISIZE, &pctx);
+                               ext2fs_expand_extra_isize(ctx->fs, pctx.ino, 0,
+                                                         ctx->want_extra_isize,
+                                                         NULL, NULL);
+                       }
+               }
+               ext2fs_free_inode_bitmap(ctx->expand_eisize_map);
+
+set_min_extra_isize:
+               if (ctx->fs->super->s_min_extra_isize)
+                       min_extra_isize = ctx->fs->super->s_min_extra_isize;
+               else
+                       min_extra_isize = ctx->want_extra_isize;
+               if (ctx->min_extra_isize >= min_extra_isize &&
+                   !ctx->fs_unexpanded_inodes) {
+                       ctx->fs->super->s_min_extra_isize =ctx->min_extra_isize;
+                       ctx->fs->super->s_feature_ro_compat |=
+                                       EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE;
+               } else {
+                       ctx->fs->super->s_min_extra_isize = 0;
+                       ctx->fs->super->s_feature_ro_compat &=
+                                       ~EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE;
+               }
+               ext2fs_mark_super_dirty(ctx->fs);
+       }
+
        print_resource_track(ctx, _("Pass 5"), &rtrack, ctx->fs->io);
 }
 
@@ -842,7 +878,7 @@ static void check_inode_end(e2fsck_t ctx)
 
        clear_problem_context(&pctx);
 
-       end = EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count;
+       end = (__u64)EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count;
        pctx.errcode = ext2fs_fudge_inode_bitmap_end(fs->inode_map, end,
                                                     &save_inodes_count);
        if (pctx.errcode) {
@@ -856,11 +892,11 @@ static void check_inode_end(e2fsck_t ctx)
 
        /* protect loop from wrap-around if end is maxed */
        for (i = save_inodes_count + 1; i <= end && i > save_inodes_count; i++) {
-               if (!ext2fs_test_inode_bitmap(fs->inode_map, i)) {
+               if (!ext2fs_test_inode_bitmap2(fs->inode_map, i)) {
                        asked = 1;
                        if (fix_problem(ctx, PR_5_INODE_BMAP_PADDING, &pctx)) {
                                for (; i <= end; i++)
-                                       ext2fs_mark_inode_bitmap(fs->inode_map,
+                                       ext2fs_mark_inode_bitmap2(fs->inode_map,
                                                                 i);
                                ext2fs_mark_ib_dirty(fs);
                        } else
@@ -886,11 +922,12 @@ static void check_inode_end(e2fsck_t ctx)
         * be written back to disk.
         */
 check_intra_bg_tail:
-       if (!asked && fs->flags & EXT2_FLAG_IBITMAP_TAIL_PROBLEM)
+       if (!asked && fs->flags & EXT2_FLAG_IBITMAP_TAIL_PROBLEM) {
                if (fix_problem(ctx, PR_5_INODE_BMAP_PADDING, &pctx))
                        ext2fs_mark_ib_dirty(fs);
                else
                        ext2fs_unmark_valid(fs);
+       }
 }
 
 static void check_block_end(e2fsck_t ctx)