summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2020-06-15 15:42:11 +0000
committermpi <mpi@openbsd.org>2020-06-15 15:42:11 +0000
commitcd7317608c2935dc76e7edbef5164cf5eec1552f (patch)
tree6581a1dcb90042a207ec9faa42a97b1c54866a1d
parentSet __EV_HUP when the conditions matching poll(2)'s POLLUP are found. (diff)
downloadwireguard-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.c6
-rw-r--r--sys/miscfs/deadfs/dead_vnops.c22
-rw-r--r--sys/sys/event.h3
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 *);