summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2015-05-04 18:55:55 -0700
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:34:08 -0800
commite13a54e6c7463d5ef75cd9ba09cb18d3e5e06bc7 (patch)
tree06638ce42d9c4bc103ba7baeed318f8dea0153a5
parente461fa327712186992439a5ca1e30baef1ad2655 (diff)
bcache: Mark btree node pointers when keys are inserted
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-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)