summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/gc.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/md/bcache/gc.c b/drivers/md/bcache/gc.c
index 48d411eef5bd..96aea208af20 100644
--- a/drivers/md/bcache/gc.c
+++ b/drivers/md/bcache/gc.c
@@ -105,9 +105,6 @@ bool btree_gc_mark_node(struct cache_set *c, struct btree *b,
if (stat)
stat->nodes++;
- /* only actually needed for the root */
- __bch_btree_mark_key(c, b->level + 1, bkey_i_to_s_c(&b->key));
-
if (btree_node_has_ptrs(b)) {
struct btree_node_iter iter;
struct bkey_packed *k;
@@ -200,7 +197,17 @@ static int bch_gc_btree(struct cache_set *c, enum btree_id btree_id,
bch_btree_iter_cond_resched(&iter);
}
- return bch_btree_iter_unlock(&iter);
+ bch_btree_iter_unlock(&iter);
+
+ spin_lock(&c->btree_root_lock);
+ b = c->btree_roots[btree_id];
+ __bch_btree_mark_key(c, b->level + 1, bkey_i_to_s_c(&b->key));
+
+ write_seqlock(&c->gc_cur_lock);
+ c->gc_cur_level = b->level + 1;
+ write_sequnlock(&c->gc_cur_lock);
+ spin_unlock(&c->btree_root_lock);
+ return 0;
}
static void bch_mark_allocator_buckets(struct cache_set *c)