diff options
author | 2021-04-29 21:44:05 -0400 | |
---|---|---|
committer | 2023-10-22 17:09:03 -0400 | |
commit | 360746bf6f7cae871a683e1718bedba6a29f10dc (patch) | |
tree | 07981cecc0d05edb06bec66f5154603a57bdbc8e /fs | |
parent | bcachefs: Fix reflink trigger (diff) | |
download | wireguard-linux-360746bf6f7cae871a683e1718bedba6a29f10dc.tar.xz wireguard-linux-360746bf6f7cae871a683e1718bedba6a29f10dc.zip |
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>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bcachefs/btree_iter.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 525afe3509ec..8c343d5cec0c 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1618,16 +1618,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) { @@ -1643,9 +1644,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; |