Commit f269af5a authored by Kent Overstreet's avatar Kent Overstreet

bcache: Add btree_node_write_sync()

More refactoring - mostly making the interfaces more explicit about what
we actually want to do.
Signed-off-by: default avatarKent Overstreet <kmo@daterainc.com>
parent 0eacac22
...@@ -474,6 +474,15 @@ void bch_btree_node_write(struct btree *b, struct closure *parent) ...@@ -474,6 +474,15 @@ void bch_btree_node_write(struct btree *b, struct closure *parent)
bch_bset_init_next(b); 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) static void btree_node_write_work(struct work_struct *w)
{ {
struct btree *b = container_of(to_delayed_work(w), struct btree, work); 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,10 +664,8 @@ static int mca_reap(struct btree *b, unsigned min_order, bool flush)
return -ENOMEM; return -ENOMEM;
} }
if (btree_node_dirty(b)) { if (btree_node_dirty(b))
bch_btree_node_write(b, &cl); bch_btree_node_write_sync(b);
closure_sync(&cl);
}
/* wait for any in flight btree write */ /* wait for any in flight btree write */
closure_wait_event(&b->io.wait, &cl, 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,9 +1418,6 @@ static int bch_btree_gc_root(struct btree *b, struct btree_op *op,
struct btree *n = NULL; struct btree *n = NULL;
unsigned keys = 0; unsigned keys = 0;
int ret = 0, stale = btree_gc_mark_node(b, &keys, gc); int ret = 0, stale = btree_gc_mark_node(b, &keys, gc);
struct closure cl;
closure_init_stack(&cl);
if (b->level || stale > 10) if (b->level || stale > 10)
n = btree_node_alloc_replacement(b); n = btree_node_alloc_replacement(b);
...@@ -1424,12 +1428,10 @@ static int bch_btree_gc_root(struct btree *b, struct btree_op *op, ...@@ -1424,12 +1428,10 @@ static int bch_btree_gc_root(struct btree *b, struct btree_op *op,
if (b->level) if (b->level)
ret = btree_gc_recurse(b, op, writes, gc); ret = btree_gc_recurse(b, op, writes, gc);
if (!b->written || btree_node_dirty(b)) { if (!b->written || btree_node_dirty(b))
bch_btree_node_write(b, n ? &cl : NULL); bch_btree_node_write_sync(b);
}
if (!IS_ERR_OR_NULL(n)) { if (!IS_ERR_OR_NULL(n)) {
closure_sync(&cl);
bch_btree_set_root(b); bch_btree_set_root(b);
btree_node_free(n); btree_node_free(n);
rw_unlock(true, b); rw_unlock(true, b);
...@@ -2104,15 +2106,10 @@ static int bch_btree_insert_node(struct btree *b, struct btree_op *op, ...@@ -2104,15 +2106,10 @@ static int bch_btree_insert_node(struct btree *b, struct btree_op *op,
if (bch_btree_insert_keys(b, op, insert_keys, if (bch_btree_insert_keys(b, op, insert_keys,
replace_key)) { replace_key)) {
if (!b->level) { if (!b->level)
bch_btree_leaf_dirty(b, journal_ref); bch_btree_leaf_dirty(b, journal_ref);
} else { else
struct closure cl; bch_btree_node_write_sync(b);
closure_init_stack(&cl);
bch_btree_node_write(b, &cl);
closure_sync(&cl);
}
} }
} }
} while (!bch_keylist_empty(&split_keys)); } while (!bch_keylist_empty(&split_keys));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment