Whamcloud - gitweb
LU-16972 e2fsck: use rb-tree to track EA reference counts
[tools/e2fsprogs.git] / e2fsck / pass1.c
index 66f0e9c..037b99a 100644 (file)
@@ -430,8 +430,7 @@ static void inc_ea_inode_refs(e2fsck_t ctx, struct problem_context *pctx,
                if (!entry->e_value_inum)
                        goto next;
                if (!ctx->ea_inode_refs) {
-                       pctx->errcode = ea_refcount_create(0,
-                                                          &ctx->ea_inode_refs);
+                       pctx->errcode = ea_refcount_create(&ctx->ea_inode_refs);
                        if (pctx->errcode) {
                                pctx->num = 4;
                                fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
@@ -3195,8 +3194,8 @@ static errcode_t e2fsck_pass1_merge_dirs_to_hash(e2fsck_t global_ctx,
 static errcode_t e2fsck_pass1_merge_ea_inode_refs(e2fsck_t global_ctx,
                                                  e2fsck_t thread_ctx)
 {
-       ea_value_t count;
-       blk64_t blk;
+       ea_value_t thread_count, global_count;
+       ea_key_t ino;
        errcode_t retval;
 
        if (!thread_ctx->ea_inode_refs)
@@ -3210,17 +3209,15 @@ static errcode_t e2fsck_pass1_merge_ea_inode_refs(e2fsck_t global_ctx,
 
        ea_refcount_intr_begin(thread_ctx->ea_inode_refs);
        while (1) {
-               if ((blk = ea_refcount_intr_next(thread_ctx->ea_inode_refs,
-                                                &count)) == 0)
+               if ((ino = ea_refcount_intr_next(thread_ctx->ea_inode_refs,
+                                                &thread_count)) == 0)
                        break;
-               if (!global_ctx->block_ea_map ||
-                   !ext2fs_fast_test_block_bitmap2(global_ctx->block_ea_map,
-                                                   blk)) {
-                       retval = ea_refcount_store(global_ctx->ea_inode_refs,
-                                                  blk, count);
-                       if (retval)
-                               return retval;
-               }
+               ea_refcount_fetch(global_ctx->ea_inode_refs,
+                                 ino, &global_count);
+               retval = ea_refcount_store(global_ctx->ea_inode_refs,
+                                          ino, thread_count + global_count);
+               if (retval)
+                       return retval;
        }
 
        return retval;
@@ -3292,8 +3289,7 @@ static errcode_t e2fsck_pass1_merge_ea_refcount(e2fsck_t global_ctx,
                                continue;
 
                        if (!global_ctx->refcount_extra) {
-                               retval = ea_refcount_create(0,
-                                               &global_ctx->refcount_extra);
+                               retval = ea_refcount_create(&global_ctx->refcount_extra);
                                if (retval)
                                        return retval;
                        }
@@ -3326,8 +3322,7 @@ static errcode_t e2fsck_pass1_merge_ea_refcount(e2fsck_t global_ctx,
                                return retval;
                        /* Ooops, this EA was referenced more than it stated */
                        if (!global_ctx->refcount_extra) {
-                               retval = ea_refcount_create(0,
-                                               &global_ctx->refcount_extra);
+                               retval = ea_refcount_create(&global_ctx->refcount_extra);
                                if (retval)
                                        return retval;
                        }
@@ -4179,8 +4174,7 @@ static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx,
 
        /* Create the EA refcount structure if necessary */
        if (!ctx->refcount) {
-               pctx->errcode = ea_refcount_create(0,
-                                       &ctx->refcount_orig);
+               pctx->errcode = ea_refcount_create(&ctx->refcount_orig);
                if (pctx->errcode) {
                        pctx->num = 1;
                        fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
@@ -4188,7 +4182,7 @@ static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx,
                        return 0;
                }
 
-               pctx->errcode = ea_refcount_create(0, &ctx->refcount);
+               pctx->errcode = ea_refcount_create(&ctx->refcount);
                if (pctx->errcode) {
                        pctx->num = 1;
                        fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
@@ -4222,8 +4216,7 @@ static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx,
                        return 1;
                /* Ooops, this EA was referenced more than it stated */
                if (!ctx->refcount_extra) {
-                       pctx->errcode = ea_refcount_create(0,
-                                          &ctx->refcount_extra);
+                       pctx->errcode = ea_refcount_create(&ctx->refcount_extra);
                        if (pctx->errcode) {
                                pctx->num = 2;
                                fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
@@ -4364,8 +4357,7 @@ static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx,
 
        if (quota_blocks != EXT2FS_C2B(fs, 1U)) {
                if (!ctx->ea_block_quota_blocks) {
-                       pctx->errcode = ea_refcount_create(0,
-                                               &ctx->ea_block_quota_blocks);
+                       pctx->errcode = ea_refcount_create(&ctx->ea_block_quota_blocks);
                        if (pctx->errcode) {
                                pctx->num = 3;
                                goto refcount_fail;
@@ -4377,8 +4369,7 @@ static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx,
 
        if (quota_inodes) {
                if (!ctx->ea_block_quota_inodes) {
-                       pctx->errcode = ea_refcount_create(0,
-                                               &ctx->ea_block_quota_inodes);
+                       pctx->errcode = ea_refcount_create(&ctx->ea_block_quota_inodes);
                        if (pctx->errcode) {
                                pctx->num = 4;
 refcount_fail: