diff options
author | 2020-06-15 15:42:11 +0000 | |
---|---|---|
committer | 2020-06-15 15:42:11 +0000 | |
commit | cd7317608c2935dc76e7edbef5164cf5eec1552f (patch) | |
tree | 6581a1dcb90042a207ec9faa42a97b1c54866a1d | |
parent | Set __EV_HUP when the conditions matching poll(2)'s POLLUP are found. (diff) | |
download | wireguard-openbsd-cd7317608c2935dc76e7edbef5164cf5eec1552f.tar.xz wireguard-openbsd-cd7317608c2935dc76e7edbef5164cf5eec1552f.zip |
Implement a simple kqfilter for deadfs matching its poll handler.
ok visa@, millert@
-rw-r--r-- | sys/kern/kern_event.c | 6 | ||||
-rw-r--r-- | sys/miscfs/deadfs/dead_vnops.c | 22 | ||||
-rw-r--r-- | sys/sys/event.h | 3 |
3 files changed, 27 insertions, 4 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index ac793bd2045..4d0e2c88c5f 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_event.c,v 1.138 2020/06/15 13:18:33 visa Exp $ */ +/* $OpenBSD: kern_event.c,v 1.139 2020/06/15 15:42:11 mpi Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -487,6 +487,8 @@ static int filt_dead(struct knote *kn, long hint) { kn->kn_flags |= (EV_EOF | EV_ONESHOT); + if (kn->kn_flags & __EV_POLL) + kn->kn_flags |= __EV_HUP; kn->kn_data = 0; return (1); } @@ -497,7 +499,7 @@ filt_deaddetach(struct knote *kn) /* Nothing to do */ } -static const struct filterops dead_filtops = { +const struct filterops dead_filtops = { .f_flags = FILTEROP_ISFD, .f_attach = NULL, .f_detach = filt_deaddetach, diff --git a/sys/miscfs/deadfs/dead_vnops.c b/sys/miscfs/deadfs/dead_vnops.c index 606960c726d..5a1abbc73d1 100644 --- a/sys/miscfs/deadfs/dead_vnops.c +++ b/sys/miscfs/deadfs/dead_vnops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dead_vnops.c,v 1.32 2020/01/20 23:21:56 claudio Exp $ */ +/* $OpenBSD: dead_vnops.c,v 1.33 2020/06/15 15:42:11 mpi Exp $ */ /* $NetBSD: dead_vnops.c,v 1.16 1996/02/13 13:12:48 mycroft Exp $ */ /* @@ -34,6 +34,7 @@ #include <sys/param.h> #include <sys/systm.h> +#include <sys/event.h> #include <sys/time.h> #include <sys/vnode.h> #include <sys/lock.h> @@ -52,6 +53,7 @@ int dead_read(void *); int dead_write(void *); int dead_ioctl(void *); int dead_poll(void *); +int dead_kqfilter(void *v); int dead_inactive(void *); int dead_lock(void *); int dead_bmap(void *); @@ -73,6 +75,7 @@ const struct vops dead_vops = { .vop_write = dead_write, .vop_ioctl = dead_ioctl, .vop_poll = dead_poll, + .vop_kqfilter = dead_kqfilter, .vop_fsync = nullop, .vop_remove = dead_badop, .vop_link = dead_badop, @@ -167,6 +170,23 @@ dead_poll(void *v) return (POLLHUP); } +int +dead_kqfilter(void *v) +{ + struct vop_kqfilter_args *ap = v; + + switch (ap->a_kn->kn_filter) { + case EVFILT_READ: + case EVFILT_WRITE: + ap->a_kn->kn_fop = &dead_filtops; + break; + default: + return (EINVAL); + } + + return (0); +} + /* * Just call the device strategy routine */ diff --git a/sys/sys/event.h b/sys/sys/event.h index b4539666c9a..93a8a904d90 100644 --- a/sys/sys/event.h +++ b/sys/sys/event.h @@ -1,4 +1,4 @@ -/* $OpenBSD: event.h,v 1.42 2020/06/15 15:29:40 mpi Exp $ */ +/* $OpenBSD: event.h,v 1.43 2020/06/15 15:42:11 mpi Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org> @@ -196,6 +196,7 @@ struct knote { struct proc; extern const struct filterops sig_filtops; +extern const struct filterops dead_filtops; extern void knote(struct klist *list, long hint); extern void knote_activate(struct knote *); |