summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-08-15 12:04:02 +0000
committerphk <phk@FreeBSD.org>2003-08-15 12:04:02 +0000
commit8eb928cd77f3c4d619b3780ebf1806da55b3db12 (patch)
tree353aebd9c45c47b7c962e93577c58b169b95943d
parent9f239b6d697fb40199ff2e27062e693911b1332a (diff)
downloadFreeBSD-src-8eb928cd77f3c4d619b3780ebf1806da55b3db12.zip
FreeBSD-src-8eb928cd77f3c4d619b3780ebf1806da55b3db12.tar.gz
Remove the magic way of configuring NFS backed swap.
This code dates back to the very first diskless support on FreeBSD, back when swapon(8) couldn't simply be run on a NFS backed file. Suggested replacement command sequence on the client: dd if=/dev/zero of=/swapfile bs=1k count=1 oseek=100000 swapon /swapfile rm -f /swapfile For whatever value of 100000 you want.
-rw-r--r--sys/nfsclient/bootp_subr.c163
-rw-r--r--sys/nfsclient/nfs_diskless.c2
-rw-r--r--sys/nfsclient/nfs_vfsops.c63
-rw-r--r--sys/nfsclient/nfsdiskless.h16
4 files changed, 1 insertions, 243 deletions
diff --git a/sys/nfsclient/bootp_subr.c b/sys/nfsclient/bootp_subr.c
index 61c02c0..740242b 100644
--- a/sys/nfsclient/bootp_subr.c
+++ b/sys/nfsclient/bootp_subr.c
@@ -155,17 +155,14 @@ struct bootpc_globalcontext {
struct bootpc_ifcontext *lastinterface;
u_int32_t xid;
int gotrootpath;
- int gotswappath;
int gotgw;
int ifnum;
int secs;
int starttime;
struct bootp_packet reply;
int replylen;
- struct bootpc_ifcontext *setswapfs;
struct bootpc_ifcontext *setrootfs;
struct bootpc_ifcontext *sethostname;
- char lookup_path[24];
struct bootpc_tagcontext tmptag;
struct bootpc_tagcontext tag;
};
@@ -220,9 +217,6 @@ SYSCTL_STRING(_kern, OID_AUTO, bootp_cookie, CTLFLAG_RD,
/* mountd RPC */
static int md_mount(struct sockaddr_in *mdsin, char *path, u_char *fhp,
int *fhsizep, struct nfs_args *args, struct thread *td);
-static int md_lookup_swap(struct sockaddr_in *mdsin, char *path,
- u_char *fhp, int *fhsizep, struct nfs_args *args,
- struct thread *td);
static int setfs(struct sockaddr_in *addr, char *path, char *p);
static int getdec(char **ptr);
static char *substr(char *a, char *b);
@@ -1495,9 +1489,6 @@ bootpc_decode_reply(struct nfsv3_diskless *nd, struct bootpc_ifcontext *ifctx,
ifctx->myaddr.sin_addr = ifctx->reply.yiaddr;
ip = ntohl(ifctx->myaddr.sin_addr.s_addr);
- snprintf(gctx->lookup_path, sizeof(gctx->lookup_path),
- "swap.%d.%d.%d.%d",
- ip >> 24, (ip >> 16) & 255, (ip >> 8) & 255, ip & 255);
printf("%s at ", ifctx->ireq.ifr_name);
print_sin_addr(&ifctx->myaddr);
@@ -1576,45 +1567,6 @@ bootpc_decode_reply(struct nfsv3_diskless *nd, struct bootpc_ifcontext *ifctx,
}
p = bootpc_tag(&gctx->tag, &ifctx->reply, ifctx->replylen,
- TAG_SWAP);
- if (p != NULL) {
- if (gctx->setswapfs != NULL) {
- printf("swapfs %s (ignored) ", p);
- } else if (setfs(&nd->swap_saddr,
- nd->swap_hostnam, p)) {
- gctx->gotswappath = 1;
- gctx->setswapfs = ifctx;
- printf("swapfs %s ", p);
-
- p = bootpc_tag(&gctx->tag, &ifctx->reply,
- ifctx->replylen,
- TAG_SWAPOPTS);
- if (p != NULL) {
- /* swap mount options */
- mountopts(&nd->swap_args, p);
- printf("swapopts %s ", p);
- }
-
- p = bootpc_tag(&gctx->tag, &ifctx->reply,
- ifctx->replylen,
- TAG_SWAPSIZE);
- if (p != NULL) {
- int swaplen;
- if (gctx->tag.taglen != 4)
- panic("bootpc: "
- "Expected 4 bytes for swaplen, "
- "not %d bytes",
- gctx->tag.taglen);
- bcopy(p, &swaplen, 4);
- nd->swap_nblks = ntohl(swaplen);
- printf("swapsize %d KB ",
- nd->swap_nblks);
- }
- } else
- panic("Failed to set swapfs to %s", p);
- }
-
- p = bootpc_tag(&gctx->tag, &ifctx->reply, ifctx->replylen,
TAG_HOSTNAME);
if (p != NULL) {
if (gctx->tag.taglen >= MAXHOSTNAMELEN)
@@ -1762,14 +1714,10 @@ bootpc_init(void)
mountopts(&nd->root_args, NULL);
- mountopts(&nd->swap_args, NULL);
-
for (ifctx = gctx->interfaces; ifctx != NULL; ifctx = ifctx->next)
if (bootpc_ifctx_isresolved(ifctx) != 0)
bootpc_decode_reply(nd, ifctx, gctx);
- if (gctx->gotswappath == 0)
- nd->swap_nblks = 0;
#ifdef BOOTP_NFSROOT
if (gctx->gotrootpath == 0)
panic("bootpc: No root path offered");
@@ -1802,24 +1750,6 @@ bootpc_init(void)
if (error != 0)
panic("nfs_boot: mountd root, error=%d", error);
- if (gctx->gotswappath != 0) {
-
- error = md_mount(&nd->swap_saddr,
- nd->swap_hostnam,
- nd->swap_fh, &nd->swap_fhsize,
- &nd->swap_args, td);
- if (error != 0)
- panic("nfs_boot: mountd swap, error=%d",
- error);
-
- error = md_lookup_swap(&nd->swap_saddr,
- gctx->lookup_path,
- nd->swap_fh, &nd->swap_fhsize,
- &nd->swap_args, td);
- if (error != 0)
- panic("nfs_boot: lookup swap, error=%d",
- error);
- }
nfs_diskless_valid = 3;
}
@@ -1936,96 +1866,3 @@ out:
m_freem(m);
return error;
}
-
-static int
-md_lookup_swap(struct sockaddr_in *mdsin, char *path, u_char *fhp, int *fhsizep,
- struct nfs_args *args, struct thread *td)
-{
- struct mbuf *m;
- int error;
- int size = -1;
- int attribs_present;
- int status;
- union {
- u_int32_t v2[17];
- u_int32_t v3[21];
- } fattribs;
-
- m = m_get(M_TRYWAIT, MT_DATA);
- if (m == NULL)
- return ENOBUFS;
-
- if ((args->flags & NFSMNT_NFSV3) != 0) {
- *mtod(m, u_int32_t *) = txdr_unsigned(*fhsizep);
- bcopy(fhp, mtod(m, u_char *) + sizeof(u_int32_t), *fhsizep);
- m->m_len = *fhsizep + sizeof(u_int32_t);
- } else {
- bcopy(fhp, mtod(m, u_char *), NFSX_V2FH);
- m->m_len = NFSX_V2FH;
- }
-
- m->m_next = xdr_string_encode(path, strlen(path));
- if (m->m_next == NULL) {
- error = ENOBUFS;
- goto out;
- }
-
- /* Do RPC to nfsd. */
- if ((args->flags & NFSMNT_NFSV3) != 0)
- error = krpc_call(mdsin, NFS_PROG, NFS_VER3,
- NFSPROC_LOOKUP, &m, NULL, td);
- else
- error = krpc_call(mdsin, NFS_PROG, NFS_VER2,
- NFSV2PROC_LOOKUP, &m, NULL, td);
- if (error != 0)
- return error; /* message already freed */
-
- if (xdr_int_decode(&m, &status) != 0)
- goto bad;
- if (status != 0) {
- error = ENOENT;
- goto out;
- }
-
- if ((args->flags & NFSMNT_NFSV3) != 0) {
- if (xdr_int_decode(&m, fhsizep) != 0 ||
- *fhsizep > NFSX_V3FHMAX ||
- *fhsizep <= 0)
- goto bad;
- } else
- *fhsizep = NFSX_V2FH;
-
- if (xdr_opaque_decode(&m, fhp, *fhsizep) != 0)
- goto bad;
-
- if ((args->flags & NFSMNT_NFSV3) != 0) {
- if (xdr_int_decode(&m, &attribs_present) != 0)
- goto bad;
- if (attribs_present != 0) {
- if (xdr_opaque_decode(&m, (u_char *) &fattribs.v3,
- sizeof(u_int32_t) * 21) != 0)
- goto bad;
- size = fxdr_unsigned(u_int32_t, fattribs.v3[6]);
- }
- } else {
- if (xdr_opaque_decode(&m,(u_char *) &fattribs.v2,
- sizeof(u_int32_t) * 17) != 0)
- goto bad;
- size = fxdr_unsigned(u_int32_t, fattribs.v2[5]);
- }
-
- if (nfsv3_diskless.swap_nblks == 0 && size != -1) {
- nfsv3_diskless.swap_nblks = size / 1024;
- printf("md_lookup_swap: Swap size is %d KB\n",
- nfsv3_diskless.swap_nblks);
- }
-
- goto out;
-
-bad:
- error = EBADRPC;
-
-out:
- m_freem(m);
- return error;
-}
diff --git a/sys/nfsclient/nfs_diskless.c b/sys/nfsclient/nfs_diskless.c
index 4fb45a6..dc847de 100644
--- a/sys/nfsclient/nfs_diskless.c
+++ b/sys/nfsclient/nfs_diskless.c
@@ -129,8 +129,6 @@ match_done:
/* set up gateway */
inaddr_to_sockaddr("boot.netif.gateway", &nd->mygateway);
- /* XXX set up swap? */
-
/* set up root mount */
nd->root_args.rsize = 8192; /* XXX tunable? */
nd->root_args.wsize = 8192;
diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c
index 51c7a0e..6976012 100644
--- a/sys/nfsclient/nfs_vfsops.c
+++ b/sys/nfsclient/nfs_vfsops.c
@@ -141,13 +141,6 @@ SYSCTL_OPAQUE(_vfs_nfs, OID_AUTO, diskless_rootaddr, CTLFLAG_RD,
&nfsv3_diskless.root_saddr, sizeof nfsv3_diskless.root_saddr,
"%Ssockaddr_in", "");
-SYSCTL_STRING(_vfs_nfs, OID_AUTO, diskless_swappath, CTLFLAG_RD,
- nfsv3_diskless.swap_hostnam, 0, "");
-
-SYSCTL_OPAQUE(_vfs_nfs, OID_AUTO, diskless_swapaddr, CTLFLAG_RD,
- &nfsv3_diskless.swap_saddr, sizeof nfsv3_diskless.swap_saddr,
- "%Ssockaddr_in","");
-
void nfsargs_ntoh(struct nfs_args *);
static int nfs_mountdiskless(char *, char *, int,
@@ -204,15 +197,6 @@ nfs_convert_diskless(void)
sizeof(struct ifaliasreq));
bcopy(&nfs_diskless.mygateway, &nfsv3_diskless.mygateway,
sizeof(struct sockaddr_in));
- nfs_convert_oargs(&nfsv3_diskless.swap_args,&nfs_diskless.swap_args);
- nfsv3_diskless.swap_fhsize = NFSX_V2FH;
- bcopy(nfs_diskless.swap_fh, nfsv3_diskless.swap_fh, NFSX_V2FH);
- bcopy(&nfs_diskless.swap_saddr,&nfsv3_diskless.swap_saddr,
- sizeof(struct sockaddr_in));
- bcopy(nfs_diskless.swap_hostnam, nfsv3_diskless.swap_hostnam, MNAMELEN);
- nfsv3_diskless.swap_nblks = nfs_diskless.swap_nblks;
- bcopy(&nfs_diskless.swap_ucred, &nfsv3_diskless.swap_ucred,
- sizeof(struct ucred));
nfs_convert_oargs(&nfsv3_diskless.root_args,&nfs_diskless.root_args);
nfsv3_diskless.root_fhsize = NFSX_V2FH;
bcopy(nfs_diskless.root_fh, nfsv3_diskless.root_fh, NFSX_V2FH);
@@ -385,7 +369,6 @@ nfsmout:
int
nfs_mountroot(struct mount *mp, struct thread *td)
{
- struct mount *swap_mp;
struct nfsv3_diskless *nd = &nfsv3_diskless;
struct socket *so;
struct vnode *vp;
@@ -409,17 +392,6 @@ nfs_mountroot(struct mount *mp, struct thread *td)
*/
splnet();
-#ifdef notyet
- /* Set up swap credentials. */
- proc0.p_ucred->cr_uid = ntohl(nd->swap_ucred.cr_uid);
- proc0.p_ucred->cr_gid = ntohl(nd->swap_ucred.cr_gid);
- if ((proc0.p_ucred->cr_ngroups = ntohs(nd->swap_ucred.cr_ngroups)) >
- NGROUPS)
- proc0.p_ucred->cr_ngroups = NGROUPS;
- for (i = 0; i < proc0.p_ucred->cr_ngroups; i++)
- proc0.p_ucred->cr_groups[i] = ntohl(nd->swap_ucred.cr_groups[i]);
-#endif
-
/*
* Do enough of ifconfig(8) so that the critical net interface can
* talk to the server.
@@ -488,41 +460,6 @@ nfs_mountroot(struct mount *mp, struct thread *td)
return (error);
}
- swap_mp = NULL;
- if (nd->swap_nblks) {
-
- /* Convert to DEV_BSIZE instead of Kilobyte */
- nd->swap_nblks *= 2;
-
- /*
- * Create a fake mount point just for the swap vnode so that the
- * swap file can be on a different server from the rootfs.
- */
- nd->swap_args.fh = nd->swap_fh;
- nd->swap_args.fhsize = nd->swap_fhsize;
- l = ntohl(nd->swap_saddr.sin_addr.s_addr);
- snprintf(buf, sizeof(buf), "%ld.%ld.%ld.%ld:%s",
- (l >> 24) & 0xff, (l >> 16) & 0xff,
- (l >> 8) & 0xff, (l >> 0) & 0xff, nd->swap_hostnam);
- printf("NFS SWAP: %s\n", buf);
- if ((error = nfs_mountdiskless(buf, "/swap", 0,
- &nd->swap_saddr, &nd->swap_args, td, &vp, &swap_mp)) != 0)
- return (error);
- vfs_unbusy(swap_mp, td);
-
- VTONFS(vp)->n_size = VTONFS(vp)->n_vattr.va_size =
- nd->swap_nblks * DEV_BSIZE ;
- /*
- * Since the swap file is not the root dir of a filesystem,
- * hack it to a regular file.
- */
- vp->v_type = VREG;
- vp->v_vflag = 0;
- vp->v_iflag = 0;
- VREF(vp);
- swaponvp(td, vp, NODEV, nd->swap_nblks);
- }
-
mp->mnt_flag |= MNT_ROOTFS;
mp->mnt_vnodecovered = NULLVP;
rootvp = vp;
diff --git a/sys/nfsclient/nfsdiskless.h b/sys/nfsclient/nfsdiskless.h
index 4a189a2..5e00b81 100644
--- a/sys/nfsclient/nfsdiskless.h
+++ b/sys/nfsclient/nfsdiskless.h
@@ -46,8 +46,7 @@
* and to do a partial ifconfig(8) and route(8) so that the critical net
* interface can communicate with the server.
* The primary bootstrap is expected to fill in the appropriate fields before
- * starting the kernel. Whether or not the swap area is nfs mounted is
- * determined by the value in swdevt[0]. (equal to NODEV --> swap over nfs)
+ * starting the kernel.
* Currently only works for AF_INET protocols.
* NB: All fields are stored in net byte order to avoid hassles with
* client/server byte ordering differences.
@@ -64,13 +63,6 @@
struct nfsv3_diskless {
struct ifaliasreq myif; /* Default interface */
struct sockaddr_in mygateway; /* Default gateway */
- struct nfs_args swap_args; /* Mount args for swap file */
- int swap_fhsize; /* Size of file handle */
- u_char swap_fh[NFSX_V3FHMAX]; /* Swap file's file handle */
- struct sockaddr_in swap_saddr; /* Address of swap server */
- char swap_hostnam[MNAMELEN]; /* Host name for mount pt */
- int swap_nblks; /* Size of server swap file */
- struct ucred swap_ucred; /* Swap credentials */
struct nfs_args root_args; /* Mount args for root fs */
int root_fhsize; /* Size of root file handle */
u_char root_fh[NFSX_V3FHMAX]; /* File handle of root dir */
@@ -106,12 +98,6 @@ struct onfs_args {
struct nfs_diskless {
struct ifaliasreq myif; /* Default interface */
struct sockaddr_in mygateway; /* Default gateway */
- struct onfs_args swap_args; /* Mount args for swap file */
- u_char swap_fh[NFSX_V2FH]; /* Swap file's file handle */
- struct sockaddr_in swap_saddr; /* Address of swap server */
- char swap_hostnam[MNAMELEN]; /* Host name for mount pt */
- int swap_nblks; /* Size of server swap file */
- struct ucred swap_ucred; /* Swap credentials */
struct onfs_args root_args; /* Mount args for root fs */
u_char root_fh[NFSX_V2FH]; /* File handle of root dir */
struct sockaddr_in root_saddr; /* Address of root server */
OpenPOWER on IntegriCloud