diff options
author | Christoph Hellwig <hch@lst.de> | 2014-04-16 03:44:57 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-04-16 16:15:25 -0400 |
commit | ed0791b2f83cec4e77d88c4e9baabcebf9254a78 (patch) | |
tree | a29b2fc04373c76a7889a3b4f1e43709a3f08fbc /block/blk-mq.c | |
parent | 2f268556567ebeb3538f99b9bdad177581439dcb (diff) |
blk-mq: add blk_mq_requeue_request
This allows to requeue a request that has been accepted by ->queue_rq
earlier. This is needed by the SCSI layer in various error conditions.
The existing internal blk_mq_requeue_request is renamed to
__blk_mq_requeue_request as it is a lower level building block for this
funtionality.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-mq.c')
-rw-r--r-- | block/blk-mq.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index 543bbc08a261..ee225cc312b8 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -400,7 +400,7 @@ static void blk_mq_start_request(struct request *rq, bool last) | |||
400 | rq->cmd_flags |= REQ_END; | 400 | rq->cmd_flags |= REQ_END; |
401 | } | 401 | } |
402 | 402 | ||
403 | static void blk_mq_requeue_request(struct request *rq) | 403 | static void __blk_mq_requeue_request(struct request *rq) |
404 | { | 404 | { |
405 | struct request_queue *q = rq->q; | 405 | struct request_queue *q = rq->q; |
406 | 406 | ||
@@ -413,6 +413,20 @@ static void blk_mq_requeue_request(struct request *rq) | |||
413 | rq->nr_phys_segments--; | 413 | rq->nr_phys_segments--; |
414 | } | 414 | } |
415 | 415 | ||
416 | void blk_mq_requeue_request(struct request *rq) | ||
417 | { | ||
418 | struct request_queue *q = rq->q; | ||
419 | |||
420 | __blk_mq_requeue_request(rq); | ||
421 | blk_clear_rq_complete(rq); | ||
422 | |||
423 | trace_block_rq_requeue(q, rq); | ||
424 | |||
425 | BUG_ON(blk_queued_rq(rq)); | ||
426 | blk_mq_insert_request(rq, true, true, false); | ||
427 | } | ||
428 | EXPORT_SYMBOL(blk_mq_requeue_request); | ||
429 | |||
416 | struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag) | 430 | struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag) |
417 | { | 431 | { |
418 | return tags->rqs[tag]; | 432 | return tags->rqs[tag]; |
@@ -602,7 +616,7 @@ static void __blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx) | |||
602 | * time | 616 | * time |
603 | */ | 617 | */ |
604 | list_add(&rq->queuelist, &rq_list); | 618 | list_add(&rq->queuelist, &rq_list); |
605 | blk_mq_requeue_request(rq); | 619 | __blk_mq_requeue_request(rq); |
606 | break; | 620 | break; |
607 | default: | 621 | default: |
608 | pr_err("blk-mq: bad return on queue: %d\n", ret); | 622 | pr_err("blk-mq: bad return on queue: %d\n", ret); |