Skip to content

Commit 57ea3ab

Browse files
committed
Merge branch 'pm-sleep'
Merge hibernation test mode fix for 6.4-rc1. * pm-sleep: PM: hibernate: Do not get block device exclusively in test_resume mode PM: hibernate: Turn snapshot_test into global variable
2 parents bd44682 + 5904de0 commit 57ea3ab

3 files changed

Lines changed: 19 additions & 5 deletions

File tree

kernel/power/hibernate.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ enum {
6464
static int hibernation_mode = HIBERNATION_SHUTDOWN;
6565

6666
bool freezer_test_done;
67+
bool snapshot_test;
6768

6869
static const struct platform_hibernation_ops *hibernation_ops;
6970

@@ -687,18 +688,22 @@ static int load_image_and_restore(void)
687688
{
688689
int error;
689690
unsigned int flags;
691+
fmode_t mode = FMODE_READ;
692+
693+
if (snapshot_test)
694+
mode |= FMODE_EXCL;
690695

691696
pm_pr_dbg("Loading hibernation image.\n");
692697

693698
lock_device_hotplug();
694699
error = create_basic_memory_bitmaps();
695700
if (error) {
696-
swsusp_close(FMODE_READ | FMODE_EXCL);
701+
swsusp_close(mode);
697702
goto Unlock;
698703
}
699704

700705
error = swsusp_read(&flags);
701-
swsusp_close(FMODE_READ | FMODE_EXCL);
706+
swsusp_close(mode);
702707
if (!error)
703708
error = hibernation_restore(flags & SF_PLATFORM_MODE);
704709

@@ -716,7 +721,6 @@ static int load_image_and_restore(void)
716721
*/
717722
int hibernate(void)
718723
{
719-
bool snapshot_test = false;
720724
unsigned int sleep_flags;
721725
int error;
722726

@@ -744,6 +748,9 @@ int hibernate(void)
744748
if (error)
745749
goto Exit;
746750

751+
/* protected by system_transition_mutex */
752+
snapshot_test = false;
753+
747754
lock_device_hotplug();
748755
/* Allocate memory management structures */
749756
error = create_basic_memory_bitmaps();
@@ -940,6 +947,8 @@ static int software_resume(void)
940947
*/
941948
mutex_lock_nested(&system_transition_mutex, SINGLE_DEPTH_NESTING);
942949

950+
snapshot_test = false;
951+
943952
if (swsusp_resume_device)
944953
goto Check_image;
945954

kernel/power/power.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ asmlinkage int swsusp_save(void);
5959

6060
/* kernel/power/hibernate.c */
6161
extern bool freezer_test_done;
62+
extern bool snapshot_test;
6263

6364
extern int hibernation_snapshot(int platform_mode);
6465
extern int hibernation_restore(int platform_mode);

kernel/power/swap.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,9 +1518,13 @@ int swsusp_check(void)
15181518
{
15191519
int error;
15201520
void *holder;
1521+
fmode_t mode = FMODE_READ;
1522+
1523+
if (snapshot_test)
1524+
mode |= FMODE_EXCL;
15211525

15221526
hib_resume_bdev = blkdev_get_by_dev(swsusp_resume_device,
1523-
FMODE_READ | FMODE_EXCL, &holder);
1527+
mode, &holder);
15241528
if (!IS_ERR(hib_resume_bdev)) {
15251529
set_blocksize(hib_resume_bdev, PAGE_SIZE);
15261530
clear_page(swsusp_header);
@@ -1547,7 +1551,7 @@ int swsusp_check(void)
15471551

15481552
put:
15491553
if (error)
1550-
blkdev_put(hib_resume_bdev, FMODE_READ | FMODE_EXCL);
1554+
blkdev_put(hib_resume_bdev, mode);
15511555
else
15521556
pr_debug("Image signature found, resuming\n");
15531557
} else {

0 commit comments

Comments
 (0)