aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/alloc.c2
-rw-r--r--drivers/md/bcache/bcache.h4
-rw-r--r--drivers/md/bcache/bset.c2
-rw-r--r--drivers/md/bcache/bset.h2
-rw-r--r--drivers/md/bcache/btree.c50
-rw-r--r--drivers/md/bcache/btree.h5
-rw-r--r--drivers/md/bcache/extents.c13
-rw-r--r--drivers/md/bcache/extents.h1
-rw-r--r--drivers/md/bcache/journal.c24
-rw-r--r--drivers/md/bcache/request.c3
-rw-r--r--drivers/md/bcache/super.c57
-rw-r--r--drivers/md/bcache/util.h4
-rw-r--r--drivers/md/bcache/writeback.c14
-rw-r--r--drivers/md/bcache/writeback.h3
-rw-r--r--include/trace/events/bcache.h21
15 files changed, 131 insertions, 74 deletions
diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c
index 443d03fbac47..8eeab72b93e2 100644
--- a/drivers/md/bcache/alloc.c
+++ b/drivers/md/bcache/alloc.c
@@ -331,7 +331,7 @@ static int bch_allocator_thread(void *arg)
331 mutex_unlock(&ca->set->bucket_lock); 331 mutex_unlock(&ca->set->bucket_lock);
332 blkdev_issue_discard(ca->bdev, 332 blkdev_issue_discard(ca->bdev,
333 bucket_to_sector(ca->set, bucket), 333 bucket_to_sector(ca->set, bucket),
334 ca->sb.block_size, GFP_KERNEL, 0); 334 ca->sb.bucket_size, GFP_KERNEL, 0);
335 mutex_lock(&ca->set->bucket_lock); 335 mutex_lock(&ca->set->bucket_lock);
336 } 336 }
337 337
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
index d2ebcf323094..04f7bc28ef83 100644
--- a/drivers/md/bcache/bcache.h
+++ b/drivers/md/bcache/bcache.h
@@ -477,9 +477,13 @@ struct gc_stat {
477 * CACHE_SET_STOPPING always gets set first when we're closing down a cache set; 477 * CACHE_SET_STOPPING always gets set first when we're closing down a cache set;
478 * we'll continue to run normally for awhile with CACHE_SET_STOPPING set (i.e. 478 * we'll continue to run normally for awhile with CACHE_SET_STOPPING set (i.e.
479 * flushing dirty data). 479 * flushing dirty data).
480 *
481 * CACHE_SET_RUNNING means all cache devices have been registered and journal
482 * replay is complete.
480 */ 483 */
481#define CACHE_SET_UNREGISTERING 0 484#define CACHE_SET_UNREGISTERING 0
482#define CACHE_SET_STOPPING 1 485#define CACHE_SET_STOPPING 1
486#define CACHE_SET_RUNNING 2
483 487
484struct cache_set { 488struct cache_set {
485 struct closure cl; 489 struct closure cl;
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
index 545416415305..646fe85261c1 100644
--- a/drivers/md/bcache/bset.c
+++ b/drivers/md/bcache/bset.c
@@ -1182,7 +1182,7 @@ static void __btree_sort(struct btree_keys *b, struct btree_iter *iter,
1182{ 1182{
1183 uint64_t start_time; 1183 uint64_t start_time;
1184 bool used_mempool = false; 1184 bool used_mempool = false;
1185 struct bset *out = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOIO, 1185 struct bset *out = (void *) __get_free_pages(__GFP_NOWARN|GFP_NOWAIT,
1186 order); 1186 order);
1187 if (!out) { 1187 if (!out) {
1188 struct page *outp; 1188 struct page *outp;
diff --git a/drivers/md/bcache/bset.h b/drivers/md/bcache/bset.h
index 5f6728d5d4dd..ae964624efb2 100644
--- a/drivers/md/bcache/bset.h
+++ b/drivers/md/bcache/bset.h
@@ -453,7 +453,7 @@ static inline bool bch_bkey_equal_header(const struct bkey *l,
453{ 453{
454 return (KEY_DIRTY(l) == KEY_DIRTY(r) && 454 return (KEY_DIRTY(l) == KEY_DIRTY(r) &&
455 KEY_PTRS(l) == KEY_PTRS(r) && 455 KEY_PTRS(l) == KEY_PTRS(r) &&
456 KEY_CSUM(l) == KEY_CSUM(l)); 456 KEY_CSUM(l) == KEY_CSUM(r));
457} 457}
458 458
459/* Keylists */ 459/* Keylists */
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 7347b6100961..00cde40db572 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -117,9 +117,9 @@
117({ \ 117({ \
118 int _r, l = (b)->level - 1; \ 118 int _r, l = (b)->level - 1; \
119 bool _w = l <= (op)->lock; \ 119 bool _w = l <= (op)->lock; \
120 struct btree *_child = bch_btree_node_get((b)->c, op, key, l, _w);\ 120 struct btree *_child = bch_btree_node_get((b)->c, op, key, l, \
121 _w, b); \
121 if (!IS_ERR(_child)) { \ 122 if (!IS_ERR(_child)) { \
122 _child->parent = (b); \
123 _r = bch_btree_ ## fn(_child, op, ##__VA_ARGS__); \ 123 _r = bch_btree_ ## fn(_child, op, ##__VA_ARGS__); \
124 rw_unlock(_w, _child); \ 124 rw_unlock(_w, _child); \
125 } else \ 125 } else \
@@ -142,7 +142,6 @@
142 rw_lock(_w, _b, _b->level); \ 142 rw_lock(_w, _b, _b->level); \
143 if (_b == (c)->root && \ 143 if (_b == (c)->root && \
144 _w == insert_lock(op, _b)) { \ 144 _w == insert_lock(op, _b)) { \
145 _b->parent = NULL; \
146 _r = bch_btree_ ## fn(_b, op, ##__VA_ARGS__); \ 145 _r = bch_btree_ ## fn(_b, op, ##__VA_ARGS__); \
147 } \ 146 } \
148 rw_unlock(_w, _b); \ 147 rw_unlock(_w, _b); \
@@ -202,7 +201,7 @@ void bch_btree_node_read_done(struct btree *b)
202 struct bset *i = btree_bset_first(b); 201 struct bset *i = btree_bset_first(b);
203 struct btree_iter *iter; 202 struct btree_iter *iter;
204 203
205 iter = mempool_alloc(b->c->fill_iter, GFP_NOWAIT); 204 iter = mempool_alloc(b->c->fill_iter, GFP_NOIO);
206 iter->size = b->c->sb.bucket_size / b->c->sb.block_size; 205 iter->size = b->c->sb.bucket_size / b->c->sb.block_size;
207 iter->used = 0; 206 iter->used = 0;
208 207
@@ -421,7 +420,7 @@ static void do_btree_node_write(struct btree *b)
421 SET_PTR_OFFSET(&k.key, 0, PTR_OFFSET(&k.key, 0) + 420 SET_PTR_OFFSET(&k.key, 0, PTR_OFFSET(&k.key, 0) +
422 bset_sector_offset(&b->keys, i)); 421 bset_sector_offset(&b->keys, i));
423 422
424 if (!bio_alloc_pages(b->bio, GFP_NOIO)) { 423 if (!bio_alloc_pages(b->bio, __GFP_NOWARN|GFP_NOWAIT)) {
425 int j; 424 int j;
426 struct bio_vec *bv; 425 struct bio_vec *bv;
427 void *base = (void *) ((unsigned long) i & ~(PAGE_SIZE - 1)); 426 void *base = (void *) ((unsigned long) i & ~(PAGE_SIZE - 1));
@@ -967,7 +966,8 @@ err:
967 * level and op->lock. 966 * level and op->lock.
968 */ 967 */
969struct btree *bch_btree_node_get(struct cache_set *c, struct btree_op *op, 968struct btree *bch_btree_node_get(struct cache_set *c, struct btree_op *op,
970 struct bkey *k, int level, bool write) 969 struct bkey *k, int level, bool write,
970 struct btree *parent)
971{ 971{
972 int i = 0; 972 int i = 0;
973 struct btree *b; 973 struct btree *b;
@@ -1002,6 +1002,7 @@ retry:
1002 BUG_ON(b->level != level); 1002 BUG_ON(b->level != level);
1003 } 1003 }
1004 1004
1005 b->parent = parent;
1005 b->accessed = 1; 1006 b->accessed = 1;
1006 1007
1007 for (; i <= b->keys.nsets && b->keys.set[i].size; i++) { 1008 for (; i <= b->keys.nsets && b->keys.set[i].size; i++) {
@@ -1022,15 +1023,16 @@ retry:
1022 return b; 1023 return b;
1023} 1024}
1024 1025
1025static void btree_node_prefetch(struct cache_set *c, struct bkey *k, int level) 1026static void btree_node_prefetch(struct btree *parent, struct bkey *k)
1026{ 1027{
1027 struct btree *b; 1028 struct btree *b;
1028 1029
1029 mutex_lock(&c->bucket_lock); 1030 mutex_lock(&parent->c->bucket_lock);
1030 b = mca_alloc(c, NULL, k, level); 1031 b = mca_alloc(parent->c, NULL, k, parent->level - 1);
1031 mutex_unlock(&c->bucket_lock); 1032 mutex_unlock(&parent->c->bucket_lock);
1032 1033
1033 if (!IS_ERR_OR_NULL(b)) { 1034 if (!IS_ERR_OR_NULL(b)) {
1035 b->parent = parent;
1034 bch_btree_node_read(b); 1036 bch_btree_node_read(b);
1035 rw_unlock(true, b); 1037 rw_unlock(true, b);
1036 } 1038 }
@@ -1060,15 +1062,16 @@ static void btree_node_free(struct btree *b)
1060 mutex_unlock(&b->c->bucket_lock); 1062 mutex_unlock(&b->c->bucket_lock);
1061} 1063}
1062 1064
1063struct btree *bch_btree_node_alloc(struct cache_set *c, struct btree_op *op, 1065struct btree *__bch_btree_node_alloc(struct cache_set *c, struct btree_op *op,
1064 int level) 1066 int level, bool wait,
1067 struct btree *parent)
1065{ 1068{
1066 BKEY_PADDED(key) k; 1069 BKEY_PADDED(key) k;
1067 struct btree *b = ERR_PTR(-EAGAIN);