diff options
author | pjd <pjd@FreeBSD.org> | 2007-07-26 16:58:09 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-07-26 16:58:09 +0000 |
commit | fe74e944d12452785490f4343dd388287bc64da4 (patch) | |
tree | 5a98f364f3abdf11cc44ba4d0cfc643ff591bd63 /sys/fs | |
parent | 8dc8d42bdcbcf383b19e382acdec9adc0bd70d90 (diff) | |
download | FreeBSD-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.c | 1 | ||||
-rw-r--r-- | sys/fs/fifofs/fifo_vnops.c | 2 |
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) { |