diff options
author | Slava Pestov <sviatoslavpestov@gmail.com> | 2014-07-22 22:38:33 -0700 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-01-18 20:21:14 -0900 |
commit | e2216e20d58d4a7cc4787922e652e2559f4534c7 (patch) | |
tree | 68a0f01210eae9c6cdcc8d46a18487a51c17846b | |
parent | 936e33d35289ee26288a4008053ff65426627a9c (diff) |
bcache: clean up some duplication
- rename bch_btree_flush_write() to bch_btree_write_oldest()
- add bch_btree_flush() to write all dirty nodes to disk
- replace open-coded implementations in cache_set_flush() and
cache_set_run()
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | drivers/md/bcache/btree.c | 27 | ||||
-rw-r--r-- | drivers/md/bcache/journal.c | 4 | ||||
-rw-r--r-- | drivers/md/bcache/journal.h | 2 | ||||
-rw-r--r-- | drivers/md/bcache/super.c | 12 |
4 files changed, 21 insertions, 24 deletions
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c index d51103e784ec..7aca747f5c09 100644 --- a/drivers/md/bcache/btree.c +++ b/drivers/md/bcache/btree.c @@ -536,16 +536,21 @@ static void bch_btree_node_write_sync(struct btree *b) closure_sync(&cl); } -static void btree_node_write_work(struct work_struct *w) +static void bch_btree_node_write_dirty(struct btree *b, struct closure *parent) { - struct btree *b = container_of(to_delayed_work(w), struct btree, work); - six_lock_read(&b->lock); if (btree_node_dirty(b)) - __bch_btree_node_write(b, NULL); + __bch_btree_node_write(b, parent); six_unlock_read(&b->lock); } +static void btree_node_write_work(struct work_struct *w) +{ + struct btree *b = container_of(to_delayed_work(w), struct btree, work); + + bch_btree_node_write_dirty(b, NULL); +} + /* * Write all dirty btree nodes to disk, including roots */ @@ -573,12 +578,8 @@ restart: rht_for_each_entry_rcu(b, pos, tbl, i, hash) if (btree_node_dirty(b)) { rcu_read_unlock(); - - six_lock_read(&b->lock); - __bch_btree_node_write(b, &cl); - six_unlock_read(&b->lock); + bch_btree_node_write_dirty(b, &cl); dropped_lock = true; - rcu_read_lock(); goto restart; } @@ -819,6 +820,8 @@ void bch_btree_cache_free(struct cache_set *c) { struct btree *b; struct closure cl; + unsigned i; + closure_init_stack(&cl); if (c->btree_cache_shrink.list.next) @@ -833,6 +836,10 @@ void bch_btree_cache_free(struct cache_set *c) free_pages((unsigned long) c->verify_ondisk, ilog2(bucket_pages(c))); #endif + for (i = 0; i < BTREE_ID_NR; i++) + if (c->btree_roots[i]) + list_add(&c->btree_roots[i]->list, &c->btree_cache); + list_splice(&c->btree_cache_freeable, &c->btree_cache); @@ -2224,7 +2231,7 @@ static void btree_journal_res_get(struct btree *b, unsigned nkeys, six_unlock_write(&b->lock); if (ret == -ENOSPC) - btree_flush_write(b->c); + btree_write_oldest(b->c); schedule(); btree_node_lock_for_insert(b); } diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 8d8f24fe4d40..a012bb02f8d1 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -420,7 +420,7 @@ err: /* Journalling */ -void btree_flush_write(struct cache_set *c) +void btree_write_oldest(struct cache_set *c) { /* * Try to find the btree node with that references the oldest journal @@ -881,7 +881,7 @@ static int __journal_meta_write_get(struct cache_set *c, int ret = bch_journal_res_get(c, 0, res); if (ret == -ENOSPC) - btree_flush_write(c); + btree_write_oldest(c); return ret; } diff --git a/drivers/md/bcache/journal.h b/drivers/md/bcache/journal.h index dcaff6a01f10..ba6cc695a2fe 100644 --- a/drivers/md/bcache/journal.h +++ b/drivers/md/bcache/journal.h @@ -111,7 +111,7 @@ struct keylist; struct bkey *bch_journal_find_btree_root(struct cache_set *, struct jset *, enum btree_id, unsigned *); -void btree_flush_write(struct cache_set *); +void btree_write_oldest(struct cache_set *); struct journal_res { unsigned ref:1; diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 043bc78a15db..cb7f524e4c01 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -1306,7 +1306,6 @@ static void cache_set_flush(struct closure *cl) { struct cache_set *c = container_of(cl, struct cache_set, caching); struct cache *ca; - struct btree *b; unsigned i; for_each_cache(ca, c, i) { @@ -1333,17 +1332,8 @@ static void cache_set_flush(struct closure *cl) if (!IS_ERR_OR_NULL(c->gc_thread)) kthread_stop(c->gc_thread); - for (i = 0; i < BTREE_ID_NR; i++) - if (c->btree_roots[i]) - list_add(&c->btree_roots[i]->list, &c->btree_cache); - /* Should skip this if we're unregistering because of an error */ - list_for_each_entry(b, &c->btree_cache, list) { - six_lock_read(&b->lock); - if (btree_node_dirty(b)) - __bch_btree_node_write(b, NULL); - six_unlock_read(&b->lock); - } + bch_btree_flush(c); for_each_cache(ca, c, i) if (ca->alloc_thread) |