diff options
-rw-r--r-- | fs/bcachefs/btree_update.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/bcachefs/btree_update.c b/fs/bcachefs/btree_update.c index f514a8ad7a89..952ae0eee869 100644 --- a/fs/bcachefs/btree_update.c +++ b/fs/bcachefs/btree_update.c @@ -273,11 +273,18 @@ static int bch2_trans_update_extent(struct btree_trans *trans, enum btree_id btree_id = orig_iter->btree_id; int ret = 0; - bch2_trans_iter_init(trans, &iter, btree_id, bkey_start_pos(&insert->k), + struct bpos start_pos = bkey_start_pos(&insert->k); + + if (!bkey_eq(start_pos, POS_MIN)) + start_pos = bpos_nosnap_predecessor(start_pos); + start_pos.snapshot = insert->k.p.snapshot; + + bch2_trans_iter_init(trans, &iter, btree_id, + start_pos, BTREE_ITER_intent| - BTREE_ITER_with_updates| - BTREE_ITER_not_extents); - k = bch2_btree_iter_peek_max(trans, &iter, POS(insert->k.p.inode, U64_MAX)); + BTREE_ITER_with_updates); + struct bpos peek_end = bpos_nosnap_successor(insert->k.p); + k = bch2_btree_iter_peek_max(trans, &iter, peek_end); if ((ret = bkey_err(k))) goto err; if (!k.k) @@ -304,7 +311,7 @@ static int bch2_trans_update_extent(struct btree_trans *trans, goto out; next: bch2_btree_iter_advance(trans, &iter); - k = bch2_btree_iter_peek_max(trans, &iter, POS(insert->k.p.inode, U64_MAX)); + k = bch2_btree_iter_peek_max(trans, &iter, peek_end); if ((ret = bkey_err(k))) goto err; if (!k.k) |