diff options
authorFilipe David Borba Manana <>2013-07-04 16:48:39 +0100
committerDavid Sterba <>2013-08-09 14:32:34 +0200
commit06e7d1e3fe96b5061bf1bed583c7a53707266e01 (patch)
parent7eb13593e39ae353d847047433fe257b3aab05a0 (diff)
Btrfs-progs: fix optimization in btrfs_lookup_extent_info
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 <> Reviewed-by: Josef Bacik <> Signed-off-by: David Sterba <> Signed-off-by: Chris Mason <>
1 files changed, 3 insertions, 2 deletions
diff --git a/extent-tree.c b/extent-tree.c
index 3f54706a..8ccb6eb3 100644
--- a/extent-tree.c
+++ b/extent-tree.c
@@ -1504,12 +1504,13 @@ again:
* to make sure.
if (ret > 0 && metadata) {
- if (path->slots) {
+ if (path->slots[0]) {
btrfs_item_key_to_cpu(path->nodes[0], &key,
if (key.objectid == bytenr &&
+ key.type == BTRFS_EXTENT_ITEM_KEY &&
+ key.offset == root->leafsize)
ret = 0;