diff --git a/block/blk-lib.c b/block/blk-lib.c index 0dbc9e2ab9a3ff662997b94a3419af0e083a35d8..71a551a497ea1c609f880d332ccca242c8c32376 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -48,6 +48,15 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, op = REQ_OP_DISCARD; } + /* In case the discard granularity isn't set by buggy device driver */ + if (WARN_ON_ONCE(!q->limits.discard_granularity)) { + char dev_name[BDEVNAME_SIZE]; + + bdevname(bdev, dev_name); + pr_err_ratelimited("%s: Error: discard_granularity is 0.\n", dev_name); + return -EOPNOTSUPP; + } + bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; if ((sector | nr_sects) & bs_mask) return -EINVAL;