summaryrefslogtreecommitdiff
path: root/sys/nfs
diff options
context:
space:
mode:
authorDavid Greenman <dg@FreeBSD.org>1995-07-22 03:40:56 +0000
committerDavid Greenman <dg@FreeBSD.org>1995-07-22 03:40:56 +0000
commitb92f7fba749dcb7b442bc4fb2d9c0109c875dfb2 (patch)
tree6db401de91b908350e5484951bfdbf6dbc7f6fd8 /sys/nfs
parentda9bdb3dfa7e99c7f4881284311cb1d5c273a498 (diff)
Notes
Diffstat (limited to 'sys/nfs')
-rw-r--r--sys/nfs/nfs_node.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/sys/nfs/nfs_node.c b/sys/nfs/nfs_node.c
index e5315f449b14..a6bf9000738f 100644
--- a/sys/nfs/nfs_node.c
+++ b/sys/nfs/nfs_node.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_node.c 8.2 (Berkeley) 12/30/93
- * $Id: nfs_node.c,v 1.7 1994/10/17 17:47:33 phk Exp $
+ * $Id: nfs_node.c,v 1.8 1995/03/16 18:15:36 bde Exp $
*/
#include <sys/param.h>
@@ -100,6 +100,8 @@ nfs_hash(fhp)
* In all cases, a pointer to a
* nfsnode structure is returned.
*/
+int nfs_node_hash_lock;
+
int
nfs_nget(mntp, fhp, npp)
struct mount *mntp;
@@ -124,8 +126,24 @@ loop:
*npp = np;
return(0);
}
+ /*
+ * Obtain a lock to prevent a race condition if the getnewvnode()
+ * or MALLOC() below happens to block.
+ */
+ if (nfs_node_hash_lock) {
+ while (nfs_node_hash_lock) {
+ nfs_node_hash_lock = -1;
+ tsleep(&nfs_node_hash_lock, PVM, "nfsngt", 0);
+ }
+ goto loop;
+ }
+ nfs_node_hash_lock = 1;
+
error = getnewvnode(VT_NFS, mntp, nfsv2_vnodeop_p, &nvp);
if (error) {
+ if (nfs_node_hash_lock < 0)
+ wakeup(&nfs_node_hash_lock);
+ nfs_node_hash_lock = 0;
*npp = 0;
return (error);
}
@@ -152,6 +170,11 @@ loop:
np->n_timer.cqe_next = (struct nfsnode *)0;
}
*npp = np;
+
+ if (nfs_node_hash_lock < 0)
+ wakeup(&nfs_node_hash_lock);
+ nfs_node_hash_lock = 0;
+
return (0);
}