diff options
Diffstat (limited to 'kernel/power/disk.c')
| -rw-r--r-- | kernel/power/disk.c | 45 | 
1 files changed, 28 insertions, 17 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 5f21ab2bbcd..e71ca9cd81b 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c @@ -22,6 +22,7 @@  #include <linux/console.h>  #include <linux/cpu.h>  #include <linux/freezer.h> +#include <scsi/scsi_scan.h>  #include <asm/suspend.h>  #include "power.h" @@ -655,32 +656,42 @@ static int software_resume(void)  	 * here to avoid lockdep complaining.  	 */  	mutex_lock_nested(&pm_mutex, SINGLE_DEPTH_NESTING); + +	if (swsusp_resume_device) +		goto Check_image; + +	if (!strlen(resume_file)) { +		error = -ENOENT; +		goto Unlock; +	} + +	pr_debug("PM: Checking image partition %s\n", resume_file); + +	/* Check if the device is there */ +	swsusp_resume_device = name_to_dev_t(resume_file);  	if (!swsusp_resume_device) { -		if (!strlen(resume_file)) { -			mutex_unlock(&pm_mutex); -			return -ENOENT; -		}  		/*  		 * Some device discovery might still be in progress; we need  		 * to wait for this to finish.  		 */  		wait_for_device_probe(); +		/* +		 * We can't depend on SCSI devices being available after loading +		 * one of their modules until scsi_complete_async_scans() is +		 * called and the resume device usually is a SCSI one. +		 */ +		scsi_complete_async_scans(); +  		swsusp_resume_device = name_to_dev_t(resume_file); -		pr_debug("PM: Resume from partition %s\n", resume_file); -	} else { -		pr_debug("PM: Resume from partition %d:%d\n", -				MAJOR(swsusp_resume_device), -				MINOR(swsusp_resume_device)); +		if (!swsusp_resume_device) { +			error = -ENODEV; +			goto Unlock; +		}  	} -	if (noresume) { -		/** -		 * FIXME: If noresume is specified, we need to find the -		 * partition and reset it back to normal swap space. -		 */ -		mutex_unlock(&pm_mutex); -		return 0; -	} + Check_image: +	pr_debug("PM: Resume from partition %d:%d\n", +		MAJOR(swsusp_resume_device), MINOR(swsusp_resume_device));  	pr_debug("PM: Checking hibernation image.\n");  	error = swsusp_check();  | 
