aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/tty.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index e051c66ab0c9..61a6beafa2c0 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -253,9 +253,6 @@ ttydev_leave(struct tty *tp)
ttyoutq_free(&tp->t_outq);
tp->t_outlow = 0;
- knlist_clear(&tp->t_inpoll.si_note, 1);
- knlist_clear(&tp->t_outpoll.si_note, 1);
-
if (!tty_gone(tp))
ttydevsw_close(tp);
@@ -369,7 +366,7 @@ done: tp->t_flags &= ~TF_OPENCLOSE;
static int
ttydev_close(struct cdev *dev, int fflag, int devtype __unused,
- struct thread *td __unused)
+ struct thread *td)
{
struct tty *tp = dev->si_drv1;
@@ -392,8 +389,11 @@ ttydev_close(struct cdev *dev, int fflag, int devtype __unused,
}
/* If revoking, flush output now to avoid draining it later. */
- if (fflag & FREVOKE)
+ if ((fflag & FREVOKE) != 0) {
tty_flush(tp, FWRITE);
+ knlist_delete(&tp->t_inpoll.si_note, td, 1);
+ knlist_delete(&tp->t_outpoll.si_note, td, 1);
+ }
tp->t_flags &= ~TF_EXCLUDE;
@@ -1120,6 +1120,8 @@ tty_dealloc(void *arg)
ttyoutq_free(&tp->t_outq);
seldrain(&tp->t_inpoll);
seldrain(&tp->t_outpoll);
+ knlist_clear(&tp->t_inpoll.si_note, 0);
+ knlist_clear(&tp->t_outpoll.si_note, 0);
knlist_destroy(&tp->t_inpoll.si_note);
knlist_destroy(&tp->t_outpoll.si_note);