From: Christoph Hellwig The only own ioctl, TAPE390_DISPLAY, is compat_clean, everything else is routed through common translation code. Signed-off-by: Christoph Hellwig Cc: Martin Schwidefsky Signed-off-by: Andrew Morton --- arch/s390/kernel/compat_ioctl.c | 2 -- drivers/s390/char/tape_char.c | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff -puN arch/s390/kernel/compat_ioctl.c~compat_ioctl-for-390-tape_char arch/s390/kernel/compat_ioctl.c --- 25/arch/s390/kernel/compat_ioctl.c~compat_ioctl-for-390-tape_char Thu Nov 17 15:08:29 2005 +++ 25-akpm/arch/s390/kernel/compat_ioctl.c Thu Nov 17 15:08:51 2005 @@ -63,8 +63,6 @@ COMPATIBLE_IOCTL(BIODASDSATTR) COMPATIBLE_IOCTL(BIODASDCMFENABLE) COMPATIBLE_IOCTL(BIODASDCMFDISABLE) COMPATIBLE_IOCTL(BIODASDREADALLCMB) - -COMPATIBLE_IOCTL(TAPE390_DISPLAY) }; int ioctl_table_size = ARRAY_SIZE(ioctl_start); diff -puN drivers/s390/char/tape_char.c~compat_ioctl-for-390-tape_char drivers/s390/char/tape_char.c --- 25/drivers/s390/char/tape_char.c~compat_ioctl-for-390-tape_char Thu Nov 17 15:08:29 2005 +++ 25-akpm/drivers/s390/char/tape_char.c Thu Nov 17 15:08:29 2005 @@ -37,6 +37,8 @@ static int tapechar_open(struct inode *, static int tapechar_release(struct inode *,struct file *); static int tapechar_ioctl(struct inode *, struct file *, unsigned int, unsigned long); +static long tapechar_compat_ioctl(struct file *, unsigned int, + unsigned long); static struct file_operations tape_fops = { @@ -44,6 +46,7 @@ static struct file_operations tape_fops .read = tapechar_read, .write = tapechar_write, .ioctl = tapechar_ioctl, + .compat_ioctl = tapechar_compat_ioctl, .open = tapechar_open, .release = tapechar_release, }; @@ -463,6 +466,23 @@ tapechar_ioctl(struct inode *inp, struct return device->discipline->ioctl_fn(device, no, data); } +static long +tapechar_compat_ioctl(struct file *filp, unsigned int no, unsigned long data) +{ + struct tape_device *device = filp->private_data; + int rval = -ENOIOCTLCMD; + + if (device->discipline->ioctl_fn) { + lock_kernel(); + rval = device->discipline->ioctl_fn(device, no, data); + unlock_kernel(); + if (rval == -EINVAL) + rval = -ENOIOCTLCMD; + } + + return rval; +} + /* * Initialize character device frontend. */ _