]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
blk-mq: End unstarted requests on a dying queue
authorKeith Busch <keith.busch@intel.com>
Thu, 8 Jan 2015 15:59:53 +0000 (08:59 -0700)
committerJens Axboe <axboe@fb.com>
Thu, 8 Jan 2015 15:59:53 +0000 (08:59 -0700)
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>
block/blk-mq.c

index 78324a2f0e107b2e15deaf49d3839d2df5267983..2f95747c287eac350b45cc272fcd3d6e9c43ee09 100644 (file)
@@ -625,8 +625,17 @@ static void blk_mq_check_expired(struct blk_mq_hw_ctx *hctx,
 {
        struct blk_mq_timeout_data *data = priv;
 
-       if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags))
+       if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) {
+               /*
+                * If a request wasn't started before the queue was
+                * marked dying, kill it here or it'll go unnoticed.
+                */
+               if (unlikely(blk_queue_dying(rq->q))) {
+                       rq->errors = -EIO;
+                       blk_mq_complete_request(rq);
+               }
                return;
+       }
        if (rq->cmd_flags & REQ_NO_TIMEOUT)
                return;