Skip to content

Commit

Permalink
PM/Hibernate: Fix waiting for image device to appear on resume
Browse files Browse the repository at this point in the history
Commit c751085 ("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: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
rjwysocki authored and torvalds committed Apr 24, 2009
1 parent 4b2b0b9 commit 0c8454f
Showing 1 changed file with 27 additions and 24 deletions.
51 changes: 27 additions & 24 deletions kernel/power/disk.c
Expand Up @@ -645,13 +645,6 @@ static int software_resume(void)
if (noresume)
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
* is configured into the kernel. Since the regular hibernate
Expand All @@ -663,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();
Expand Down

0 comments on commit 0c8454f

Please sign in to comment.