compat_ioctl: move BLKPG handling to block/compat_ioctl.c
authorArnd Bergmann <arnd@arndb.de>
Tue, 9 Oct 2007 11:23:56 +0000 (13:23 +0200)
committerJens Axboe <axboe@carl.home.kernel.dk>
Wed, 10 Oct 2007 07:26:00 +0000 (09:26 +0200)
BLKPG is common to all block devices, so it should be handled
by common code.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/compat_ioctl.c
fs/compat_ioctl.c

index 5c6dafa..44807d3 100644 (file)
@@ -92,6 +92,35 @@ static int compat_hdio_ioctl(struct inode *inode, struct file *file,
        return error;
 }
 
        return error;
 }
 
+struct compat_blkpg_ioctl_arg {
+       compat_int_t op;
+       compat_int_t flags;
+       compat_int_t datalen;
+       compat_caddr_t data;
+};
+
+static int compat_blkpg_ioctl(struct inode *inode, struct file *file,
+               unsigned int cmd, struct compat_blkpg_ioctl_arg __user *ua32)
+{
+       struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a));
+       compat_caddr_t udata;
+       compat_int_t n;
+       int err;
+
+       err = get_user(n, &ua32->op);
+       err |= put_user(n, &a->op);
+       err |= get_user(n, &ua32->flags);
+       err |= put_user(n, &a->flags);
+       err |= get_user(n, &ua32->datalen);
+       err |= put_user(n, &a->datalen);
+       err |= get_user(udata, &ua32->data);
+       err |= put_user(compat_ptr(udata), &a->data);
+       if (err)
+               return err;
+
+       return blkdev_ioctl(inode, file, cmd, (unsigned long)a);
+}
+
 #define BLKBSZGET_32           _IOR(0x12, 112, int)
 #define BLKBSZSET_32           _IOW(0x12, 113, int)
 #define BLKGETSIZE64_32                _IOR(0x12, 114, int)
 #define BLKBSZGET_32           _IOR(0x12, 112, int)
 #define BLKBSZSET_32           _IOW(0x12, 113, int)
 #define BLKGETSIZE64_32                _IOR(0x12, 114, int)
@@ -348,6 +377,8 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
        case BLKBSZSET_32:
                return blkdev_ioctl(inode, file, BLKBSZSET,
                                (unsigned long)compat_ptr(arg));
        case BLKBSZSET_32:
                return blkdev_ioctl(inode, file, BLKBSZSET,
                                (unsigned long)compat_ptr(arg));
+       case BLKPG:
+               return compat_blkpg_ioctl(inode, file, cmd, compat_ptr(arg));
        }
 
        lock_kernel();
        }
 
        lock_kernel();
index e6a9471..3baa90d 100644 (file)
@@ -47,7 +47,6 @@
 #include <linux/netdevice.h>
 #include <linux/raw.h>
 #include <linux/smb_fs.h>
 #include <linux/netdevice.h>
 #include <linux/raw.h>
 #include <linux/smb_fs.h>
-#include <linux/blkpg.h>
 #include <linux/blkdev.h>
 #include <linux/elevator.h>
 #include <linux/rtc.h>
 #include <linux/blkdev.h>
 #include <linux/elevator.h>
 #include <linux/rtc.h>
@@ -1487,37 +1486,6 @@ ret_einval(unsigned int fd, unsigned int cmd, unsigned long arg)
        return -EINVAL;
 }
 
        return -EINVAL;
 }
 
-#ifdef CONFIG_BLOCK
-struct blkpg_ioctl_arg32 {
-       compat_int_t op;
-       compat_int_t flags;
-       compat_int_t datalen;
-       compat_caddr_t data;
-};
-
-static int blkpg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-       struct blkpg_ioctl_arg32 __user *ua32 = compat_ptr(arg);
-       struct blkpg_ioctl_arg __user *a = compat_alloc_user_space(sizeof(*a));
-       compat_caddr_t udata;
-       compat_int_t n;
-       int err;
-       
-       err = get_user(n, &ua32->op);
-       err |= put_user(n, &a->op);
-       err |= get_user(n, &ua32->flags);
-       err |= put_user(n, &a->flags);
-       err |= get_user(n, &ua32->datalen);
-       err |= put_user(n, &a->datalen);
-       err |= get_user(udata, &ua32->data);
-       err |= put_user(compat_ptr(udata), &a->data);
-       if (err)
-               return err;
-
-       return sys_ioctl(fd, cmd, (unsigned long)a);
-}
-#endif
-
 static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
        return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
 static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
        return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
@@ -3160,7 +3128,6 @@ HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
 HANDLE_IOCTL(SIOCGSTAMPNS, do_siocgstampns)
 #endif
 #ifdef CONFIG_BLOCK
 HANDLE_IOCTL(SIOCGSTAMPNS, do_siocgstampns)
 #endif
 #ifdef CONFIG_BLOCK
-HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
 HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans)
 HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans)
 HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans)
 HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans)
 HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans)
 HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans)