]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/xen/manage.c
splice: fix deadlock in splicing to file
[linux-2.6-omap-h63xx.git] / drivers / xen / manage.c
index 3ccd348d112d62036f4e63a038d23deca7ed67f7..0d61db1e7b49bc5f5fd095795e74001dadda1bc3 100644 (file)
@@ -39,12 +39,6 @@ static int xen_suspend(void *data)
 
        BUG_ON(!irqs_disabled());
 
-       err = device_power_down(PMSG_SUSPEND);
-       if (err) {
-               printk(KERN_ERR "xen_suspend: device_power_down failed: %d\n",
-                      err);
-               return err;
-       }
        err = sysdev_suspend(PMSG_SUSPEND);
        if (err) {
                printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
@@ -69,7 +63,6 @@ static int xen_suspend(void *data)
        xen_mm_unpin_all();
 
        sysdev_resume();
-       device_power_up(PMSG_RESUME);
 
        if (!*cancelled) {
                xen_irq_resume();
@@ -108,6 +101,12 @@ static void do_suspend(void)
        /* XXX use normal device tree? */
        xenbus_suspend();
 
+       err = device_power_down(PMSG_SUSPEND);
+       if (err) {
+               printk(KERN_ERR "device_power_down failed: %d\n", err);
+               goto resume_devices;
+       }
+
        err = stop_machine(xen_suspend, &cancelled, cpumask_of(0));
        if (err) {
                printk(KERN_ERR "failed to start xen_suspend: %d\n", err);
@@ -120,6 +119,9 @@ static void do_suspend(void)
        } else
                xenbus_suspend_cancel();
 
+       device_power_up(PMSG_RESUME);
+
+resume_devices:
        device_resume(PMSG_RESUME);
 
        /* Make sure timer events get retriggered on all CPUs */