|
@@ -67,6 +67,7 @@ atomic_t snapshot_device_available = ATOMIC_INIT(1);
|
|
|
static int snapshot_open(struct inode *inode, struct file *filp)
|
|
|
{
|
|
|
struct snapshot_data *data;
|
|
|
+ int error;
|
|
|
|
|
|
if (!atomic_add_unless(&snapshot_device_available, -1, 0))
|
|
|
return -EBUSY;
|
|
@@ -87,9 +88,19 @@ static int snapshot_open(struct inode *inode, struct file *filp)
|
|
|
data->swap = swsusp_resume_device ?
|
|
|
swap_type_of(swsusp_resume_device, 0, NULL) : -1;
|
|
|
data->mode = O_RDONLY;
|
|
|
+ error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
|
|
|
+ if (error)
|
|
|
+ pm_notifier_call_chain(PM_POST_RESTORE);
|
|
|
} else {
|
|
|
data->swap = -1;
|
|
|
data->mode = O_WRONLY;
|
|
|
+ error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
|
|
|
+ if (error)
|
|
|
+ pm_notifier_call_chain(PM_POST_HIBERNATION);
|
|
|
+ }
|
|
|
+ if (error) {
|
|
|
+ atomic_inc(&snapshot_device_available);
|
|
|
+ return error;
|
|
|
}
|
|
|
data->frozen = 0;
|
|
|
data->ready = 0;
|
|
@@ -111,6 +122,8 @@ static int snapshot_release(struct inode *inode, struct file *filp)
|
|
|
thaw_processes();
|
|
|
mutex_unlock(&pm_mutex);
|
|
|
}
|
|
|
+ pm_notifier_call_chain(data->mode == O_WRONLY ?
|
|
|
+ PM_POST_HIBERNATION : PM_POST_RESTORE);
|
|
|
atomic_inc(&snapshot_device_available);
|
|
|
return 0;
|
|
|
}
|
|
@@ -174,18 +187,13 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
|
|
|
if (data->frozen)
|
|
|
break;
|
|
|
mutex_lock(&pm_mutex);
|
|
|
- error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
|
|
|
- if (!error) {
|
|
|
- printk("Syncing filesystems ... ");
|
|
|
- sys_sync();
|
|
|
- printk("done.\n");
|
|
|
-
|
|
|
- error = freeze_processes();
|
|
|
- if (error)
|
|
|
- thaw_processes();
|
|
|
- }
|
|
|
+ printk("Syncing filesystems ... ");
|
|
|
+ sys_sync();
|
|
|
+ printk("done.\n");
|
|
|
+
|
|
|
+ error = freeze_processes();
|
|
|
if (error)
|
|
|
- pm_notifier_call_chain(PM_POST_HIBERNATION);
|
|
|
+ thaw_processes();
|
|
|
mutex_unlock(&pm_mutex);
|
|
|
if (!error)
|
|
|
data->frozen = 1;
|
|
@@ -196,7 +204,6 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
|
|
|
break;
|
|
|
mutex_lock(&pm_mutex);
|
|
|
thaw_processes();
|
|
|
- pm_notifier_call_chain(PM_POST_HIBERNATION);
|
|
|
mutex_unlock(&pm_mutex);
|
|
|
data->frozen = 0;
|
|
|
break;
|