On Wed, Dec 18, 2019 at 9:11 PM Ben Hutchings ben.hutchings@codethink.co.uk 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