[ARM] Fix "apm -s" command hang
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Tue, 7 Nov 2006 21:01:30 +0000 (21:01 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 30 Nov 2006 12:24:45 +0000 (12:24 +0000)
Fix an apparant hang with the "apm -s" command.  We omitted to wake up
this process once resume had completed.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/apm.c

index bbe98e3b860b67c61aaec01778c19a76e2a56582..845af0bc110832ebe3f9477d4e0a3e5a274a28ee 100644 (file)
@@ -340,6 +340,7 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
                        wait_event(apm_suspend_waitqueue,
                                   as->suspend_state == SUSPEND_DONE);
                } else {
+                       as->suspend_state = SUSPEND_WAIT;
                        up(&state_lock);
 
                        /*
@@ -349,8 +350,14 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
                         * acknowledged.
                         */
                        err = queue_suspend_event(APM_USER_SUSPEND, as);
-                       if (err < 0)
+                       if (err < 0) {
+                               /*
+                                * Avoid taking the lock here - this
+                                * should be fine.
+                                */
+                               as->suspend_state = SUSPEND_NONE;
                                break;
+                       }
 
                        if (err > 0)
                                apm_suspend();