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 | }; |