diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-07-23 23:48:29 -0400 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2013-11-11 00:56:36 -0500 |
commit | f269af5a078302712de8ee70d273eba2eb4485ca (patch) | |
tree | 789f938bd0609edc4e4db96b4e13dbe676a466c5 | |
parent | 0eacac22034ca21c73fe49e800d0b938b2047250 (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.c | 35 |
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 | ||
477 | static 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 | |||
477 | static void btree_node_write_work(struct work_struct *w) | 486 | static 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)); |