From 0bddf4c8e9c5a67147f2a2bab705203e4810a716 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Fri, 15 Aug 2003 12:04:02 +0000 Subject: [PATCH] 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. --- sys/nfsclient/bootp_subr.c | 163 ----------------------------------- sys/nfsclient/nfs_diskless.c | 2 - sys/nfsclient/nfs_vfsops.c | 63 -------------- sys/nfsclient/nfsdiskless.h | 16 +--- 4 files changed, 1 insertion(+), 243 deletions(-) diff --git a/sys/nfsclient/bootp_subr.c b/sys/nfsclient/bootp_subr.c index 61c02c0246e6..740242bbde1a 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); @@ -1575,45 +1566,6 @@ bootpc_decode_reply(struct nfsv3_diskless *nd, struct bootpc_ifcontext *ifctx, panic("Failed to set rootfs to %s", p); } - 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) { @@ -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 4fb45a613a82..dc847de3e00a 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 51c7a0e421b2..69760125601e 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 4a189a294241..5e00b8191ee0 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 */