diff options
Diffstat (limited to 'kernel/power')
| -rw-r--r-- | kernel/power/hibernate.c | 15 | ||||
| -rw-r--r-- | kernel/power/process.c | 16 | ||||
| -rw-r--r-- | kernel/power/suspend.c | 8 | ||||
| -rw-r--r-- | kernel/power/user.c | 4 | 
4 files changed, 14 insertions, 29 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 196c01268eb..ba2319ffc86 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -607,17 +607,6 @@ static void power_down(void)  	while(1);  } -static int prepare_processes(void) -{ -	int error = 0; - -	if (freeze_processes()) { -		error = -EBUSY; -		thaw_processes(); -	} -	return error; -} -  /**   * hibernate - Carry out system hibernation, including saving the image.   */ @@ -650,7 +639,7 @@ int hibernate(void)  	sys_sync();  	printk("done.\n"); -	error = prepare_processes(); +	error = freeze_processes();  	if (error)  		goto Finish; @@ -811,7 +800,7 @@ static int software_resume(void)  		goto close_finish;  	pr_debug("PM: Preparing processes for restore.\n"); -	error = prepare_processes(); +	error = freeze_processes();  	if (error) {  		swsusp_close(FMODE_READ);  		goto Done; diff --git a/kernel/power/process.c b/kernel/power/process.c index e59676f5811..ce643838a00 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -91,11 +91,6 @@ static int try_to_freeze_tasks(bool sig_only)  	elapsed_csecs = elapsed_csecs64;  	if (todo) { -		/* This does not unfreeze processes that are already frozen -		 * (we have slightly ugly calling convention in that respect, -		 * and caller must call thaw_processes() if something fails), -		 * but it cleans up leftover PF_FREEZE requests. -		 */  		printk("\n");  		printk(KERN_ERR "Freezing of tasks %s after %d.%02d seconds "  		       "(%d tasks refusing to freeze, wq_busy=%d):\n", @@ -103,14 +98,11 @@ static int try_to_freeze_tasks(bool sig_only)  		       elapsed_csecs / 100, elapsed_csecs % 100,  		       todo - wq_busy, wq_busy); -		thaw_workqueues(); -  		read_lock(&tasklist_lock);  		do_each_thread(g, p) {  			if (!wakeup && !freezer_should_skip(p) &&  			    freezing(p) && !frozen(p))  				sched_show_task(p); -			cancel_freezing(p);  		} while_each_thread(g, p);  		read_unlock(&tasklist_lock);  	} else { @@ -123,6 +115,8 @@ static int try_to_freeze_tasks(bool sig_only)  /**   * freeze_processes - Signal user space processes to enter the refrigerator. + * + * On success, returns 0.  On failure, -errno and system is fully thawed.   */  int freeze_processes(void)  { @@ -137,11 +131,15 @@ int freeze_processes(void)  	printk("\n");  	BUG_ON(in_atomic()); +	if (error) +		thaw_processes();  	return error;  }  /**   * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. + * + * On success, returns 0.  On failure, -errno and system is fully thawed.   */  int freeze_kernel_threads(void)  { @@ -155,6 +153,8 @@ int freeze_kernel_threads(void)  	printk("\n");  	BUG_ON(in_atomic()); +	if (error) +		thaw_processes();  	return error;  } diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 4953dc054c5..d336b27d110 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -106,13 +106,11 @@ static int suspend_prepare(void)  		goto Finish;  	error = suspend_freeze_processes(); -	if (error) { -		suspend_stats.failed_freeze++; -		dpm_save_failed_step(SUSPEND_FREEZE); -	} else +	if (!error)  		return 0; -	suspend_thaw_processes(); +	suspend_stats.failed_freeze++; +	dpm_save_failed_step(SUSPEND_FREEZE);  	usermodehelper_enable();   Finish:  	pm_notifier_call_chain(PM_POST_SUSPEND); diff --git a/kernel/power/user.c b/kernel/power/user.c index 6d8f535c2b8..7cc3f5bc5c2 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c @@ -257,10 +257,8 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,  			break;  		error = freeze_processes(); -		if (error) { -			thaw_processes(); +		if (error)  			usermodehelper_enable(); -		}  		if (!error)  			data->frozen = 1;  		break;  |