summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authortruckman <truckman@FreeBSD.org>2003-06-16 17:17:09 +0000
committertruckman <truckman@FreeBSD.org>2003-06-16 17:17:09 +0000
commit78ee1563afff191a2968fa2a69195f7f0b34028d (patch)
tree2816372755270811b2dea495b9484caa1117374c /sys/fs
parent0890e600ee117e8e8ef300248855448556deaa7a (diff)
downloadFreeBSD-src-78ee1563afff191a2968fa2a69195f7f0b34028d.zip
FreeBSD-src-78ee1563afff191a2968fa2a69195f7f0b34028d.tar.gz
Partially back out rev 1.87 by nuking fifo_inactive() and moving the
resource deallocation back to fifo_close(). This eliminates any stale data that might be stuck in the socket buffers after all the readers and writers have closed the fifo. Tested by: Thorsten Schroeder <ths@katjusha.de>
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/fifofs/fifo_vnops.c24
1 files changed, 4 insertions, 20 deletions
diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c
index 95c8a9e..c2df25d 100644
--- a/sys/fs/fifofs/fifo_vnops.c
+++ b/sys/fs/fifofs/fifo_vnops.c
@@ -70,7 +70,6 @@ static int fifo_print(struct vop_print_args *);
static int fifo_lookup(struct vop_lookup_args *);
static int fifo_open(struct vop_open_args *);
static int fifo_close(struct vop_close_args *);
-static int fifo_inactive(struct vop_inactive_args *);
static int fifo_read(struct vop_read_args *);
static int fifo_write(struct vop_write_args *);
static int fifo_ioctl(struct vop_ioctl_args *);
@@ -98,7 +97,6 @@ static struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
{ &vop_create_desc, (vop_t *) vop_panic },
{ &vop_getattr_desc, (vop_t *) vop_ebadf },
{ &vop_getwritemount_desc, (vop_t *) vop_stdgetwritemount },
- { &vop_inactive_desc, (vop_t *) fifo_inactive },
{ &vop_ioctl_desc, (vop_t *) fifo_ioctl },
{ &vop_kqfilter_desc, (vop_t *) fifo_kqfilter },
{ &vop_lease_desc, (vop_t *) vop_null },
@@ -556,33 +554,19 @@ fifo_close(ap)
if (fip->fi_writers == 0)
socantrcvmore(fip->fi_readsock);
}
- VOP_UNLOCK(vp, 0, td);
- return (0);
-}
-
-static int
-fifo_inactive(ap)
- struct vop_inactive_args /* {
- struct vnode *a_vp;
- struct thread *a_td;
- } */ *ap;
-{
- struct vnode *vp = ap->a_vp;
- struct fifoinfo *fip = vp->v_fifoinfo;
-
VI_LOCK(vp);
- if (fip != NULL && vp->v_usecount == 0) {
+ if (vp->v_usecount == 1) {
vp->v_fifoinfo = NULL;
VI_UNLOCK(vp);
(void)soclose(fip->fi_readsock);
(void)soclose(fip->fi_writesock);
FREE(fip, M_VNODE);
- }
- VOP_UNLOCK(vp, 0, ap->a_td);
+ } else
+ VI_UNLOCK(vp);
+ VOP_UNLOCK(vp, 0, td);
return (0);
}
-
/*
* Print out internal contents of a fifo vnode.
*/
OpenPOWER on IntegriCloud