Whamcloud - gitweb
libext2fs: optimize rb_set_bmap_range()
authorTheodore Ts'o <tytso@mit.edu>
Sat, 24 Nov 2012 19:59:28 +0000 (14:59 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 27 Nov 2012 17:37:34 +0000 (12:37 -0500)
This speeds up reading bitmaps from disk for very large (and full)
disks by significant amounts (i.e., up to two CPU minutes for a 4T
file system).

Addresses-Google-Bug: #7534813

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Reviewed-by: Lukas Czerner <lczerner@redhat.com>
lib/ext2fs/blkmap64_rb.c

index a42eda1..0fc7c57 100644 (file)
@@ -674,16 +674,42 @@ static errcode_t rb_set_bmap_range(ext2fs_generic_bitmap bitmap,
                                     __u64 start, size_t num, void *in)
 {
        struct ext2fs_rb_private *bp;
+       unsigned char *cp = in;
        size_t i;
+       int first_set = -1;
        int ret;
 
        bp = (struct ext2fs_rb_private *) bitmap->private;
 
        for (i = 0; i < num; i++) {
-               ret = ext2fs_test_bit(i, in);
-               if (ret)
-                       rb_insert_extent(start + i - bitmap->start, 1, bp);
+               if (i & 7 == 0) {
+                       unsigned char c = cp[i/8];
+                       if (c == 0xFF) {
+                               if (first_set == -1)
+                                       first_set = i;
+                               i += 7;
+                               continue;
+                       }
+                       if ((c == 0x00) && (first_set == -1)) {
+                               i += 7;
+                               continue;
+                       }
+               }
+               if (ext2fs_test_bit(i, in)) {
+                       if (first_set == -1)
+                               first_set = i;
+                       continue;
+               }
+               if (first_set == -1)
+                       continue;
+
+               rb_insert_extent(start + first_set - bitmap->start,
+                                i - first_set, bp);
+               first_set = -1;
        }
+       if (first_set != -1)
+               rb_insert_extent(start + first_set - bitmap->start,
+                                num - first_set, bp);
 
        return 0;
 }