The power management semaphore is only used as mutex, so convert it.
[akpm@osdl.org: fix rotten bug]
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Acked-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Pavel Machek <pavel@ucw.cz>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
if (!swsusp_resume_device) {
if (!strlen(resume_file)) {
if (!swsusp_resume_device) {
if (!strlen(resume_file)) {
+ mutex_unlock(&pm_mutex);
return -ENOENT;
}
swsusp_resume_device = name_to_dev_t(resume_file);
return -ENOENT;
}
swsusp_resume_device = name_to_dev_t(resume_file);
* FIXME: If noresume is specified, we need to find the partition
* and reset it back to normal swap space.
*/
* FIXME: If noresume is specified, we need to find the partition
* and reset it back to normal swap space.
*/
+ mutex_unlock(&pm_mutex);
unprepare_processes();
Done:
/* For success case, the suspend path will release the lock */
unprepare_processes();
Done:
/* For success case, the suspend path will release the lock */
+ mutex_unlock(&pm_mutex);
pr_debug("PM: Resume from disk failed.\n");
return 0;
}
pr_debug("PM: Resume from disk failed.\n");
return 0;
}
p = memchr(buf, '\n', n);
len = p ? p - buf : n;
p = memchr(buf, '\n', n);
len = p ? p - buf : n;
for (i = PM_DISK_FIRMWARE; i < PM_DISK_MAX; i++) {
if (!strncmp(buf, pm_disk_modes[i], len)) {
mode = i;
for (i = PM_DISK_FIRMWARE; i < PM_DISK_MAX; i++) {
if (!strncmp(buf, pm_disk_modes[i], len)) {
mode = i;
pr_debug("PM: suspend-to-disk mode set to '%s'\n",
pm_disk_modes[mode]);
pr_debug("PM: suspend-to-disk mode set to '%s'\n",
pm_disk_modes[mode]);
+ mutex_unlock(&pm_mutex);
return error ? error : n;
}
return error ? error : n;
}
if (maj != MAJOR(res) || min != MINOR(res))
goto out;
if (maj != MAJOR(res) || min != MINOR(res))
goto out;
swsusp_resume_device = res;
swsusp_resume_device = res;
+ mutex_unlock(&pm_mutex);
printk("Attempting manual resume\n");
noresume = 0;
software_resume();
printk("Attempting manual resume\n");
noresume = 0;
software_resume();
/*This is just an arbitrary number */
#define FREE_PAGE_NUMBER (100)
/*This is just an arbitrary number */
#define FREE_PAGE_NUMBER (100)
struct pm_ops *pm_ops;
suspend_disk_method_t pm_disk_mode = PM_DISK_SHUTDOWN;
struct pm_ops *pm_ops;
suspend_disk_method_t pm_disk_mode = PM_DISK_SHUTDOWN;
void pm_set_ops(struct pm_ops * ops)
{
void pm_set_ops(struct pm_ops * ops)
{
+ mutex_unlock(&pm_mutex);
if (!valid_state(state))
return -ENODEV;
if (!valid_state(state))
return -ENODEV;
- if (down_trylock(&pm_sem))
+ if (!mutex_trylock(&pm_mutex))
return -EBUSY;
if (state == PM_SUSPEND_DISK) {
return -EBUSY;
if (state == PM_SUSPEND_DISK) {
pr_debug("PM: Finishing wakeup.\n");
suspend_finish(state);
Unlock:
pr_debug("PM: Finishing wakeup.\n");
suspend_finish(state);
Unlock:
+ mutex_unlock(&pm_mutex);
-extern struct semaphore pm_sem;
+
+extern struct mutex pm_mutex;
+
#define power_attr(_name) \
static struct subsys_attribute _name##_attr = { \
.attr = { \
#define power_attr(_name) \
static struct subsys_attribute _name##_attr = { \
.attr = { \
free_all_swap_pages(data->swap, data->bitmap);
free_bitmap(data->bitmap);
if (data->frozen) {
free_all_swap_pages(data->swap, data->bitmap);
free_bitmap(data->bitmap);
if (data->frozen) {
thaw_processes();
enable_nonboot_cpus();
thaw_processes();
enable_nonboot_cpus();
+ mutex_unlock(&pm_mutex);
}
atomic_inc(&device_available);
return 0;
}
atomic_inc(&device_available);
return 0;
case SNAPSHOT_FREEZE:
if (data->frozen)
break;
case SNAPSHOT_FREEZE:
if (data->frozen)
break;
error = disable_nonboot_cpus();
if (!error) {
error = freeze_processes();
error = disable_nonboot_cpus();
if (!error) {
error = freeze_processes();
+ mutex_unlock(&pm_mutex);
if (!error)
data->frozen = 1;
break;
if (!error)
data->frozen = 1;
break;
case SNAPSHOT_UNFREEZE:
if (!data->frozen)
break;
case SNAPSHOT_UNFREEZE:
if (!data->frozen)
break;
thaw_processes();
enable_nonboot_cpus();
thaw_processes();
enable_nonboot_cpus();
+ mutex_unlock(&pm_mutex);
/* Free memory before shutting down devices. */
error = swsusp_shrink_memory();
if (!error) {
/* Free memory before shutting down devices. */
error = swsusp_shrink_memory();
if (!error) {
+ mutex_unlock(&pm_mutex);
if (!error)
error = put_user(in_suspend, (unsigned int __user *)arg);
if (!error)
if (!error)
error = put_user(in_suspend, (unsigned int __user *)arg);
if (!error)
pm_prepare_console();
suspend_console();
error = device_suspend(PMSG_PRETHAW);
pm_prepare_console();
suspend_console();
error = device_suspend(PMSG_PRETHAW);
}
resume_console();
pm_restore_console();
}
resume_console();
pm_restore_console();
+ mutex_unlock(&pm_mutex);
break;
case SNAPSHOT_FREE:
break;
case SNAPSHOT_FREE:
- if (down_trylock(&pm_sem)) {
+ if (!mutex_trylock(&pm_mutex)) {
pm_ops->finish(PM_SUSPEND_MEM);
OutS3:
pm_ops->finish(PM_SUSPEND_MEM);
OutS3:
+ mutex_unlock(&pm_mutex);
break;
case SNAPSHOT_PMOPS:
break;
case SNAPSHOT_PMOPS: