forked from luck/tmp_suning_uos_patched
- 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. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJXwHX2AAoJEMUj8QotnQNaMdQIAJuCHedIKQxlsCH4BG20thwM 7+kPh68ZWOB5VYpVlm2sn0aJG0t2c2IsM2+AcQrwwcVsTjVkqu4s5XeqhBhkhvBE xrRHdJU21K6ho3IFiMhscZYfhMGvptwddevOxnRLfCgBALTjWpCWCEeQWLe17QCt klR0bvGckLp7dJavYmb/8MO7VqIQQufYCDjYqEdq4IQT+lKVf940X1bNx5+RpzAD OCgFwmWFb1OWYsVKWnVqxL+QzQcIA84YpBMV+FKQSTDNTLYgDM1mPTxMOxVMCNLO neCUh2WNetvoE9s69T/NmPkjzB3hNAmVhbuFT2SBJ7Bnf/lfxT4Zc6WYOeqqWKY= =XAfD -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
6ec675ede9
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -316,7 +317,7 @@ static int read_header(struct log_c *log)
|
|||
{
|
||||
int r;
|
||||
|
||||
r = rw_header(log, READ);
|
||||
r = rw_header(log, REQ_OP_READ);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
@ -630,7 +631,7 @@ static int disk_resume(struct dm_dirty_log *log)
|
|||
header_to_disk(&lc->header, lc->disk_header);
|
||||
|
||||
/* write the new header */
|
||||
r = rw_header(lc, WRITE);
|
||||
r = rw_header(lc, REQ_OP_WRITE);
|
||||
if (!r) {
|
||||
r = flush_header(lc);
|
||||
if (r)
|
||||
|
@ -698,7 +699,7 @@ static int disk_flush(struct dm_dirty_log *log)
|
|||
log_clear_bit(lc, lc->clean_bits, i);
|
||||
}
|
||||
|
||||
r = rw_header(lc, WRITE);
|
||||
r = rw_header(lc, REQ_OP_WRITE);
|
||||
if (r)
|
||||
fail_log_device(lc);
|
||||
else {
|
||||
|
|
Loading…
Reference in New Issue
Block a user