diff options
Diffstat (limited to 'libbcachefs/io_read.c')
-rw-r--r-- | libbcachefs/io_read.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/libbcachefs/io_read.c b/libbcachefs/io_read.c index 3765aa52..8b4cda1d 100644 --- a/libbcachefs/io_read.c +++ b/libbcachefs/io_read.c @@ -31,10 +31,15 @@ #include <linux/random.h> #include <linux/sched/mm.h> +static unsigned __maybe_unused bch2_read_corrupt_ratio; +static int __maybe_unused bch2_read_corrupt_device; + #ifdef CONFIG_BCACHEFS_DEBUG -static unsigned bch2_read_corrupt_ratio; module_param_named(read_corrupt_ratio, bch2_read_corrupt_ratio, uint, 0644); MODULE_PARM_DESC(read_corrupt_ratio, ""); + +module_param_named(read_corrupt_device, bch2_read_corrupt_device, int, 0644); +MODULE_PARM_DESC(read_corrupt_device, ""); #endif static bool bch2_poison_extents_on_checksum_error; @@ -277,7 +282,7 @@ static struct bch_read_bio *__promote_alloc(struct btree_trans *trans, } if (!update_opts.rewrite_ptrs) - return NULL; + return ERR_PTR(bch_err_throw(c, nopromote_no_rewrites)); } if (!enumerated_ref_tryget(&c->writes, BCH_WRITE_REF_promote)) @@ -879,7 +884,9 @@ static void __bch2_read_endio(struct work_struct *work) src->bi_iter = rbio->bvec_iter; } - bch2_maybe_corrupt_bio(src, bch2_read_corrupt_ratio); + if (bch2_read_corrupt_device == rbio->pick.ptr.dev || + bch2_read_corrupt_device < 0) + bch2_maybe_corrupt_bio(src, bch2_read_corrupt_ratio); csum = bch2_checksum_bio(c, crc.csum_type, nonce, src); bool csum_good = !bch2_crc_cmp(csum, rbio->pick.crc.csum) || c->opts.no_data_io; |