Commit 6ec675ed authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'dm-4.8-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fixes from Mike Snitzer:

 - another stable fix for DM flakey (that tweaks the previous fix that
   didn't factor in expected 'drop_writes' behavior for read IO).

 - a dm-log bio operation flags fix for the broader block changes that
   were merged during the 4.8 merge window.

* tag 'dm-4.8-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
  dm log: fix unitialized bio operation flags
  dm flakey: fix reads to be issued if drop_writes configured
parents 67a8c7d6 9c5a559d
...@@ -289,15 +289,13 @@ static int flakey_map(struct dm_target *ti, struct bio *bio) ...@@ -289,15 +289,13 @@ static int flakey_map(struct dm_target *ti, struct bio *bio)
pb->bio_submitted = true; 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 (bio_data_dir(bio) == READ) {
/* If flags were specified, only corrupt those that match. */ if (!fc->corrupt_bio_byte && !test_bit(DROP_WRITES, &fc->flags))
if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) &&
all_corrupt_bio_flags_match(bio, fc))
goto map_bio;
else
return -EIO; return -EIO;
goto map_bio;
} }
/* /*
...@@ -334,15 +332,22 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, int error) ...@@ -334,15 +332,22 @@ static int flakey_end_io(struct dm_target *ti, struct bio *bio, int error)
struct flakey_c *fc = ti->private; struct flakey_c *fc = ti->private;
struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data)); struct per_bio_data *pb = dm_per_bio_data(bio, sizeof(struct per_bio_data));
if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) {
if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw == READ) &&
all_corrupt_bio_flags_match(bio, fc)) {
/* /*
* Corrupt successful READs while in down state. * Corrupt successful matching READs while in down state.
*/ */
if (!error && pb->bio_submitted && (bio_data_dir(bio) == READ)) {
if (fc->corrupt_bio_byte)
corrupt_bio_data(bio, fc); 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 -EIO;
} }
}
return error; return error;
} }
......
...@@ -291,9 +291,10 @@ static void header_from_disk(struct log_header_core *core, struct log_header_dis ...@@ -291,9 +291,10 @@ static void header_from_disk(struct log_header_core *core, struct log_header_dis
core->nr_regions = le64_to_cpu(disk->nr_regions); core->nr_regions = le64_to_cpu(disk->nr_regions);
} }
static int rw_header(struct log_c *lc, int rw) static int rw_header(struct log_c *lc, int op)
{ {
lc->io_req.bi_op = rw; lc->io_req.bi_op = op;
lc->io_req.bi_op_flags = 0;
return dm_io(&lc->io_req, 1, &lc->header_location, NULL); return dm_io(&lc->io_req, 1, &lc->header_location, NULL);
} }
...@@ -316,7 +317,7 @@ static int read_header(struct log_c *log) ...@@ -316,7 +317,7 @@ static int read_header(struct log_c *log)
{ {
int r; int r;
r = rw_header(log, READ); r = rw_header(log, REQ_OP_READ);
if (r) if (r)
return r; return r;
...@@ -630,7 +631,7 @@ static int disk_resume(struct dm_dirty_log *log) ...@@ -630,7 +631,7 @@ static int disk_resume(struct dm_dirty_log *log)
header_to_disk(&lc->header, lc->disk_header); header_to_disk(&lc->header, lc->disk_header);
/* write the new header */ /* write the new header */
r = rw_header(lc, WRITE); r = rw_header(lc, REQ_OP_WRITE);
if (!r) { if (!r) {
r = flush_header(lc); r = flush_header(lc);
if (r) if (r)
...@@ -698,7 +699,7 @@ static int disk_flush(struct dm_dirty_log *log) ...@@ -698,7 +699,7 @@ static int disk_flush(struct dm_dirty_log *log)
log_clear_bit(lc, lc->clean_bits, i); log_clear_bit(lc, lc->clean_bits, i);
} }
r = rw_header(lc, WRITE); r = rw_header(lc, REQ_OP_WRITE);
if (r) if (r)
fail_log_device(lc); fail_log_device(lc);
else { else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment