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

Commit c751085943 ("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>
This commit is contained in:
Rafael J. Wysocki 2009-04-25 00:16:06 +02:00 коммит произвёл Linus Torvalds
Родитель 4b2b0b9753
Коммит 0c8454f566
1 изменённых файлов: 27 добавлений и 24 удалений

Просмотреть файл

@ -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,32 +656,42 @@ 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)
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 (!swsusp_resume_device) {
if (!strlen(resume_file)) {
mutex_unlock(&pm_mutex);
return -ENOENT;
}
/* /*
* 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) { Check_image:
/** pr_debug("PM: Resume from partition %d:%d\n",
* FIXME: If noresume is specified, we need to find the MAJOR(swsusp_resume_device), MINOR(swsusp_resume_device));
* partition and reset it back to normal swap space.
*/
mutex_unlock(&pm_mutex);
return 0;
}
pr_debug("PM: Checking hibernation image.\n"); pr_debug("PM: Checking hibernation image.\n");
error = swsusp_check(); error = swsusp_check();