File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 6464static int hibernation_mode = HIBERNATION_SHUTDOWN ;
6565
6666bool freezer_test_done ;
67+ bool snapshot_test ;
6768
6869static 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 */
717722int 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
Original file line number Diff line number Diff line change @@ -59,6 +59,7 @@ asmlinkage int swsusp_save(void);
5959
6060/* kernel/power/hibernate.c */
6161extern bool freezer_test_done ;
62+ extern bool snapshot_test ;
6263
6364extern int hibernation_snapshot (int platform_mode );
6465extern int hibernation_restore (int platform_mode );
Original file line number Diff line number Diff 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
15481552put :
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 {
You can’t perform that action at this time.
0 commit comments