tty: vt: expect valid vc when in tty ops
authorJiri Slaby (SUSE) <jirislaby@kernel.org>
Mon, 22 Jan 2024 11:03:18 +0000 (12:03 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 28 Jan 2024 02:08:52 +0000 (18:08 -0800)
At least since commits feebed6515a1 ("tty: shutdown method") and
bc1e99d93f09 ("TTY: vt, add ->install"), tty->driver_data in vc is
expected to be set since tty_operations::install() till ::cleanup().

So the checks of !tty->driver_data (aka !vc) in:
* vc_do_resize() by tty -> ioctl(TIOCSWINSZ) -> vt_resize()
* do_con_write() by tty -> tty_operations::write()/::put_char()
* con_flush_chars() by tty -> ::flush_chars()
are all superfluous. And also, holding a console lock is not needed to
fetch tty->driver_data.

Note there is even a stale comment in con_flush_chars() about a race
between that and con_close(). But con_close() does not set
tty->driver_data to NULL for years already.

Drop all these in a hope I am not terribly mistaken.

Signed-off-by: "Jiri Slaby (SUSE)" <jirislaby@kernel.org>
Tested-by: Helge Deller <deller@gmx.de> # parisc STI console
Link: https://lore.kernel.org/r/20240122110401.7289-5-jirislaby@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/vt.c

index 55ce6cdecbca09daa965adc7b2f866fb872c3bf1..e131edea00daf8de154bcc6775f9ecbc0708411a 100644 (file)
@@ -1154,9 +1154,6 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
 
        WARN_CONSOLE_UNLOCKED();
 
-       if (!vc)
-               return -ENXIO;
-
        user = vc->vc_resize_user;
        vc->vc_resize_user = 0;
 
@@ -2852,7 +2849,7 @@ static int do_con_write(struct tty_struct *tty, const u8 *buf, int count)
        };
        int c, tc, n = 0;
        unsigned int currcons;
-       struct vc_data *vc;
+       struct vc_data *vc = tty->driver_data;
        struct vt_notifier_param param;
        bool rescan;
 
@@ -2860,13 +2857,6 @@ static int do_con_write(struct tty_struct *tty, const u8 *buf, int count)
                return count;
 
        console_lock();
-       vc = tty->driver_data;
-       if (vc == NULL) {
-               pr_err("vt: argh, driver_data is NULL !\n");
-               console_unlock();
-               return 0;
-       }
-
        currcons = vc->vc_num;
        if (!vc_cons_allocated(currcons)) {
                /* could this happen? */
@@ -3312,16 +3302,13 @@ static void con_start(struct tty_struct *tty)
 
 static void con_flush_chars(struct tty_struct *tty)
 {
-       struct vc_data *vc;
+       struct vc_data *vc = tty->driver_data;
 
        if (in_interrupt())     /* from flush_to_ldisc */
                return;
 
-       /* if we race with con_close(), vt may be null */
        console_lock();
-       vc = tty->driver_data;
-       if (vc)
-               set_cursor(vc);
+       set_cursor(vc);
        console_unlock();
 }