diff options
| -rw-r--r-- | drivers/md/dm-io.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 37de0173b6d2..74adcd2c967e 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c | |||
| @@ -289,9 +289,16 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
| 289 | struct request_queue *q = bdev_get_queue(where->bdev); | 289 | struct request_queue *q = bdev_get_queue(where->bdev); |
| 290 | unsigned short logical_block_size = queue_logical_block_size(q); | 290 | unsigned short logical_block_size = queue_logical_block_size(q); |
| 291 | sector_t num_sectors; | 291 | sector_t num_sectors; |
| 292 | unsigned int uninitialized_var(special_cmd_max_sectors); | ||
| 292 | 293 | ||
| 293 | /* Reject unsupported discard requests */ | 294 | /* |
| 294 | if ((rw & REQ_DISCARD) && !blk_queue_discard(q)) { | 295 | * Reject unsupported discard and write same requests. |
| 296 | */ | ||
| 297 | if (rw & REQ_DISCARD) | ||
| 298 | special_cmd_max_sectors = q->limits.max_discard_sectors; | ||
| 299 | else if (rw & REQ_WRITE_SAME) | ||
| 300 | special_cmd_max_sectors = q->limits.max_write_same_sectors; | ||
| 301 | if ((rw & (REQ_DISCARD | REQ_WRITE_SAME)) && special_cmd_max_sectors == 0) { | ||
| 295 | dec_count(io, region, -EOPNOTSUPP); | 302 | dec_count(io, region, -EOPNOTSUPP); |
| 296 | return; | 303 | return; |
| 297 | } | 304 | } |
| @@ -317,7 +324,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
| 317 | store_io_and_region_in_bio(bio, io, region); | 324 | store_io_and_region_in_bio(bio, io, region); |
| 318 | 325 | ||
| 319 | if (rw & REQ_DISCARD) { | 326 | if (rw & REQ_DISCARD) { |
| 320 | num_sectors = min_t(sector_t, q->limits.max_discard_sectors, remaining); | 327 | num_sectors = min_t(sector_t, special_cmd_max_sectors, remaining); |
| 321 | bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; | 328 | bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; |
| 322 | remaining -= num_sectors; | 329 | remaining -= num_sectors; |
| 323 | } else if (rw & REQ_WRITE_SAME) { | 330 | } else if (rw & REQ_WRITE_SAME) { |
| @@ -326,7 +333,7 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where, | |||
| 326 | */ | 333 | */ |
| 327 | dp->get_page(dp, &page, &len, &offset); | 334 | dp->get_page(dp, &page, &len, &offset); |
| 328 | bio_add_page(bio, page, logical_block_size, offset); | 335 | bio_add_page(bio, page, logical_block_size, offset); |
| 329 | num_sectors = min_t(sector_t, q->limits.max_write_same_sectors, remaining); | 336 | num_sectors = min_t(sector_t, special_cmd_max_sectors, remaining); |
| 330 | bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; | 337 | bio->bi_iter.bi_size = num_sectors << SECTOR_SHIFT; |
| 331 | 338 | ||
| 332 | offset = 0; | 339 | offset = 0; |
