mirror of https://gitee.com/openkylin/linux.git
[PATCH] kill cdrom ->dev_ioctl method
Since early 2.4.x all cdrom drivers implement the block_device methods themselves, so they can handle additional ioctls directly instead of going through the cdrom layer. Signed-off-by: Christoph Hellwig <hch@lst.de> Acked-by: Jens Axboe <axboe@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
d2c5d4fc07
commit
6a2900b676
|
@ -407,7 +407,6 @@ int register_cdrom(struct cdrom_device_info *cdi)
|
|||
ENSURE(get_mcn, CDC_MCN);
|
||||
ENSURE(reset, CDC_RESET);
|
||||
ENSURE(audio_ioctl, CDC_PLAY_AUDIO);
|
||||
ENSURE(dev_ioctl, CDC_IOCTLS);
|
||||
ENSURE(generic_packet, CDC_GENERIC_PACKET);
|
||||
cdi->mc_flags = 0;
|
||||
cdo->n_minors = 0;
|
||||
|
@ -2776,12 +2775,6 @@ int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi,
|
|||
return cdrom_ioctl_audioctl(cdi, cmd);
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, do the device specific ioctls
|
||||
*/
|
||||
if (CDROM_CAN(CDC_IOCTLS))
|
||||
return cdi->ops->dev_ioctl(cdi, cmd, arg);
|
||||
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
|
|
|
@ -2668,7 +2668,7 @@ static int scd_audio_ioctl(struct cdrom_device_info *cdi,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int scd_dev_ioctl(struct cdrom_device_info *cdi,
|
||||
static int scd_read_audio(struct cdrom_device_info *cdi,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
void __user *argp = (void __user *)arg;
|
||||
|
@ -2894,11 +2894,10 @@ static struct cdrom_device_ops scd_dops = {
|
|||
.get_mcn = scd_get_mcn,
|
||||
.reset = scd_reset,
|
||||
.audio_ioctl = scd_audio_ioctl,
|
||||
.dev_ioctl = scd_dev_ioctl,
|
||||
.capability = CDC_OPEN_TRAY | CDC_CLOSE_TRAY | CDC_LOCK |
|
||||
CDC_SELECT_SPEED | CDC_MULTI_SESSION |
|
||||
CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO |
|
||||
CDC_RESET | CDC_IOCTLS | CDC_DRIVE_STATUS,
|
||||
CDC_RESET | CDC_DRIVE_STATUS,
|
||||
.n_minors = 1,
|
||||
};
|
||||
|
||||
|
@ -2936,6 +2935,9 @@ static int scd_block_ioctl(struct inode *inode, struct file *file,
|
|||
case CDROMCLOSETRAY:
|
||||
retval = scd_tray_move(&scd_info, 0);
|
||||
break;
|
||||
case CDROMREADAUDIO:
|
||||
retval = scd_read_audio(&scd_info, CDROMREADAUDIO, arg);
|
||||
break;
|
||||
default:
|
||||
retval = cdrom_ioctl(file, &scd_info, inode, cmd, arg);
|
||||
}
|
||||
|
|
|
@ -1157,32 +1157,6 @@ static int cm206_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
|
|||
}
|
||||
}
|
||||
|
||||
/* Ioctl. These ioctls are specific to the cm206 driver. I have made
|
||||
some driver statistics accessible through ioctl calls.
|
||||
*/
|
||||
|
||||
static int cm206_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
#ifdef STATISTICS
|
||||
case CM206CTL_GET_STAT:
|
||||
if (arg >= NR_STATS)
|
||||
return -EINVAL;
|
||||
else
|
||||
return cd->stats[arg];
|
||||
case CM206CTL_GET_LAST_STAT:
|
||||
if (arg >= NR_STATS)
|
||||
return -EINVAL;
|
||||
else
|
||||
return cd->last_stat[arg];
|
||||
#endif
|
||||
default:
|
||||
debug(("Unknown ioctl call 0x%x\n", cmd));
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int cm206_media_changed(struct cdrom_device_info *cdi, int disc_nr)
|
||||
{
|
||||
if (cd != NULL) {
|
||||
|
@ -1321,11 +1295,10 @@ static struct cdrom_device_ops cm206_dops = {
|
|||
.get_mcn = cm206_get_upc,
|
||||
.reset = cm206_reset,
|
||||
.audio_ioctl = cm206_audio_ioctl,
|
||||
.dev_ioctl = cm206_ioctl,
|
||||
.capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
|
||||
CDC_MULTI_SESSION | CDC_MEDIA_CHANGED |
|
||||
CDC_MCN | CDC_PLAY_AUDIO | CDC_SELECT_SPEED |
|
||||
CDC_IOCTLS | CDC_DRIVE_STATUS,
|
||||
CDC_DRIVE_STATUS,
|
||||
.n_minors = 1,
|
||||
};
|
||||
|
||||
|
@ -1350,6 +1323,21 @@ static int cm206_block_release(struct inode *inode, struct file *file)
|
|||
static int cm206_block_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned cmd, unsigned long arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
#ifdef STATISTICS
|
||||
case CM206CTL_GET_STAT:
|
||||
if (arg >= NR_STATS)
|
||||
return -EINVAL;
|
||||
return cd->stats[arg];
|
||||
case CM206CTL_GET_LAST_STAT:
|
||||
if (arg >= NR_STATS)
|
||||
return -EINVAL;
|
||||
return cd->last_stat[arg];
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return cdrom_ioctl(file, &cm206_info, inode, cmd, arg);
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -627,7 +627,7 @@ static struct cdrom_device_ops viocd_dops = {
|
|||
.media_changed = viocd_media_changed,
|
||||
.lock_door = viocd_lock_door,
|
||||
.generic_packet = viocd_packet,
|
||||
.capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_GENERIC_PACKET | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_RAM
|
||||
.capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_GENERIC_PACKET | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_RAM
|
||||
};
|
||||
|
||||
static int __init find_capability(const char *type)
|
||||
|
|
|
@ -2470,52 +2470,6 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi,
|
|||
return cgc->stat;
|
||||
}
|
||||
|
||||
static
|
||||
int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct packet_command cgc;
|
||||
char buffer[16];
|
||||
int stat;
|
||||
|
||||
init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
|
||||
|
||||
/* These will be moved into the Uniform layer shortly... */
|
||||
switch (cmd) {
|
||||
case CDROMSETSPINDOWN: {
|
||||
char spindown;
|
||||
|
||||
if (copy_from_user(&spindown, (void __user *) arg, sizeof(char)))
|
||||
return -EFAULT;
|
||||
|
||||
if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
|
||||
return stat;
|
||||
|
||||
buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
|
||||
|
||||
return cdrom_mode_select(cdi, &cgc);
|
||||
}
|
||||
|
||||
case CDROMGETSPINDOWN: {
|
||||
char spindown;
|
||||
|
||||
if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
|
||||
return stat;
|
||||
|
||||
spindown = buffer[11] & 0x0f;
|
||||
|
||||
if (copy_to_user((void __user *) arg, &spindown, sizeof (char)))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static
|
||||
int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
|
||||
unsigned int cmd, void *arg)
|
||||
|
@ -2852,12 +2806,11 @@ static struct cdrom_device_ops ide_cdrom_dops = {
|
|||
.get_mcn = ide_cdrom_get_mcn,
|
||||
.reset = ide_cdrom_reset,
|
||||
.audio_ioctl = ide_cdrom_audio_ioctl,
|
||||
.dev_ioctl = ide_cdrom_dev_ioctl,
|
||||
.capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
|
||||
CDC_SELECT_SPEED | CDC_SELECT_DISC |
|
||||
CDC_MULTI_SESSION | CDC_MCN |
|
||||
CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET |
|
||||
CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_CD_R |
|
||||
CDC_DRIVE_STATUS | CDC_CD_R |
|
||||
CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM |
|
||||
CDC_GENERIC_PACKET | CDC_MO_DRIVE | CDC_MRW |
|
||||
CDC_MRW_W | CDC_RAM,
|
||||
|
@ -3367,6 +3320,45 @@ static int idecd_release(struct inode * inode, struct file * file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int idecd_set_spindown(struct cdrom_device_info *cdi, unsigned long arg)
|
||||
{
|
||||
struct packet_command cgc;
|
||||
char buffer[16];
|
||||
int stat;
|
||||
char spindown;
|
||||
|
||||
if (copy_from_user(&spindown, (void __user *)arg, sizeof(char)))
|
||||
return -EFAULT;
|
||||
|
||||
init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
|
||||
|
||||
stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
|
||||
return cdrom_mode_select(cdi, &cgc);
|
||||
}
|
||||
|
||||
static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
|
||||
{
|
||||
struct packet_command cgc;
|
||||
char buffer[16];
|
||||
int stat;
|
||||
char spindown;
|
||||
|
||||
init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
|
||||
|
||||
stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
spindown = buffer[11] & 0x0f;
|
||||
if (copy_to_user((void __user *)arg, &spindown, sizeof (char)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int idecd_ioctl (struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -3374,7 +3366,16 @@ static int idecd_ioctl (struct inode *inode, struct file *file,
|
|||
struct cdrom_info *info = ide_cd_g(bdev->bd_disk);
|
||||
int err;
|
||||
|
||||
err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
|
||||
switch (cmd) {
|
||||
case CDROMSETSPINDOWN:
|
||||
return idecd_set_spindown(&info->devinfo, arg);
|
||||
case CDROMGETSPINDOWN:
|
||||
return idecd_get_spindown(&info->devinfo, arg);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
|
||||
if (err == -EINVAL)
|
||||
err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ MODULE_ALIAS_BLOCKDEV_MAJOR(SCSI_CDROM_MAJOR);
|
|||
#define SR_CAPABILITIES \
|
||||
(CDC_CLOSE_TRAY|CDC_OPEN_TRAY|CDC_LOCK|CDC_SELECT_SPEED| \
|
||||
CDC_SELECT_DISC|CDC_MULTI_SESSION|CDC_MCN|CDC_MEDIA_CHANGED| \
|
||||
CDC_PLAY_AUDIO|CDC_RESET|CDC_IOCTLS|CDC_DRIVE_STATUS| \
|
||||
CDC_PLAY_AUDIO|CDC_RESET|CDC_DRIVE_STATUS| \
|
||||
CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_DVD_RAM|CDC_GENERIC_PACKET| \
|
||||
CDC_MRW|CDC_MRW_W|CDC_RAM)
|
||||
|
||||
|
@ -118,7 +118,6 @@ static struct cdrom_device_ops sr_dops = {
|
|||
.get_mcn = sr_get_mcn,
|
||||
.reset = sr_reset,
|
||||
.audio_ioctl = sr_audio_ioctl,
|
||||
.dev_ioctl = sr_dev_ioctl,
|
||||
.capability = SR_CAPABILITIES,
|
||||
.generic_packet = sr_packet,
|
||||
};
|
||||
|
@ -456,17 +455,33 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
|
|||
{
|
||||
struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk);
|
||||
struct scsi_device *sdev = cd->device;
|
||||
void __user *argp = (void __user *)arg;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Send SCSI addressing ioctls directly to mid level, send other
|
||||
* ioctls to cdrom/block level.
|
||||
*/
|
||||
switch (cmd) {
|
||||
case SCSI_IOCTL_GET_IDLUN:
|
||||
case SCSI_IOCTL_GET_BUS_NUMBER:
|
||||
return scsi_ioctl(sdev, cmd, (void __user *)arg);
|
||||
/*
|
||||
* Send SCSI addressing ioctls directly to mid level, send other
|
||||
* ioctls to cdrom/block level.
|
||||
*/
|
||||
switch (cmd) {
|
||||
case SCSI_IOCTL_GET_IDLUN:
|
||||
case SCSI_IOCTL_GET_BUS_NUMBER:
|
||||
return scsi_ioctl(sdev, cmd, argp);
|
||||
}
|
||||
return cdrom_ioctl(file, &cd->cdi, inode, cmd, arg);
|
||||
|
||||
ret = cdrom_ioctl(file, &cd->cdi, inode, cmd, arg);
|
||||
if (ret != ENOSYS)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* ENODEV means that we didn't recognise the ioctl, or that we
|
||||
* cannot execute it in the current device state. In either
|
||||
* case fall through to scsi_ioctl, which will return ENDOEV again
|
||||
* if it doesn't recognise the ioctl
|
||||
*/
|
||||
ret = scsi_nonblockable_ioctl(sdev, cmd, argp, NULL);
|
||||
if (ret != -ENODEV)
|
||||
return ret;
|
||||
return scsi_ioctl(sdev, cmd, argp);
|
||||
}
|
||||
|
||||
static int sr_block_media_changed(struct gendisk *disk)
|
||||
|
|
|
@ -55,7 +55,6 @@ int sr_get_mcn(struct cdrom_device_info *, struct cdrom_mcn *);
|
|||
int sr_reset(struct cdrom_device_info *);
|
||||
int sr_select_speed(struct cdrom_device_info *cdi, int speed);
|
||||
int sr_audio_ioctl(struct cdrom_device_info *, unsigned int, void *);
|
||||
int sr_dev_ioctl(struct cdrom_device_info *, unsigned int, unsigned long);
|
||||
|
||||
int sr_is_xa(Scsi_CD *);
|
||||
|
||||
|
|
|
@ -562,22 +562,3 @@ int sr_is_xa(Scsi_CD *cd)
|
|||
#endif
|
||||
return is_xa;
|
||||
}
|
||||
|
||||
int sr_dev_ioctl(struct cdrom_device_info *cdi,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
Scsi_CD *cd = cdi->handle;
|
||||
int ret;
|
||||
|
||||
ret = scsi_nonblockable_ioctl(cd->device, cmd,
|
||||
(void __user *)arg, NULL);
|
||||
/*
|
||||
* ENODEV means that we didn't recognise the ioctl, or that we
|
||||
* cannot execute it in the current device state. In either
|
||||
* case fall through to scsi_ioctl, which will return ENDOEV again
|
||||
* if it doesn't recognise the ioctl
|
||||
*/
|
||||
if (ret != -ENODEV)
|
||||
return ret;
|
||||
return scsi_ioctl(cd->device, cmd, (void __user *)arg);
|
||||
}
|
||||
|
|
|
@ -378,7 +378,6 @@ struct cdrom_generic_command
|
|||
#define CDC_MEDIA_CHANGED 0x80 /* media changed */
|
||||
#define CDC_PLAY_AUDIO 0x100 /* audio functions */
|
||||
#define CDC_RESET 0x200 /* hard reset device */
|
||||
#define CDC_IOCTLS 0x400 /* driver has non-standard ioctls */
|
||||
#define CDC_DRIVE_STATUS 0x800 /* driver implements drive status */
|
||||
#define CDC_GENERIC_PACKET 0x1000 /* driver implements generic packets */
|
||||
#define CDC_CD_R 0x2000 /* drive is a CD-R */
|
||||
|
@ -974,9 +973,7 @@ struct cdrom_device_ops {
|
|||
int (*reset) (struct cdrom_device_info *);
|
||||
/* play stuff */
|
||||
int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
|
||||
/* dev-specific */
|
||||
int (*dev_ioctl) (struct cdrom_device_info *,
|
||||
unsigned int, unsigned long);
|
||||
|
||||
/* driver specifications */
|
||||
const int capability; /* capability flags */
|
||||
int n_minors; /* number of active minor devices */
|
||||
|
|
Loading…
Reference in New Issue