summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_export.c
diff options
context:
space:
mode:
authorhsu <hsu@FreeBSD.org>2002-12-24 03:03:39 +0000
committerhsu <hsu@FreeBSD.org>2002-12-24 03:03:39 +0000
commit32436a25c0510e4371c6f02353b447c09ba9db0d (patch)
tree5e53dfd4f16f3a5c2080f2ce73aed007b1be63a1 /sys/kern/vfs_export.c
parent018c02046059a2588bdd154c9136e4467aafa156 (diff)
downloadFreeBSD-src-32436a25c0510e4371c6f02353b447c09ba9db0d.zip
FreeBSD-src-32436a25c0510e4371c6f02353b447c09ba9db0d.tar.gz
SMP locking for radix nodes.
Diffstat (limited to 'sys/kern/vfs_export.c')
-rw-r--r--sys/kern/vfs_export.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index 22927bd..b909b83 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -137,7 +137,7 @@ vfs_hang_addrlist(mp, nep, argp)
smask->sa_len = argp->ex_masklen;
}
i = saddr->sa_family;
- if ((rnh = nep->ne_rtable[i]) == 0) {
+ if ((rnh = nep->ne_rtable[i]) == NULL) {
/*
* Seems silly to initialize every AF when most are not used,
* do so on demand here
@@ -148,13 +148,15 @@ vfs_hang_addrlist(mp, nep, argp)
dom->dom_rtoffset);
break;
}
- if ((rnh = nep->ne_rtable[i]) == 0) {
+ if ((rnh = nep->ne_rtable[i]) == NULL) {
error = ENOBUFS;
goto out;
}
}
+ RADIX_NODE_HEAD_LOCK(rnh);
rn = (*rnh->rnh_addaddr)(saddr, smask, rnh, np->netc_rnodes);
- if (rn == 0 || np != (struct netcred *)rn) { /* already exists */
+ RADIX_NODE_HEAD_UNLOCK(rnh);
+ if (rn == NULL || np != (struct netcred *)rn) { /* already exists */
error = EPERM;
goto out;
}
@@ -197,9 +199,11 @@ vfs_free_addrlist(nep)
for (i = 0; i <= AF_MAX; i++)
if ((rnh = nep->ne_rtable[i])) {
+ RADIX_NODE_HEAD_LOCK(rnh);
(*rnh->rnh_walktree) (rnh, vfs_free_netcred, rnh);
+ RADIX_NODE_HEAD_DESTROY(rnh);
free(rnh, M_RTABLE);
- nep->ne_rtable[i] = 0;
+ nep->ne_rtable[i] = NULL; /* not SMP safe XXX */
}
}
@@ -355,8 +359,10 @@ vfs_export_lookup(mp, nam)
saddr = nam;
rnh = nep->ne_rtable[saddr->sa_family];
if (rnh != NULL) {
+ RADIX_NODE_HEAD_LOCK(rnh);
np = (struct netcred *)
(*rnh->rnh_matchaddr)(saddr, rnh);
+ RADIX_NODE_HEAD_UNLOCK(rnh);
if (np && np->netc_rnodes->rn_flags & RNF_ROOT)
np = NULL;
}
OpenPOWER on IntegriCloud