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 *);

Reply via email to