|
|
@@ -1584,15 +1584,19 @@ void tty_free_termios(struct tty_struct *tty)
|
|
|
EXPORT_SYMBOL(tty_free_termios);
|
|
|
|
|
|
/**
|
|
|
- * tty_flush_works - flush all works of a tty
|
|
|
- * @tty: tty device to flush works for
|
|
|
+ * tty_flush_works - flush all works of a tty/pty pair
|
|
|
+ * @tty: tty device to flush works for (or either end of a pty pair)
|
|
|
*
|
|
|
- * Sync flush all works belonging to @tty.
|
|
|
+ * Sync flush all works belonging to @tty (and the 'other' tty).
|
|
|
*/
|
|
|
static void tty_flush_works(struct tty_struct *tty)
|
|
|
{
|
|
|
flush_work(&tty->SAK_work);
|
|
|
flush_work(&tty->hangup_work);
|
|
|
+ if (tty->link) {
|
|
|
+ flush_work(&tty->link->SAK_work);
|
|
|
+ flush_work(&tty->link->hangup_work);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1892,8 +1896,6 @@ int tty_release(struct inode *inode, struct file *filp)
|
|
|
|
|
|
/* Wait for pending work before tty destruction commmences */
|
|
|
tty_flush_works(tty);
|
|
|
- if (o_tty)
|
|
|
- tty_flush_works(o_tty);
|
|
|
|
|
|
#ifdef TTY_DEBUG_HANGUP
|
|
|
printk(KERN_DEBUG "%s: %s: freeing structure...\n", __func__, tty_name(tty, buf));
|