diff options
Diffstat (limited to 'block/blk-barrier.c')
-rw-r--r-- | block/blk-barrier.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/block/blk-barrier.c b/block/blk-barrier.c index 21f5025c3945..8873b9b439ff 100644 --- a/block/blk-barrier.c +++ b/block/blk-barrier.c | |||
@@ -385,6 +385,8 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | |||
385 | 385 | ||
386 | while (nr_sects && !ret) { | 386 | while (nr_sects && !ret) { |
387 | unsigned int sector_size = q->limits.logical_block_size; | 387 | unsigned int sector_size = q->limits.logical_block_size; |
388 | unsigned int max_discard_sectors = | ||
389 | min(q->limits.max_discard_sectors, UINT_MAX >> 9); | ||
388 | 390 | ||
389 | bio = bio_alloc(gfp_mask, 1); | 391 | bio = bio_alloc(gfp_mask, 1); |
390 | if (!bio) | 392 | if (!bio) |
@@ -411,10 +413,10 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | |||
411 | * touch many more blocks on disk than the actual payload | 413 | * touch many more blocks on disk than the actual payload |
412 | * length. | 414 | * length. |
413 | */ | 415 | */ |
414 | if (nr_sects > queue_max_hw_sectors(q)) { | 416 | if (nr_sects > max_discard_sectors) { |
415 | bio->bi_size = queue_max_hw_sectors(q) << 9; | 417 | bio->bi_size = max_discard_sectors << 9; |
416 | nr_sects -= queue_max_hw_sectors(q); | 418 | nr_sects -= max_discard_sectors; |
417 | sector += queue_max_hw_sectors(q); | 419 | sector += max_discard_sectors; |
418 | } else { | 420 | } else { |
419 | bio->bi_size = nr_sects << 9; | 421 | bio->bi_size = nr_sects << 9; |
420 | nr_sects = 0; | 422 | nr_sects = 0; |