aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block/blk-mq.c12
-rw-r--r--include/linux/blk-mq.h4
2 files changed, 13 insertions, 3 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 30bad930e661..010b878d53b3 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -434,10 +434,16 @@ void __blk_mq_complete_request(struct request *rq)
434 **/ 434 **/
435void blk_mq_complete_request(struct request *rq) 435void blk_mq_complete_request(struct request *rq)
436{ 436{
437 if (unlikely(blk_should_fake_timeout(rq->q))) 437 struct request_queue *q = rq->q;
438
439 if (unlikely(blk_should_fake_timeout(q)))
438 return; 440 return;
439 if (!blk_mark_rq_complete(rq)) 441 if (!blk_mark_rq_complete(rq)) {
440 __blk_mq_complete_request(rq); 442 if (q->softirq_done_fn)
443 __blk_mq_complete_request(rq);
444 else
445 blk_mq_end_io(rq, rq->errors);
446 }
441} 447}
442EXPORT_SYMBOL(blk_mq_complete_request); 448EXPORT_SYMBOL(blk_mq_complete_request);
443 449
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h
index afeb93496907..1dfeb1529a61 100644
--- a/include/linux/blk-mq.h
+++ b/include/linux/blk-mq.h
@@ -173,6 +173,10 @@ void __blk_mq_end_io(struct request *rq, int error);
173 173
174void blk_mq_requeue_request(struct request *rq); 174void blk_mq_requeue_request(struct request *rq);
175 175
176/*
177 * Complete request through potential IPI for right placement. Driver must
178 * have defined a mq_ops->complete() hook for this.
179 */
176void blk_mq_complete_request(struct request *rq); 180void blk_mq_complete_request(struct request *rq);
177 181
178void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx); 182void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx);