diff options
| -rw-r--r-- | arch/x86/kernel/apm_32.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index 151ace69a5aa..b5b6b23bce53 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
| @@ -204,7 +204,6 @@ | |||
| 204 | #include <linux/module.h> | 204 | #include <linux/module.h> |
| 205 | 205 | ||
| 206 | #include <linux/poll.h> | 206 | #include <linux/poll.h> |
| 207 | #include <linux/smp_lock.h> | ||
| 208 | #include <linux/types.h> | 207 | #include <linux/types.h> |
| 209 | #include <linux/stddef.h> | 208 | #include <linux/stddef.h> |
| 210 | #include <linux/timer.h> | 209 | #include <linux/timer.h> |
| @@ -403,6 +402,7 @@ static DECLARE_WAIT_QUEUE_HEAD(apm_waitqueue); | |||
| 403 | static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue); | 402 | static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue); |
| 404 | static struct apm_user *user_list; | 403 | static struct apm_user *user_list; |
| 405 | static DEFINE_SPINLOCK(user_list_lock); | 404 | static DEFINE_SPINLOCK(user_list_lock); |
| 405 | static DEFINE_MUTEX(apm_mutex); | ||
| 406 | 406 | ||
| 407 | /* | 407 | /* |
| 408 | * Set up a segment that references the real mode segment 0x40 | 408 | * Set up a segment that references the real mode segment 0x40 |
| @@ -1531,7 +1531,7 @@ static long do_ioctl(struct file *filp, u_int cmd, u_long arg) | |||
| 1531 | return -EPERM; | 1531 | return -EPERM; |
| 1532 | switch (cmd) { | 1532 | switch (cmd) { |
| 1533 | case APM_IOC_STANDBY: | 1533 | case APM_IOC_STANDBY: |
| 1534 | lock_kernel(); | 1534 | mutex_lock(&apm_mutex); |
| 1535 | if (as->standbys_read > 0) { | 1535 | if (as->standbys_read > 0) { |
| 1536 | as->standbys_read--; | 1536 | as->standbys_read--; |
| 1537 | as->standbys_pending--; | 1537 | as->standbys_pending--; |
| @@ -1540,10 +1540,10 @@ static long do_ioctl(struct file *filp, u_int cmd, u_long arg) | |||
| 1540 | queue_event(APM_USER_STANDBY, as); | 1540 | queue_event(APM_USER_STANDBY, as); |
| 1541 | if (standbys_pending <= 0) | 1541 | if (standbys_pending <= 0) |
| 1542 | standby(); | 1542 | standby(); |
| 1543 | unlock_kernel(); | 1543 | mutex_unlock(&apm_mutex); |
| 1544 | break; | 1544 | break; |
| 1545 | case APM_IOC_SUSPEND: | 1545 | case APM_IOC_SUSPEND: |
| 1546 | lock_kernel(); | 1546 | mutex_lock(&apm_mutex); |
| 1547 | if (as->suspends_read > 0) { | 1547 | if (as->suspends_read > 0) { |
| 1548 | as->suspends_read--; | 1548 | as->suspends_read--; |
| 1549 | as->suspends_pending--; | 1549 | as->suspends_pending--; |
| @@ -1552,13 +1552,14 @@ static long do_ioctl(struct file *filp, u_int cmd, u_long arg) | |||
| 1552 | queue_event(APM_USER_SUSPEND, as); | 1552 | queue_event(APM_USER_SUSPEND, as); |
| 1553 | if (suspends_pending <= 0) { | 1553 | if (suspends_pending <= 0) { |
| 1554 | ret = suspend(1); | 1554 | ret = suspend(1); |
| 1555 | mutex_unlock(&apm_mutex); | ||
| 1555 | } else { | 1556 | } else { |
| 1556 | as->suspend_wait = 1; | 1557 | as->suspend_wait = 1; |
| 1558 | mutex_unlock(&apm_mutex); | ||
| 1557 | wait_event_interruptible(apm_suspend_waitqueue, | 1559 | wait_event_interruptible(apm_suspend_waitqueue, |
| 1558 | as->suspend_wait == 0); | 1560 | as->suspend_wait == 0); |
| 1559 | ret = as->suspend_result; | 1561 | ret = as->suspend_result; |
| 1560 | } | 1562 | } |
| 1561 | unlock_kernel(); | ||
| 1562 | return ret; | 1563 | return ret; |
| 1563 | default: | 1564 | default: |
| 1564 | return -ENOTTY; | 1565 | return -ENOTTY; |
| @@ -1608,12 +1609,10 @@ static int do_open(struct inode *inode, struct file *filp) | |||
| 1608 | { | 1609 | { |
| 1609 | struct apm_user *as; | 1610 | struct apm_user *as; |
| 1610 | 1611 | ||
| 1611 | lock_kernel(); | ||
| 1612 | as = kmalloc(sizeof(*as), GFP_KERNEL); | 1612 | as = kmalloc(sizeof(*as), GFP_KERNEL); |
| 1613 | if (as == NULL) { | 1613 | if (as == NULL) { |
| 1614 | printk(KERN_ERR "apm: cannot allocate struct of size %d bytes\n", | 1614 | printk(KERN_ERR "apm: cannot allocate struct of size %d bytes\n", |
| 1615 | sizeof(*as)); | 1615 | sizeof(*as)); |
| 1616 | unlock_kernel(); | ||
| 1617 | return -ENOMEM; | 1616 | return -ENOMEM; |
| 1618 | } | 1617 | } |
| 1619 | as->magic = APM_BIOS_MAGIC; | 1618 | as->magic = APM_BIOS_MAGIC; |
| @@ -1635,7 +1634,6 @@ static int do_open(struct inode *inode, struct file *filp) | |||
| 1635 | user_list = as; | 1634 | user_list = as; |
| 1636 | spin_unlock(&user_list_lock); | 1635 | spin_unlock(&user_list_lock); |
| 1637 | filp->private_data = as; | 1636 | filp->private_data = as; |
| 1638 | unlock_kernel(); | ||
| 1639 | return 0; | 1637 | return 0; |
| 1640 | } | 1638 | } |
| 1641 | 1639 | ||
