summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_update_interior.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/btree_update_interior.c')
-rw-r--r--libbcachefs/btree_update_interior.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/libbcachefs/btree_update_interior.c b/libbcachefs/btree_update_interior.c
index 62021727..19ba667b 100644
--- a/libbcachefs/btree_update_interior.c
+++ b/libbcachefs/btree_update_interior.c
@@ -161,7 +161,6 @@ static void bch2_btree_node_free_index(struct btree_update *as, struct btree *b,
{
struct bch_fs *c = as->c;
struct pending_btree_node_free *d;
- struct gc_pos pos = { 0 };
for (d = as->pending; d < as->pending + as->nr_pending; d++)
if (!bkey_cmp(k.k->p, d->key.k.p) &&
@@ -189,18 +188,12 @@ found:
* to cancel out one of mark and sweep's markings if necessary:
*/
- /*
- * bch2_mark_key() compares the current gc pos to the pos we're
- * moving this reference from, hence one comparison here:
- */
if (gc_pos_cmp(c->gc_pos, b
? gc_pos_btree_node(b)
: gc_pos_btree_root(as->btree_id)) >= 0 &&
gc_pos_cmp(c->gc_pos, gc_phase(GC_PHASE_PENDING_DELETE)) < 0)
- bch2_mark_key_locked(c,
- bkey_i_to_s_c(&d->key),
- false, 0, pos,
- NULL, 0, BCH_BUCKET_MARK_GC);
+ bch2_mark_key_locked(c, bkey_i_to_s_c(&d->key),
+ false, 0, NULL, 0, BCH_BUCKET_MARK_GC);
}
static void __btree_node_free(struct bch_fs *c, struct btree *b)
@@ -272,8 +265,11 @@ static void bch2_btree_node_free_ondisk(struct bch_fs *c,
bch2_mark_key(c, bkey_i_to_s_c(&pending->key),
false, 0,
- gc_phase(GC_PHASE_PENDING_DELETE),
NULL, 0, 0);
+
+ if (gc_visited(c, gc_phase(GC_PHASE_PENDING_DELETE)))
+ bch2_mark_key(c, bkey_i_to_s_c(&pending->key),
+ false, 0, NULL, 0, BCH_BUCKET_MARK_GC);
}
static struct btree *__bch2_btree_node_alloc(struct bch_fs *c,
@@ -1078,9 +1074,11 @@ static void bch2_btree_set_root_inmem(struct btree_update *as, struct btree *b)
fs_usage = bch2_fs_usage_scratch_get(c);
bch2_mark_key_locked(c, bkey_i_to_s_c(&b->key),
- true, 0,
- gc_pos_btree_root(b->btree_id),
- fs_usage, 0, 0);
+ true, 0, fs_usage, 0, 0);
+ if (gc_visited(c, gc_pos_btree_root(b->btree_id)))
+ bch2_mark_key_locked(c, bkey_i_to_s_c(&b->key),
+ true, 0, NULL, 0,
+ BCH_BUCKET_MARK_GC);
if (old && !btree_node_fake(old))
bch2_btree_node_free_index(as, NULL,
@@ -1172,8 +1170,11 @@ static void bch2_insert_fixup_btree_ptr(struct btree_update *as, struct btree *b
fs_usage = bch2_fs_usage_scratch_get(c);
bch2_mark_key_locked(c, bkey_i_to_s_c(insert),
- true, 0,
- gc_pos_btree_node(b), fs_usage, 0, 0);
+ true, 0, fs_usage, 0, 0);
+
+ if (gc_visited(c, gc_pos_btree_node(b)))
+ bch2_mark_key_locked(c, bkey_i_to_s_c(insert),
+ true, 0, NULL, 0, BCH_BUCKET_MARK_GC);
while ((k = bch2_btree_node_iter_peek_all(node_iter, b)) &&
bkey_iter_pos_cmp(b, &insert->k.p, k) > 0)
@@ -1428,6 +1429,7 @@ static void btree_split(struct btree_update *as, struct btree *b,
/* Successful split, update the iterator to point to the new nodes: */
+ six_lock_increment(&b->lock, SIX_LOCK_intent);
bch2_btree_iter_node_drop(iter, b);
if (n3)
bch2_btree_iter_node_replace(iter, n3);
@@ -1739,7 +1741,10 @@ retry:
bch2_open_buckets_put(c, &n->ob);
+ six_lock_increment(&b->lock, SIX_LOCK_intent);
bch2_btree_iter_node_drop(iter, b);
+ bch2_btree_iter_node_drop(iter, m);
+
bch2_btree_iter_node_replace(iter, n);
bch2_btree_iter_verify(iter, n);
@@ -1837,6 +1842,7 @@ static int __btree_node_rewrite(struct bch_fs *c, struct btree_iter *iter,
bch2_open_buckets_put(c, &n->ob);
+ six_lock_increment(&b->lock, SIX_LOCK_intent);
bch2_btree_iter_node_drop(iter, b);
bch2_btree_iter_node_replace(iter, n);
bch2_btree_node_free_inmem(c, b, iter);
@@ -1988,9 +1994,12 @@ static void __bch2_btree_node_update_key(struct bch_fs *c,
fs_usage = bch2_fs_usage_scratch_get(c);
bch2_mark_key_locked(c, bkey_i_to_s_c(&new_key->k_i),
- true, 0,
- gc_pos_btree_root(b->btree_id),
- fs_usage, 0, 0);
+ true, 0, fs_usage, 0, 0);
+ if (gc_visited(c, gc_pos_btree_root(b->btree_id)))
+ bch2_mark_key_locked(c, bkey_i_to_s_c(&new_key->k_i),
+ true, 0, NULL, 0,
+ BCH_BUCKET_MARK_GC);
+
bch2_btree_node_free_index(as, NULL,
bkey_i_to_s_c(&b->key),
fs_usage);