Whamcloud - gitweb
LU-8465 e2fsck: merge encrypted dir lists after thread finish 95/37995/11
authorWang Shilong <wshilong@ddn.com>
Thu, 12 Mar 2020 11:40:27 +0000 (19:40 +0800)
committerAndreas Dilger <adilger@whamcloud.com>
Sat, 26 Sep 2020 06:35:47 +0000 (06:35 +0000)
This is missed and should be done after threads finish.

Change-Id: Ib8b05f6d0d236c7a50e1517563b46cd34efeb2a9
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Reviewed-on: https://review.whamcloud.com/37995
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Andreas Dilger <adilger@whamcloud.com>
e2fsck/pass1.c

index 6adeb8d..802d064 100644 (file)
@@ -2838,6 +2838,7 @@ static errcode_t e2fsck_pass1_thread_prepare(e2fsck_t global_ctx, e2fsck_t *thre
        }
        memcpy(thread_context, global_ctx, sizeof(struct e2fsck_struct));
        thread_context->block_dup_map = NULL;
+       thread_context->encrypted_dirs = NULL;
 
        retval = e2fsck_allocate_block_bitmap(global_ctx->fs,
                                _("in-use block map"), EXT2FS_BMAP64_RBTREE,
@@ -3134,6 +3135,24 @@ static errcode_t e2fsck_pass1_merge_ea_refcount(e2fsck_t global_ctx,
        return retval;
 }
 
+static errcode_t e2fsck_pass1_merge_encrypted_dirs(e2fsck_t global_ctx,
+                                                  e2fsck_t thread_ctx)
+{
+       errcode_t retval = 0;
+
+       if (!thread_ctx->encrypted_dirs)
+               return 0;
+
+       if (!global_ctx->encrypted_dirs)
+               retval = ext2fs_badblocks_copy(thread_ctx->encrypted_dirs,
+                                              &global_ctx->encrypted_dirs);
+       else
+               retval = ext2fs_badblocks_merge(thread_ctx->encrypted_dirs,
+                                               global_ctx->encrypted_dirs);
+
+       return retval;
+}
+
 static int e2fsck_pass1_thread_join_one(e2fsck_t global_ctx, e2fsck_t thread_ctx)
 {
        errcode_t        retval;
@@ -3188,6 +3207,7 @@ static int e2fsck_pass1_thread_join_one(e2fsck_t global_ctx, e2fsck_t thread_ctx
        ext2_refcount_t ea_inode_refs = global_ctx->ea_inode_refs;
        ext2fs_block_bitmap  block_found_map = global_ctx->block_found_map;
        ext2fs_block_bitmap  block_dup_map = global_ctx->block_dup_map;
+       ext2_u32_list encrypted_dirs = global_ctx->encrypted_dirs;
 
 #ifdef HAVE_SETJMP_H
        jmp_buf          old_jmp;
@@ -3276,6 +3296,13 @@ static int e2fsck_pass1_thread_join_one(e2fsck_t global_ctx, e2fsck_t thread_ctx
                                              thread_ctx->qctx);
        if (retval)
                return retval;
+       global_ctx->encrypted_dirs = encrypted_dirs;
+       retval = e2fsck_pass1_merge_encrypted_dirs(global_ctx, thread_ctx);
+       if (retval) {
+               com_err(global_ctx->program_name, 0,
+                       _("while merging encrypted dirs\n"));
+               return retval;
+       }
        global_ctx->invalid_block_bitmap_flag = invalid_block_bitmap_flag;
        global_ctx->invalid_inode_bitmap_flag = invalid_inode_bitmap_flag;
        global_ctx->invalid_inode_table_flag = invalid_inode_table_flag;
@@ -3379,6 +3406,8 @@ static int e2fsck_pass1_thread_join(e2fsck_t global_ctx, e2fsck_t thread_ctx)
        ext2fs_free_icount(thread_ctx->inode_badness);
        if (thread_ctx->dirs_to_hash)
                ext2fs_badblocks_list_free(thread_ctx->dirs_to_hash);
+       if (thread_ctx->encrypted_dirs)
+               ext2fs_badblocks_list_free(thread_ctx->encrypted_dirs);
        quota_release_context(&thread_ctx->qctx);
        ext2fs_free_mem(&thread_ctx->invalid_block_bitmap_flag);
        ext2fs_free_mem(&thread_ctx->invalid_inode_bitmap_flag);