]> git.baikalelectronics.ru Git - kernel.git/commit
TTY: ldisc, wait for ldisc infinitely in hangup
authorJiri Slaby <jslaby@suse.cz>
Wed, 16 Nov 2011 15:27:09 +0000 (16:27 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 17 Nov 2011 19:36:12 +0000 (11:36 -0800)
commit2b23fd8ab671fe21c0303c89a56c7558c25cd736
tree1ea6d927a4766dfa0f24ad4ec482eeb6187c3c98
parente7e59fbc7c3f98af5749dddfc00e7918256c7070
TTY: ldisc, wait for ldisc infinitely in hangup

For /dev/console case, we do not kill all ldisc users. It's due to
redirected_tty_write test in __tty_hangup. In that case there still
might be a process waiting e.g. in n_tty_read for input.

We wait for such processes to disappear. The problem is that we use a
timeout. After this timeout, we continue closing the ldisc and start
freeing tty resources. It obviously leads to crashes when the other
process is woken.

So to fix this, we wait infinitely before reiniting the ldisc. (The
tiocsetd remains untouched -- times out after 5s.)

This is nicely reproducible with this run from shell:
  exec 0<>/dev/console 1<>/dev/console 2<>/dev/console
and stopping a getty like:
  systemctl stop serial-getty@ttyS0.service

The crash proper may be produced only under load or with constified
timing the same as for 6eed8b82a.

Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Dave Young <hidave.darkstar@gmail.com>
Cc: Dave Jones <davej@redhat.com>
Cc: Ben Hutchings <ben@decadent.org.uk>
Cc: Dmitriy Matrosov <sgf.dma@gmail.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/tty/tty_ldisc.c