compat_ioctl: move cdrom handlers to block/compat_ioctl.c
These are shared by all cd-rom drivers and should have common handlers. Do slight cosmetic cleanups in the process. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
18cf7f8723
commit
b3087cc4f3
@ -92,6 +92,84 @@ static int compat_hdio_ioctl(struct inode *inode, struct file *file,
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct compat_cdrom_read_audio {
|
||||||
|
union cdrom_addr addr;
|
||||||
|
u8 addr_format;
|
||||||
|
compat_int_t nframes;
|
||||||
|
compat_caddr_t buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct compat_cdrom_generic_command {
|
||||||
|
unsigned char cmd[CDROM_PACKET_SIZE];
|
||||||
|
compat_caddr_t buffer;
|
||||||
|
compat_uint_t buflen;
|
||||||
|
compat_int_t stat;
|
||||||
|
compat_caddr_t sense;
|
||||||
|
unsigned char data_direction;
|
||||||
|
compat_int_t quiet;
|
||||||
|
compat_int_t timeout;
|
||||||
|
compat_caddr_t reserved[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
static int compat_cdrom_read_audio(struct inode *inode, struct file *file,
|
||||||
|
struct gendisk *disk, unsigned int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
struct cdrom_read_audio __user *cdread_audio;
|
||||||
|
struct compat_cdrom_read_audio __user *cdread_audio32;
|
||||||
|
__u32 data;
|
||||||
|
void __user *datap;
|
||||||
|
|
||||||
|
cdread_audio = compat_alloc_user_space(sizeof(*cdread_audio));
|
||||||
|
cdread_audio32 = compat_ptr(arg);
|
||||||
|
|
||||||
|
if (copy_in_user(&cdread_audio->addr,
|
||||||
|
&cdread_audio32->addr,
|
||||||
|
(sizeof(*cdread_audio32) -
|
||||||
|
sizeof(compat_caddr_t))))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (get_user(data, &cdread_audio32->buf))
|
||||||
|
return -EFAULT;
|
||||||
|
datap = compat_ptr(data);
|
||||||
|
if (put_user(datap, &cdread_audio->buf))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return blkdev_driver_ioctl(inode, file, disk, cmd,
|
||||||
|
(unsigned long)cdread_audio);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int compat_cdrom_generic_command(struct inode *inode, struct file *file,
|
||||||
|
struct gendisk *disk, unsigned int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
struct cdrom_generic_command __user *cgc;
|
||||||
|
struct compat_cdrom_generic_command __user *cgc32;
|
||||||
|
u32 data;
|
||||||
|
unsigned char dir;
|
||||||
|
int itmp;
|
||||||
|
|
||||||
|
cgc = compat_alloc_user_space(sizeof(*cgc));
|
||||||
|
cgc32 = compat_ptr(arg);
|
||||||
|
|
||||||
|
if (copy_in_user(&cgc->cmd, &cgc32->cmd, sizeof(cgc->cmd)) ||
|
||||||
|
get_user(data, &cgc32->buffer) ||
|
||||||
|
put_user(compat_ptr(data), &cgc->buffer) ||
|
||||||
|
copy_in_user(&cgc->buflen, &cgc32->buflen,
|
||||||
|
(sizeof(unsigned int) + sizeof(int))) ||
|
||||||
|
get_user(data, &cgc32->sense) ||
|
||||||
|
put_user(compat_ptr(data), &cgc->sense) ||
|
||||||
|
get_user(dir, &cgc32->data_direction) ||
|
||||||
|
put_user(dir, &cgc->data_direction) ||
|
||||||
|
get_user(itmp, &cgc32->quiet) ||
|
||||||
|
put_user(itmp, &cgc->quiet) ||
|
||||||
|
get_user(itmp, &cgc32->timeout) ||
|
||||||
|
put_user(itmp, &cgc->timeout) ||
|
||||||
|
get_user(data, &cgc32->reserved[0]) ||
|
||||||
|
put_user(compat_ptr(data), &cgc->reserved[0]))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return blkdev_driver_ioctl(inode, file, disk, cmd, (unsigned long)cgc);
|
||||||
|
}
|
||||||
|
|
||||||
struct compat_blkpg_ioctl_arg {
|
struct compat_blkpg_ioctl_arg {
|
||||||
compat_int_t op;
|
compat_int_t op;
|
||||||
compat_int_t flags;
|
compat_int_t flags;
|
||||||
@ -190,6 +268,11 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file,
|
|||||||
case HDIO_GET_ADDRESS:
|
case HDIO_GET_ADDRESS:
|
||||||
case HDIO_GET_BUSSTATE:
|
case HDIO_GET_BUSSTATE:
|
||||||
return compat_hdio_ioctl(inode, file, disk, cmd, arg);
|
return compat_hdio_ioctl(inode, file, disk, cmd, arg);
|
||||||
|
case CDROMREADAUDIO:
|
||||||
|
return compat_cdrom_read_audio(inode, file, disk, cmd, arg);
|
||||||
|
case CDROM_SEND_PACKET:
|
||||||
|
return compat_cdrom_generic_command(inode, file, disk, cmd, arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* No handler required for the ones below, we just need to
|
* No handler required for the ones below, we just need to
|
||||||
* convert arg to a 64 bit pointer.
|
* convert arg to a 64 bit pointer.
|
||||||
|
@ -37,7 +37,6 @@
|
|||||||
#include <linux/if_ppp.h>
|
#include <linux/if_ppp.h>
|
||||||
#include <linux/if_pppox.h>
|
#include <linux/if_pppox.h>
|
||||||
#include <linux/mtio.h>
|
#include <linux/mtio.h>
|
||||||
#include <linux/cdrom.h>
|
|
||||||
#include <linux/auto_fs.h>
|
#include <linux/auto_fs.h>
|
||||||
#include <linux/auto_fs4.h>
|
#include <linux/auto_fs4.h>
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
@ -1039,108 +1038,6 @@ static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|||||||
return err ? -EFAULT: 0;
|
return err ? -EFAULT: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cdrom_read_audio32 {
|
|
||||||
union cdrom_addr addr;
|
|
||||||
u8 addr_format;
|
|
||||||
compat_int_t nframes;
|
|
||||||
compat_caddr_t buf;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct cdrom_generic_command32 {
|
|
||||||
unsigned char cmd[CDROM_PACKET_SIZE];
|
|
||||||
compat_caddr_t buffer;
|
|
||||||
compat_uint_t buflen;
|
|
||||||
compat_int_t stat;
|
|
||||||
compat_caddr_t sense;
|
|
||||||
unsigned char data_direction;
|
|
||||||
compat_int_t quiet;
|
|
||||||
compat_int_t timeout;
|
|
||||||
compat_caddr_t reserved[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
static int cdrom_do_read_audio(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
struct cdrom_read_audio __user *cdread_audio;
|
|
||||||
struct cdrom_read_audio32 __user *cdread_audio32;
|
|
||||||
__u32 data;
|
|
||||||
void __user *datap;
|
|
||||||
|
|
||||||
cdread_audio = compat_alloc_user_space(sizeof(*cdread_audio));
|
|
||||||
cdread_audio32 = compat_ptr(arg);
|
|
||||||
|
|
||||||
if (copy_in_user(&cdread_audio->addr,
|
|
||||||
&cdread_audio32->addr,
|
|
||||||
(sizeof(*cdread_audio32) -
|
|
||||||
sizeof(compat_caddr_t))))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
if (get_user(data, &cdread_audio32->buf))
|
|
||||||
return -EFAULT;
|
|
||||||
datap = compat_ptr(data);
|
|
||||||
if (put_user(datap, &cdread_audio->buf))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
return sys_ioctl(fd, cmd, (unsigned long) cdread_audio);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cdrom_do_generic_command(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
struct cdrom_generic_command __user *cgc;
|
|
||||||
struct cdrom_generic_command32 __user *cgc32;
|
|
||||||
u32 data;
|
|
||||||
unsigned char dir;
|
|
||||||
int itmp;
|
|
||||||
|
|
||||||
cgc = compat_alloc_user_space(sizeof(*cgc));
|
|
||||||
cgc32 = compat_ptr(arg);
|
|
||||||
|
|
||||||
if (copy_in_user(&cgc->cmd, &cgc32->cmd, sizeof(cgc->cmd)) ||
|
|
||||||
get_user(data, &cgc32->buffer) ||
|
|
||||||
put_user(compat_ptr(data), &cgc->buffer) ||
|
|
||||||
copy_in_user(&cgc->buflen, &cgc32->buflen,
|
|
||||||
(sizeof(unsigned int) + sizeof(int))) ||
|
|
||||||
get_user(data, &cgc32->sense) ||
|
|
||||||
put_user(compat_ptr(data), &cgc->sense) ||
|
|
||||||
get_user(dir, &cgc32->data_direction) ||
|
|
||||||
put_user(dir, &cgc->data_direction) ||
|
|
||||||
get_user(itmp, &cgc32->quiet) ||
|
|
||||||
put_user(itmp, &cgc->quiet) ||
|
|
||||||
get_user(itmp, &cgc32->timeout) ||
|
|
||||||
put_user(itmp, &cgc->timeout) ||
|
|
||||||
get_user(data, &cgc32->reserved[0]) ||
|
|
||||||
put_user(compat_ptr(data), &cgc->reserved[0]))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
return sys_ioctl(fd, cmd, (unsigned long) cgc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
switch(cmd) {
|
|
||||||
case CDROMREADAUDIO:
|
|
||||||
err = cdrom_do_read_audio(fd, cmd, arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CDROM_SEND_PACKET:
|
|
||||||
err = cdrom_do_generic_command(fd, cmd, arg);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
do {
|
|
||||||
static int count;
|
|
||||||
if (++count <= 20)
|
|
||||||
printk("cdrom_ioctl: Unknown cmd fd(%d) "
|
|
||||||
"cmd(%08x) arg(%08x)\n",
|
|
||||||
(int)fd, (unsigned int)cmd, (unsigned int)arg);
|
|
||||||
} while(0);
|
|
||||||
err = -EINVAL;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_BLOCK */
|
#endif /* CONFIG_BLOCK */
|
||||||
|
|
||||||
#ifdef CONFIG_VT
|
#ifdef CONFIG_VT
|
||||||
@ -3147,8 +3044,6 @@ HANDLE_IOCTL(PPPIOCSACTIVE32, ppp_sock_fprog_ioctl_trans)
|
|||||||
#ifdef CONFIG_BLOCK
|
#ifdef CONFIG_BLOCK
|
||||||
HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
|
HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
|
||||||
HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
|
HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
|
||||||
HANDLE_IOCTL(CDROMREADAUDIO, cdrom_ioctl_trans)
|
|
||||||
HANDLE_IOCTL(CDROM_SEND_PACKET, cdrom_ioctl_trans)
|
|
||||||
#endif
|
#endif
|
||||||
#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
|
#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
|
||||||
HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
|
HANDLE_IOCTL(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout)
|
||||||
|
Loading…
Reference in New Issue
Block a user