Update to 3.4-final.
[linux-flexiantxendom0-3.2.10.git] / drivers / xen / blktap2 / wait_queue.c
1 #include <linux/list.h>
2 #include <linux/spinlock.h>
3
4 #include "blktap.h"
5
6 static LIST_HEAD(deferred_work_queue);
7 static DEFINE_SPINLOCK(deferred_work_lock);
8
9 void
10 blktap_run_deferred(void)
11 {
12         LIST_HEAD(queue);
13         struct blktap *tap;
14         unsigned long flags;
15
16         spin_lock_irqsave(&deferred_work_lock, flags);
17         list_splice_init(&deferred_work_queue, &queue);
18         list_for_each_entry(tap, &queue, deferred_queue)
19                 clear_bit(BLKTAP_DEFERRED, &tap->dev_inuse);
20         spin_unlock_irqrestore(&deferred_work_lock, flags);
21
22         while (!list_empty(&queue)) {
23                 tap = list_entry(queue.next, struct blktap, deferred_queue);
24                 list_del_init(&tap->deferred_queue);
25                 blktap_device_restart(tap);
26         }
27 }
28
29 void
30 blktap_defer(struct blktap *tap)
31 {
32         unsigned long flags;
33
34         spin_lock_irqsave(&deferred_work_lock, flags);
35         if (!test_bit(BLKTAP_DEFERRED, &tap->dev_inuse)) {
36                 set_bit(BLKTAP_DEFERRED, &tap->dev_inuse);
37                 list_add_tail(&tap->deferred_queue, &deferred_work_queue);
38         }
39         spin_unlock_irqrestore(&deferred_work_lock, flags);
40 }