diff --git a/sys/kern/tty.c b/sys/kern/tty.c index ffc4d120e84..2e02e126dc8 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.c,v 1.151 2020/01/09 14:35:20 mpi Exp $ */ +/* $OpenBSD: tty.c,v 1.152 2020/02/08 14:52:07 visa Exp $ */ /* $NetBSD: tty.c,v 1.68.4.2 1996/06/06 16:04:52 thorpej Exp $ */ /*- @@ -75,7 +75,6 @@ static void ttyblock(struct tty *); void ttyunblock(struct tty *); static void ttyecho(int, struct tty *); static void ttyrubo(struct tty *, int); -void ttkqflush(struct klist *klist); int filt_ttyread(struct knote *kn, long hint); void filt_ttyrdetach(struct knote *kn); int filt_ttywrite(struct knote *kn, long hint); @@ -1124,7 +1123,7 @@ ttkqfilter(dev_t dev, struct knote *kn) return (EINVAL); } - kn->kn_hook = (caddr_t)((u_long)dev); + kn->kn_hook = tp; s = spltty(); SLIST_INSERT_HEAD(klist, kn, kn_selnext); @@ -1133,30 +1132,12 @@ ttkqfilter(dev_t dev, struct knote *kn) return (0); } -void -ttkqflush(struct klist *klist) -{ - struct knote *kn, *kn1; - - SLIST_FOREACH_SAFE(kn, klist, kn_selnext, kn1) { - SLIST_REMOVE(klist, kn, knote, kn_selnext); - kn->kn_hook = (caddr_t)((u_long)NODEV); - kn->kn_flags |= EV_EOF; - knote_activate(kn); - } -} - void filt_ttyrdetach(struct knote *kn) { - dev_t dev = (dev_t)((u_long)kn->kn_hook); - struct tty *tp; + struct tty *tp = kn->kn_hook; int s; - if (dev == NODEV) - return; - tp = (*cdevsw[major(dev)].d_tty)(dev); - s = spltty(); SLIST_REMOVE(&tp->t_rsel.si_note, kn, knote, kn_selnext); splx(s); @@ -1165,16 +1146,9 @@ filt_ttyrdetach(struct knote *kn) int filt_ttyread(struct knote *kn, long hint) { - dev_t dev = (dev_t)((u_long)kn->kn_hook); - struct tty *tp; + struct tty *tp = kn->kn_hook; int s; - if (dev == NODEV) { - kn->kn_flags |= EV_EOF; - return (1); - } - tp = (*cdevsw[major(dev)].d_tty)(dev); - s = spltty(); kn->kn_data = ttnread(tp); splx(s); @@ -1188,14 +1162,9 @@ filt_ttyread(struct knote *kn, long hint) void filt_ttywdetach(struct knote *kn) { - dev_t dev = (dev_t)((u_long)kn->kn_hook); - struct tty *tp; + struct tty *tp = kn->kn_hook; int s; - if (dev == NODEV) - return; - tp = (*cdevsw[major(dev)].d_tty)(dev); - s = spltty(); SLIST_REMOVE(&tp->t_wsel.si_note, kn, knote, kn_selnext); splx(s); @@ -1204,16 +1173,9 @@ filt_ttywdetach(struct knote *kn) int filt_ttywrite(struct knote *kn, long hint) { - dev_t dev = (dev_t)((u_long)kn->kn_hook); - struct tty *tp; + struct tty *tp = kn->kn_hook; int canwrite, s; - if (dev == NODEV) { - kn->kn_flags |= EV_EOF; - return (1); - } - tp = (*cdevsw[major(dev)].d_tty)(dev); - s = spltty(); kn->kn_data = tp->t_outq.c_cn - tp->t_outq.c_cc; canwrite = (tp->t_outq.c_cc <= tp->t_lowat); @@ -2378,6 +2340,7 @@ ttymalloc(int baud) void ttyfree(struct tty *tp) { + int s; --tty_count; #ifdef DIAGNOSTIC @@ -2386,8 +2349,10 @@ ttyfree(struct tty *tp) #endif TAILQ_REMOVE(&ttylist, tp, tty_link); - ttkqflush(&tp->t_rsel.si_note); - ttkqflush(&tp->t_wsel.si_note); + s = spltty(); + klist_invalidate(&tp->t_rsel.si_note); + klist_invalidate(&tp->t_wsel.si_note); + splx(s); clfree(&tp->t_rawq); clfree(&tp->t_canq);