compat_ioctl: move drivers to compat_ptr_ioctl
commit 407e9ef724
upstream.
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>
Signed-off-by: Chen Zhuo <sagazchen@tencent.com>
Signed-off-by: Xinghui Li <korantli@tencent.com>
This commit is contained in:
parent
78165d5573
commit
1d7b998074
|
@ -678,14 +678,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);
|
||||
|
@ -794,9 +786,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,
|
||||
};
|
||||
|
|
|
@ -845,13 +845,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,
|
||||
|
@ -861,9 +854,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,
|
||||
};
|
||||
|
|
|
@ -1122,14 +1122,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,
|
||||
|
@ -1139,9 +1131,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,
|
||||
|
|
|
@ -2707,18 +2707,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)
|
||||
|
@ -2742,9 +2730,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,
|
||||
};
|
||||
|
||||
|
|
|
@ -1744,14 +1744,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;
|
||||
|
@ -1787,9 +1779,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,
|
||||
};
|
||||
|
|
|
@ -1715,21 +1715,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,
|
||||
};
|
||||
|
|
|
@ -304,21 +304,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,
|
||||
};
|
||||
|
|
|
@ -814,23 +814,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