|
@@ -209,12 +209,19 @@ void blk_abort_queue(struct request_queue *q)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
struct request *rq, *tmp;
|
|
|
+ LIST_HEAD(list);
|
|
|
|
|
|
spin_lock_irqsave(q->queue_lock, flags);
|
|
|
|
|
|
elv_abort_queue(q);
|
|
|
|
|
|
- list_for_each_entry_safe(rq, tmp, &q->timeout_list, timeout_list)
|
|
|
+ /*
|
|
|
+ * Splice entries to local list, to avoid deadlocking if entries
|
|
|
+ * get readded to the timeout list by error handling
|
|
|
+ */
|
|
|
+ list_splice_init(&q->timeout_list, &list);
|
|
|
+
|
|
|
+ list_for_each_entry_safe(rq, tmp, &list, timeout_list)
|
|
|
blk_abort_request(rq);
|
|
|
|
|
|
spin_unlock_irqrestore(q->queue_lock, flags);
|