summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2015-01-07 18:55:45 -0700
committerJens Axboe <axboe@fb.com>2015-01-08 08:55:53 -0700
commit1885b24d23716e09b9c952822b05fd7f68099cdb (patch)
tree13cfd695ad4548766095cfff8afee07bba49b5a1 /block
parentc68ed59f534c318716c6189050af3c5ea03b8071 (diff)
downloadlinux-1885b24d23716e09b9c952822b05fd7f68099cdb.tar.gz
linux-1885b24d23716e09b9c952822b05fd7f68099cdb.tar.bz2
linux-1885b24d23716e09b9c952822b05fd7f68099cdb.zip
blk-mq: Add helper to abort requeued requests
Adds a helper function a driver can use to abort requeued requests in case any are pending when h/w queues are being removed. Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r--block/blk-mq.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index e73a5dd89fc4..261ccd89e15d 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -539,6 +539,26 @@ void blk_mq_kick_requeue_list(struct request_queue *q)
}
EXPORT_SYMBOL(blk_mq_kick_requeue_list);
+void blk_mq_abort_requeue_list(struct request_queue *q)
+{
+ unsigned long flags;
+ LIST_HEAD(rq_list);
+
+ spin_lock_irqsave(&q->requeue_lock, flags);
+ list_splice_init(&q->requeue_list, &rq_list);
+ spin_unlock_irqrestore(&q->requeue_lock, flags);
+
+ while (!list_empty(&rq_list)) {
+ struct request *rq;
+
+ rq = list_first_entry(&rq_list, struct request, queuelist);
+ list_del_init(&rq->queuelist);
+ rq->errors = -EIO;
+ blk_mq_end_request(rq, rq->errors);
+ }
+}
+EXPORT_SYMBOL(blk_mq_abort_requeue_list);
+
static inline bool is_flush_request(struct request *rq,
struct blk_flush_queue *fq, unsigned int tag)
{