On Mon, Aug 22 2016 at 4:05am -0400, Lukas Herbolt <lherbolt@xxxxxxxxxx> wrote: > Hello, > > There is patch from Mike. It's part of current pull request to 4.8-rc1 > For more details check: > - https://www.redhat.com/archives/dm-devel/2016-July/msg00561.html > - https://www.redhat.com/archives/dm-devel/2016-August/msg00109.html > > Lukas > > On Mon, Aug 22, 2016 at 9:31 AM, Qu Wenruo <quwenruo@xxxxxxxxxxxxxx> wrote: > > Hi, Mike and btrfs and dm guys > > > > When doing regression test on v4.8-rc1, we found that fstests/btrfs/056 > > always fails. With the following dmesg: > > --- > > Buffer I/O error on dev dm-0, logical block 1310704, async page read > > Buffer I/O error on dev dm-0, logical block 16, async page read > > Buffer I/O error on dev dm-0, logical block 16, async page read > > --- > > > > And bisect leads to the following commits: > > --- > > commit 99f3c90d0d85708e7401a81ce3314e50bf7f2819 > > Author: Mike Snitzer <snitzer@xxxxxxxxxx> > > Date: Fri Jul 29 13:19:55 2016 -0400 > > > > dm flakey: error READ bios during the down_interval > > --- > > > > While according to the document of dm-flakey, it says that when using > > drop_writes feature, read bios are not affected: > > --- > > drop_writes: > > All write I/O is silently ignored. > > Read I/O is handled correctly. I went back to the dm-flakey.c code at the time that the 'drop_writes' feature was added via commit b26f5e3d. It does confirm your understanding of how reads should be handled if drop_writes is enabled. Not sure why I thought differently. Please try the following patch. diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c index 97e446d..6a2e8dd 100644 --- a/drivers/md/dm-flakey.c +++ b/drivers/md/dm-flakey.c @@ -289,15 +289,13 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) pb->bio_submitted = true; /* - * Map reads as normal only if corrupt_bio_byte set. + * Error reads if neither corrupt_bio_byte or drop_writes are set. + * Otherwise, flakey_end_io() will decide if the reads should be modified. */ if (bio_data_dir(bio) == READ) { - /* If flags were specified, only corrupt those that match. */ - if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) && - all_corrupt_bio_flags_match(bio, fc)) - goto map_bio; - else + if (!fc->corrupt_bio_byte && !test_bit(DROP_WRITES, &fc->flags)) return -EIO; + goto map_bio; } /* @@ -334,14 +332,21 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, int error) struct flakey_c *fc = ti->private; struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data)); - /* - * Corrupt successful READs while in down state. - */ if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) { - if (fc->corrupt_bio_byte) + if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) && + all_corrupt_bio_flags_match(bio, fc)) { + /* + * Corrupt successful matching READs while in down state. + */ corrupt_bio_data(bio, fc); - else + + } else if (!test_bit(DROP_WRITES, &fc->flags)) { + /* + * Error read during the down_interval if drop_writes + * wasn't configured. + */ return -EIO; + } } return error; -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel