diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2015-05-04 18:55:55 -0700 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-07 12:34:08 -0800 |
commit | e13a54e6c7463d5ef75cd9ba09cb18d3e5e06bc7 (patch) | |
tree | 06638ce42d9c4bc103ba7baeed318f8dea0153a5 | |
parent | e461fa327712186992439a5ca1e30baef1ad2655 (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.c | 15 |
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) |