[PATCH] BLOCK: Move the Ext3 device ioctl compat stuff to the Ext3 driver [try #6]
authorDavid Howells <dhowells@redhat.com>
Tue, 29 Aug 2006 18:06:23 +0000 (19:06 +0100)
committerJens Axboe <axboe@nelson.home.kernel.dk>
Sat, 30 Sep 2006 18:52:29 +0000 (20:52 +0200)
Move the Ext3 device ioctl compat stuff from fs/compat_ioctl.c to the Ext3
driver so that the Ext3 header file doesn't need to be included.

Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/compat_ioctl.c
fs/ext3/dir.c
fs/ext3/file.c
fs/ext3/ioctl.c
include/linux/ext3_fs.h

index 3594668559af0cddfe62f241e51459dd3d885ebf..e5eb0f10f05a6113739fe9ba777e8b343259a963 100644 (file)
@@ -45,8 +45,6 @@
 #include <linux/tty.h>
 #include <linux/vt_kern.h>
 #include <linux/fb.h>
-#include <linux/ext3_jbd.h>
-#include <linux/ext3_fs.h>
 #include <linux/videodev.h>
 #include <linux/netdevice.h>
 #include <linux/raw.h>
@@ -158,22 +156,6 @@ static int rw_long(unsigned int fd, unsigned int cmd, unsigned long arg)
        return err;
 }
 
-static int do_ext3_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       /* These are just misnamed, they actually get/put from/to user an int */
-       switch (cmd) {
-       case EXT3_IOC32_GETVERSION: cmd = EXT3_IOC_GETVERSION; break;
-       case EXT3_IOC32_SETVERSION: cmd = EXT3_IOC_SETVERSION; break;
-       case EXT3_IOC32_GETRSVSZ: cmd = EXT3_IOC_GETRSVSZ; break;
-       case EXT3_IOC32_SETRSVSZ: cmd = EXT3_IOC_SETRSVSZ; break;
-       case EXT3_IOC32_GROUP_EXTEND: cmd = EXT3_IOC_GROUP_EXTEND; break;
-#ifdef CONFIG_JBD_DEBUG
-       case EXT3_IOC32_WAIT_FOR_READONLY: cmd = EXT3_IOC_WAIT_FOR_READONLY; break;
-#endif
-       }
-       return sys_ioctl(fd, cmd, (unsigned long)compat_ptr(arg));
-}
-
 struct compat_video_event {
        int32_t         type;
        compat_time_t   timestamp;
@@ -2712,15 +2694,6 @@ HANDLE_IOCTL(PIO_UNIMAP, do_unimap_ioctl)
 HANDLE_IOCTL(GIO_UNIMAP, do_unimap_ioctl)
 HANDLE_IOCTL(KDFONTOP, do_kdfontop_ioctl)
 #endif
-HANDLE_IOCTL(EXT3_IOC32_GETVERSION, do_ext3_ioctl)
-HANDLE_IOCTL(EXT3_IOC32_SETVERSION, do_ext3_ioctl)
-HANDLE_IOCTL(EXT3_IOC32_GETRSVSZ, do_ext3_ioctl)
-HANDLE_IOCTL(EXT3_IOC32_SETRSVSZ, do_ext3_ioctl)
-HANDLE_IOCTL(EXT3_IOC32_GROUP_EXTEND, do_ext3_ioctl)
-COMPATIBLE_IOCTL(EXT3_IOC_GROUP_ADD)
-#ifdef CONFIG_JBD_DEBUG
-HANDLE_IOCTL(EXT3_IOC32_WAIT_FOR_READONLY, do_ext3_ioctl)
-#endif
 /* One SMB ioctl needs translations. */
 #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
 HANDLE_IOCTL(SMB_IOC_GETMOUNTUID_32, do_smb_getmountuid)
index 429acbb4e064bd21352f8019e133a781523169fb..d0b54f30b914e5304f367252e5f6a3bd96ac8d38 100644 (file)
@@ -44,6 +44,9 @@ const struct file_operations ext3_dir_operations = {
        .read           = generic_read_dir,
        .readdir        = ext3_readdir,         /* we take BKL. needed?*/
        .ioctl          = ext3_ioctl,           /* BKL held */
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = ext3_compat_ioctl,
+#endif
        .fsync          = ext3_sync_file,       /* BKL held */
 #ifdef CONFIG_EXT3_INDEX
        .release        = ext3_release_dir,
index 994efd189f4e3c7bd667e866d359670189f7ea65..74ff20f9d09b927f982c0f5331f7b339286a1ad3 100644 (file)
@@ -114,6 +114,9 @@ const struct file_operations ext3_file_operations = {
        .readv          = generic_file_readv,
        .writev         = generic_file_writev,
        .ioctl          = ext3_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = ext3_compat_ioctl,
+#endif
        .mmap           = generic_file_mmap,
        .open           = generic_file_open,
        .release        = ext3_release_file,
index 3a6b012d120cedae637169ee747ec43b36b25e47..12daa68695721ffaf4a06bfa087d2018fceeb845 100644 (file)
 #include <linux/ext3_fs.h>
 #include <linux/ext3_jbd.h>
 #include <linux/time.h>
+#include <linux/compat.h>
+#include <linux/smp_lock.h>
 #include <asm/uaccess.h>
 
-
 int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd,
                unsigned long arg)
 {
@@ -252,3 +253,55 @@ flags_err:
                return -ENOTTY;
        }
 }
+
+#ifdef CONFIG_COMPAT
+long ext3_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       struct inode *inode = file->f_dentry->d_inode;
+       int ret;
+
+       /* These are just misnamed, they actually get/put from/to user an int */
+       switch (cmd) {
+       case EXT3_IOC32_GETFLAGS:
+               cmd = EXT3_IOC_GETFLAGS;
+               break;
+       case EXT3_IOC32_SETFLAGS:
+               cmd = EXT3_IOC_SETFLAGS;
+               break;
+       case EXT3_IOC32_GETVERSION:
+               cmd = EXT3_IOC_GETVERSION;
+               break;
+       case EXT3_IOC32_SETVERSION:
+               cmd = EXT3_IOC_SETVERSION;
+               break;
+       case EXT3_IOC32_GROUP_EXTEND:
+               cmd = EXT3_IOC_GROUP_EXTEND;
+               break;
+       case EXT3_IOC32_GETVERSION_OLD:
+               cmd = EXT3_IOC_GETVERSION_OLD;
+               break;
+       case EXT3_IOC32_SETVERSION_OLD:
+               cmd = EXT3_IOC_SETVERSION_OLD;
+               break;
+#ifdef CONFIG_JBD_DEBUG
+       case EXT3_IOC32_WAIT_FOR_READONLY:
+               cmd = EXT3_IOC_WAIT_FOR_READONLY;
+               break;
+#endif
+       case EXT3_IOC32_GETRSVSZ:
+               cmd = EXT3_IOC_GETRSVSZ;
+               break;
+       case EXT3_IOC32_SETRSVSZ:
+               cmd = EXT3_IOC_SETRSVSZ;
+               break;
+       case EXT3_IOC_GROUP_ADD:
+               break;
+       default:
+               return -ENOIOCTLCMD;
+       }
+       lock_kernel();
+       ret = ext3_ioctl(inode, file, cmd, (unsigned long) compat_ptr(arg));
+       unlock_kernel();
+       return ret;
+}
+#endif
index a7a01ff44669209e7aea750d941f3cc80d910216..11cca1bdc0c79840ab69c12b2a538d2a9770fb65 100644 (file)
@@ -233,6 +233,8 @@ struct ext3_new_group_data {
 /*
  * ioctl commands in 32 bit emulation
  */
+#define EXT3_IOC32_GETFLAGS            FS_IOC32_GETFLAGS
+#define EXT3_IOC32_SETFLAGS            FS_IOC32_SETFLAGS
 #define EXT3_IOC32_GETVERSION          _IOR('f', 3, int)
 #define EXT3_IOC32_SETVERSION          _IOW('f', 4, int)
 #define EXT3_IOC32_GETRSVSZ            _IOR('f', 5, int)
@@ -241,6 +243,9 @@ struct ext3_new_group_data {
 #ifdef CONFIG_JBD_DEBUG
 #define EXT3_IOC32_WAIT_FOR_READONLY   _IOR('f', 99, int)
 #endif
+#define EXT3_IOC32_GETVERSION_OLD      FS_IOC32_GETVERSION
+#define EXT3_IOC32_SETVERSION_OLD      FS_IOC32_SETVERSION
+
 
 /*
  *  Mount options
@@ -824,6 +829,7 @@ extern void ext3_set_aops(struct inode *inode);
 /* ioctl.c */
 extern int ext3_ioctl (struct inode *, struct file *, unsigned int,
                       unsigned long);
+extern long ext3_compat_ioctl (struct file *, unsigned int, unsigned long);
 
 /* namei.c */
 extern int ext3_orphan_add(handle_t *, struct inode *);