1 #include <linux/list.h>
2 #include <linux/spinlock.h>
6 static LIST_HEAD(deferred_work_queue);
7 static DEFINE_SPINLOCK(deferred_work_lock);
10 blktap_run_deferred(void)
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);
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);
30 blktap_defer(struct blktap *tap)
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);
39 spin_unlock_irqrestore(&deferred_work_lock, flags);