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