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 <a...@arndb.de>

Besides the two minor things below

Acked-by: Heiko Carstens <heiko.carst...@de.ibm.com>

> 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.

Reply via email to