aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/tty_io.c
diff options
context:
space:
mode:
authorPeter Hurley <peter@hurleysoftware.com>2013-03-11 16:44:34 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-03-18 19:44:02 -0400
commit4f98d4675166fc1991dbad7dd2af634df7c14061 (patch)
tree75695c7c73a7a79d398cb748a65ede865a24733d /drivers/tty/tty_io.c
parentd912156605b0eb3b3070dc7eabc43db6379aa43b (diff)
tty: Complete ownership transfer of flip buffers
Waiting for buffer work to complete is not required for safely performing changes to the line discipline, once the line discipline is halted. The buffer work routine, flush_to_ldisc(), will be unable to acquire an ldisc ref and all existing references were waited until released (so it can't already have one). Ensure running buffer work which may reference the soon-to-be-gone tty completes and any buffer work running after this point retrieves a NULL tty. Also, ensure all buffer work is cancelled on port destruction. Signed-off-by: Peter Hurley <peter@hurleysoftware.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/tty_io.c')
-rw-r--r--drivers/tty/tty_io.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index e6ee0f459a20..458763418701 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -1595,6 +1595,7 @@ static void release_tty(struct tty_struct *tty, int idx)
1595 tty_free_termios(tty); 1595 tty_free_termios(tty);
1596 tty_driver_remove_tty(tty->driver, tty); 1596 tty_driver_remove_tty(tty->driver, tty);
1597 tty->port->itty = NULL; 1597 tty->port->itty = NULL;
1598 cancel_work_sync(&tty->port->buf.work);
1598 1599
1599 if (tty->link) 1600 if (tty->link)
1600 tty_kref_put(tty->link); 1601 tty_kref_put(tty->link);