aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-07-23 23:48:29 -0400
committerKent Overstreet <kmo@daterainc.com>2013-11-11 00:56:36 -0500
commitf269af5a078302712de8ee70d273eba2eb4485ca (patch)
tree789f938bd0609edc4e4db96b4e13dbe676a466c5
parent0eacac22034ca21c73fe49e800d0b938b2047250 (diff)
bcache: Add btree_node_write_sync()
More refactoring - mostly making the interfaces more explicit about what we actually want to do. Signed-off-by: Kent Overstreet <kmo@daterainc.com>
-rw-r--r--drivers/md/bcache/btree.c35
1 files changed, 16 insertions, 19 deletions
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 773b0e929ff4..7d6204c41840 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -474,6 +474,15 @@ void bch_btree_node_write(struct btree *b, struct closure *parent)
474 bch_bset_init_next(b); 474 bch_bset_init_next(b);
475} 475}
476 476
477static void bch_btree_node_write_sync(struct btree *b)
478{
479 struct closure cl;
480
481 closure_init_stack(&cl);
482 bch_btree_node_write(b, &cl);
483 closure_sync(&cl);
484}
485
477static void btree_node_write_work(struct work_struct *w) 486static void btree_node_write_work(struct work_struct *w)
478{ 487{
479 struct btree *b = container_of(to_delayed_work(w), struct btree, work); 488 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)
655 return -ENOMEM; 664 return -ENOMEM;
656 } 665 }
657 666
658 if (btree_node_dirty(b)) { 667 if (btree_node_dirty(b))
659 bch_btree_node_write(b, &cl); 668 bch_btree_node_write_sync(b);
660 closure_sync(&cl);
661 }
662 669
663 /* wait for any in flight btree write */ 670 /* wait for any in flight btree write */
664 closure_wait_event(&b->io.wait, &cl, 671 closure_wait_event(&b->io.wait, &cl,
@@ -1411,9 +1418,6 @@ static int bch_btree_gc_root(struct btree *b, struct btree_op *op,
1411 struct btree *n = NULL; 1418 struct btree *n = NULL;
1412 unsigned keys = 0; 1419 unsigned keys = 0;
1413 int ret = 0, stale = btree_gc_mark_node(b, &keys, gc); 1420 int ret = 0, stale = btree_gc_mark_node(b, &keys, gc);
1414 struct closure cl;
1415
1416 closure_init_stack(&cl);
1417 1421
1418 if (b->level || stale > 10) 1422 if (b->level || stale > 10)
1419 n = btree_node_alloc_replacement(b); 1423 n = btree_node_alloc_replacement(b);
@@ -1424,12 +1428,10 @@ static int bch_btree_gc_root(struct btree *b, struct btree_op *op,
1424 if (b->level) 1428 if (b->level)
1425 ret = btree_gc_recurse(b, op, writes, gc); 1429 ret = btree_gc_recurse(b, op, writes, gc);
1426 1430
1427 if (!b->written || btree_node_dirty(b)) { 1431 if (!b->written || btree_node_dirty(b))
1428 bch_btree_node_write(b, n ? &cl : NULL); 1432 bch_btree_node_write_sync(b);
1429 }
1430 1433
1431 if (!IS_ERR_OR_NULL(n)) { 1434 if (!IS_ERR_OR_NULL(n)) {
1432 closure_sync(&cl);
1433 bch_btree_set_root(b); 1435 bch_btree_set_root(b);
1434 btree_node_free(n); 1436 btree_node_free(n);
1435 rw_unlock(true, b); 1437 rw_unlock(true, b);
@@ -2104,15 +2106,10 @@ static int bch_btree_insert_node(struct btree *b, struct btree_op *op,
2104 2106
2105 if (bch_btree_insert_keys(b, op, insert_keys, 2107 if (bch_btree_insert_keys(b, op, insert_keys,
2106 replace_key)) { 2108 replace_key)) {
2107 if (!b->level) { 2109 if (!b->level)
2108 bch_btree_leaf_dirty(b, journal_ref); 2110 bch_btree_leaf_dirty(b, journal_ref);
2109 } else { 2111 else
2110 struct closure cl; 2112 bch_btree_node_write_sync(b);
2111
2112 closure_init_stack(&cl);
2113 bch_btree_node_write(b, &cl);
2114 closure_sync(&cl);
2115 }
2116 } 2113 }
2117 } 2114 }
2118 } while (!bch_keylist_empty(&split_keys)); 2115 } while (!bch_keylist_empty(&split_keys));