Commit c5aa4a3157b55bdca18dd2a9d9f43314470b6d32

Authored by Slava Pestov
Committed by Kent Overstreet
1 parent a664d0f05a

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>

Showing 3 changed files with 12 additions and 5 deletions Side-by-side Diff

drivers/md/bcache/btree.c
... ... @@ -1060,15 +1060,15 @@
1060 1060 mutex_unlock(&b->c->bucket_lock);
1061 1061 }
1062 1062  
1063   -struct btree *bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
1064   - int level)
  1063 +struct btree *__bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
  1064 + int level, bool wait)
1065 1065 {
1066 1066 BKEY_PADDED(key) k;
1067 1067 struct btree *b = ERR_PTR(-EAGAIN);
1068 1068  
1069 1069 mutex_lock(&c->bucket_lock);
1070 1070 retry:
1071   - if (__bch_bucket_alloc_set(c, RESERVE_BTREE, &k.key, 1, op != NULL))
  1071 + if (__bch_bucket_alloc_set(c, RESERVE_BTREE, &k.key, 1, wait))
1072 1072 goto err;
1073 1073  
1074 1074 bkey_put(c, &k.key);
... ... @@ -1098,6 +1098,12 @@
1098 1098  
1099 1099 trace_bcache_btree_node_alloc_fail(b);
1100 1100 return b;
  1101 +}
  1102 +
  1103 +static struct btree *bch_btree_node_alloc(struct cache_set *c,
  1104 + struct btree_op *op, int level)
  1105 +{
  1106 + return __bch_btree_node_alloc(c, op, level, op != NULL);
1101 1107 }
1102 1108  
1103 1109 static struct btree *btree_node_alloc_replacement(struct btree *b,
drivers/md/bcache/btree.h
... ... @@ -242,7 +242,8 @@
242 242 void bch_btree_node_write(struct btree *, struct closure *);
243 243  
244 244 void bch_btree_set_root(struct btree *);
245   -struct btree *bch_btree_node_alloc(struct cache_set *, struct btree_op *, int);
  245 +struct btree *__bch_btree_node_alloc(struct cache_set *, struct btree_op *,
  246 + int, bool);
246 247 struct btree *bch_btree_node_get(struct cache_set *, struct btree_op *,
247 248 struct bkey *, int, bool);
248 249  
drivers/md/bcache/super.c
... ... @@ -1669,7 +1669,7 @@
1669 1669 goto err;
1670 1670  
1671 1671 err = "cannot allocate new btree root";
1672   - c->root = bch_btree_node_alloc(c, NULL, 0);
  1672 + c->root = __bch_btree_node_alloc(c, NULL, 0, true);
1673 1673 if (IS_ERR_OR_NULL(c->root))
1674 1674 goto err;
1675 1675