diff options
| -rw-r--r-- | drivers/md/dm-integrity.c | 12 | ||||
| -rw-r--r-- | drivers/md/dm-io.c | 4 | ||||
| -rw-r--r-- | drivers/md/dm-raid1.c | 21 |
3 files changed, 31 insertions, 6 deletions
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c index 7910bfe50da4..93b181088168 100644 --- a/drivers/md/dm-integrity.c +++ b/drivers/md/dm-integrity.c | |||
| @@ -1105,10 +1105,13 @@ static void schedule_autocommit(struct dm_integrity_c *ic) | |||
| 1105 | static void submit_flush_bio(struct dm_integrity_c *ic, struct dm_integrity_io *dio) | 1105 | static void submit_flush_bio(struct dm_integrity_c *ic, struct dm_integrity_io *dio) |
| 1106 | { | 1106 | { |
| 1107 | struct bio *bio; | 1107 | struct bio *bio; |
| 1108 | spin_lock_irq(&ic->endio_wait.lock); | 1108 | unsigned long flags; |
| 1109 | |||
| 1110 | spin_lock_irqsave(&ic->endio_wait.lock, flags); | ||
| 1109 | bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io)); | 1111 | bio = dm_bio_from_per_bio_data(dio, sizeof(struct dm_integrity_io)); |
| 1110 | bio_list_add(&ic->flush_bio_list, bio); | 1112 | bio_list_add(&ic->flush_bio_list, bio); |
| 1111 | spin_unlock_irq(&ic->endio_wait.lock); | 1113 | spin_unlock_irqrestore(&ic->endio_wait.lock, flags); |
| 1114 | |||
| 1112 | queue_work(ic->commit_wq, &ic->commit_work); | 1115 | queue_work(ic->commit_wq, &ic->commit_work); |
| 1113 | } | 1116 | } |
| 1114 | 1117 | ||
| @@ -3040,6 +3043,11 @@ static int dm_integrity_ctr(struct dm_target *ti, unsigned argc, char **argv) | |||
| 3040 | ti->error = "The device is too small"; | 3043 | ti->error = "The device is too small"; |
| 3041 | goto bad; | 3044 | goto bad; |
| 3042 | } | 3045 | } |
| 3046 | if (ti->len > ic->provided_data_sectors) { | ||
| 3047 | r = -EINVAL; | ||
| 3048 | ti->error = "Not enough provided sectors for requested mapping size"; | ||
| 3049 | goto bad; | ||
| 3050 | } | ||
| 3043 | 3051 | ||
| 3044 | if (!buffer_sectors) | 3052 | if (!buffer_sectors) |
| 3045 | buffer_sectors = 1; | 3053 | buffer_sectors = 1; |
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 3702e502466d..8d5ca30f6551 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
| @@ -317,8 +317,8 @@ static void do_region(int op, int op_flags, unsigned region, | |||
| 317 | else if (op == REQ_OP_WRITE_SAME) | 317 | else if (op == REQ_OP_WRITE_SAME) |
| 318 | special_cmd_max_sectors = q->limits.max_write_same_sectors; | 318 | special_cmd_max_sectors = q->limits.max_write_same_sectors; |
| 319 | if ((op == REQ_OP_DISCARD || op == REQ_OP_WRITE_ZEROES || | 319 | if ((op == REQ_OP_DISCARD || op == REQ_OP_WRITE_ZEROES || |
| 320 | op == REQ_OP_WRITE_SAME) && | 320 | op == REQ_OP_WRITE_SAME) && special_cmd_max_sectors == 0) { |
| 321 | special_cmd_max_sectors == 0) { | 321 | atomic_inc(&io->count); |
| 322 | dec_count(io, region, -EOPNOTSUPP); | 322 | dec_count(io, region, -EOPNOTSUPP); |
| 323 | return; | 323 | return; |
| 324 | } | 324 | } |
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index e61c45047c25..4da8858856fb 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
| @@ -145,6 +145,7 @@ static void dispatch_bios(void *context, struct bio_list *bio_list) | |||
| 145 | 145 | ||
| 146 | struct dm_raid1_bio_record { | 146 | struct dm_raid1_bio_record { |
| 147 | struct mirror *m; | 147 | struct mirror *m; |
| 148 | /* if details->bi_bdev == NULL, details were not saved */ | ||
| 148 | struct dm_bio_details details; | 149 | struct dm_bio_details details; |
| 149 | region_t write_region; | 150 | region_t write_region; |
| 150 | }; | 151 | }; |
| @@ -1198,6 +1199,8 @@ static int mirror_map(struct dm_target *ti, struct bio *bio) | |||
| 1198 | struct dm_raid1_bio_record *bio_record = | 1199 | struct dm_raid1_bio_record *bio_record = |
| 1199 | dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record)); | 1200 | dm_per_bio_data(bio, sizeof(struct dm_raid1_bio_record)); |
| 1200 | 1201 | ||
| 1202 | bio_record->details.bi_bdev = NULL; | ||
| 1203 | |||
| 1201 | if (rw == WRITE) { | 1204 | if (rw == WRITE) { |
| 1202 | /* Save region for mirror_end_io() handler */ | 1205 | /* Save region for mirror_end_io() handler */ |
| 1203 | bio_record->write_region = dm_rh_bio_to_region(ms->rh, bio); | 1206 | bio_record->write_region = dm_rh_bio_to_region(ms->rh, bio); |
| @@ -1256,12 +1259,22 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) | |||
| 1256 | } | 1259 | } |
| 1257 | 1260 | ||
| 1258 | if (error == -EOPNOTSUPP) | 1261 | if (error == -EOPNOTSUPP) |
| 1259 | return error; | 1262 | goto out; |
| 1260 | 1263 | ||
| 1261 | if ((error == -EWOULDBLOCK) && (bio->bi_opf & REQ_RAHEAD)) | 1264 | if ((error == -EWOULDBLOCK) && (bio->bi_opf & REQ_RAHEAD)) |
| 1262 | return error; | 1265 | goto out; |
| 1263 | 1266 | ||
| 1264 | if (unlikely(error)) { | 1267 | if (unlikely(error)) { |
| 1268 | if (!bio_record->details.bi_bdev) { | ||
| 1269 | /* | ||
| 1270 | * There wasn't enough memory to record necessary | ||
| 1271 | * information for a retry or there was no other | ||
| 1272 | * mirror in-sync. | ||
| 1273 | */ | ||
| 1274 | DMERR_LIMIT("Mirror read failed."); | ||
| 1275 | return -EIO; | ||
| 1276 | } | ||
| 1277 | |||
| 1265 | m = bio_record->m; | 1278 | m = bio_record->m; |
| 1266 | 1279 | ||
| 1267 | DMERR("Mirror read failed from %s. Trying alternative device.", | 1280 | DMERR("Mirror read failed from %s. Trying alternative device.", |
| @@ -1277,6 +1290,7 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) | |||
| 1277 | bd = &bio_record->details; | 1290 | bd = &bio_record->details; |
| 1278 | 1291 | ||
| 1279 | dm_bio_restore(bd, bio); | 1292 | dm_bio_restore(bd, bio); |
| 1293 | bio_record->details.bi_bdev = NULL; | ||
| 1280 | bio->bi_error = 0; | 1294 | bio->bi_error = 0; |
| 1281 | 1295 | ||
| 1282 | queue_bio(ms, bio, rw); | 1296 | queue_bio(ms, bio, rw); |
| @@ -1285,6 +1299,9 @@ static int mirror_end_io(struct dm_target *ti, struct bio *bio, int error) | |||
| 1285 | DMERR("All replicated volumes dead, failing I/O"); | 1299 | DMERR("All replicated volumes dead, failing I/O"); |
| 1286 | } | 1300 | } |
| 1287 | 1301 | ||
| 1302 | out: | ||
| 1303 | bio_record->details.bi_bdev = NULL; | ||
| 1304 | |||
| 1288 | return error; | 1305 | return error; |
| 1289 | } | 1306 | } |
| 1290 | 1307 | ||
