On Tue, May 23, 2023 at 9:45 AM Christoph Hellwig <hch@xxxxxx> wrote: > > 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@xxxxxx> Acked-by: Rafael J. Wysocki <rafael@xxxxxxxxxx> > --- > kernel/power/hibernate.c | 72 +++++++++++++++++++++------------------- > 1 file changed, 37 insertions(+), 35 deletions(-) > > diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c > index 30d1274f03f625..07279506366255 100644 > --- a/kernel/power/hibernate.c > +++ b/kernel/power/hibernate.c > @@ -910,6 +910,41 @@ int hibernate_quiet_exec(int (*func)(void *data), void *data) > } > 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)); > > -- > 2.39.2 >