summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorClaudio Jeker <claudio@cvs.openbsd.org>2014-06-04 07:58:15 +0000
committerClaudio Jeker <claudio@cvs.openbsd.org>2014-06-04 07:58:15 +0000
commitd078b491a53d016c4f2820721411619c5e6da8a2 (patch)
tree8d26f19fc8690d73d78eb6f21890a3a3e8dacd0c /sys
parentc5febaeadf7498c94cd75a988e880171d1e2a91f (diff)
While it may be smart to use the radix tree for exports it is not OK to
use the domain specific tree initialisation method for this since that one is multipath enabled and assumes that the radix node is part of a struct rtentry. This code uses a different struct and so the multipath modifies wrong fields and breaks stuff in mysterious ways. Since we only support AF_INET here anyway simplify the code and only have one radix_node_head pointer instead of AF_MAX ones. Fixes NFS server issues reported by rpe@, OK rpe@, guenther@, sthen@
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_subr.c56
-rw-r--r--sys/sys/mount.h6
2 files changed, 31 insertions, 31 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 625cb8afe31..00e9bc7c7a3 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_subr.c,v 1.213 2014/04/10 13:48:24 tedu Exp $ */
+/* $OpenBSD: vfs_subr.c,v 1.214 2014/06/04 07:58:14 claudio Exp $ */
/* $NetBSD: vfs_subr.c,v 1.53 1996/04/22 01:39:13 christos Exp $ */
/*
@@ -56,13 +56,14 @@
#include <sys/buf.h>
#include <sys/errno.h>
#include <sys/malloc.h>
-#include <sys/domain.h>
#include <sys/mbuf.h>
#include <sys/syscallargs.h>
#include <sys/pool.h>
#include <sys/tree.h>
#include <sys/specdev.h>
+#include <netinet/in.h>
+
#include <uvm/uvm_extern.h>
#include <sys/sysctl.h>
@@ -1390,7 +1391,6 @@ vfs_hang_addrlist(struct mount *mp, struct netexport *nep,
int i;
struct radix_node *rn;
struct sockaddr *saddr, *smask = 0;
- struct domain *dom;
int error;
if (argp->ex_addrlen == 0) {
@@ -1420,25 +1420,20 @@ vfs_hang_addrlist(struct mount *mp, struct netexport *nep,
smask->sa_len = argp->ex_masklen;
}
i = saddr->sa_family;
- if (i < 0 || i > AF_MAX) {
- error = EINVAL;
- goto out;
- }
- if ((rnh = nep->ne_rtable[i]) == 0) {
- /*
- * Seems silly to initialize every AF when most are not
- * used, do so on demand here
- */
- for (dom = domains; dom; dom = dom->dom_next)
- if (dom->dom_family == i && dom->dom_rtattach) {
- dom->dom_rtattach((void **)&nep->ne_rtable[i],
- dom->dom_rtoffset);
- break;
+ switch (i) {
+ case AF_INET:
+ if ((rnh = nep->ne_rtable_inet) == NULL) {
+ if (!rn_inithead((void **)&nep->ne_rtable_inet,
+ offsetof(struct sockaddr_in, sin_addr) * 8)) {
+ error = ENOBUFS;
+ goto out;
}
- if ((rnh = nep->ne_rtable[i]) == 0) {
- error = ENOBUFS;
- goto out;
+ rnh = nep->ne_rtable_inet;
}
+ break;
+ default:
+ error = EINVAL;
+ goto out;
}
rn = (*rnh->rnh_addaddr)((caddr_t)saddr, (caddr_t)smask, rnh,
np->netc_rnodes, 0);
@@ -1473,15 +1468,13 @@ vfs_free_netcred(struct radix_node *rn, void *w, u_int id)
void
vfs_free_addrlist(struct netexport *nep)
{
- int i;
struct radix_node_head *rnh;
- for (i = 0; i <= AF_MAX; i++)
- if ((rnh = nep->ne_rtable[i]) != NULL) {
- (*rnh->rnh_walktree)(rnh, vfs_free_netcred, rnh);
- free(rnh, M_RTABLE);
- nep->ne_rtable[i] = 0;
- }
+ if ((rnh = nep->ne_rtable_inet) != NULL) {
+ (*rnh->rnh_walktree)(rnh, vfs_free_netcred, rnh);
+ free(rnh, M_RTABLE);
+ nep->ne_rtable_inet = NULL;
+ }
}
int
@@ -1515,7 +1508,14 @@ vfs_export_lookup(struct mount *mp, struct netexport *nep, struct mbuf *nam)
*/
if (nam != NULL) {
saddr = mtod(nam, struct sockaddr *);
- rnh = nep->ne_rtable[saddr->sa_family];
+ switch(saddr->sa_family) {
+ case AF_INET:
+ rnh = nep->ne_rtable_inet;
+ break;
+ default:
+ rnh = NULL;
+ break;
+ }
if (rnh != NULL) {
np = (struct netcred *)
(*rnh->rnh_matchaddr)((caddr_t)saddr,
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index 7bad79b2f4e..2917c003447 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: mount.h,v 1.119 2014/05/20 13:32:22 syl Exp $ */
+/* $OpenBSD: mount.h,v 1.120 2014/06/04 07:58:14 claudio Exp $ */
/* $NetBSD: mount.h,v 1.48 1996/02/18 11:55:47 fvdl Exp $ */
/*
@@ -584,8 +584,8 @@ struct netcred {
* Network export information
*/
struct netexport {
- struct netcred ne_defexported; /* Default export */
- struct radix_node_head *ne_rtable[AF_MAX+1]; /* Individual exports */
+ struct netcred ne_defexported; /* Default export */
+ struct radix_node_head *ne_rtable_inet;/* Individual exports */
};
/*