Commit 0c8454f5 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Linus Torvalds

PM/Hibernate: Fix waiting for image device to appear on resume

Commit c7510859 ("PM/Hibernate: Wait for
SCSI devices scan to complete during resume") added a call to
scsi_complete_async_scans() to software_resume(), so that it waited for
the SCSI scanning to complete, but the call was added at a wrong place.

Namely, it should have been added after wait_for_device_probe(), which
is called only if the image partition hasn't been specified yet.  Also,
it's reasonable to check if the image partition is present and only wait
for the device probing and SCSI scanning to complete if it is not the
case.

Additionally, since noresume is checked right at the beginning of
software_resume() and the function returns immediately if it's set, it
doesn't make sense to check it once again later.
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4b2b0b97
...@@ -645,13 +645,6 @@ static int software_resume(void) ...@@ -645,13 +645,6 @@ static int software_resume(void)
if (noresume) if (noresume)
return 0; return 0;
/*
* We can't depend on SCSI devices being available after loading one of
* their modules if scsi_complete_async_scans() is not called and the
* resume device usually is a SCSI one.
*/
scsi_complete_async_scans();
/* /*
* name_to_dev_t() below takes a sysfs buffer mutex when sysfs * name_to_dev_t() below takes a sysfs buffer mutex when sysfs
* is configured into the kernel. Since the regular hibernate * is configured into the kernel. Since the regular hibernate
...@@ -663,33 +656,43 @@ static int software_resume(void) ...@@ -663,33 +656,43 @@ static int software_resume(void)
* here to avoid lockdep complaining. * here to avoid lockdep complaining.
*/ */
mutex_lock_nested(&pm_mutex, SINGLE_DEPTH_NESTING); mutex_lock_nested(&pm_mutex, SINGLE_DEPTH_NESTING);
if (!swsusp_resume_device) {
if (swsusp_resume_device)
goto Check_image;
if (!strlen(resume_file)) { if (!strlen(resume_file)) {
mutex_unlock(&pm_mutex); error = -ENOENT;
return -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) {
/* /*
* Some device discovery might still be in progress; we need * Some device discovery might still be in progress; we need
* to wait for this to finish. * to wait for this to finish.
*/ */
wait_for_device_probe(); 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); swsusp_resume_device = name_to_dev_t(resume_file);
pr_debug("PM: Resume from partition %s\n", resume_file); if (!swsusp_resume_device) {
} else { error = -ENODEV;
pr_debug("PM: Resume from partition %d:%d\n", goto Unlock;
MAJOR(swsusp_resume_device),
MINOR(swsusp_resume_device));
} }
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"); pr_debug("PM: Checking hibernation image.\n");
error = swsusp_check(); error = swsusp_check();
if (error) if (error)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment