]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
e2fsck: only consult inode_dir_map if needed in pass4
authorTheodore Ts'o <tytso@mit.edu>
Wed, 10 Oct 2012 02:45:40 +0000 (22:45 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 11 Oct 2012 11:36:09 +0000 (07:36 -0400)
In e2fsck_pass4(), we were consulting inode_dir_map using
ext2fs_test_inode_bitmap2() for every single inode in the file system.
However, there were many cases where we never needed the result of the
test --- most notably if the inode is not in use.

I was a bit surprised that GCC 4.7 with CFLAGS set to "-g -O2" wasn't
able to optimize this out for us, but here is the pass 4 timing for an
empty 3T file system before this patch:

Pass 4: Memory used: 672k/772k (422k/251k), time:  3.67/ 3.66/ 0.00

and afterwards, we see a 43% improvement:

Pass 4: Memory used: 672k/772k (422k/251k), time:  2.09/ 2.08/ 0.00

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
e2fsck/pass4.c

index 1e6328074c40ef8e156e6a40172441b8ff150bf2..2d55180787be42c9e3d1be05ca36201abb096c3a 100644 (file)
@@ -123,7 +123,7 @@ void e2fsck_pass4(e2fsck_t ctx)
 
        /* Protect loop from wrap-around if s_inodes_count maxed */
        for (i=1; i <= fs->super->s_inodes_count && i > 0; i++) {
-               int isdir = ext2fs_test_inode_bitmap2(ctx->inode_dir_map, i);
+               int isdir;
 
                if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
                        goto errout;
@@ -157,6 +157,7 @@ void e2fsck_pass4(e2fsck_t ctx)
                        ext2fs_icount_fetch(ctx->inode_count, i,
                                            &link_counted);
                }
+               isdir = ext2fs_test_inode_bitmap2(ctx->inode_dir_map, i);
                if (isdir && (link_counted > EXT2_LINK_MAX))
                        link_counted = 1;
                if (link_counted != link_count) {