Btrfs: optimize tree-log.c:count_inode_refs()
authorFilipe David Borba Manana <fdmanana@gmail.com>
Mon, 14 Oct 2013 21:49:11 +0000 (22:49 +0100)
committerChris Mason <chris.mason@fusionio.com>
Tue, 12 Nov 2013 03:02:19 +0000 (22:02 -0500)
Avoid repeated tree searches by processing all inode ref items in
a leaf at once instead of processing one at a time, followed by a
path release and a tree search for a key with a decremented offset.

Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/tree-log.c

index d12696db9adaaf28a019c57456207e8b61ce504e..d45c04b3069074ab438ad094bb44efca980e06a1 100644 (file)
@@ -1312,6 +1312,7 @@ static int count_inode_refs(struct btrfs_root *root,
                                break;
                        path->slots[0]--;
                }
+process_slot:
                btrfs_item_key_to_cpu(path->nodes[0], &key,
                                      path->slots[0]);
                if (key.objectid != ino ||
@@ -1332,6 +1333,10 @@ static int count_inode_refs(struct btrfs_root *root,
 
                if (key.offset == 0)
                        break;
+               if (path->slots[0] > 0) {
+                       path->slots[0]--;
+                       goto process_slot;
+               }
                key.offset--;
                btrfs_release_path(path);
        }