diff options
| author | Kent Overstreet <kmo@daterainc.com> | 2013-09-10 17:27:42 -0400 |
|---|---|---|
| committer | Kent Overstreet <kmo@daterainc.com> | 2013-11-11 00:56:43 -0500 |
| commit | 5ceaaad7047745c1c02150c39d3fb623b7948d48 (patch) | |
| tree | c03201ceda61314a0ec4b521e5d2d4d89bb1f0c2 | |
| parent | 098fb25498214069e6bbf908515f2952dd7654d0 (diff) | |
bcache: Bypass torture test
More testing ftw! Also, now verify mode doesn't break if you read dirty
data.
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
| -rw-r--r-- | drivers/md/bcache/bcache.h | 1 | ||||
| -rw-r--r-- | drivers/md/bcache/debug.c | 15 | ||||
| -rw-r--r-- | drivers/md/bcache/debug.h | 2 | ||||
| -rw-r--r-- | drivers/md/bcache/request.c | 14 | ||||
| -rw-r--r-- | drivers/md/bcache/sysfs.c | 4 |
5 files changed, 28 insertions, 8 deletions
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 97ef126b68bb..4beb55a0ff30 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h | |||
| @@ -364,6 +364,7 @@ struct cached_dev { | |||
| 364 | unsigned readahead; | 364 | unsigned readahead; |
| 365 | 365 | ||
| 366 | unsigned verify:1; | 366 | unsigned verify:1; |
| 367 | unsigned bypass_torture_test:1; | ||
| 367 | 368 | ||
| 368 | unsigned partial_stripes_expensive:1; | 369 | unsigned partial_stripes_expensive:1; |
| 369 | unsigned writeback_metadata:1; | 370 | unsigned writeback_metadata:1; |
diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c index e99e6b8852b2..264fcfbd6290 100644 --- a/drivers/md/bcache/debug.c +++ b/drivers/md/bcache/debug.c | |||
| @@ -189,13 +189,14 @@ void bch_data_verify(struct cached_dev *dc, struct bio *bio) | |||
| 189 | void *p1 = kmap_atomic(bv->bv_page); | 189 | void *p1 = kmap_atomic(bv->bv_page); |
| 190 | void *p2 = page_address(check->bi_io_vec[i].bv_page); | 190 | void *p2 = page_address(check->bi_io_vec[i].bv_page); |
| 191 | 191 | ||
| 192 | if (memcmp(p1 + bv->bv_offset, | 192 | cache_set_err_on(memcmp(p1 + bv->bv_offset, |
| 193 | p2 + bv->bv_offset, | 193 | p2 + bv->bv_offset, |
| 194 | bv->bv_len)) | 194 | bv->bv_len), |
| 195 | printk(KERN_ERR | 195 | dc->disk.c, |
| 196 | "bcache (%s): verify failed at sector %llu\n", | 196 | "verify failed at dev %s sector %llu", |
| 197 | bdevname(dc->bdev, name), | 197 | bdevname(dc->bdev, name), |
| 198 | (uint64_t) bio->bi_sector); | 198 | (uint64_t) bio->bi_sector); |
| 199 | |||
| 199 | kunmap_atomic(p1); | 200 | kunmap_atomic(p1); |
| 200 | } | 201 | } |
| 201 | 202 | ||
diff --git a/drivers/md/bcache/debug.h b/drivers/md/bcache/debug.h index 7914ba0ff316..2ede60e31874 100644 --- a/drivers/md/bcache/debug.h +++ b/drivers/md/bcache/debug.h | |||
| @@ -16,6 +16,7 @@ void bch_btree_iter_next_check(struct btree_iter *); | |||
| 16 | #define EBUG_ON(cond) BUG_ON(cond) | 16 | #define EBUG_ON(cond) BUG_ON(cond) |
| 17 | #define expensive_debug_checks(c) ((c)->expensive_debug_checks) | 17 | #define expensive_debug_checks(c) ((c)->expensive_debug_checks) |
| 18 | #define key_merging_disabled(c) ((c)->key_merging_disabled) | 18 | #define key_merging_disabled(c) ((c)->key_merging_disabled) |
| 19 | #define bypass_torture_test(d) ((d)->bypass_torture_test) | ||
| 19 | 20 | ||
| 20 | #else /* DEBUG */ | 21 | #else /* DEBUG */ |
| 21 | 22 | ||
| @@ -28,6 +29,7 @@ static inline void bch_btree_iter_next_check(struct btree_iter *iter) {} | |||
| 28 | #define EBUG_ON(cond) do { if (cond); } while (0) | 29 | #define EBUG_ON(cond) do { if (cond); } while (0) |
| 29 | #define expensive_debug_checks(c) 0 | 30 | #define expensive_debug_checks(c) 0 |
| 30 | #define key_merging_disabled(c) 0 | 31 | #define key_merging_disabled(c) 0 |
| 32 | #define bypass_torture_test(d) 0 | ||
| 31 | 33 | ||
| 32 | #endif | 34 | #endif |
| 33 | 35 | ||
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c index 9f5a1386f77a..fbcc851ed5a5 100644 --- a/drivers/md/bcache/request.c +++ b/drivers/md/bcache/request.c | |||
| @@ -528,6 +528,13 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) | |||
| 528 | goto skip; | 528 | goto skip; |
| 529 | } | 529 | } |
| 530 | 530 | ||
| 531 | if (bypass_torture_test(dc)) { | ||
| 532 | if ((get_random_int() & 3) == 3) | ||
| 533 | goto skip; | ||
| 534 | else | ||
| 535 | goto rescale; | ||
| 536 | } | ||
| 537 | |||
| 531 | if (!congested && !dc->sequential_cutoff) | 538 | if (!congested && !dc->sequential_cutoff) |
| 532 | goto rescale; | 539 | goto rescale; |
| 533 | 540 | ||
| @@ -601,6 +608,7 @@ struct search { | |||
| 601 | unsigned recoverable:1; | 608 | unsigned recoverable:1; |
| 602 | unsigned unaligned_bvec:1; | 609 | unsigned unaligned_bvec:1; |
| 603 | unsigned write:1; | 610 | unsigned write:1; |
| 611 | unsigned read_dirty_data:1; | ||
| 604 | 612 | ||
| 605 | unsigned long start_time; | 613 | unsigned long start_time; |
| 606 | 614 | ||
| @@ -669,6 +677,9 @@ static int cache_lookup_fn(struct btree_op *op, struct btree *b, struct bkey *k) | |||
| 669 | 677 | ||
| 670 | PTR_BUCKET(b->c, k, ptr)->prio = INITIAL_PRIO; | 678 | PTR_BUCKET(b->c, k, ptr)->prio = INITIAL_PRIO; |
| 671 | 679 | ||
| 680 | if (KEY_DIRTY(k)) | ||
| 681 | s->read_dirty_data = true; | ||
| 682 | |||
| 672 | n = bch_bio_split(bio, min_t(uint64_t, INT_MAX, | 683 | n = bch_bio_split(bio, min_t(uint64_t, INT_MAX, |
| 673 | KEY_OFFSET(k) - bio->bi_sector), | 684 | KEY_OFFSET(k) - bio->bi_sector), |
| 674 | GFP_NOIO, s->d->bio_split); | 685 | GFP_NOIO, s->d->bio_split); |
| @@ -894,7 +905,8 @@ static void cached_dev_read_done(struct closure *cl) | |||
| 894 | s->cache_miss = NULL; | 905 | s->cache_miss = NULL; |
| 895 | } | 906 | } |
| 896 | 907 | ||
| 897 | if (verify(dc, &s->bio.bio) && s->recoverable && !s->unaligned_bvec) | 908 | if (verify(dc, &s->bio.bio) && s->recoverable && |
| 909 | !s->unaligned_bvec && !s->read_dirty_data) | ||
| 898 | bch_data_verify(dc, s->orig_bio); | 910 | bch_data_verify(dc, s->orig_bio); |
| 899 | 911 | ||
| 900 | bio_complete(s); | 912 | bio_complete(s); |
diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c index 194d43782ea4..80d4c2bee18a 100644 --- a/drivers/md/bcache/sysfs.c +++ b/drivers/md/bcache/sysfs.c | |||
| @@ -99,6 +99,7 @@ rw_attribute(errors); | |||
| 99 | rw_attribute(io_error_limit); | 99 | rw_attribute(io_error_limit); |
| 100 | rw_attribute(io_error_halflife); | 100 | rw_attribute(io_error_halflife); |
| 101 | rw_attribute(verify); | 101 | rw_attribute(verify); |
| 102 | rw_attribute(bypass_torture_test); | ||
| 102 | rw_attribute(key_merging_disabled); | 103 | rw_attribute(key_merging_disabled); |
| 103 | rw_attribute(gc_always_rewrite); | 104 | rw_attribute(gc_always_rewrite); |
| 104 | rw_attribute(expensive_debug_checks); | 105 | rw_attribute(expensive_debug_checks); |
| @@ -123,6 +124,7 @@ SHOW(__bch_cached_dev) | |||
| 123 | 124 | ||
| 124 | sysfs_printf(data_csum, "%i", dc->disk.data_csum); | 125 | sysfs_printf(data_csum, "%i", dc->disk.data_csum); |
| 125 | var_printf(verify, "%i"); | 126 | var_printf(verify, "%i"); |
| 127 | var_printf(bypass_torture_test, "%i"); | ||
| 126 | var_printf(writeback_metadata, "%i"); | 128 | var_printf(writeback_metadata, "%i"); |
| 127 | var_printf(writeback_running, "%i"); | 129 | var_printf(writeback_running, "%i"); |
| 128 | var_print(writeback_delay); | 130 | var_print(writeback_delay); |
| @@ -191,6 +193,7 @@ STORE(__cached_dev) | |||
| 191 | 193 | ||
| 192 | sysfs_strtoul(data_csum, dc->disk.data_csum); | 194 | sysfs_strtoul(data_csum, dc->disk.data_csum); |
| 193 | d_strtoul(verify); | 195 | d_strtoul(verify); |
| 196 | d_strtoul(bypass_torture_test); | ||
| 194 | d_strtoul(writeback_metadata); | 197 | d_strtoul(writeback_metadata); |
| 195 | d_strtoul(writeback_running); | 198 | d_strtoul(writeback_running); |
| 196 | d_strtoul(writeback_delay); | 199 | d_strtoul(writeback_delay); |
| @@ -323,6 +326,7 @@ static struct attribute *bch_cached_dev_files[] = { | |||
| 323 | &sysfs_readahead, | 326 | &sysfs_readahead, |
| 324 | #ifdef CONFIG_BCACHE_DEBUG | 327 | #ifdef CONFIG_BCACHE_DEBUG |
| 325 | &sysfs_verify, | 328 | &sysfs_verify, |
| 329 | &sysfs_bypass_torture_test, | ||
| 326 | #endif | 330 | #endif |
| 327 | NULL | 331 | NULL |
| 328 | }; | 332 | }; |
