mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
PM: hibernate: Fix the exclusive get block device in test_resume mode
Commit5904de0d73
("PM: hibernate: Do not get block device exclusively in test_resume mode") fixes a hibernation issue under test_resume mode. That commit is supposed to open the block device in non-exclusive mode when in test_resume. However the code does the opposite, which is against its description. In summary, the swap device is only opened exclusively by swsusp_check() with its corresponding *close(), and must be in non test_resume mode. This is to avoid the race condition that different processes scribble the device at the same time. All the other cases should use non-exclusive mode. Fix it by really disabling exclusive mode under test_resume. Fixes:5904de0d73
("PM: hibernate: Do not get block device exclusively in test_resume mode") Closes: https://lore.kernel.org/lkml/000000000000761f5f0603324129@google.com/ Reported-by: Pengfei Xu <pengfei.xu@intel.com> Signed-off-by: Chen Yu <yu.c.chen@intel.com> Tested-by: Chenzhou Feng <chenzhoux.feng@intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
40d84e198b
commit
148b6f4cc3
@ -786,9 +786,9 @@ int hibernate(void)
|
||||
unlock_device_hotplug();
|
||||
if (snapshot_test) {
|
||||
pm_pr_dbg("Checking hibernation image\n");
|
||||
error = swsusp_check(snapshot_test);
|
||||
error = swsusp_check(false);
|
||||
if (!error)
|
||||
error = load_image_and_restore(snapshot_test);
|
||||
error = load_image_and_restore(false);
|
||||
}
|
||||
thaw_processes();
|
||||
|
||||
@ -945,14 +945,14 @@ static int software_resume(void)
|
||||
pm_pr_dbg("Looking for hibernation image.\n");
|
||||
|
||||
mutex_lock(&system_transition_mutex);
|
||||
error = swsusp_check(false);
|
||||
error = swsusp_check(true);
|
||||
if (error)
|
||||
goto Unlock;
|
||||
|
||||
/* The snapshot device should not be opened while we're running */
|
||||
if (!hibernate_acquire()) {
|
||||
error = -EBUSY;
|
||||
swsusp_close(false);
|
||||
swsusp_close(true);
|
||||
goto Unlock;
|
||||
}
|
||||
|
||||
@ -973,7 +973,7 @@ static int software_resume(void)
|
||||
goto Close_Finish;
|
||||
}
|
||||
|
||||
error = load_image_and_restore(false);
|
||||
error = load_image_and_restore(true);
|
||||
thaw_processes();
|
||||
Finish:
|
||||
pm_notifier_call_chain(PM_POST_RESTORE);
|
||||
@ -987,7 +987,7 @@ static int software_resume(void)
|
||||
pm_pr_dbg("Hibernation image not present or could not be loaded.\n");
|
||||
return error;
|
||||
Close_Finish:
|
||||
swsusp_close(false);
|
||||
swsusp_close(true);
|
||||
goto Finish;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user