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

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
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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)
{
+2 −1
Original line number Diff line number Diff line
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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;