Commit c5aa4a3157b55bdca18dd2a9d9f43314470b6d32
Committed by
Kent Overstreet
1 parent
a664d0f05a
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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