|
@@ -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)
|
|
|
{
|