ide: add support for SCSI ioctls to ide-floppy
Now that ide-floppy supports SG_IO we can add support for SCSI ioctls (except deprecated SCSI_IOCTL_SEND_COMMAND and legacy CDROM_SEND_PACKET ones - we can add them later iff really needed). While at it remove handling of CDROMEJECT and CDROMCLOSETRAY ioctls from generic_ide_ioctl(): - This prevents ide-{disk,tape,scsi} device drivers from obtaining REQ_TYPE_BLOCK_PC type requests which are currently unsupported by these drivers and which are potentially harmful (as reported by Andrew). - There is no functionality loss since aforementioned ioctls will now be handled by idefloppy_ioctl()->scsi_cmd_ioctl() (for devices using ide-floppy driver) and by idecd_ioctl->cdrom_ioctl()->scsi_cmd_ioctl() (for devices using ide-cd driver). Cc: Jens Axboe <jens.axboe@oracle.com> Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Cc: James Bottomley <James.Bottomley@steeleye.com> Cc: Jeff Garzik <jeff@garzik.org> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
Родитель
4bf9fdf7f2
Коммит
89636af25d
|
@ -99,6 +99,8 @@
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
#include <scsi/scsi_ioctl.h>
|
||||||
|
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
@ -2099,7 +2101,21 @@ static int idefloppy_ioctl(struct inode *inode, struct file *file,
|
||||||
case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS:
|
case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS:
|
||||||
return idefloppy_get_format_progress(drive, argp);
|
return idefloppy_get_format_progress(drive, argp);
|
||||||
}
|
}
|
||||||
return generic_ide_ioctl(drive, file, bdev, cmd, arg);
|
|
||||||
|
/*
|
||||||
|
* skip SCSI_IOCTL_SEND_COMMAND (deprecated)
|
||||||
|
* and CDROM_SEND_PACKET (legacy) ioctls
|
||||||
|
*/
|
||||||
|
if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND)
|
||||||
|
err = scsi_cmd_ioctl(file, bdev->bd_disk->queue,
|
||||||
|
bdev->bd_disk, cmd, argp);
|
||||||
|
else
|
||||||
|
err = -ENOTTY;
|
||||||
|
|
||||||
|
if (err == -ENOTTY)
|
||||||
|
err = generic_ide_ioctl(drive, file, bdev, cmd, arg);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int idefloppy_media_changed(struct gendisk *disk)
|
static int idefloppy_media_changed(struct gendisk *disk)
|
||||||
|
|
|
@ -1097,10 +1097,6 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case CDROMEJECT:
|
|
||||||
case CDROMCLOSETRAY:
|
|
||||||
return scsi_cmd_ioctl(file, bdev->bd_disk->queue, bdev->bd_disk, cmd, p);
|
|
||||||
|
|
||||||
case HDIO_GET_BUSSTATE:
|
case HDIO_GET_BUSSTATE:
|
||||||
if (!capable(CAP_SYS_ADMIN))
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче