summaryrefslogtreecommitdiffstats
path: root/sys/fs
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2007-07-26 16:58:09 +0000
committerpjd <pjd@FreeBSD.org>2007-07-26 16:58:09 +0000
commitfe74e944d12452785490f4343dd388287bc64da4 (patch)
tree5a98f364f3abdf11cc44ba4d0cfc643ff591bd63 /sys/fs
parent8dc8d42bdcbcf383b19e382acdec9adc0bd70d90 (diff)
downloadFreeBSD-src-fe74e944d12452785490f4343dd388287bc64da4.zip
FreeBSD-src-fe74e944d12452785490f4343dd388287bc64da4.tar.gz
When we do open, we should lock the vnode exclusively. This fixes few races:
- fifo race, where two threads assign v_fifoinfo, - v_writecount modifications, - v_object modifications, - and probably more... Discussed with: kib, ups Approved by: re (rwatson)
Diffstat (limited to 'sys/fs')
-rw-r--r--sys/fs/devfs/devfs_vnops.c1
-rw-r--r--sys/fs/fifofs/fifo_vnops.c2
2 files changed, 2 insertions, 1 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c
index fcf3b3a..5ed41de 100644
--- a/sys/fs/devfs/devfs_vnops.c
+++ b/sys/fs/devfs/devfs_vnops.c
@@ -232,6 +232,7 @@ devfs_allocv(struct devfs_dirent *de, struct mount *mp, struct vnode **vpp, stru
VI_LOCK(vp);
dev_lock();
dev_refl(dev);
+ /* XXX: v_rdev should be protect by vnode lock */
vp->v_rdev = dev;
KASSERT(vp->v_usecount == 1,
("%s %d (%d)\n", __func__, __LINE__, vp->v_usecount));
diff --git a/sys/fs/fifofs/fifo_vnops.c b/sys/fs/fifofs/fifo_vnops.c
index 7161591..2d3254f 100644
--- a/sys/fs/fifofs/fifo_vnops.c
+++ b/sys/fs/fifofs/fifo_vnops.c
@@ -179,7 +179,7 @@ fifo_open(ap)
struct socket *rso, *wso;
int error;
- ASSERT_VOP_LOCKED(vp, "fifo_open");
+ ASSERT_VOP_ELOCKED(vp, "fifo_open");
if (fp == NULL)
return (EINVAL);
if ((fip = vp->v_fifoinfo) == NULL) {
OpenPOWER on IntegriCloud