aboutsummaryrefslogtreecommitdiff
path: root/fs/bcachefs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2022-12-30 22:41:38 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:05 -0400
commite750296bf5599b748360b3497bcfc7243dceb185 (patch)
tree3088718082cde7260d8da500e936d61e48ac4bbb /fs/bcachefs
parent5288e66a7b732aae8a905ddba86b3b65acb6a911 (diff)
bcachefs: bch2_btree_iter_peek_slot() now supports BTREE_ITER_WITH_UPDATES
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs')
-rw-r--r--fs/bcachefs/btree_iter.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index d6de24e92339..fa21739c24bc 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -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);