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