diff options
Diffstat (limited to 'kernel/power/user.c')
-rw-r--r-- | kernel/power/user.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/kernel/power/user.c b/kernel/power/user.c index b902a7e3bd12..f5512cb3aa86 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
@@ -67,6 +67,7 @@ atomic_t snapshot_device_available = ATOMIC_INIT(1); | |||
67 | static int snapshot_open(struct inode *inode, struct file *filp) | 67 | static int snapshot_open(struct inode *inode, struct file *filp) |
68 | { | 68 | { |
69 | struct snapshot_data *data; | 69 | struct snapshot_data *data; |
70 | int error; | ||
70 | 71 | ||
71 | if (!atomic_add_unless(&snapshot_device_available, -1, 0)) | 72 | if (!atomic_add_unless(&snapshot_device_available, -1, 0)) |
72 | return -EBUSY; | 73 | return -EBUSY; |
@@ -87,9 +88,19 @@ static int snapshot_open(struct inode *inode, struct file *filp) | |||
87 | data->swap = swsusp_resume_device ? | 88 | data->swap = swsusp_resume_device ? |
88 | swap_type_of(swsusp_resume_device, 0, NULL) : -1; | 89 | swap_type_of(swsusp_resume_device, 0, NULL) : -1; |
89 | data->mode = O_RDONLY; | 90 | data->mode = O_RDONLY; |
91 | error = pm_notifier_call_chain(PM_RESTORE_PREPARE); | ||
92 | if (error) | ||
93 | pm_notifier_call_chain(PM_POST_RESTORE); | ||
90 | } else { | 94 | } else { |
91 | data->swap = -1; | 95 | data->swap = -1; |
92 | data->mode = O_WRONLY; | 96 | data->mode = O_WRONLY; |
97 | error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE); | ||
98 | if (error) | ||
99 | pm_notifier_call_chain(PM_POST_HIBERNATION); | ||
100 | } | ||
101 | if (error) { | ||
102 | atomic_inc(&snapshot_device_available); | ||
103 | return error; | ||
93 | } | 104 | } |
94 | data->frozen = 0; | 105 | data->frozen = 0; |
95 | data->ready = 0; | 106 | data->ready = 0; |
@@ -111,6 +122,8 @@ static int snapshot_release(struct inode *inode, struct file *filp) | |||
111 | thaw_processes(); | 122 | thaw_processes(); |
112 | mutex_unlock(&pm_mutex); | 123 | mutex_unlock(&pm_mutex); |
113 | } | 124 | } |
125 | pm_notifier_call_chain(data->mode == O_WRONLY ? | ||
126 | PM_POST_HIBERNATION : PM_POST_RESTORE); | ||
114 | atomic_inc(&snapshot_device_available); | 127 | atomic_inc(&snapshot_device_available); |
115 | return 0; | 128 | return 0; |
116 | } | 129 | } |
@@ -174,18 +187,13 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
174 | if (data->frozen) | 187 | if (data->frozen) |
175 | break; | 188 | break; |
176 | mutex_lock(&pm_mutex); | 189 | mutex_lock(&pm_mutex); |
177 | error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE); | 190 | printk("Syncing filesystems ... "); |
178 | if (!error) { | 191 | sys_sync(); |
179 | printk("Syncing filesystems ... "); | 192 | printk("done.\n"); |
180 | sys_sync(); | 193 | |
181 | printk("done.\n"); | 194 | error = freeze_processes(); |
182 | |||
183 | error = freeze_processes(); | ||
184 | if (error) | ||
185 | thaw_processes(); | ||
186 | } | ||
187 | if (error) | 195 | if (error) |
188 | pm_notifier_call_chain(PM_POST_HIBERNATION); | 196 | thaw_processes(); |
189 | mutex_unlock(&pm_mutex); | 197 | mutex_unlock(&pm_mutex); |
190 | if (!error) | 198 | if (!error) |
191 | data->frozen = 1; | 199 | data->frozen = 1; |
@@ -196,7 +204,6 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
196 | break; | 204 | break; |
197 | mutex_lock(&pm_mutex); | 205 | mutex_lock(&pm_mutex); |
198 | thaw_processes(); | 206 | thaw_processes(); |
199 | pm_notifier_call_chain(PM_POST_HIBERNATION); | ||
200 | mutex_unlock(&pm_mutex); | 207 | mutex_unlock(&pm_mutex); |
201 | data->frozen = 0; | 208 | data->frozen = 0; |
202 | break; | 209 | break; |