compat_ioctl: move drivers to compat_ptr_ioctl
Each of these drivers has a copy of the same trivial helper function to convert the pointer argument and then call the native ioctl handler. We now have a generic implementation of that, so use it. Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Acked-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: David S. Miller <davem@davemloft.net> Acked-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Reviewed-by: Jason Gunthorpe <jgg@mellanox.com> Reviewed-by: Jiri Kosina <jkosina@suse.cz> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
parent
076ff65862
commit
407e9ef724
@ -670,14 +670,6 @@ static long pp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long pp_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
return pp_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static int pp_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
unsigned int minor = iminor(inode);
|
||||
@ -786,9 +778,7 @@ static const struct file_operations pp_fops = {
|
||||
.write = pp_write,
|
||||
.poll = pp_poll,
|
||||
.unlocked_ioctl = pp_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = pp_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.open = pp_open,
|
||||
.release = pp_release,
|
||||
};
|
||||
|
@ -670,20 +670,10 @@ static long vtpmx_fops_ioctl(struct file *f, unsigned int ioctl,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vtpmx_fops_compat_ioctl(struct file *f, unsigned int ioctl,
|
||||
unsigned long arg)
|
||||
{
|
||||
return vtpmx_fops_ioctl(f, ioctl, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct file_operations vtpmx_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = vtpmx_fops_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vtpmx_fops_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
|
@ -1646,14 +1646,6 @@ static long fw_device_op_ioctl(struct file *file,
|
||||
return dispatch_ioctl(file->private_data, cmd, (void __user *)arg);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long fw_device_op_compat_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return dispatch_ioctl(file->private_data, cmd, compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static int fw_device_op_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct client *client = file->private_data;
|
||||
@ -1795,7 +1787,5 @@ const struct file_operations fw_device_ops = {
|
||||
.mmap = fw_device_op_mmap,
|
||||
.release = fw_device_op_release,
|
||||
.poll = fw_device_op_poll,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = fw_device_op_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
};
|
||||
|
@ -854,13 +854,6 @@ ret_unlock:
|
||||
return r;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long hiddev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return hiddev_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct file_operations hiddev_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = hiddev_read,
|
||||
@ -870,9 +863,7 @@ static const struct file_operations hiddev_fops = {
|
||||
.release = hiddev_release,
|
||||
.unlocked_ioctl = hiddev_ioctl,
|
||||
.fasync = hiddev_fasync,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = hiddev_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
|
@ -832,23 +832,13 @@ stm_char_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long
|
||||
stm_char_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return stm_char_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#else
|
||||
#define stm_char_compat_ioctl NULL
|
||||
#endif
|
||||
|
||||
static const struct file_operations stm_fops = {
|
||||
.open = stm_char_open,
|
||||
.release = stm_char_release,
|
||||
.write = stm_char_write,
|
||||
.mmap = stm_char_mmap,
|
||||
.unlocked_ioctl = stm_char_ioctl,
|
||||
.compat_ioctl = stm_char_compat_ioctl,
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.llseek = no_llseek,
|
||||
};
|
||||
|
||||
|
@ -532,24 +532,6 @@ out:
|
||||
return rets;
|
||||
}
|
||||
|
||||
/**
|
||||
* mei_compat_ioctl - the compat IOCTL function
|
||||
*
|
||||
* @file: pointer to file structure
|
||||
* @cmd: ioctl command
|
||||
* @data: pointer to mei message structure
|
||||
*
|
||||
* Return: 0 on success , <0 on error
|
||||
*/
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long mei_compat_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long data)
|
||||
{
|
||||
return mei_ioctl(file, cmd, (unsigned long)compat_ptr(data));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* mei_poll - the poll function
|
||||
*
|
||||
@ -898,9 +880,7 @@ static const struct file_operations mei_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = mei_read,
|
||||
.unlocked_ioctl = mei_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = mei_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.open = mei_open,
|
||||
.release = mei_release,
|
||||
.write = mei_write,
|
||||
|
@ -1078,36 +1078,6 @@ static long ctrl_cdev_ioctl(struct file *file, unsigned int cmd,
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vol_cdev_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
unsigned long translated_arg = (unsigned long)compat_ptr(arg);
|
||||
|
||||
return vol_cdev_ioctl(file, cmd, translated_arg);
|
||||
}
|
||||
|
||||
static long ubi_cdev_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
unsigned long translated_arg = (unsigned long)compat_ptr(arg);
|
||||
|
||||
return ubi_cdev_ioctl(file, cmd, translated_arg);
|
||||
}
|
||||
|
||||
static long ctrl_cdev_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
unsigned long translated_arg = (unsigned long)compat_ptr(arg);
|
||||
|
||||
return ctrl_cdev_ioctl(file, cmd, translated_arg);
|
||||
}
|
||||
#else
|
||||
#define vol_cdev_compat_ioctl NULL
|
||||
#define ubi_cdev_compat_ioctl NULL
|
||||
#define ctrl_cdev_compat_ioctl NULL
|
||||
#endif
|
||||
|
||||
/* UBI volume character device operations */
|
||||
const struct file_operations ubi_vol_cdev_operations = {
|
||||
.owner = THIS_MODULE,
|
||||
@ -1118,7 +1088,7 @@ const struct file_operations ubi_vol_cdev_operations = {
|
||||
.write = vol_cdev_write,
|
||||
.fsync = vol_cdev_fsync,
|
||||
.unlocked_ioctl = vol_cdev_ioctl,
|
||||
.compat_ioctl = vol_cdev_compat_ioctl,
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
};
|
||||
|
||||
/* UBI character device operations */
|
||||
@ -1126,13 +1096,13 @@ const struct file_operations ubi_cdev_operations = {
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = no_llseek,
|
||||
.unlocked_ioctl = ubi_cdev_ioctl,
|
||||
.compat_ioctl = ubi_cdev_compat_ioctl,
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
};
|
||||
|
||||
/* UBI control character device operations */
|
||||
const struct file_operations ubi_ctrl_cdev_operations = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = ctrl_cdev_ioctl,
|
||||
.compat_ioctl = ctrl_cdev_compat_ioctl,
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.llseek = no_llseek,
|
||||
};
|
||||
|
@ -1123,14 +1123,6 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long tap_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
return tap_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct file_operations tap_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = tap_open,
|
||||
@ -1140,9 +1132,7 @@ static const struct file_operations tap_fops = {
|
||||
.poll = tap_poll,
|
||||
.llseek = no_llseek,
|
||||
.unlocked_ioctl = tap_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = tap_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
};
|
||||
|
||||
static int tap_get_user_xdp(struct tap_queue *q, struct xdp_buff *xdp)
|
||||
|
@ -928,16 +928,6 @@ pi433_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long
|
||||
pi433_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
return pi433_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#else
|
||||
#define pi433_compat_ioctl NULL
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static int pi433_open(struct inode *inode, struct file *filp)
|
||||
@ -1094,7 +1084,7 @@ static const struct file_operations pi433_fops = {
|
||||
.write = pi433_write,
|
||||
.read = pi433_read,
|
||||
.unlocked_ioctl = pi433_ioctl,
|
||||
.compat_ioctl = pi433_compat_ioctl,
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.open = pi433_open,
|
||||
.release = pi433_release,
|
||||
.llseek = no_llseek,
|
||||
|
@ -2685,18 +2685,6 @@ static long usbdev_ioctl(struct file *file, unsigned int cmd,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long usbdev_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = usbdev_do_ioctl(file, cmd, compat_ptr(arg));
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* No kernel lock - fine */
|
||||
static __poll_t usbdev_poll(struct file *file,
|
||||
struct poll_table_struct *wait)
|
||||
@ -2720,9 +2708,7 @@ const struct file_operations usbdev_file_operations = {
|
||||
.read = usbdev_read,
|
||||
.poll = usbdev_poll,
|
||||
.unlocked_ioctl = usbdev_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = usbdev_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.mmap = usbdev_mmap,
|
||||
.open = usbdev_open,
|
||||
.release = usbdev_release,
|
||||
|
@ -1184,15 +1184,6 @@ static long vfio_fops_unl_ioctl(struct file *filep,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vfio_fops_compat_ioctl(struct file *filep,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
arg = (unsigned long)compat_ptr(arg);
|
||||
return vfio_fops_unl_ioctl(filep, cmd, arg);
|
||||
}
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
static int vfio_fops_open(struct inode *inode, struct file *filep)
|
||||
{
|
||||
struct vfio_container *container;
|
||||
@ -1275,9 +1266,7 @@ static const struct file_operations vfio_fops = {
|
||||
.read = vfio_fops_read,
|
||||
.write = vfio_fops_write,
|
||||
.unlocked_ioctl = vfio_fops_unl_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vfio_fops_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.mmap = vfio_fops_mmap,
|
||||
};
|
||||
|
||||
@ -1556,15 +1545,6 @@ static long vfio_group_fops_unl_ioctl(struct file *filep,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vfio_group_fops_compat_ioctl(struct file *filep,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
arg = (unsigned long)compat_ptr(arg);
|
||||
return vfio_group_fops_unl_ioctl(filep, cmd, arg);
|
||||
}
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
static int vfio_group_fops_open(struct inode *inode, struct file *filep)
|
||||
{
|
||||
struct vfio_group *group;
|
||||
@ -1620,9 +1600,7 @@ static int vfio_group_fops_release(struct inode *inode, struct file *filep)
|
||||
static const struct file_operations vfio_group_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = vfio_group_fops_unl_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vfio_group_fops_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.open = vfio_group_fops_open,
|
||||
.release = vfio_group_fops_release,
|
||||
};
|
||||
@ -1687,24 +1665,13 @@ static int vfio_device_fops_mmap(struct file *filep, struct vm_area_struct *vma)
|
||||
return device->ops->mmap(device->device_data, vma);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vfio_device_fops_compat_ioctl(struct file *filep,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
arg = (unsigned long)compat_ptr(arg);
|
||||
return vfio_device_fops_unl_ioctl(filep, cmd, arg);
|
||||
}
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
static const struct file_operations vfio_device_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.release = vfio_device_fops_release,
|
||||
.read = vfio_device_fops_read,
|
||||
.write = vfio_device_fops_write,
|
||||
.unlocked_ioctl = vfio_device_fops_unl_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vfio_device_fops_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.mmap = vfio_device_fops_mmap,
|
||||
};
|
||||
|
||||
|
@ -1751,14 +1751,6 @@ static long vhost_net_ioctl(struct file *f, unsigned int ioctl,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vhost_net_compat_ioctl(struct file *f, unsigned int ioctl,
|
||||
unsigned long arg)
|
||||
{
|
||||
return vhost_net_ioctl(f, ioctl, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static ssize_t vhost_net_chr_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
@ -1794,9 +1786,7 @@ static const struct file_operations vhost_net_fops = {
|
||||
.write_iter = vhost_net_chr_write_iter,
|
||||
.poll = vhost_net_chr_poll,
|
||||
.unlocked_ioctl = vhost_net_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vhost_net_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.open = vhost_net_open,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
@ -1727,21 +1727,11 @@ vhost_scsi_ioctl(struct file *f,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vhost_scsi_compat_ioctl(struct file *f, unsigned int ioctl,
|
||||
unsigned long arg)
|
||||
{
|
||||
return vhost_scsi_ioctl(f, ioctl, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct file_operations vhost_scsi_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.release = vhost_scsi_release,
|
||||
.unlocked_ioctl = vhost_scsi_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vhost_scsi_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.open = vhost_scsi_open,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
@ -302,21 +302,11 @@ static long vhost_test_ioctl(struct file *f, unsigned int ioctl,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vhost_test_compat_ioctl(struct file *f, unsigned int ioctl,
|
||||
unsigned long arg)
|
||||
{
|
||||
return vhost_test_ioctl(f, ioctl, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct file_operations vhost_test_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.release = vhost_test_release,
|
||||
.unlocked_ioctl = vhost_test_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vhost_test_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.open = vhost_test_open,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
@ -761,23 +761,13 @@ static long vhost_vsock_dev_ioctl(struct file *f, unsigned int ioctl,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long vhost_vsock_dev_compat_ioctl(struct file *f, unsigned int ioctl,
|
||||
unsigned long arg)
|
||||
{
|
||||
return vhost_vsock_dev_ioctl(f, ioctl, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct file_operations vhost_vsock_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = vhost_vsock_dev_open,
|
||||
.release = vhost_vsock_dev_release,
|
||||
.llseek = noop_llseek,
|
||||
.unlocked_ioctl = vhost_vsock_dev_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = vhost_vsock_dev_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
};
|
||||
|
||||
static struct miscdevice vhost_vsock_misc = {
|
||||
|
@ -172,15 +172,6 @@ long fat_generic_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static long fat_generic_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
|
||||
{
|
||||
return fat_generic_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static int fat_file_release(struct inode *inode, struct file *filp)
|
||||
{
|
||||
if ((filp->f_mode & FMODE_WRITE) &&
|
||||
@ -215,9 +206,7 @@ const struct file_operations fat_file_operations = {
|
||||
.mmap = generic_file_mmap,
|
||||
.release = fat_file_release,
|
||||
.unlocked_ioctl = fat_generic_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = fat_generic_compat_ioctl,
|
||||
#endif
|
||||
.compat_ioctl = compat_ptr_ioctl,
|
||||
.fsync = fat_file_fsync,
|
||||
.splice_read = generic_file_splice_read,
|
||||
.splice_write = iter_file_splice_write,
|
||||
|
Loading…
Reference in New Issue
Block a user