diff options
Diffstat (limited to 'drivers/tty/tty_io.c')
| -rw-r--r-- | drivers/tty/tty_io.c | 9 | 
1 files changed, 9 insertions, 0 deletions
| diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index eb9133b472f4..63114ea35ec1 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -586,6 +586,14 @@ static void __tty_hangup(struct tty_struct *tty, int exit_session)  		return;  	} +	/* +	 * Some console devices aren't actually hung up for technical and +	 * historical reasons, which can lead to indefinite interruptible +	 * sleep in n_tty_read().  The following explicitly tells +	 * n_tty_read() to abort readers. +	 */ +	set_bit(TTY_HUPPING, &tty->flags); +  	/* inuse_filps is protected by the single tty lock,  	   this really needs to change if we want to flush the  	   workqueue with the lock held */ @@ -640,6 +648,7 @@ static void __tty_hangup(struct tty_struct *tty, int exit_session)  	 * from the ldisc side, which is now guaranteed.  	 */  	set_bit(TTY_HUPPED, &tty->flags); +	clear_bit(TTY_HUPPING, &tty->flags);  	tty_unlock(tty);  	if (f) | 

