struct request_queue *q;
        unsigned long flags;
        struct request *rq;
+       LIST_HEAD(list);
 
        BUG_ON(plug->magic != PLUG_MAGIC);
 
        if (list_empty(&plug->list))
                return;
 
-       if (plug->should_sort)
-               list_sort(NULL, &plug->list, plug_rq_cmp);
+       list_splice_init(&plug->list, &list);
+
+       if (plug->should_sort) {
+               list_sort(NULL, &list, plug_rq_cmp);
+               plug->should_sort = 0;
+       }
 
        q = NULL;
        local_irq_save(flags);
-       while (!list_empty(&plug->list)) {
-               rq = list_entry_rq(plug->list.next);
+       while (!list_empty(&list)) {
+               rq = list_entry_rq(list.next);
                list_del_init(&rq->queuelist);
                BUG_ON(!(rq->cmd_flags & REQ_ON_PLUG));
                BUG_ON(!rq->q);
                spin_unlock(q->queue_lock);
        }
 
-       BUG_ON(!list_empty(&plug->list));
        local_irq_restore(flags);
 }