On Wed, Dec 18, 2019 at 9:11 PM Ben Hutchings <ben.hutchings@xxxxxxxxxxxxxxx> wrote: > > On Tue, 2019-12-17 at 23:17 +0100, Arnd Bergmann wrote: > [...] > > @@ -1710,6 +1711,38 @@ static int idecd_ioctl(struct block_device *bdev, fmode_t mode, > > return ret; > > } > > > > +#ifdef CONFIG_COMPAT > > +static int idecd_locked_compat_ioctl(struct block_device *bdev, fmode_t mode, > > + unsigned int cmd, unsigned long arg) > > +{ > > + struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info); > > + int err; > > + > > + switch (cmd) { > > + case CDROMSETSPINDOWN: > > + return idecd_set_spindown(&info->devinfo, arg); > > + case CDROMGETSPINDOWN: > > + return idecd_get_spindown(&info->devinfo, arg); > > compat_ptr() should also be applied to the argument for these two > commands, though I'm fairly sure IDE drivers have never been useful on > s390 so it doesn't matter in practice. Agreed on both, fixed by folding in this change: diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 2de6e8ace957..e09b949a7c46 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -1716,19 +1716,20 @@ static int idecd_locked_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) { struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info); + void __user *argp = compat_ptr(arg); int err; switch (cmd) { case CDROMSETSPINDOWN: - return idecd_set_spindown(&info->devinfo, arg); + return idecd_set_spindown(&info->devinfo, (unsigned long)argp); case CDROMGETSPINDOWN: - return idecd_get_spindown(&info->devinfo, arg); + return idecd_get_spindown(&info->devinfo, (unsigned long)argp); default: break; } return cdrom_ioctl(&info->devinfo, bdev, mode, cmd, - (unsigned long)compat_ptr(arg)); + (unsigned long)argp); } static int idecd_compat_ioctl(struct block_device *bdev, fmode_t mode, Unfortunately the generic_ide_ioctl() call still needs an unconverted arg, so I can't just use compat_ptr() to call the native idecd_locked_ioctl() for all commands. Thanks, Arnd