14 #include <linux/reboot.h>
15 #include <linux/string.h>
16 #include <linux/device.h>
28 #include <asm/uaccess.h>
33 #define SNAPSHOT_MINOR 231
35 static struct snapshot_data {
41 char platform_support;
48 struct snapshot_data *
data;
53 if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
69 data = &snapshot_state;
99 data->platform_support = 0;
102 unlock_system_sleep();
107 static int snapshot_release(
struct inode *inode,
struct file *filp)
109 struct snapshot_data *
data;
121 pm_notifier_call_chain(data->mode ==
O_RDONLY ?
125 unlock_system_sleep();
131 size_t count, loff_t *offp)
133 struct snapshot_data *
data;
158 unlock_system_sleep();
163 static ssize_t snapshot_write(
struct file *filp,
const char __user *buf,
164 size_t count, loff_t *offp)
166 struct snapshot_data *
data;
187 unlock_system_sleep();
192 static long snapshot_ioctl(
struct file *filp,
unsigned int cmd,
196 struct snapshot_data *
data;
218 printk(
"Syncing filesystems ... ");
228 if (!data->frozen || data->ready)
236 if (data->mode !=
O_RDONLY || !data->frozen || data->ready) {
243 error =
put_user(in_suspend, (
int __user *)arg);
251 if (data->mode !=
O_WRONLY || !data->frozen ||
285 error =
put_user(size, (loff_t __user *)arg);
289 size = count_swap_pages(data->swap, 1);
291 error =
put_user(size, (loff_t __user *)arg);
302 error =
put_user(offset, (loff_t __user *)arg);
330 data->platform_support = !!
arg;
334 if (data->platform_support)
356 swdev = new_decode_dev(swap_area.dev);
358 offset = swap_area.offset;
359 data->swap = swap_type_of(swdev, offset,
NULL);
381 struct compat_resume_swap_area {
387 snapshot_compat_ioctl(
struct file *
file,
unsigned int cmd,
unsigned long arg)
402 err = snapshot_ioctl(file, cmd, (
unsigned long) &offset);
404 if (!err &&
put_user(offset, uoffset))
410 return snapshot_ioctl(file, cmd,
411 (
unsigned long) compat_ptr(arg));
414 struct compat_resume_swap_area
__user *u_swap_area =
420 err =
get_user(swap_area.offset, &u_swap_area->offset);
421 err |=
get_user(swap_area.dev, &u_swap_area->dev);
427 (
unsigned long) &swap_area);
433 return snapshot_ioctl(file, cmd, arg);
440 .open = snapshot_open,
441 .release = snapshot_release,
442 .read = snapshot_read,
443 .write = snapshot_write,
445 .unlocked_ioctl = snapshot_ioctl,
447 .compat_ioctl = snapshot_compat_ioctl,
454 .fops = &snapshot_fops,
457 static int __init snapshot_device_init(
void)