summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Unangst <tedu@cvs.openbsd.org>2014-12-23 07:54:14 +0000
committerTed Unangst <tedu@cvs.openbsd.org>2014-12-23 07:54:14 +0000
commited439ed4d2e756a9e996a49602a8d57815c5a0f4 (patch)
treef1e3afc6bd687c1685a32c63e7c833106a40a66c
parentf472db0d4cb99a3dd5d8c8848a9e0ceba4569210 (diff)
to be safe, revert locking change until further tested.
-rw-r--r--sys/nfs/nfs_node.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/sys/nfs/nfs_node.c b/sys/nfs/nfs_node.c
index 0a63a744d7c..4d9bbd1d971 100644
--- a/sys/nfs/nfs_node.c
+++ b/sys/nfs/nfs_node.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_node.c,v 1.60 2014/12/23 04:48:47 tedu Exp $ */
+/* $OpenBSD: nfs_node.c,v 1.61 2014/12/23 07:54:13 tedu Exp $ */
/* $NetBSD: nfs_node.c,v 1.16 1996/02/18 11:53:42 fvdl Exp $ */
/*
@@ -118,27 +118,23 @@ loop:
*/
rw_exit_write(&nfs_hashlock);
error = getnewvnode(VT_NFS, mnt, &nfs_vops, &nvp);
+ /* note that we don't have this vnode set up completely yet */
+ rw_enter_write(&nfs_hashlock);
if (error) {
*npp = NULL;
+ rw_exit_write(&nfs_hashlock);
return (error);
}
- /* grab one of these too while we're outside the lock */
- np2 = pool_get(&nfs_node_pool, PR_WAITOK | PR_ZERO);
-
- /* note that we don't have this vnode set up completely yet */
- rw_enter_write(&nfs_hashlock);
nvp->v_flag |= VLARVAL;
np = RB_FIND(nfs_nodetree, &nmp->nm_ntree, &find);
- /* lost race. undo and repeat */
if (np != NULL) {
- pool_put(&nfs_node_pool, np2);
vgone(nvp);
rw_exit_write(&nfs_hashlock);
goto loop;
}
vp = nvp;
- np = np2;
+ np = pool_get(&nfs_node_pool, PR_WAITOK | PR_ZERO);
vp->v_data = np;
/* we now have an nfsnode on this vnode */
vp->v_flag &= ~VLARVAL;