diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/power/disk.c | 8 | ||||
| -rw-r--r-- | kernel/power/user.c | 9 |
2 files changed, 17 insertions, 0 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 5f21ab2bbcdf..0854770b63b9 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/console.h> | 22 | #include <linux/console.h> |
| 23 | #include <linux/cpu.h> | 23 | #include <linux/cpu.h> |
| 24 | #include <linux/freezer.h> | 24 | #include <linux/freezer.h> |
| 25 | #include <scsi/scsi_scan.h> | ||
| 25 | #include <asm/suspend.h> | 26 | #include <asm/suspend.h> |
| 26 | 27 | ||
| 27 | #include "power.h" | 28 | #include "power.h" |
| @@ -645,6 +646,13 @@ static int software_resume(void) | |||
| 645 | return 0; | 646 | return 0; |
| 646 | 647 | ||
| 647 | /* | 648 | /* |
| 649 | * We can't depend on SCSI devices being available after loading one of | ||
| 650 | * their modules if scsi_complete_async_scans() is not called and the | ||
| 651 | * resume device usually is a SCSI one. | ||
| 652 | */ | ||
| 653 | scsi_complete_async_scans(); | ||
| 654 | |||
| 655 | /* | ||
| 648 | * name_to_dev_t() below takes a sysfs buffer mutex when sysfs | 656 | * name_to_dev_t() below takes a sysfs buffer mutex when sysfs |
| 649 | * is configured into the kernel. Since the regular hibernate | 657 | * is configured into the kernel. Since the regular hibernate |
| 650 | * trigger path is via sysfs which takes a buffer mutex before | 658 | * trigger path is via sysfs which takes a buffer mutex before |
diff --git a/kernel/power/user.c b/kernel/power/user.c index 6c85359364f2..ed97375daae9 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/cpu.h> | 24 | #include <linux/cpu.h> |
| 25 | #include <linux/freezer.h> | 25 | #include <linux/freezer.h> |
| 26 | #include <linux/smp_lock.h> | 26 | #include <linux/smp_lock.h> |
| 27 | #include <scsi/scsi_scan.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/uaccess.h> | 29 | #include <asm/uaccess.h> |
| 29 | 30 | ||
| @@ -92,6 +93,7 @@ static int snapshot_open(struct inode *inode, struct file *filp) | |||
| 92 | filp->private_data = data; | 93 | filp->private_data = data; |
| 93 | memset(&data->handle, 0, sizeof(struct snapshot_handle)); | 94 | memset(&data->handle, 0, sizeof(struct snapshot_handle)); |
| 94 | if ((filp->f_flags & O_ACCMODE) == O_RDONLY) { | 95 | if ((filp->f_flags & O_ACCMODE) == O_RDONLY) { |
| 96 | /* Hibernating. The image device should be accessible. */ | ||
| 95 | data->swap = swsusp_resume_device ? | 97 | data->swap = swsusp_resume_device ? |
| 96 | swap_type_of(swsusp_resume_device, 0, NULL) : -1; | 98 | swap_type_of(swsusp_resume_device, 0, NULL) : -1; |
| 97 | data->mode = O_RDONLY; | 99 | data->mode = O_RDONLY; |
| @@ -99,6 +101,13 @@ static int snapshot_open(struct inode *inode, struct file *filp) | |||
| 99 | if (error) | 101 | if (error) |
| 100 | pm_notifier_call_chain(PM_POST_HIBERNATION); | 102 | pm_notifier_call_chain(PM_POST_HIBERNATION); |
| 101 | } else { | 103 | } else { |
| 104 | /* | ||
| 105 | * Resuming. We may need to wait for the image device to | ||
| 106 | * appear. | ||
| 107 | */ | ||
| 108 | wait_for_device_probe(); | ||
| 109 | scsi_complete_async_scans(); | ||
| 110 | |||
| 102 | data->swap = -1; | 111 | data->swap = -1; |
| 103 | data->mode = O_WRONLY; | 112 | data->mode = O_WRONLY; |
| 104 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); | 113 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); |
