summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorjlemon <jlemon@FreeBSD.org>2001-06-06 17:38:36 +0000
committerjlemon <jlemon@FreeBSD.org>2001-06-06 17:38:36 +0000
commit60545edbcb9facbd2051b8dae4a8de9c998e5a3d (patch)
tree0770fe3971d5ec6bdbf13fb0c9532fbe9fd1b91a /sys/fs
parentad33edc1582bc5ae4821ffb12df76482ae8c0fbd (diff)
downloadFreeBSD-src-60545edbcb9facbd2051b8dae4a8de9c998e5a3d.zip
FreeBSD-src-60545edbcb9facbd2051b8dae4a8de9c998e5a3d.tar.gz
The kq write filter was hooked up to the wrong socket, and thus was
not behaving correctly. Fix by attaching to the correct socket. Also call so{rw}wakeup in addition to the fifo wakeup, so that any kqfilters attached to the socket buffer get poked.
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/fifofs/fifo_vnops.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c
index 2a3078f..5fadba2 100644
--- a/sys/fs/fifofs/fifo_vnops.c
+++ b/sys/fs/fifofs/fifo_vnops.c
@@ -95,6 +95,7 @@ static struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
{ &vop_getattr_desc, (vop_t *) vop_ebadf },
{ &vop_getwritemount_desc, (vop_t *) vop_stdgetwritemount },
{ &vop_ioctl_desc, (vop_t *) fifo_ioctl },
+ { &vop_kqfilter_desc, (vop_t *) fifo_kqfilter },
{ &vop_lease_desc, (vop_t *) vop_null },
{ &vop_link_desc, (vop_t *) fifo_badop },
{ &vop_lookup_desc, (vop_t *) fifo_lookup },
@@ -103,7 +104,6 @@ static struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
{ &vop_open_desc, (vop_t *) fifo_open },
{ &vop_pathconf_desc, (vop_t *) fifo_pathconf },
{ &vop_poll_desc, (vop_t *) fifo_poll },
- { &vop_kqfilter_desc, (vop_t *) fifo_kqfilter },
{ &vop_print_desc, (vop_t *) fifo_print },
{ &vop_read_desc, (vop_t *) fifo_read },
{ &vop_readdir_desc, (vop_t *) fifo_badop },
@@ -204,16 +204,20 @@ fifo_open(ap)
fip->fi_readers++;
if (fip->fi_readers == 1) {
fip->fi_writesock->so_state &= ~SS_CANTSENDMORE;
- if (fip->fi_writers > 0)
+ if (fip->fi_writers > 0) {
wakeup((caddr_t)&fip->fi_writers);
+ sowwakeup(fip->fi_writesock);
+ }
}
}
if (ap->a_mode & FWRITE) {
fip->fi_writers++;
if (fip->fi_writers == 1) {
fip->fi_readsock->so_state &= ~SS_CANTRCVMORE;
- if (fip->fi_readers > 0)
+ if (fip->fi_readers > 0) {
wakeup((caddr_t)&fip->fi_readers);
+ sorwakeup(fip->fi_writesock);
+ }
}
}
if ((ap->a_mode & FREAD) && (ap->a_mode & O_NONBLOCK) == 0) {
@@ -360,16 +364,19 @@ fifo_kqfilter(ap)
struct knote *a_kn;
} */ *ap;
{
- struct socket *so = (struct socket *)ap->a_vp->v_fifoinfo->fi_readsock;
+ struct fifoinfo *fi = ap->a_vp->v_fifoinfo;
+ struct socket *so;
struct sockbuf *sb;
switch (ap->a_kn->kn_filter) {
case EVFILT_READ:
ap->a_kn->kn_fop = &fiforead_filtops;
+ so = fi->fi_readsock;
sb = &so->so_rcv;
break;
case EVFILT_WRITE:
ap->a_kn->kn_fop = &fifowrite_filtops;
+ so = fi->fi_writesock;
sb = &so->so_snd;
break;
default:
OpenPOWER on IntegriCloud