diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-03-17 02:21:24 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-04-27 17:05:17 -0400 |
commit | 138bc4d29b8714f35b8ededd4e5535a3ab39ff51 (patch) | |
tree | 819f901095bca98d11f573865edc0d17c7c50c0d | |
parent | 1ca37e920c1a8699f5f9fb3bb2ba7c06c68b6e14 (diff) |
bcachefs: Update triggers code for snapshots
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/buckets.c | 21 |
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; |