--- /dev/null 2006-05-22 07:25:23.000000000 -0700 +++ linux-2.6.19.2/fs/pipe-cr-debug.c 2007-01-22 15:39:05.000000000 -0800 @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include + +static struct class *crctl_class; + +#define CRCTL_MAJOR 200 +#define CRCTL_NAME "crctl" + +extern int ckpoint_pipe(struct file *filp, struct cr_pipe *img); +extern int restore_pipe(int *fd, struct cr_pipe *img); + + +static int cr_open(struct inode *inode, struct file *filp) +{ + return 0; +} + +static int cr_release(struct inode *inode, struct file *filp) +{ + return 0; +} + +static int crctl_ioctl(struct inode *pino, struct file *filp, + unsigned int cmd, unsigned long arg) +{ + int fd[2]; + struct mig_arg { + void *arg1; + void *arg2; + } i; + + switch(cmd) { + case 246: + { + struct file *pipefp; + int r, fput; + + if (copy_from_user (&i, (void __user *) arg, + sizeof(i))) return -EFAULT; + pipefp = fget_light((int) i.arg1, &fput); + r = ckpoint_pipe(pipefp, (struct cr_pipe *) i.arg2); + fput_light(pipefp, fput); + return r; + } + case 245: + if (copy_from_user(&i, (void __user *) arg, + sizeof(i))) return -EFAULT; + if (copy_from_user(fd, (void __user *) i.arg1, + sizeof(int) * 2)) return -EFAULT; + return restore_pipe(fd, (struct cr_pipe *) i.arg2); + } + return 0; +} + +static struct file_operations crctl_fops = { + .open = cr_open, + .release = cr_release, + .ioctl = crctl_ioctl, +}; + +static void __exit crctl_exit(void) +{ + class_device_destroy(crctl_class, MKDEV(CRCTL_MAJOR, 0)); + class_destroy(crctl_class); + unregister_chrdev(CRCTL_MAJOR, CRCTL_NAME); +} + +static int __init crctl_init(void) +{ + int ret; + struct class_device *class_err; + + ret = register_chrdev(CRCTL_MAJOR, CRCTL_NAME, &crctl_fops); + if (ret < 0) + goto out; + + crctl_class = class_create(THIS_MODULE, "crctl"); + if (IS_ERR(crctl_class)) { + ret = PTR_ERR(crctl_class); + goto out_cleandev; + } + + class_err = class_device_create(crctl_class, NULL, + MKDEV(CRCTL_MAJOR, 0), NULL, CRCTL_NAME); + if (IS_ERR(class_err)) { + ret = PTR_ERR(class_err); + goto out_rmclass; + } + goto out; + +out_rmclass: + class_destroy(crctl_class); +out_cleandev: + unregister_chrdev(CRCTL_MAJOR, CRCTL_NAME); +out: + return ret; +} + +fs_initcall(crctl_init); +module_exit(crctl_exit); --- linux-2.6.19.2/fs/Makefile.original 2007-01-10 11:10:37.000000000 -0800 +++ linux-2.6.19.2/fs/Makefile 2007-01-22 15:13:59.000000000 -0800 @@ -10,7 +10,7 @@ obj-y := open.o read_write.o file_table. ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o \ attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \ seq_file.o xattr.o libfs.o fs-writeback.o \ - pnode.o drop_caches.o splice.o sync.o utimes.o + pnode.o drop_caches.o splice.o sync.o utimes.o pipe-cr-debug.o ifeq ($(CONFIG_BLOCK),y) obj-y += buffer.o bio.o block_dev.o direct-io.o mpage.o ioprio.o