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: Kent Overstreet <kmo@daterainc.com>
This commit is contained in:
parent
a664d0f05a
commit
c5aa4a3157
|
@ -1060,15 +1060,15 @@ static void btree_node_free(struct btree *b)
|
|||
mutex_unlock(&b->c->bucket_lock);
|
||||
}
|
||||
|
||||
struct btree *bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
|
||||
int level)
|
||||
struct btree *__bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
|
||||
int level, bool wait)
|
||||
{
|
||||
BKEY_PADDED(key) k;
|
||||
struct btree *b = ERR_PTR(-EAGAIN);
|
||||
|
||||
mutex_lock(&c->bucket_lock);
|
||||
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;
|
||||
|
||||
bkey_put(c, &k.key);
|
||||
|
@ -1100,6 +1100,12 @@ err:
|
|||
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,
|
||||
struct btree_op *op)
|
||||
{
|
||||
|
|
|
@ -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_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 bkey *, int, bool);
|
||||
|
||||
|
|
|
@ -1669,7 +1669,7 @@ static void run_cache_set(struct cache_set *c)
|
|||
goto err;
|
||||
|
||||
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))
|
||||
goto err;
|
||||
|
||||
|
|
Loading…
Reference in New Issue