-Index: linux-2.4.20-8/fs/ext3/ioctl.c
-===================================================================
---- linux-2.4.20-8.orig/fs/ext3/ioctl.c 2004-01-05 10:54:00.000000000 +0800
-+++ linux-2.4.20-8/fs/ext3/ioctl.c 2004-01-13 00:10:14.000000000 +0800
-@@ -13,6 +13,12 @@
- #include <linux/ext3_jbd.h>
- #include <linux/sched.h>
- #include <asm/uaccess.h>
-+#include <linux/locks.h>
-+
-+#include <linux/snap.h>
-+extern struct snapshot_operations ext3_snap_operations;
-+extern int ext3_snap_print(struct super_block *sb, int index);
-+extern int ext3_snap_delete(struct super_block *sb, int index);
-
-
- int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
-@@ -189,6 +195,103 @@
- return ret;
- }
- #endif
-+#if 0
-+ case EXT3_IOC_SNAP_SETFILECOW: {
-+ printk(KERN_INFO "set file cow on dev %x\n",inode->i_dev);
-+
-+ /* clear block cow feature*/
-+ if (EXT3_HAS_COMPAT_FEATURE(inode->i_sb,
-+ EXT3_FEATURE_COMPAT_BLOCKCOW)) {
-+ handle_t *handle = ext3_journal_start(inode, 1);
-+
-+ if (EXT3_HAS_COMPAT_FEATURE(inode->i_sb,
-+ EXT3_FEATURE_COMPAT_SNAPFS)) {
-+ printk(KERN_INFO "can't change cow level while snapfs feature exist");
-+ return -EPERM;
-+ }
-+ lock_super(inode->i_sb);
-+ journal_get_write_access(handle, EXT3_SB(inode->i_sb)->s_sbh);
-+ inode->i_sb->u.ext3_sb.s_es->s_feature_compat &=
-+ cpu_to_le32(~EXT3_FEATURE_COMPAT_BLOCKCOW);
-+ inode->i_sb->s_dirt = 1;
-+ journal_dirty_metadata(handle, EXT3_SB(inode->i_sb)->s_sbh);
-+ unlock_super(inode->i_sb);
-+ ext3_journal_stop(handle, inode);
-+ }
-+ return 0;
-+ }
-+ case EXT3_IOC_CREATE_INDIR: {
-+ struct inode *ind;
-+ printk(KERN_INFO "create indirect on inode %lu\n",inode->i_ino);
-+ ind = ext3_snap_operations.create_indirect(inode, 0, 1, 0);
-+ if (!ind || IS_ERR(ind))
-+ return PTR_ERR(ind);
-+ printk(KERN_INFO "got indirect inode %lu\n",ind->i_ino);
-+ put_user(ind->i_ino,(int *) arg);
-+ iput(ind);
-+ return 0;
-+ }
-+ case EXT3_IOC_GET_INDIR: {
-+ struct inode *ind;
-+ int index = 1;
-+ if (get_user(index, (int *) arg))
-+ return -EFAULT;
-+
-+ printk(KERN_INFO "get indirect on inode %lu, index %d\n",
-+ inode->i_ino, index);
-+ ind = ext3_snap_operations.get_indirect(inode, NULL, index);
-+ if (!ind || IS_ERR(ind)) {
-+ put_user(0,(int *) arg);
-+ return PTR_ERR(ind);
-+ }
-+ printk(KERN_INFO "got indirect inode %lu for index %d\n",
-+ ind->i_ino, index);
-+ put_user(ind->i_ino,(int *) arg);
-+ iput(ind);
-+ return 0;
-+ }
-+ case EXT3_IOC_IS_REDIR: {
-+ int is_redirector = 0;
-+ printk(KERN_INFO "checking if inode %lu is redirector via\n",
-+ inode->i_ino);
-+ is_redirector = ext3_snap_operations.is_redirector(inode);
-+ printk(KERN_INFO "redirector: %s\n",is_redirector ? "yes":"no");
-+ put_user(is_redirector,(int *) arg);
-+
-+ return 0;
-+ }
-+ case EXT3_IOC_RESTORE_INDIR: {
-+ printk(KERN_INFO "restore indirect on inode %lu\n",inode->i_ino);
-+ return ext3_snap_operations.restore_indirect(inode, 1);
-+ }
-+ case EXT3_IOC_SNAP_PRINT: {
-+ int index = 1;
-+ if (get_user(index, (int *) arg))
-+ return -EFAULT;
-+ printk(KERN_INFO "print snap for index %d\n",index);
-+
-+ return ext3_snap_print(inode->i_sb, 1);
-+ }
-+ case EXT3_IOC_SNAP_DELETE: {
-+ int index = 1;
-+ if (get_user(index, (int *) arg))
-+ return -EFAULT;
-+
-+ // XXX: debug code , always set index = 1
-+ if(index !=1) index=1;
-+ printk(KERN_INFO "delete all cowed inode for index %d\n",index);
-+ return ext3_snap_delete(inode->i_sb, index);
-+ }
-+
-+ case EXT3_IOC_DESTROY_INDIR: {
-+ int index = 1;
-+ if (get_user(index, (int *) arg))
-+ index = 1;
-+ printk(KERN_INFO "destroy indirect on ino %lu, index %d\n",
-+ inode->i_ino, index);
-+ return ext3_snap_operations.destroy_indirect(inode, index, NULL);
-+ }
-+#endif
- default:
- return -ENOTTY;
- }