Name of blk_discard_mergable() is very confusing, and this function actually means if the queue supports multi_range discard. Also there are two kinds of discard merge: 1) multi range discard, bios in one request won't have to be contiguous, and actually each bio is thought as one range 2) single range discard, all bios in one request have to be contiguous just like normal RW request's merge Rename blk_discard_mergable() for not confusing people, and avoiding to introduce bugs in future. Cc: Christoph Hellwig <hch@xxxxxx> Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> --- block/blk-merge.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index 7af1f3668a91..47a03d2eed24 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -693,8 +693,11 @@ static void blk_account_io_merge_request(struct request *req) * needn't to be contiguous. * Otherwise, the bios/requests will be handled as same as * others which should be contiguous. + * + * queue_max_discard_segments() is > 1, the queue supports multi range + * discard. */ -static inline bool blk_discard_mergable(struct request *req) +static inline bool blk_discard_support_multi_range(struct request *req) { if (req_op(req) == REQ_OP_DISCARD && queue_max_discard_segments(req->q) > 1) @@ -705,7 +708,7 @@ static inline bool blk_discard_mergable(struct request *req) static enum elv_merge blk_try_req_merge(struct request *req, struct request *next) { - if (blk_discard_mergable(req)) + if (blk_discard_support_multi_range(req)) return ELEVATOR_DISCARD_MERGE; else if (blk_rq_pos(req) + blk_rq_sectors(req) == blk_rq_pos(next)) return ELEVATOR_BACK_MERGE; @@ -791,7 +794,7 @@ static struct request *attempt_merge(struct request_queue *q, req->__data_len += blk_rq_bytes(next); - if (!blk_discard_mergable(req)) + if (!blk_discard_support_multi_range(req)) elv_merge_requests(q, req, next); /* @@ -887,7 +890,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio) enum elv_merge blk_try_merge(struct request *rq, struct bio *bio) { - if (blk_discard_mergable(rq)) + if (blk_discard_support_multi_range(rq)) return ELEVATOR_DISCARD_MERGE; else if (blk_rq_pos(rq) + blk_rq_sectors(rq) == bio->bi_iter.bi_sector) return ELEVATOR_BACK_MERGE; -- 2.25.2