linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Al Viro <viro@zeniv.linux.org.uk>, David Miller <davem@davemloft.net>
Cc: gregkh <gregkh@linuxfoundation.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: [PATCHES] tty ioctls cleanups, compat and not only
Date: Fri, 14 Sep 2018 10:21:53 +0200	[thread overview]
Message-ID: <CAK8P3a0wN0uMZdj-mxXwbN9AnZjHzMU6_b01H5y+Vpdt+UoeAw@mail.gmail.com> (raw)
In-Reply-To: <20180914022737.GX19965@ZenIV.linux.org.uk>

On Fri, Sep 14, 2018 at 4:27 AM Al Viro <viro@zeniv.linux.org.uk> wrote:
> On Thu, Sep 13, 2018 at 10:56:48PM +0200, Arnd Bergmann wrote:

> commit de36af5ca465156863b5fb7548e3660ea7d3bbcf
> Author: Al Viro <viro@zeniv.linux.org.uk>
> Date:   Thu Sep 13 22:12:15 2018 -0400
>
>     change semantics of ldisc ->compat_ioctl()
>
>     First of all, make it return int.  Returning long when native method
>     had never allowed that is ridiculous and inconvenient.

Ack.

>     More importantly, change the caller; if ldisc ->compat_ioctl() is NULL
>     or returns -ENOIOCTLCMD, tty_compat_ioctl() will try to feed cmd and
>     compat_ptr(arg) to ldisc's native ->ioctl().
>
>     That simplifies ->compat_ioctl() instances quite a bit - they only
>     need to deal with ioctls that are neither generic tty ones (those
>     would get shunted off to tty_ioctl()) nor simple compat pointer ones.

This does sound very appealing, but there is a small downside:
The difference between ".compat_ioctl = NULL" and
".compat_ioctl=native_ioctl" is now very subtle, and I wouldn't
necessarily expect casual readers to understand that.

If we go with my file_operations patch for generic_compat_ioctl_ptrarg
and add generic_compat_ioctl_intarg, we can do the same thing here
with ldisc_compat_ioctl_ptrarg/ldisc_compat_ioctl_intarg to make it
a little more consistent with fops and self-documenting.

> diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c
> index 963bb0309e25..ae0dd57a8e99 100644
> --- a/drivers/bluetooth/hci_ldisc.c
> +++ b/drivers/bluetooth/hci_ldisc.c
> @@ -821,6 +821,7 @@ static int __init hci_uart_init(void)
>         hci_uart_ldisc.read             = hci_uart_tty_read;
>         hci_uart_ldisc.write            = hci_uart_tty_write;
>         hci_uart_ldisc.ioctl            = hci_uart_tty_ioctl;
> +       hci_uart_ldisc.compat_ioctl     = hci_uart_tty_ioctl;
>         hci_uart_ldisc.poll             = hci_uart_tty_poll;
>         hci_uart_ldisc.receive_buf      = hci_uart_tty_receive;
>         hci_uart_ldisc.write_wakeup     = hci_uart_tty_wakeup;

so this would become

       hci_uart_ldisc.compat_ioctl     = ldisc_compat_ioctl_intarg;

>  static struct tty_ldisc_ops sp_ldisc = {
>         .owner          = THIS_MODULE,
>         .magic          = TTY_LDISC_MAGIC,
> @@ -776,9 +758,6 @@ static struct tty_ldisc_ops sp_ldisc = {
>         .open           = sixpack_open,
>         .close          = sixpack_close,
>         .ioctl          = sixpack_ioctl,
> -#ifdef CONFIG_COMPAT
> -       .compat_ioctl   = sixpack_compat_ioctl,
> -#endif
>         .receive_buf    = sixpack_receive_buf,
>         .write_wakeup   = sixpack_write_wakeup,
>  };

And this would be

         .compat_ioctl = ldisc_compat_ioctl_ptrarg,

respectively

> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index 0f75ae6bfaa7..483ad432d906 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -2824,6 +2824,9 @@ static long tty_compat_ioctl(struct file *file, unsigned int cmd,
>                 return hung_up_tty_compat_ioctl(file, cmd, arg);
>         if (ld->ops->compat_ioctl)
>                 retval = ld->ops->compat_ioctl(tty, file, cmd, arg);
> +       if (retval == -ENOIOCTLCMD && ld->ops->ioctl)
> +               retval = ld->ops->ioctl(tty, file,
> +                               (unsigned long)compat_ptr(cmd), arg);
>         tty_ldisc_deref(ld);

The added fallback would still be useful in case someone
forgets to add the .compat_ioctl assignment to a newly
added ldisc.

Another idea I had for a final fallback would be

          tty_ldisc_deref(ld);
+        if (retval == -ENOIOCTLCMD && _IOC_TYPE(cmd) == 'T') {
+                 retval = tty_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
+                 WARN_ON_ONCE(retval != -ENOIOCTLCMD && retval != -ENOTTY);
+        }

Seeing that you list every single 'T' command in tty_compat_ioctl()
that we handle in the native case, that WARN_ON_ONCE should not
trigger for any input, but it would catch (and warn about) any of those
that might get added in the future to the native code path without the
compat entry.

That might be too much  -- if it gets easy enough to keep the code
correct in the first place, there is no need.

            Arnd

  reply	other threads:[~2018-09-14  8:22 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-13  2:31 [PATCHES] tty ioctls cleanups, compat and not only Al Viro
2018-09-13  2:40 ` [PATCH 01/50] presence of RS485 ioctls has been unconditional since 2014 Al Viro
2018-09-13  2:40   ` [PATCH 02/50] move compat handling of tty ioctls to tty_compat_ioctl() Al Viro
2018-09-14 15:15     ` Arnd Bergmann
2018-09-14 18:16       ` gregkh
2018-09-14 19:38         ` Arnd Bergmann
2018-09-15 18:51           ` gregkh
2018-09-13  2:40   ` [PATCH 03/50] tty_ioctl(): drop FIONBIO handling Al Viro
2018-09-13  2:40   ` [PATCH 04/50] mos7720: bury dead TIOCM... in ->ioctl() Al Viro
2018-09-14 13:31     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 05/50] tty_ioctl(): start taking TIOC[SG]SERIAL into separate methods Al Viro
2018-09-14 13:22     ` Johan Hovold
2018-09-14 15:18       ` Al Viro
2018-09-14 16:23         ` Johan Hovold
2018-09-13  2:40   ` [PATCH 06/50] simserial: switch to ->[sg]et_serial() Al Viro
2018-09-13  2:40   ` [PATCH 07/50] fwserial: " Al Viro
2018-09-13  2:40   ` [PATCH 08/50] greybus/uart: " Al Viro
2018-09-14 13:31     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 09/50] amiserial: " Al Viro
2018-09-13 10:33     ` Greg Kroah-Hartman
2018-10-11 17:58     ` Geert Uytterhoeven
2018-10-13  5:36       ` Al Viro
2018-09-13  2:40   ` [PATCH 10/50] cyclades: " Al Viro
2018-09-13  2:40   ` [PATCH 11/50] ipwireless: " Al Viro
2018-09-14 12:00     ` David Sterba
2018-09-13  2:40   ` [PATCH 12/50] isicom: " Al Viro
2018-09-13  2:40   ` [PATCH 13/50] moxa: " Al Viro
2018-09-13  2:40   ` [PATCH 14/50] mxser: " Al Viro
2018-09-13  2:40   ` [PATCH 15/50] serial_core: " Al Viro
2018-09-13  2:40   ` [PATCH 16/50] rfcomm: get rid of mentioning TIOC[SG]SERIAL Al Viro
2018-09-13  2:40   ` [PATCH 17/50] usb-serial: begin switching to ->[sg]et_serial() Al Viro
2018-09-14 13:39     ` Johan Hovold
2018-09-14 15:23       ` Al Viro
2018-09-14 15:26         ` Johan Hovold
2018-09-13  2:40   ` [PATCH 18/50] cdc-acm: switch " Al Viro
2018-09-13  2:40   ` [PATCH 19/50] ark3116: switch to ->get_serial() Al Viro
2018-09-14 13:41     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 20/50] f81232: " Al Viro
2018-09-14 13:42     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 21/50] f81534: " Al Viro
2018-09-14 13:43     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 22/50] fdti_sio: switch to ->[sg]et_serial() Al Viro
2018-09-14 13:47     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 23/50] io_edgeport: switch to ->get_serial() Al Viro
2018-09-14 13:58     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 24/50] io_ti: " Al Viro
2018-09-14 13:59     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 25/50] mos7720: " Al Viro
2018-09-14 14:02     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 26/50] mos7840: " Al Viro
2018-09-14 14:07     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 27/50] opticon: " Al Viro
2018-09-14 14:08     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 28/50] pl2303: " Al Viro
2018-09-14 14:08     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 29/50] quatech2: " Al Viro
2018-09-14 14:09     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 30/50] ssu100: " Al Viro
2018-09-14 14:10     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 31/50] ti_usb_3410_5052: switch to ->[sg]et_serial() Al Viro
2018-09-14 14:12     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 32/50] whiteheat: switch to ->get_serial() Al Viro
2018-09-14 14:15     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 33/50] usb_wwan: switch to ->[sg]et_serial() Al Viro
2018-09-14 14:18     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 34/50] complete ->[sg]et_serial() switchover Al Viro
2018-09-14 14:20     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 35/50] synclink: reduce pointless checks in ->ioctl() Al Viro
2018-09-13  2:40   ` [PATCH 36/50] take compat TIOC[SG]SERIAL treatment into tty_compat_ioctl() Al Viro
2018-09-13  2:40   ` [PATCH 37/50] kill capinc_tty_ioctl() Al Viro
2018-09-13  2:40   ` [PATCH 38/50] isdn_tty: TCSBRK{,P} won't reach ->ioctl() Al Viro
2018-09-13  2:40   ` [PATCH 39/50] dgnc: TIOCM... " Al Viro
2018-09-13  2:40   ` [PATCH 40/50] kill the rest of tty COMPAT_IOCTL() entries Al Viro
2018-09-13 10:55     ` Arnd Bergmann
2018-09-13  2:40   ` [PATCH 41/50] dgnc: break-related ioctls won't reach ->ioctl() Al Viro
2018-09-13 11:59     ` Greg Kroah-Hartman
2018-09-13  2:40   ` [PATCH 42/50] remove fallback to drivers for TIOCGICOUNT Al Viro
2018-09-14 14:23     ` Johan Hovold
2018-09-13  2:40   ` [PATCH 43/50] dgnc: leave TIOC[GS]SOFTCAR to ldisc Al Viro
2018-09-13  2:40   ` [PATCH 44/50] dgnc: don't bother with (empty) stub for TCXONC Al Viro
2018-09-13  2:40   ` [PATCH 45/50] gigaset: don't try to printk userland buffer contents Al Viro
2018-09-13  2:40   ` [PATCH 46/50] vt_compat_ioctl(): clean up, use compat_ptr() properly Al Viro
2018-09-13 10:10     ` Arnd Bergmann
2018-09-13  2:40   ` [PATCH 47/50] gigaset: add ->compat_ioctl() Al Viro
2018-09-13  2:40   ` [PATCH 48/50] compat_ioctl - kill keyboard ioctl handling Al Viro
2018-09-13  2:40   ` [PATCH 49/50] pty: fix compat ioctls Al Viro
2018-09-13  2:40   ` [PATCH 50/50] synclink_gt(): fix compat_ioctl() Al Viro
2018-09-13 11:19 ` [PATCHES] tty ioctls cleanups, compat and not only Arnd Bergmann
2018-09-13 20:31   ` Al Viro
2018-09-13 20:56     ` Arnd Bergmann
2018-09-14  2:27       ` Al Viro
2018-09-14  8:21         ` Arnd Bergmann [this message]
2018-09-14 15:10           ` Al Viro
2018-09-14 15:33             ` Arnd Bergmann
2018-09-13 11:59 ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAK8P3a0wN0uMZdj-mxXwbN9AnZjHzMU6_b01H5y+Vpdt+UoeAw@mail.gmail.com \
    --to=arnd@arndb.de \
    --cc=davem@davemloft.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).