Index: fifo_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/fs/fifofs/fifo_vnops.c,v retrieving revision 1.126 diff -u -r1.126 fifo_vnops.c --- fifo_vnops.c 18 Sep 2005 10:44:50 -0000 1.126 +++ fifo_vnops.c 21 Sep 2005 16:44:55 -0000 @@ -82,6 +82,7 @@ struct socket *fi_writesock; long fi_readers; long fi_writers; + struct sx fi_sx; }; static vop_print_t fifo_print; @@ -152,6 +153,7 @@ vp->v_fifoinfo = NULL; (void)soclose(fip->fi_readsock); (void)soclose(fip->fi_writesock); + sx_destroy(&fip->fi_sx); FREE(fip, M_VNODE); } } @@ -179,7 +181,8 @@ int error; if ((fip = vp->v_fifoinfo) == NULL) { - MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, M_WAITOK); + MALLOC(fip, struct fifoinfo *, sizeof(*fip), M_VNODE, + M_WAITOK | M_ZERO); error = socreate(AF_LOCAL, &rso, SOCK_STREAM, 0, cred, td); if (error) goto fail1; @@ -198,6 +201,7 @@ return (error); } fip->fi_readers = fip->fi_writers = 0; + sx_init(&fip->fi_sx, "fifo_sx"); wso->so_snd.sb_lowat = PIPE_BUF; SOCKBUF_LOCK(&rso->so_rcv); rso->so_rcv.sb_state |= SBS_CANTRCVMORE; @@ -703,7 +707,9 @@ if (uio->uio_resid == 0) return (0); sflags = (fp->f_flag & FNONBLOCK) ? MSG_NBIO : 0; + sx_xlock(&fip->fi_sx); error = soreceive(fip->fi_readsock, NULL, uio, NULL, NULL, &sflags); + sx_xunlock(&fip->fi_sx); return (error); } @@ -723,6 +729,8 @@ fip = fp->f_data; KASSERT(uio->uio_rw == UIO_WRITE,("fifo_write mode")); sflags = (fp->f_flag & FNONBLOCK) ? MSG_NBIO : 0; + sx_xlock(&fip->fi_sx); error = sosend(fip->fi_writesock, NULL, uio, 0, NULL, sflags, td); + sx_xunlock(&fip->fi_sx); return (error); }