aboutsummaryrefslogtreecommitdiffstats
path: root/block/blk-mq.c
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2015-01-08 10:59:53 -0500
committerJens Axboe <axboe@fb.com>2015-01-08 10:59:53 -0500
commiteb130dbfc40eabcd4e10797310bda6b9f6dd7e76 (patch)
tree7f54bd0fca7d8c22d7eb02eab791645f00357ff5 /block/blk-mq.c
parent5b3f25fc343690cafd3e27431a69a7bdaf9df001 (diff)
blk-mq: End unstarted requests on a dying queue
Requests that haven't been started prior to a queue dying can be ended in error without waiting for them to start and time out. Signed-off-by: Keith Busch <keith.busch@intel.com> Added code comment to explain why this is done. Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-mq.c')
-rw-r--r--block/blk-mq.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 78324a2f0e10..2f95747c287e 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -625,8 +625,17 @@ static void blk_mq_check_expired(struct blk_mq_hw_ctx *hctx,
625{ 625{
626 struct blk_mq_timeout_data *data = priv; 626 struct blk_mq_timeout_data *data = priv;
627 627
628 if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) 628 if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) {
629 /*
630 * If a request wasn't started before the queue was
631 * marked dying, kill it here or it'll go unnoticed.
632 */
633 if (unlikely(blk_queue_dying(rq->q))) {
634 rq->errors = -EIO;
635 blk_mq_complete_request(rq);
636 }
629 return; 637 return;
638 }
630 if (rq->cmd_flags & REQ_NO_TIMEOUT) 639 if (rq->cmd_flags & REQ_NO_TIMEOUT)
631 return; 640 return;
632 641