diff options
author | Keith Busch <keith.busch@intel.com> | 2015-01-08 08:59:53 -0700 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-01-08 08:59:53 -0700 |
commit | eb130dbfc40eabcd4e10797310bda6b9f6dd7e76 (patch) | |
tree | 7f54bd0fca7d8c22d7eb02eab791645f00357ff5 | |
parent | 5b3f25fc343690cafd3e27431a69a7bdaf9df001 (diff) | |
download | linux-stable-eb130dbfc40eabcd4e10797310bda6b9f6dd7e76.tar.gz linux-stable-eb130dbfc40eabcd4e10797310bda6b9f6dd7e76.tar.bz2 linux-stable-eb130dbfc40eabcd4e10797310bda6b9f6dd7e76.zip |
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>
-rw-r--r-- | block/blk-mq.c | 11 |
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, { 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; |