summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-29 21:44:05 -0400
committerStijn Tintel <stijn@linux-ipv6.be>2021-05-24 15:49:13 +0300
commit72a0f19a89a8c441439e16ee60942f4e1850d922 (patch)
tree9dcd7f41e168934f4471e4b390bc4b2676b5baf3
parente718d3db9f6627f34ac179600f7cded1f9b2d8a5 (diff)
bcachefs: Fix bch2_btree_iter_peek_with_updates()
By not re-fetching the next update we were going into an infinite loop. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_iter.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index cdec05c86173..6bac80aea958 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -1611,16 +1611,17 @@ static struct bkey_i *btree_trans_peek_updates(struct btree_trans *trans,
static inline struct bkey_s_c __btree_iter_peek(struct btree_iter *iter, bool with_updates)
{
struct bpos search_key = btree_iter_search_key(iter);
- struct bkey_i *next_update = with_updates
- ? btree_trans_peek_updates(iter->trans, iter->btree_id, search_key)
- : NULL;
+ struct bkey_i *next_update;
struct bkey_s_c k;
int ret;
EBUG_ON(btree_iter_type(iter) != BTREE_ITER_KEYS);
bch2_btree_iter_verify(iter);
bch2_btree_iter_verify_entry_exit(iter);
-
+start:
+ next_update = with_updates
+ ? btree_trans_peek_updates(iter->trans, iter->btree_id, search_key)
+ : NULL;
btree_iter_set_search_pos(iter, search_key);
while (1) {
@@ -1636,9 +1637,8 @@ static inline struct bkey_s_c __btree_iter_peek(struct btree_iter *iter, bool wi
if (likely(k.k)) {
if (bkey_deleted(k.k)) {
- btree_iter_set_search_pos(iter,
- bkey_successor(iter, k.k->p));
- continue;
+ search_key = bkey_successor(iter, k.k->p);
+ goto start;
}
break;