Thread (43 messages) 43 messages, 3 authors, 2020-02-07

Re: [PATCH v2 23/27] compat_ioctl: move HDIO ioctl handling into drivers/ide

From: Ben Hutchings <hidden>
Date: 2019-12-18 22:20:31
Also in: linux-doc, linux-fsdevel, linux-scsi, lkml

On Wed, 2019-12-18 at 23:17 +0100, Arnd Bergmann wrote:
On Wed, Dec 18, 2019 at 10:11 PM Ben Hutchings
[off-list ref] wrote:
quoted
On Tue, 2019-12-17 at 23:17 +0100, Arnd Bergmann wrote:
quoted
Most of the HDIO ioctls are only used by the obsolete drivers/ide
subsystem, these can be handled by changing ide_cmd_ioctl() to be aware
of compat mode and doing the correct transformations in place and using
it as both native and compat handlers for all drivers.

The SCSI drivers implementing the same commands are already doing
this in the drivers, so the compat_blkdev_driver_ioctl() function
is no longer needed now.

The BLKSECTSET and HDIO_GETGEO_BIG ioctls are not implemented
in any driver any more and no longer need any conversion.
[...]

I noticed that HDIO_DRIVE_TASKFILE, handled by ide_taskfile_ioctl() in
drivers/ide/ide-taskfile.c, never had compat handling before.  After
this patch it does, but its argument isn't passed through compat_ptr().
Again, doesn't really matter because IDE isn't a thing on s390.
I checked again, and I think it's worse than that: ide_taskfile_ioctl()
takes an ide_task_request_t argument, which is not compatible
at all (it has two long members). I suspect what happened here
is that I confused it with ide_cmd_ioctl(), which takes a 'struct
ide_taskfile' argument that /is/ compatible.

I don't think there is a point in adding a handler now: most
users of drivers/ide are 32-bit only, and nobody complained
so far, but I would add this change if you agree:
Looks good to me.

Ben.
quoted hunk ↗ jump to hunk
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c
index f6497c817493..83afee3983fe 100644
--- a/drivers/ide/ide-ioctls.c
+++ b/drivers/ide/ide-ioctls.c
@@ -270,6 +270,9 @@ int generic_ide_ioctl(ide_drive_t *drive, struct
block_device *bdev,
        case HDIO_DRIVE_TASKFILE:
                if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
                        return -EACCES;
+               /* missing compat handler for HDIO_DRIVE_TASKFILE */
+               if (in_compat_syscall())
+                       return -ENOTTY;
                if (drive->media == ide_disk)
                        return ide_taskfile_ioctl(drive, arg);
                return -ENOMSG;



         Arnd
-- 
Ben Hutchings, Software Developer                         Codethink Ltd
https://www.codethink.co.uk/                 Dale House, 35 Dale Street
                                     Manchester, M1 2HF, United Kingdom
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help