aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-09-10 17:27:42 -0400
committerKent Overstreet <kmo@daterainc.com>2013-11-11 00:56:43 -0500
commit5ceaaad7047745c1c02150c39d3fb623b7948d48 (patch)
treec03201ceda61314a0ec4b521e5d2d4d89bb1f0c2
parent098fb25498214069e6bbf908515f2952dd7654d0 (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.h1
-rw-r--r--drivers/md/bcache/debug.c15
-rw-r--r--drivers/md/bcache/debug.h2
-rw-r--r--drivers/md/bcache/request.c14
-rw-r--r--drivers/md/bcache/sysfs.c4
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);
99rw_attribute(io_error_limit); 99rw_attribute(io_error_limit);
100rw_attribute(io_error_halflife); 100rw_attribute(io_error_halflife);
101rw_attribute(verify); 101rw_attribute(verify);
102rw_attribute(bypass_torture_test);
102rw_attribute(key_merging_disabled); 103rw_attribute(key_merging_disabled);
103rw_attribute(gc_always_rewrite); 104rw_attribute(gc_always_rewrite);
104rw_attribute(expensive_debug_checks); 105rw_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};