summaryrefslogtreecommitdiffstats
path: root/sys/rpc/rpc_generic.c
diff options
context:
space:
mode:
authorzec <zec@FreeBSD.org>2009-08-24 10:09:30 +0000
committerzec <zec@FreeBSD.org>2009-08-24 10:09:30 +0000
commit19bb42c4683c0b8129df0c1807d6980d4535679d (patch)
tree5ba9dcd2e54bc9abd1d333c3fb6c2e11842ff46f /sys/rpc/rpc_generic.c
parentfb1931d971247184022a15dd9f7150669e17efe6 (diff)
downloadFreeBSD-src-19bb42c4683c0b8129df0c1807d6980d4535679d.zip
FreeBSD-src-19bb42c4683c0b8129df0c1807d6980d4535679d.tar.gz
Fix NFS panics with options VIMAGE kernels by apropriately setting curvnet
context inside the RPC code. Temporarily set td's cred to mount's cred before calling socreate() via __rpc_nconf2socket(). Submitted by: rmacklem (in part) Reviewed by: rmacklem, rwatson Discussed with: dfr, bz Approved by: re (rwatson), julian (mentor) MFC after: 3 days
Diffstat (limited to 'sys/rpc/rpc_generic.c')
-rw-r--r--sys/rpc/rpc_generic.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/rpc/rpc_generic.c b/sys/rpc/rpc_generic.c
index d9100b3..f15ad28 100644
--- a/sys/rpc/rpc_generic.c
+++ b/sys/rpc/rpc_generic.c
@@ -56,6 +56,8 @@ __FBSDID("$FreeBSD$");
#include <sys/socketvar.h>
#include <sys/syslog.h>
+#include <net/vnet.h>
+
#include <rpc/rpc.h>
#include <rpc/nettype.h>
@@ -822,6 +824,7 @@ bindresvport(struct socket *so, struct sockaddr *sa)
sa->sa_len = salen;
if (*portp == 0) {
+ CURVNET_SET(so->so_vnet);
bzero(&opt, sizeof(opt));
opt.sopt_dir = SOPT_GET;
opt.sopt_level = proto;
@@ -829,12 +832,15 @@ bindresvport(struct socket *so, struct sockaddr *sa)
opt.sopt_val = &old;
opt.sopt_valsize = sizeof(old);
error = sogetopt(so, &opt);
- if (error)
+ if (error) {
+ CURVNET_RESTORE();
goto out;
+ }
opt.sopt_dir = SOPT_SET;
opt.sopt_val = &portlow;
error = sosetopt(so, &opt);
+ CURVNET_RESTORE();
if (error)
goto out;
}
@@ -845,7 +851,9 @@ bindresvport(struct socket *so, struct sockaddr *sa)
if (error) {
opt.sopt_dir = SOPT_SET;
opt.sopt_val = &old;
+ CURVNET_SET(so->so_vnet);
sosetopt(so, &opt);
+ CURVNET_RESTORE();
}
}
out:
OpenPOWER on IntegriCloud