This extends the existing dead filter to add __EV_HUP in order to make
it usable by deadfs.
ok?
diff 6125a47a01eb7846ac29f04db756ccc8201dee58
ba22f59fc655d5ccdb16c30de07bb3f10a45aa74
blob - bb1340da842353113b6bed8e4af1427d033d594f
blob + 56f58fcabe6ac056e1d8846640ceafedda53707a
--- sys/kern/kern_event.c
+++ sys/kern/kern_event.c
@@ -481,6 +481,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);
}
@@ -491,7 +493,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,
blob - 606960c726d2b78f01043bc94c21f14230f8ef2d
blob + c0e311403805edb8c45e34256ebd5a27e37ad750
--- sys/miscfs/deadfs/dead_vnops.c
+++ sys/miscfs/deadfs/dead_vnops.c
@@ -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,
@@ -165,6 +168,23 @@ dead_poll(void *v)
* Let the user find out that the descriptor is gone.
*/
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);
}
/*
blob - e0e8441a6af82f9306311a1844c05154d7aa3bd1
blob + a73eb164dc5a1faf27b7258c37d1ddcc88cf271b
--- sys/sys/event.h
+++ sys/sys/event.h
@@ -195,7 +195,7 @@ struct knote {
struct proc;
-extern const struct filterops sig_filtops;
+extern const struct filterops sig_filtops, dead_filtops;
extern void knote(struct klist *list, long hint);
extern void knote_activate(struct knote *);