serial_core: Get a reference for port->tty in uart_remove_one_port()
authorGeert Uytterhoeven <geert+renesas@linux-m68k.org>
Mon, 17 Mar 2014 13:10:58 +0000 (14:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 Mar 2014 23:16:59 +0000 (16:16 -0700)
Suggested-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_core.c

index 203cb32638c373c04e2fb312e8fafb0f82904bfd..3253905428eaa86f6cd1449d982b940e556c0a3d 100644 (file)
@@ -2645,6 +2645,7 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
 {
        struct uart_state *state = drv->state + uport->line;
        struct tty_port *port = &state->port;
+       struct tty_struct *tty;
        int ret = 0;
 
        BUG_ON(in_interrupt());
@@ -2673,8 +2674,11 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
         */
        tty_unregister_device(drv->tty_driver, uport->line);
 
-       if (port->tty)
+       tty = tty_port_tty_get(port);
+       if (tty) {
                tty_vhangup(port->tty);
+               tty_kref_put(tty);
+       }
 
        /*
         * If the port is used as a console, unregister it