All autofs ioctl calls are simple to convert for 32 bit
compatibility. This just moves the handler into the file
system code.

CC: [EMAIL PROTECTED]
CC: [email protected]
Signed-off-by: Arnd Bergmann <[EMAIL PROTECTED]>

Index: linux-cg/fs/autofs/root.c
===================================================================
--- linux-cg.orig/fs/autofs/root.c      2005-11-05 15:47:38.000000000 +0100
+++ linux-cg/fs/autofs/root.c   2005-11-05 15:48:02.000000000 +0100
@@ -10,6 +10,8 @@
  *
  * ------------------------------------------------------------------------- */
 
+#include <linux/config.h>
+#include <linux/compat.h>
 #include <linux/errno.h>
 #include <linux/stat.h>
 #include <linux/param.h>
@@ -24,11 +26,15 @@
 static int autofs_root_rmdir(struct inode *,struct dentry *);
 static int autofs_root_mkdir(struct inode *,struct dentry *,int);
 static int autofs_root_ioctl(struct inode *, struct file *,unsigned 
int,unsigned long);
+static long autofs_root_compat_ioctl(struct file *,unsigned int,unsigned long);
 
 struct file_operations autofs_root_operations = {
        .read           = generic_read_dir,
        .readdir        = autofs_root_readdir,
        .ioctl          = autofs_root_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = autofs_root_compat_ioctl,
+#endif
 };
 
 struct inode_operations autofs_root_inode_operations = {
@@ -562,3 +568,32 @@
                return -ENOSYS;
        }
 }
+
+#ifdef CONFIG_COMPAT
+/* AUTOFS */
+#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
+
+static long autofs_root_compat_ioctl(struct file *file, unsigned int cmd,
+                               unsigned long arg)
+{
+       int ret;
+
+       switch (cmd) {
+       case AUTOFS_IOC_SETTIMEOUT32:
+               cmd = AUTOFS_IOC_SETTIMEOUT;
+       case AUTOFS_IOC_CATATONIC:
+       case AUTOFS_IOC_PROTOVER:
+       case AUTOFS_IOC_EXPIRE:
+               arg = (unsigned long) compat_ptr(arg);
+       case AUTOFS_IOC_READY:
+       case AUTOFS_IOC_FAIL:
+               lock_kernel();
+               ret = autofs_root_ioctl(file->f_dentry->d_inode, file, cmd, 
arg);
+               unlock_kernel();
+               break;
+       default:
+               ret = -ENOIOCTLCMD;
+       }
+       return ret;
+}
+#endif
Index: linux-cg/fs/autofs4/root.c
===================================================================
--- linux-cg.orig/fs/autofs4/root.c     2005-11-05 15:47:38.000000000 +0100
+++ linux-cg/fs/autofs4/root.c  2005-11-05 16:00:48.000000000 +0100
@@ -12,6 +12,8 @@
  *
  * ------------------------------------------------------------------------- */
 
+#include <linux/config.h>
+#include <linux/compat.h>
 #include <linux/errno.h>
 #include <linux/stat.h>
 #include <linux/param.h>
@@ -24,6 +26,7 @@
 static int autofs4_dir_rmdir(struct inode *,struct dentry *);
 static int autofs4_dir_mkdir(struct inode *,struct dentry *,int);
 static int autofs4_root_ioctl(struct inode *, struct file *,unsigned 
int,unsigned long);
+static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned 
long);
 static int autofs4_dir_open(struct inode *inode, struct file *file);
 static int autofs4_dir_close(struct inode *inode, struct file *file);
 static int autofs4_dir_readdir(struct file * filp, void * dirent, filldir_t 
filldir);
@@ -37,6 +40,9 @@
        .read           = generic_read_dir,
        .readdir        = autofs4_root_readdir,
        .ioctl          = autofs4_root_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = autofs4_root_compat_ioctl,
+#endif
 };
 
 struct file_operations autofs4_dir_operations = {
@@ -817,3 +823,38 @@
                return -ENOSYS;
        }
 }
+
+#ifdef CONFIG_COMPAT
+/* AUTOFS */
+#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
+
+static long autofs4_root_compat_ioctl(struct file *file, unsigned int cmd,
+                               unsigned long arg)
+{
+       int ret;
+
+       switch (cmd) {
+       case AUTOFS_IOC_SETTIMEOUT32:
+               cmd = AUTOFS_IOC_SETTIMEOUT;
+       case AUTOFS_IOC_CATATONIC:
+       case AUTOFS_IOC_PROTOVER:
+       case AUTOFS_IOC_EXPIRE:
+       case AUTOFS_IOC_EXPIRE_MULTI:
+       case AUTOFS_IOC_PROTOSUBVER:
+       case AUTOFS_IOC_ASKREGHOST:
+       case AUTOFS_IOC_TOGGLEREGHOST:
+       case AUTOFS_IOC_ASKUMOUNT:
+               arg = (unsigned long) compat_ptr(arg);
+       case AUTOFS_IOC_READY:
+       case AUTOFS_IOC_FAIL:
+               lock_kernel();
+               ret = autofs4_root_ioctl(file->f_dentry->d_inode,
+                                        file, cmd, arg);
+               unlock_kernel();
+               break;
+       default:
+               ret = -ENOIOCTLCMD;
+       }
+       return ret;
+}
+#endif
Index: linux-cg/fs/compat_ioctl.c
===================================================================
--- linux-cg.orig/fs/compat_ioctl.c     2005-11-05 15:48:01.000000000 +0100
+++ linux-cg/fs/compat_ioctl.c  2005-11-05 16:44:07.000000000 +0100
@@ -337,11 +337,6 @@
        return -EINVAL;
 }
 
-static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
-}
-
 /* Bluetooth ioctls */
 #define HCIUARTSETPROTO        _IOW('U', 200, int)
 #define HCIUARTGETPROTO        _IOR('U', 201, int)
@@ -918,8 +913,6 @@
 HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
 HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
 HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans)
-#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
-HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
 /* vfat */
 HANDLE_IOCTL(VFAT_IOCTL_READDIR_BOTH32, vfat_ioctl32)
 HANDLE_IOCTL(VFAT_IOCTL_READDIR_SHORT32, vfat_ioctl32)
Index: linux-cg/include/linux/compat_ioctl.h
===================================================================
--- linux-cg.orig/include/linux/compat_ioctl.h  2005-11-05 15:48:01.000000000 
+0100
+++ linux-cg/include/linux/compat_ioctl.h       2005-11-05 16:44:07.000000000 
+0100
@@ -360,17 +360,6 @@
 COMPATIBLE_IOCTL(SOUND_MIXER_GETLEVELS)
 COMPATIBLE_IOCTL(SOUND_MIXER_SETLEVELS)
 COMPATIBLE_IOCTL(OSS_GETVERSION)
-/* AUTOFS */
-ULONG_IOCTL(AUTOFS_IOC_READY)
-ULONG_IOCTL(AUTOFS_IOC_FAIL)
-COMPATIBLE_IOCTL(AUTOFS_IOC_CATATONIC)
-COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER)
-COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE)
-COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI)
-COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOSUBVER)
-COMPATIBLE_IOCTL(AUTOFS_IOC_ASKREGHOST)
-COMPATIBLE_IOCTL(AUTOFS_IOC_TOGGLEREGHOST)
-COMPATIBLE_IOCTL(AUTOFS_IOC_ASKUMOUNT)
 /* DEVFS */
 COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV)
 COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK)

--

_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to