diff options
| -rw-r--r-- | drivers/md/bcache/alloc.c | 2 | ||||
| -rw-r--r-- | drivers/md/bcache/bcache.h | 4 | ||||
| -rw-r--r-- | drivers/md/bcache/bset.c | 2 | ||||
| -rw-r--r-- | drivers/md/bcache/bset.h | 2 | ||||
| -rw-r--r-- | drivers/md/bcache/btree.c | 50 | ||||
| -rw-r--r-- | drivers/md/bcache/btree.h | 5 | ||||
| -rw-r--r-- | drivers/md/bcache/extents.c | 13 | ||||
| -rw-r--r-- | drivers/md/bcache/extents.h | 1 | ||||
| -rw-r--r-- | drivers/md/bcache/journal.c | 24 | ||||
| -rw-r--r-- | drivers/md/bcache/request.c | 3 | ||||
| -rw-r--r-- | drivers/md/bcache/super.c | 57 | ||||
| -rw-r--r-- | drivers/md/bcache/util.h | 4 | ||||
| -rw-r--r-- | drivers/md/bcache/writeback.c | 14 | ||||
| -rw-r--r-- | drivers/md/bcache/writeback.h | 3 | ||||
| -rw-r--r-- | include/trace/events/bcache.h | 21 |
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 | ||
| 484 | struct cache_set { | 488 | struct 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 | */ |
| 969 | struct btree *bch_btree_node_get(struct cache_set *c, struct btree_op *op, | 968 | struct 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 | ||
| 1025 | static void btree_node_prefetch(struct cache_set *c, struct bkey *k, int level) | 1026 | static 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 | ||
| 1063 | struct btree *bch_btree_node_alloc(struct cache_set *c, struct btree_op *op, | 1065 | struct 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); | ||
