PM: hibernate: factor out a helper to find the resume device

Split the logic to find the resume device out software_resume and into
a separate helper to start unwindig the convoluted goto logic.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Rafael J. Wysocki <rafael@kernel.org>
Link: https://lore.kernel.org/r/20230531125535.676098-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Christoph Hellwig 2023-05-31 14:55:13 +02:00 коммит произвёл Jens Axboe
Родитель aa5f6ed8c2
Коммит 02b42d58f3
1 изменённых файлов: 37 добавлений и 35 удалений

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

@ -910,6 +910,41 @@ unlock:
}
EXPORT_SYMBOL_GPL(hibernate_quiet_exec);
static int find_resume_device(void)
{
if (!strlen(resume_file))
return -ENOENT;
pm_pr_dbg("Checking hibernation image partition %s\n", resume_file);
if (resume_delay) {
pr_info("Waiting %dsec before reading resume device ...\n",
resume_delay);
ssleep(resume_delay);
}
/* Check if the device is there */
swsusp_resume_device = name_to_dev_t(resume_file);
if (swsusp_resume_device)
return 0;
/*
* Some device discovery might still be in progress; we need to wait for
* this to finish.
*/
wait_for_device_probe();
if (resume_wait) {
while (!(swsusp_resume_device = name_to_dev_t(resume_file)))
msleep(10);
async_synchronize_full();
}
swsusp_resume_device = name_to_dev_t(resume_file);
if (!swsusp_resume_device)
return -ENODEV;
return 0;
}
/**
* software_resume - Resume from a saved hibernation image.
*
@ -949,45 +984,12 @@ static int software_resume(void)
snapshot_test = false;
if (swsusp_resume_device)
goto Check_image;
if (!strlen(resume_file)) {
error = -ENOENT;
goto Unlock;
}
pm_pr_dbg("Checking hibernation image partition %s\n", resume_file);
if (resume_delay) {
pr_info("Waiting %dsec before reading resume device ...\n",
resume_delay);
ssleep(resume_delay);
}
/* 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
* to wait for this to finish.
*/
wait_for_device_probe();
if (resume_wait) {
while ((swsusp_resume_device = name_to_dev_t(resume_file)) == 0)
msleep(10);
async_synchronize_full();
}
swsusp_resume_device = name_to_dev_t(resume_file);
if (!swsusp_resume_device) {
error = -ENODEV;
error = find_resume_device();
if (error)
goto Unlock;
}
}
Check_image:
pm_pr_dbg("Hibernation image partition %d:%d present\n",
MAJOR(swsusp_resume_device), MINOR(swsusp_resume_device));