Index: sys/fs/fifofs/fifo_vnops.c =================================================================== --- sys/fs/fifofs/fifo_vnops.c +++ sys/fs/fifofs/fifo_vnops.c @@ -83,7 +83,7 @@ .vop_create = VOP_PANIC, .vop_getattr = VOP_EBADF, .vop_ioctl = VOP_PANIC, - .vop_kqfilter = VOP_PANIC, + .vop_kqfilter = vop_stdkqfilter, .vop_link = VOP_PANIC, .vop_mkdir = VOP_PANIC, .vop_mknod = VOP_PANIC, Index: sys/kern/sys_pipe.c =================================================================== --- sys/kern/sys_pipe.c +++ sys/kern/sys_pipe.c @@ -1752,6 +1752,10 @@ cpipe = PIPE_PEER(cpipe); break; default: + if ((cpipe->pipe_type & PIPE_TYPE_NAMED) != 0) { + PIPE_UNLOCK(cpipe); + return (vnops.fo_kqfilter(fp, kn)); + } PIPE_UNLOCK(cpipe); return (EINVAL); } Index: tests/sys/kqueue/libkqueue/common.h =================================================================== --- tests/sys/kqueue/libkqueue/common.h +++ tests/sys/kqueue/libkqueue/common.h @@ -36,6 +36,8 @@ #include #include #include +#include +#include #include #include Index: tests/sys/kqueue/libkqueue/vnode.c =================================================================== --- tests/sys/kqueue/libkqueue/vnode.c +++ tests/sys/kqueue/libkqueue/vnode.c @@ -64,6 +64,64 @@ success(); } +static void +test_kevent_vnode_note_delete_fifo(void) +{ + const char *test_id = "kevent(EVFILT_VNODE, NOTE_DELETE, FIFO)"; + const char *fifo_path = "./kqueue-fifo.tmp"; + struct kevent kev; + int fd; + pid_t pid; + + test_begin(test_id); + + if (mkfifo(fifo_path, 0600) != 0) + err(1, "mkfifo"); + + pid = fork(); + if (pid == -1) + err(1, "fork"); + + if (pid == 0) { + char buf[4]; + + fd = open(fifo_path, O_RDONLY); + if (fd == -1) + _exit(1); + + while (read(fd, buf, sizeof(buf)) != 0) { + } + + _exit(0); + } + + sleep(1); + if (waitpid(pid, NULL, WNOHANG) == pid) { + unlink(fifo_path); + err(1, "open"); + } + + fd = open(fifo_path, O_WRONLY); + if (fd < 0) { + unlink(fifo_path); + err(1, "open"); + } + + EV_SET(&kev, fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_DELETE, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) { + unlink(fifo_path); + err(1, "%s", test_id); + } + + if (unlink(fifo_path) < 0) + err(1, "unlink"); + + kevent_cmp(&kev, kevent_get(kqfd)); + close(fd); + + success(); +} + static void test_kevent_vnode_note_write(void) { @@ -261,5 +319,6 @@ test_kevent_vnode_note_attrib(); test_kevent_vnode_note_rename(); test_kevent_vnode_note_delete(); + test_kevent_vnode_note_delete_fifo(); close(kqfd); }