block: return ELEVATOR_DISCARD_MERGE if possible

commit 866663b7b52d2da267b28e12eed89ee781b8fed1 upstream.

When merging one bio to request, if they are discard IO and the queue
supports multi-range discard, we need to return ELEVATOR_DISCARD_MERGE
because both block core and related drivers(nvme, virtio-blk) doesn't
handle mixed discard io merge(traditional IO merge together with
discard merge) well.

Fix the issue by returning ELEVATOR_DISCARD_MERGE in this situation,
so both blk-mq and drivers just need to handle multi-range discard.

Reported-by: Oleksandr Natalenko <>
Signed-off-by: Ming Lei <>
Tested-by: Oleksandr Natalenko <>
Fixes: 2705dfb20947 ("block: fix discard request merge")
Signed-off-by: Jens Axboe <>
Signed-off-by: Gwendal Grignou <>
Signed-off-by: Greg Kroah-Hartman <>
5 files changed