summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSlava Pestov <sviatoslavpestov@gmail.com>2014-07-22 22:38:33 -0700
committerKent Overstreet <kent.overstreet@gmail.com>2017-01-18 20:21:14 -0900
commite2216e20d58d4a7cc4787922e652e2559f4534c7 (patch)
tree68a0f01210eae9c6cdcc8d46a18487a51c17846b
parent936e33d35289ee26288a4008053ff65426627a9c (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.c27
-rw-r--r--drivers/md/bcache/journal.c4
-rw-r--r--drivers/md/bcache/journal.h2
-rw-r--r--drivers/md/bcache/super.c12
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)