Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18cf7f87 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Jens Axboe
Browse files

compat_ioctl: move BLKPG handling to block/compat_ioctl.c



BLKPG is common to all block devices, so it should be handled
by common code.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 9617db08
Loading
Loading
Loading
Loading
+31 −0
Original line number Original line Diff line number Diff line
@@ -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 BLKBSZGET_32		_IOR(0x12, 112, int)
#define BLKBSZSET_32		_IOW(0x12, 113, int)
#define BLKBSZSET_32		_IOW(0x12, 113, int)
#define BLKGETSIZE64_32		_IOR(0x12, 114, 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:
	case BLKBSZSET_32:
		return blkdev_ioctl(inode, file, BLKBSZSET,
		return blkdev_ioctl(inode, file, BLKBSZSET,
				(unsigned long)compat_ptr(arg));
				(unsigned long)compat_ptr(arg));
	case BLKPG:
		return compat_blkpg_ioctl(inode, file, cmd, compat_ptr(arg));
	}
	}


	lock_kernel();
	lock_kernel();
+0 −33
Original line number Original line Diff line number Diff line
@@ -47,7 +47,6 @@
#include <linux/netdevice.h>
#include <linux/netdevice.h>
#include <linux/raw.h>
#include <linux/raw.h>
#include <linux/smb_fs.h>
#include <linux/smb_fs.h>
#include <linux/blkpg.h>
#include <linux/blkdev.h>
#include <linux/blkdev.h>
#include <linux/elevator.h>
#include <linux/elevator.h>
#include <linux/rtc.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)
static int ioc_settimeout(unsigned int fd, unsigned int cmd, unsigned long arg)
{
{
	return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
	return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, arg);
@@ -3160,7 +3128,6 @@ HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp)
HANDLE_IOCTL(SIOCGSTAMPNS, do_siocgstampns)
HANDLE_IOCTL(SIOCGSTAMPNS, do_siocgstampns)
#endif
#endif
#ifdef CONFIG_BLOCK
#ifdef CONFIG_BLOCK
HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans)
HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans)
HANDLE_IOCTL(FDSETPRM32, fd_ioctl_trans)
HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans)
HANDLE_IOCTL(FDDEFPRM32, fd_ioctl_trans)
HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans)
HANDLE_IOCTL(FDGETPRM32, fd_ioctl_trans)