bcachefs: bch2_btree_iter_peek_slot() now supports BTREE_ITER_WITH_UPDATES
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 31 Dec 2022 03:41:38 +0000 (22:41 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:05 +0000 (17:09 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c

index d6de24e92339b122c06597c6db1cfc273d1fe542..fa21739c24bc9a947fd7dce58b75d35c290c4eae 100644 (file)
@@ -1868,6 +1868,7 @@ __bch2_btree_iter_peek_slot_extents(struct btree_iter *iter)
 struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
 {
        struct btree_iter_level *l = &iter->l[0];
+       struct bkey_i *next_update;
        struct bkey_s_c k;
        int ret;
 
@@ -1885,9 +1886,15 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
                return bkey_s_c_err(ret);
 
        k = btree_iter_level_peek_all(iter, l);
-
        EBUG_ON(k.k && bkey_deleted(k.k) && bkey_cmp(k.k->p, iter->pos) == 0);
 
+       next_update = btree_trans_peek_updates(iter, iter->pos);
+       if (next_update &&
+           (!k.k || bpos_cmp(next_update->k.p, k.k->p) <= 0)) {
+               iter->k = next_update->k;
+               k = bkey_i_to_s_c(next_update);
+       }
+
        if (!k.k || bkey_cmp(iter->pos, k.k->p)) {
                /* hole */
                bkey_init(&iter->k);