Btrfs: ensure btrfs_prev_leaf doesn't miss 1 item
We might have had an item with the previous key in the tree right before we released our path. And after we released our path, that item might have been pushed to the first slot (0) of the leaf we were holding due to a tree balance. Alternatively, an item with the previous key can exist as the only element of a leaf (big fat item). Therefore account for these 2 cases, so that our callers (like btrfs_previous_item) don't miss an existing item with a key matching the previous key we computed above. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
f82a9901b0
commit
337c6f6830
|
@ -5097,7 +5097,17 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
|
|||
return ret;
|
||||
btrfs_item_key(path->nodes[0], &found_key, 0);
|
||||
ret = comp_keys(&found_key, &key);
|
||||
if (ret < 0)
|
||||
/*
|
||||
* We might have had an item with the previous key in the tree right
|
||||
* before we released our path. And after we released our path, that
|
||||
* item might have been pushed to the first slot (0) of the leaf we
|
||||
* were holding due to a tree balance. Alternatively, an item with the
|
||||
* previous key can exist as the only element of a leaf (big fat item).
|
||||
* Therefore account for these 2 cases, so that our callers (like
|
||||
* btrfs_previous_item) don't miss an existing item with a key matching
|
||||
* the previous key we computed above.
|
||||
*/
|
||||
if (ret <= 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue