summaryrefslogtreecommitdiffstats
path: root/sys/nfsclient
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2009-12-13 11:06:39 +0000
committerbz <bz@FreeBSD.org>2009-12-13 11:06:39 +0000
commit1ba3a5e4e0b1a21dd0c00df2e5223a60984e3de6 (patch)
tree00204cde270af98c99229eba8ad58f16ebfb498a /sys/nfsclient
parent1d2fa620269999c2637ae14c857ca41f60523cde (diff)
downloadFreeBSD-src-1ba3a5e4e0b1a21dd0c00df2e5223a60984e3de6.zip
FreeBSD-src-1ba3a5e4e0b1a21dd0c00df2e5223a60984e3de6.tar.gz
Add a few more V_hacks to nfsclient to allow machines with a VIMAGE
kernel to boot from NFS. [1] Note: this is not a full virtualization of nfsclient. It is only does what advertised above and nothing more. Requested by: public demand [1] Tested by: kris, .. MFC after: 5 days
Diffstat (limited to 'sys/nfsclient')
-rw-r--r--sys/nfsclient/bootp_subr.c7
-rw-r--r--sys/nfsclient/krpc_subr.c5
-rw-r--r--sys/nfsclient/nfs_vfsops.c5
-rw-r--r--sys/nfsclient/nfs_vnops.c14
4 files changed, 28 insertions, 3 deletions
diff --git a/sys/nfsclient/bootp_subr.c b/sys/nfsclient/bootp_subr.c
index e57b32a..4377f74 100644
--- a/sys/nfsclient/bootp_subr.c
+++ b/sys/nfsclient/bootp_subr.c
@@ -584,6 +584,8 @@ bootpc_call(struct bootpc_globalcontext *gctx, struct thread *td)
int retry;
const char *s;
+ CURVNET_SET(TD_TO_VNET(td));
+
/*
* Create socket and set its recieve timeout.
*/
@@ -960,6 +962,7 @@ gotreply:
out:
soclose(so);
out0:
+ CURVNET_RESTORE();
return error;
}
@@ -974,6 +977,8 @@ bootpc_fakeup_interface(struct bootpc_ifcontext *ifctx,
struct ifaddr *ifa;
struct sockaddr_dl *sdl;
+ CURVNET_SET(TD_TO_VNET(td));
+
error = socreate(AF_INET, &ifctx->so, SOCK_DGRAM, 0, td->td_ucred, td);
if (error != 0)
panic("nfs_boot: socreate, error=%d", error);
@@ -1048,6 +1053,8 @@ bootpc_fakeup_interface(struct bootpc_ifcontext *ifctx,
ifctx->ireq.ifr_name);
ifctx->sdl = sdl;
+ CURVNET_RESTORE();
+
return error;
}
diff --git a/sys/nfsclient/krpc_subr.c b/sys/nfsclient/krpc_subr.c
index 996cb05..7e4130f 100644
--- a/sys/nfsclient/krpc_subr.c
+++ b/sys/nfsclient/krpc_subr.c
@@ -55,6 +55,8 @@ __FBSDID("$FreeBSD$");
#include <sys/uio.h>
#include <net/if.h>
+#include <net/vnet.h>
+
#include <netinet/in.h>
#include <rpc/types.h>
@@ -213,6 +215,8 @@ krpc_call(struct sockaddr_in *sa, u_int prog, u_int vers, u_int func,
nam = mhead = NULL;
from = NULL;
+ CURVNET_SET(TD_TO_VNET(td));
+
/*
* Create socket and set its recieve timeout.
*/
@@ -425,6 +429,7 @@ krpc_call(struct sockaddr_in *sa, u_int prog, u_int vers, u_int func,
if (mhead) m_freem(mhead);
if (from) free(from, M_SONAME);
soclose(so);
+ CURVNET_RESTORE();
return error;
}
diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c
index 17dc5d4..0e10093 100644
--- a/sys/nfsclient/nfs_vfsops.c
+++ b/sys/nfsclient/nfs_vfsops.c
@@ -64,6 +64,8 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/route.h>
+#include <net/vnet.h>
+
#include <netinet/in.h>
#include <rpc/rpc.h>
@@ -825,6 +827,8 @@ nfs_mount(struct mount *mp)
has_fh_opt = 0;
has_hostname_opt = 0;
+ CURVNET_SET(CRED_TO_VNET(curthread->td_ucred));
+
if (vfs_filteropt(mp->mnt_optnew, nfs_opts)) {
error = EINVAL;
goto out;
@@ -1124,6 +1128,7 @@ out:
mp->mnt_kern_flag |= (MNTK_MPSAFE|MNTK_LOOKUP_SHARED);
MNT_IUNLOCK(mp);
}
+ CURVNET_RESTORE();
return (error);
}
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c
index dc61927..b3c28a3 100644
--- a/sys/nfsclient/nfs_vnops.c
+++ b/sys/nfsclient/nfs_vnops.c
@@ -1555,14 +1555,21 @@ nfs_create(struct vop_create_args *ap)
struct vattr vattr;
int v3 = NFS_ISV3(dvp);
+ CURVNET_SET(CRED_TO_VNET(curthread->td_ucred));
+
/*
* Oops, not for me..
*/
- if (vap->va_type == VSOCK)
- return (nfs_mknodrpc(dvp, ap->a_vpp, cnp, vap));
+ if (vap->va_type == VSOCK) {
+ error = nfs_mknodrpc(dvp, ap->a_vpp, cnp, vap);
+ CURVNET_RESTORE();
+ return (error);
+ }
- if ((error = VOP_GETATTR(dvp, &vattr, cnp->cn_cred)) != 0)
+ if ((error = VOP_GETATTR(dvp, &vattr, cnp->cn_cred)) != 0) {
+ CURVNET_RESTORE();
return (error);
+ }
if (vap->va_vaflags & VA_EXCLUSIVE)
fmode |= O_EXCL;
again:
@@ -1658,6 +1665,7 @@ nfsmout:
KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(dvp);
}
mtx_unlock(&(VTONFS(dvp))->n_mtx);
+ CURVNET_RESTORE();
return (error);
}
OpenPOWER on IntegriCloud