summaryrefslogtreecommitdiffstats
path: root/sys/kern
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/kern
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/kern')
-rw-r--r--sys/kern/uipc_usrreq.c2
-rw-r--r--sys/kern/vfs_vnops.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
index 9acb596..682496e 100644
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -463,7 +463,7 @@ restart:
goto error;
}
vp = nd.ni_vp;
- ASSERT_VOP_LOCKED(vp, "uipc_bind");
+ ASSERT_VOP_ELOCKED(vp, "uipc_bind");
soun = (struct sockaddr_un *)sodupsockaddr(nam, M_WAITOK);
UNP_GLOBAL_WLOCK();
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 019553d..4f5305e 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -184,7 +184,7 @@ restart:
ndp->ni_cnd.cn_nameiop = LOOKUP;
ndp->ni_cnd.cn_flags = ISOPEN |
((fmode & O_NOFOLLOW) ? NOFOLLOW : FOLLOW) |
- LOCKSHARED | LOCKLEAF | MPSAFE | AUDITVNODE1;
+ LOCKLEAF | MPSAFE | AUDITVNODE1;
if ((error = namei(ndp)) != 0)
return (error);
if (!mpsafe)
@@ -235,7 +235,7 @@ restart:
if (fmode & FWRITE)
vp->v_writecount++;
*flagp = fmode;
- ASSERT_VOP_LOCKED(vp, "vn_open_cred");
+ ASSERT_VOP_ELOCKED(vp, "vn_open_cred");
if (!mpsafe)
VFS_UNLOCK_GIANT(vfslocked);
return (0);
OpenPOWER on IntegriCloud