compat_ioctl: block: handle cdrom compat ioctl in non-cdrom drivers

Various block drivers implement the CDROMMULTISESSION,
CDROM_GET_CAPABILITY, and CDROMEJECT ioctl commands, relying on the
block layer to handle compat_ioctl mode for them.

Move this into the drivers directly as a preparation for simplifying
the block layer later.

When only integer arguments or no arguments are passed, the
same handler can be used for .ioctl and .compat_ioctl, and
when only pointer arguments are passed, the newly added
blkdev_compat_ptr_ioctl can be used.

Reviewed-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann 2019-11-28 15:48:10 +01:00
parent ab8bc5417d
commit 9452b1a3ed
5 changed files with 7 additions and 0 deletions

View File

@ -3879,6 +3879,9 @@ static int fd_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
{ {
int drive = (long)bdev->bd_disk->private_data; int drive = (long)bdev->bd_disk->private_data;
switch (cmd) { switch (cmd) {
case CDROMEJECT: /* CD-ROM eject */
case 0x6470: /* SunOS floppy eject */
case FDMSGON: case FDMSGON:
case FDMSGOFF: case FDMSGOFF:
case FDSETEMSGTRESH: case FDSETEMSGTRESH:

View File

@ -874,6 +874,7 @@ static const struct block_device_operations pd_fops = {
.open = pd_open, .open = pd_open,
.release = pd_release, .release = pd_release,
.ioctl = pd_ioctl, .ioctl = pd_ioctl,
.compat_ioctl = pd_ioctl,
.getgeo = pd_getgeo, .getgeo = pd_getgeo,
.check_events = pd_check_events, .check_events = pd_check_events,
.revalidate_disk= pd_revalidate .revalidate_disk= pd_revalidate

View File

@ -276,6 +276,7 @@ static const struct block_device_operations pf_fops = {
.open = pf_open, .open = pf_open,
.release = pf_release, .release = pf_release,
.ioctl = pf_ioctl, .ioctl = pf_ioctl,
.compat_ioctl = pf_ioctl,
.getgeo = pf_getgeo, .getgeo = pf_getgeo,
.check_events = pf_check_events, .check_events = pf_check_events,
}; };

View File

@ -171,6 +171,7 @@ static const struct block_device_operations vdc_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.getgeo = vdc_getgeo, .getgeo = vdc_getgeo,
.ioctl = vdc_ioctl, .ioctl = vdc_ioctl,
.compat_ioctl = blkdev_compat_ptr_ioctl,
}; };
static void vdc_blk_queue_start(struct vdc_port *port) static void vdc_blk_queue_start(struct vdc_port *port)

View File

@ -2632,6 +2632,7 @@ static const struct block_device_operations xlvbd_block_fops =
.release = blkif_release, .release = blkif_release,
.getgeo = blkif_getgeo, .getgeo = blkif_getgeo,
.ioctl = blkif_ioctl, .ioctl = blkif_ioctl,
.compat_ioctl = blkdev_compat_ptr_ioctl,
}; };