|
@@ -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;
|
|
|
}
|