summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-03-17 02:21:24 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-04-27 17:05:17 -0400
commit138bc4d29b8714f35b8ededd4e5535a3ab39ff51 (patch)
tree819f901095bca98d11f573865edc0d17c7c50c0d
parent1ca37e920c1a8699f5f9fb3bb2ba7c06c68b6e14 (diff)
bcachefs: Update triggers code for snapshots
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/buckets.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index c3ad0bc85e78..99ca543fd3b7 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -1855,16 +1855,28 @@ int bch2_trans_mark_update(struct btree_trans *trans,
return 0;
if (!btree_node_type_is_extents(iter->btree_id)) {
+ struct bkey deleted;
+
+ /* iterators should be uptodate, shouldn't get errors here: */
if (btree_iter_type(iter) != BTREE_ITER_CACHED) {
old = bch2_btree_iter_peek_slot(iter);
ret = bkey_err(old);
if (ret)
return ret;
} else {
- struct bkey_cached *ck = (void *) iter->l[0].b;
+ old = bch2_btree_iter_peek_cached(iter);
+ ret = bkey_err(old);
+ if (ret)
+ return ret;
+ }
- BUG_ON(!ck->valid);
- old = bkey_i_to_s_c(ck->k);
+ if (new->k.p.snapshot != old.k->p.snapshot) {
+ /* Not actually overwriting: */
+ bkey_init(&deleted);
+ deleted.p = new->k.p;
+
+ old.k = &deleted;
+ old.v = NULL;
}
if (old.k->type == new->k.type) {
@@ -1902,6 +1914,9 @@ int bch2_trans_mark_update(struct btree_trans *trans,
if (bkey_cmp(new->k.p, bkey_start_pos(old.k)) <= 0)
break;
+ if (new->k.p.snapshot != old.k->p.snapshot)
+ continue;
+
switch (bch2_extent_overlap(&new->k, old.k)) {
case BCH_EXTENT_OVERLAP_ALL:
offset = 0;