Commit c5aa4a31 authored by Slava Pestov's avatar Slava Pestov Committed by Kent Overstreet

bcache: wait for buckets when allocating new btree root

Tested:
- sometimes bcache_tier test would hang on startup with a failure
  to allocate the btree root -- no longer seeing this
Signed-off-by: default avatarKent Overstreet <kmo@daterainc.com>
parent a664d0f0
...@@ -1060,15 +1060,15 @@ static void btree_node_free(struct btree *b) ...@@ -1060,15 +1060,15 @@ static void btree_node_free(struct btree *b)
mutex_unlock(&b->c->bucket_lock); mutex_unlock(&b->c->bucket_lock);
} }
struct btree *bch_btree_node_alloc(struct cache_set *c, struct btree_op *op, struct btree *__bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
int level) int level, bool wait)
{ {
BKEY_PADDED(key) k; BKEY_PADDED(key) k;
struct btree *b = ERR_PTR(-EAGAIN); struct btree *b = ERR_PTR(-EAGAIN);
mutex_lock(&c->bucket_lock); mutex_lock(&c->bucket_lock);
retry: retry:
if (__bch_bucket_alloc_set(c, RESERVE_BTREE, &k.key, 1, op != NULL)) if (__bch_bucket_alloc_set(c, RESERVE_BTREE, &k.key, 1, wait))
goto err; goto err;
bkey_put(c, &k.key); bkey_put(c, &k.key);
...@@ -1100,6 +1100,12 @@ struct btree *bch_btree_node_alloc(struct cache_set *c, struct btree_op *op, ...@@ -1100,6 +1100,12 @@ struct btree *bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
return b; return b;
} }
static struct btree *bch_btree_node_alloc(struct cache_set *c,
struct btree_op *op, int level)
{
return __bch_btree_node_alloc(c, op, level, op != NULL);
}
static struct btree *btree_node_alloc_replacement(struct btree *b, static struct btree *btree_node_alloc_replacement(struct btree *b,
struct btree_op *op) struct btree_op *op)
{ {
......
...@@ -242,7 +242,8 @@ void __bch_btree_node_write(struct btree *, struct closure *); ...@@ -242,7 +242,8 @@ void __bch_btree_node_write(struct btree *, struct closure *);
void bch_btree_node_write(struct btree *, struct closure *); void bch_btree_node_write(struct btree *, struct closure *);
void bch_btree_set_root(struct btree *); void bch_btree_set_root(struct btree *);
struct btree *bch_btree_node_alloc(struct cache_set *, struct btree_op *, int); struct btree *__bch_btree_node_alloc(struct cache_set *, struct btree_op *,
int, bool);
struct btree *bch_btree_node_get(struct cache_set *, struct btree_op *, struct btree *bch_btree_node_get(struct cache_set *, struct btree_op *,
struct bkey *, int, bool); struct bkey *, int, bool);
......
...@@ -1669,7 +1669,7 @@ static void run_cache_set(struct cache_set *c) ...@@ -1669,7 +1669,7 @@ static void run_cache_set(struct cache_set *c)
goto err; goto err;
err = "cannot allocate new btree root"; err = "cannot allocate new btree root";
c->root = bch_btree_node_alloc(c, NULL, 0); c->root = __bch_btree_node_alloc(c, NULL, 0, true);
if (IS_ERR_OR_NULL(c->root)) if (IS_ERR_OR_NULL(c->root))
goto err; goto err;
......
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