diff options
-rw-r--r-- | fs/btrfs/ctree.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index d99d9651dd58..4eada52f3969 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -5097,7 +5097,17 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) | |||
5097 | return ret; | 5097 | return ret; |
5098 | btrfs_item_key(path->nodes[0], &found_key, 0); | 5098 | btrfs_item_key(path->nodes[0], &found_key, 0); |
5099 | ret = comp_keys(&found_key, &key); | 5099 | ret = comp_keys(&found_key, &key); |
5100 | if (ret < 0) | 5100 | /* |
5101 | * We might have had an item with the previous key in the tree right | ||
5102 | * before we released our path. And after we released our path, that | ||
5103 | * item might have been pushed to the first slot (0) of the leaf we | ||
5104 | * were holding due to a tree balance. Alternatively, an item with the | ||
5105 | * previous key can exist as the only element of a leaf (big fat item). | ||
5106 | * Therefore account for these 2 cases, so that our callers (like | ||
5107 | * btrfs_previous_item) don't miss an existing item with a key matching | ||
5108 | * the previous key we computed above. | ||
5109 | */ | ||
5110 | if (ret <= 0) | ||
5101 | return 0; | 5111 | return 0; |
5102 | return 1; | 5112 | return 1; |
5103 | } | 5113 | } |