On Tue, Jul 30, 2019 at 09:55:31PM +0200, Arnd Bergmann wrote: > MTIOCPOS and MTIOCGET are incompatible between 32-bit and 64-bit user > space, and traditionally have been translated in fs/compat_ioctl.c. > > To get rid of that translation handler, move a corresponding > implementation into each of the four drivers implementing those commands. > > The interesting part of that is now in a new linux/mtio.h header that > wraps the existing uapi/linux/mtio.h header and provides an abstraction > to let drivers handle both cases easily. Using an in_compat_syscall() > check, the caller does not have to keep track of whether this was > called through .unlocked_ioctl() or .compat_ioctl(). > > Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> Besides the two minor things below Acked-by: Heiko Carstens <heiko.carstens@xxxxxxxxxx> > diff --git a/include/linux/mtio.h b/include/linux/mtio.h > new file mode 100644 > index 000000000000..fa2783fd37d1 > --- /dev/null > +++ b/include/linux/mtio.h > @@ -0,0 +1,59 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef _LINUX_MTIO_COMPAT_H > +#define _LINUX_MTIO_COMPAT_H > + > +#include <linux/compat.h> > +#include <uapi/linux/mtio.h> > +#include <linux/uaccess.h> > + > +/* > + * helper functions for implementing compat ioctls on the four tape > + * drivers: we define the 32-bit layout of each incompatible strucucture, typo: structure > + * plus a wrapper function to copy it to user space in either format. > + */ > + > +struct mtget32 { > + s32 mt_type; > + s32 mt_resid; > + s32 mt_dsreg; > + s32 mt_gstat; > + s32 mt_erreg; > + s32 mt_fileno; > + s32 mt_blkno; > +}; > +#define MTIOCGET32 _IOR('m', 2, struct mtget32) > + > +struct mtpos32 { > + s32 mt_blkno; > +}; > +#define MTIOCPOS32 _IOR('m', 3, struct mtpos32) > + > +static inline int put_user_mtget(void __user *u, struct mtget *k) > +{ > + struct mtget32 k32 = { > + .mt_type = k->mt_type, > + .mt_resid = k->mt_resid, > + .mt_dsreg = k->mt_dsreg, > + .mt_gstat = k->mt_gstat, > + .mt_fileno = k->mt_fileno, > + .mt_blkno = k->mt_blkno, > + }; mt_erreg is missing here.