Discard command supports multiple ranges of blocks, so needn't checking position contiguity when merging. Let's do the same thing in attempt_merge as the blk_try_merge. Signed-off-by: Jianchao Wang <jianchao.w.wang@xxxxxxxxxx> --- block/blk-merge.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index 42a4674..c94749b 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -732,9 +732,10 @@ static struct request *attempt_merge(struct request_queue *q, return NULL; /* - * not contiguous + * not contiguous, except for DISCARD */ - if (blk_rq_pos(req) + blk_rq_sectors(req) != blk_rq_pos(next)) + if ((req_op(req) != REQ_OP_DISCARD) && + (blk_rq_pos(req) + blk_rq_sectors(req) != blk_rq_pos(next))) return NULL; if (rq_data_dir(req) != rq_data_dir(next) -- 2.7.4