]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
bcache: Add btree_node_write_sync()
authorKent Overstreet <kmo@daterainc.com>
Wed, 24 Jul 2013 03:48:29 +0000 (20:48 -0700)
committerKent Overstreet <kmo@daterainc.com>
Wed, 11 Sep 2013 02:05:39 +0000 (19:05 -0700)
More refactoring - mostly making the interfaces more explicit about what
we actually want to do.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
drivers/md/bcache/btree.c

index 462371e8a4e194c0bc19de738c1e4abbde633e5e..c15b863a6c0bdbfb9d16c6e7f74f872c92ee692c 100644 (file)
@@ -474,6 +474,15 @@ void bch_btree_node_write(struct btree *b, struct closure *parent)
                bch_bset_init_next(b);
 }
 
+static void bch_btree_node_write_sync(struct btree *b)
+{
+       struct closure cl;
+
+       closure_init_stack(&cl);
+       bch_btree_node_write(b, &cl);
+       closure_sync(&cl);
+}
+
 static void btree_node_write_work(struct work_struct *w)
 {
        struct btree *b = container_of(to_delayed_work(w), struct btree, work);
@@ -655,10 +664,8 @@ static int mca_reap(struct btree *b, unsigned min_order, bool flush)
                return -ENOMEM;
        }
 
-       if (btree_node_dirty(b)) {
-               bch_btree_node_write(b, &cl);
-               closure_sync(&cl);
-       }
+       if (btree_node_dirty(b))
+               bch_btree_node_write_sync(b);
 
        /* wait for any in flight btree write */
        closure_wait_event(&b->io.wait, &cl,
@@ -1402,9 +1409,6 @@ static int bch_btree_gc_root(struct btree *b, struct btree_op *op,
        struct btree *n = NULL;
        unsigned keys = 0;
        int ret = 0, stale = btree_gc_mark_node(b, &keys, gc);
-       struct closure cl;
-
-       closure_init_stack(&cl);
 
        if (b->level || stale > 10)
                n = btree_node_alloc_replacement(b);
@@ -1415,12 +1419,10 @@ static int bch_btree_gc_root(struct btree *b, struct btree_op *op,
        if (b->level)
                ret = btree_gc_recurse(b, op, writes, gc);
 
-       if (!b->written || btree_node_dirty(b)) {
-               bch_btree_node_write(b, n ? &cl : NULL);
-       }
+       if (!b->written || btree_node_dirty(b))
+               bch_btree_node_write_sync(b);
 
        if (!IS_ERR_OR_NULL(n)) {
-               closure_sync(&cl);
                bch_btree_set_root(b);
                btree_node_free(n);
                rw_unlock(true, b);
@@ -2092,15 +2094,10 @@ static int bch_btree_insert_node(struct btree *b, struct btree_op *op,
 
                        if (bch_btree_insert_keys(b, op, insert_keys,
                                                  replace_key)) {
-                               if (!b->level) {
+                               if (!b->level)
                                        bch_btree_leaf_dirty(b, journal_ref);
-                               } else {
-                                       struct closure cl;
-
-                                       closure_init_stack(&cl);
-                                       bch_btree_node_write(b, &cl);
-                                       closure_sync(&cl);
-                               }
+                               else
+                                       bch_btree_node_write_sync(b);
                        }
                }
        } while (!bch_keylist_empty(&split_keys));