Btrfs-progs: fix optimization in btrfs_lookup_extent_info
authorFilipe David Borba Manana <fdmanana@gmail.com>
Thu, 4 Jul 2013 15:48:39 +0000 (16:48 +0100)
committerDavid Sterba <dsterba@suse.cz>
Fri, 9 Aug 2013 12:32:34 +0000 (14:32 +0200)
If we did a tree search with the goal to find a metadata item
but the search failed with return value 1, we attempt to see
if in the same leaf there's a corresponding extent item, and if
there's one, just use it instead of doing another tree search
for this extent item. The check in the leaf was wrong because
it was seeking for a metadata item instead of an extent item.

This optimization was also being triggered incorrectly, as it
was evaluating path->slots which always evaluates to true. The
goal was to see if the leaf level slot was greater than zero
(i.e. not the first item in the leaf).

Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com>
Reviewed-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
extent-tree.c

index 3f54706ac232fabac8b18d6ef97dae1635173e97..8ccb6eb3a5112e52dc26d527077d0804e03dbce4 100644 (file)
@@ -1504,12 +1504,13 @@ again:
         * to make sure.
         */
        if (ret > 0 && metadata) {
-               if (path->slots) {
+               if (path->slots[0]) {
                        path->slots[0]--;
                        btrfs_item_key_to_cpu(path->nodes[0], &key,
                                              path->slots[0]);
                        if (key.objectid == bytenr &&
-                           key.type == BTRFS_METADATA_ITEM_KEY)
+                           key.type == BTRFS_EXTENT_ITEM_KEY &&
+                           key.offset == root->leafsize)
                                ret = 0;
                }