Commit ab3e1d3b authored by Jens Axboe's avatar Jens Axboe
Browse files

block: allow end_io based requests in the completion batch handling



With end_io handlers now being able to potentially pass ownership of
the request upon completion, we can allow requests with end_io handlers
in the batch completion handling.

Reviewed-by: default avatarAnuj Gupta <anuj20.g@samsung.com>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Co-developed-by: default avatarStefan Roesch <shr@fb.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent de671d61
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -823,9 +823,11 @@ static void blk_complete_request(struct request *req)
	 * can find how many bytes remain in the request
	 * later.
	 */
	if (!req->end_io) {
		req->bio = NULL;
		req->__data_len = 0;
	}
}

/**
 * blk_update_request - Complete multiple bytes without completing the request
@@ -1055,6 +1057,13 @@ void blk_mq_end_request_batch(struct io_comp_batch *iob)

		rq_qos_done(rq->q, rq);

		/*
		 * If end_io handler returns NONE, then it still has
		 * ownership of the request.
		 */
		if (rq->end_io && rq->end_io(rq, 0) == RQ_END_IO_NONE)
			continue;

		WRITE_ONCE(rq->state, MQ_RQ_IDLE);
		if (!req_ref_put_and_test(rq))
			continue;
+2 −1
Original line number Diff line number Diff line
@@ -853,8 +853,9 @@ static inline bool blk_mq_add_to_batch(struct request *req,
				       struct io_comp_batch *iob, int ioerror,
				       void (*complete)(struct io_comp_batch *))
{
	if (!iob || (req->rq_flags & RQF_ELV) || req->end_io || ioerror)
	if (!iob || (req->rq_flags & RQF_ELV) || ioerror)
		return false;

	if (!iob->complete)
		iob->complete = complete;
	else if (iob->complete != complete)