blk-mq: blk-mq should free bios in pass through case For non mq calls, the block layer will free the bios when blk_finish_request is called. For mq calls, the blk mq code wants the caller to do this. This patch has the blk mq code work like the non mq code and has the block layer free the bios. Signed-off-by: Mike Christie diff --git a/block/blk-flush.c b/block/blk-flush.c index c56c37d..3e4cc9c 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -231,7 +231,7 @@ static void flush_end_io(struct request *flush_rq, int error) unsigned long flags = 0; if (q->mq_ops) { - blk_mq_finish_request(flush_rq, error); + blk_mq_free_request(flush_rq); spin_lock_irqsave(&q->mq_flush_lock, flags); } running = &q->flush_queue[q->flush_running_idx]; diff --git a/block/blk-mq.c b/block/blk-mq.c index 799d305..5489b5a 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -270,7 +270,7 @@ void blk_mq_free_request(struct request *rq) } EXPORT_SYMBOL(blk_mq_free_request); -void blk_mq_finish_request(struct request *rq, int error) +static void blk_mq_finish_request(struct request *rq, int error) { struct bio *bio = rq->bio; unsigned int bytes = 0; @@ -286,22 +286,17 @@ void blk_mq_finish_request(struct request *rq, int error) blk_account_io_completion(rq, bytes); blk_account_io_done(rq); - blk_mq_free_request(rq); } void blk_mq_complete_request(struct request *rq, int error) { trace_block_rq_complete(rq->q, rq); + blk_mq_finish_request(rq, error); - /* - * If ->end_io is set, it's responsible for doing the rest of the - * completion. - */ if (rq->end_io) rq->end_io(rq, error); else - blk_mq_finish_request(rq, error); - + blk_mq_free_request(rq); } void __blk_mq_end_io(struct request *rq, int error) @@ -973,8 +968,7 @@ int blk_mq_execute_rq(struct request_queue *q, struct request *rq) if (rq->errors) err = -EIO; - blk_mq_finish_request(rq, rq->errors); - + blk_mq_free_request(rq); return err; } EXPORT_SYMBOL(blk_mq_execute_rq); diff --git a/block/blk-mq.h b/block/blk-mq.h index 42d0110..52bf1f9 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h @@ -27,7 +27,6 @@ void blk_mq_complete_request(struct request *rq, int error); void blk_mq_run_request(struct request *rq, bool run_queue, bool async); void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async); void blk_mq_init_flush(struct request_queue *q); -void blk_mq_finish_request(struct request *rq, int error); /* * CPU hotplug helpers