Whamcloud - gitweb
e2fsck: reset @inodes_to_rebuild if restart
[tools/e2fsprogs.git] / e2fsck / pass1.c
index e858286..bf25f99 100644 (file)
@@ -1503,7 +1503,8 @@ void e2fsck_pass1_run(e2fsck_t ctx)
        dgrp_t          ra_group = 0;
        struct ea_quota ea_ibody_quota;
        struct process_inode_block *inodes_to_process;
-       int             process_inode_count;
+       int             process_inode_count, check_mmp;
+       e2fsck_t        global_ctx = ctx->global_ctx ? ctx->global_ctx : ctx;
 
        init_resource_track(&rtrack, ctx->fs->io);
        clear_problem_context(&pctx);
@@ -1666,8 +1667,30 @@ void e2fsck_pass1_run(e2fsck_t ctx)
 #endif
 
        while (1) {
+               check_mmp = 0;
                e2fsck_pass1_check_lock(ctx);
-               if (ino % (fs->super->s_inodes_per_group * 4) == 1) {
+#ifdef HAVE_PTHREAD
+               if (!global_ctx->mmp_update_thread) {
+                       e2fsck_pass1_block_map_w_lock(ctx);
+                       if (!global_ctx->mmp_update_thread) {
+                               global_ctx->mmp_update_thread =
+                                       ctx->thread_info.et_thread_index + 1;
+                               check_mmp = 1;
+                       }
+                       e2fsck_pass1_block_map_w_unlock(ctx);
+               }
+
+               /* only one active thread could update mmp block. */
+               e2fsck_pass1_block_map_r_lock(ctx);
+               if (global_ctx->mmp_update_thread ==
+                   ctx->thread_info.et_thread_index + 1)
+                       check_mmp = 1;
+               e2fsck_pass1_block_map_r_unlock(ctx);
+#else
+               check_mmp = 1;
+#endif
+
+               if (check_mmp && (ino % (fs->super->s_inodes_per_group * 4) == 1)) {
                        if (e2fsck_mmp_update(fs))
                                fatal_error(ctx, 0);
                }
@@ -2403,6 +2426,13 @@ endit:
                print_resource_track(ctx, _("Pass 1"), &rtrack, ctx->fs->io);
        else
                ctx->invalid_bitmaps++;
+#ifdef HAVE_PTHREAD
+       /* reset update_thread after this thread exit */
+       e2fsck_pass1_block_map_w_lock(ctx);
+       if (check_mmp)
+               global_ctx->mmp_update_thread = 0;
+       e2fsck_pass1_block_map_w_unlock(ctx);
+#endif
 }
 
 #ifdef HAVE_PTHREAD
@@ -3142,32 +3172,14 @@ static int e2fsck_pass1_thread_join(e2fsck_t global_ctx, e2fsck_t thread_ctx)
                fputs("</problem_log>\n", thread_ctx->problem_logf);
                fclose(thread_ctx->problem_logf);
        }
-       e2fsck_pass1_free_bitmap(&thread_ctx->inode_used_map);
-       e2fsck_pass1_free_bitmap(&thread_ctx->inode_bad_map);
-       e2fsck_pass1_free_bitmap(&thread_ctx->inode_dir_map);
-       e2fsck_pass1_free_bitmap(&thread_ctx->inode_bb_map);
-       e2fsck_pass1_free_bitmap(&thread_ctx->inode_imagic_map);
-       e2fsck_pass1_free_bitmap(&thread_ctx->inode_reg_map);
-       e2fsck_pass1_free_bitmap(&thread_ctx->inodes_to_rebuild);
-       e2fsck_pass1_free_bitmap(&thread_ctx->block_found_map);
-       e2fsck_pass1_free_bitmap(&thread_ctx->block_ea_map);
-       if (thread_ctx->refcount)
-               ea_refcount_free(thread_ctx->refcount);
-       if (thread_ctx->refcount_extra)
-               ea_refcount_free(thread_ctx->refcount_extra);
-       if (thread_ctx->ea_inode_refs)
-               ea_refcount_free(thread_ctx->ea_inode_refs);
-       if (thread_ctx->refcount_orig)
-               ea_refcount_free(thread_ctx->refcount_orig);
-       e2fsck_free_dir_info(thread_ctx);
-       ext2fs_free_icount(thread_ctx->inode_count);
-       ext2fs_free_icount(thread_ctx->inode_link_info);
-       if (thread_ctx->dirs_to_hash)
-               ext2fs_badblocks_list_free(thread_ctx->dirs_to_hash);
-       quota_release_context(&thread_ctx->qctx);
-       ext2fs_free_mem(&thread_ctx->invalid_block_bitmap_flag);
-       ext2fs_free_mem(&thread_ctx->invalid_inode_bitmap_flag);
-       ext2fs_free_mem(&thread_ctx->invalid_inode_table_flag);
+
+       /*
+        * @block_metadata_map and @block_dup_map are
+        * shared, so we don't free them.
+        */
+       thread_ctx->block_metadata_map = NULL;
+       thread_ctx->block_dup_map = NULL;
+       e2fsck_reset_context(thread_ctx);
        ext2fs_free_mem(&thread_ctx);
 
        return retval;