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);
|
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 @@ err:
|
||||||
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 *);
|
||||||
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)
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue