|
@@ -31,6 +31,7 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
|
|
|
unsigned int granularity;
|
|
|
enum req_op op;
|
|
|
int alignment;
|
|
|
+ sector_t bs_mask;
|
|
|
|
|
|
if (!q)
|
|
|
return -ENXIO;
|
|
@@ -50,6 +51,10 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
|
|
|
op = REQ_OP_DISCARD;
|
|
|
}
|
|
|
|
|
|
+ bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
|
|
|
+ if ((sector | nr_sects) & bs_mask)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
/* Zero-sector (unknown) and one-sector granularities are the same. */
|
|
|
granularity = max(q->limits.discard_granularity >> 9, 1U);
|
|
|
alignment = (bdev_discard_alignment(bdev) >> 9) % granularity;
|
|
@@ -150,10 +155,15 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
|
|
|
unsigned int max_write_same_sectors;
|
|
|
struct bio *bio = NULL;
|
|
|
int ret = 0;
|
|
|
+ sector_t bs_mask;
|
|
|
|
|
|
if (!q)
|
|
|
return -ENXIO;
|
|
|
|
|
|
+ bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
|
|
|
+ if ((sector | nr_sects) & bs_mask)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
/* Ensure that max_write_same_sectors doesn't overflow bi_size */
|
|
|
max_write_same_sectors = UINT_MAX >> 9;
|
|
|
|
|
@@ -202,6 +212,11 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
|
|
|
int ret;
|
|
|
struct bio *bio = NULL;
|
|
|
unsigned int sz;
|
|
|
+ sector_t bs_mask;
|
|
|
+
|
|
|
+ bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1;
|
|
|
+ if ((sector | nr_sects) & bs_mask)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
while (nr_sects != 0) {
|
|
|
bio = next_bio(bio, min(nr_sects, (sector_t)BIO_MAX_PAGES),
|