New kernel option, NFS_V2_ONLY, which aims to reduce the NFS client to just trunk
authorbjh21 <bjh21@NetBSD.org>
Tue, 19 Sep 2000 17:04:50 +0000
branchtrunk
changeset 69870 098688ebae72
parent 69869 1d873f283252
child 69871 6e59efa23053
New kernel option, NFS_V2_ONLY, which aims to reduce the NFS client to just that required to support NFSv2 mounts. Not finished yet, but already provides some 44k of saving in code size on arm26. More savings, and some documentation, are still to come.
sys/conf/files
sys/nfs/nfs.h
sys/nfs/nfs_bio.c
sys/nfs/nfs_boot.c
sys/nfs/nfs_node.c
sys/nfs/nfs_socket.c
sys/nfs/nfs_subs.c
sys/nfs/nfs_syscalls.c
sys/nfs/nfs_vfsops.c
sys/nfs/nfs_vnops.c
--- a/sys/conf/files	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/conf/files	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-#	$NetBSD: files,v 1.390 2000/09/18 22:15:21 itojun Exp $
+#	$NetBSD: files,v 1.391 2000/09/19 17:04:50 bjh21 Exp $
 
 #	@(#)files.newconf	7.5 (Berkeley) 5/10/93
 
@@ -21,6 +21,7 @@
 defopt	opt_nfs_boot.h	NFS_BOOT_BOOTP NFS_BOOT_BOOTPARAM NFS_BOOT_DHCP
 			NFS_BOOT_GATEWAY
 			NFS_BOOT_TCP NFS_BOOT_OPTIONS NFS_BOOT_RWSIZE
+defopt	opt_nfs.h	NFS_V2_ONLY
 defopt	NFSSERVER
 
 defopt	opt_kmempages.h	NKMEMPAGES NKMEMPAGES_MIN NKMEMPAGES_MAX
--- a/sys/nfs/nfs.h	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs.h	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs.h,v 1.22 2000/06/09 00:00:17 fvdl Exp $	*/
+/*	$NetBSD: nfs.h,v 1.23 2000/09/19 17:04:50 bjh21 Exp $	*/
 /*
  * Copyright (c) 1989, 1993, 1995
  *	The Regents of the University of California.  All rights reserved.
@@ -102,7 +102,11 @@
 #define	NMOD(a)		((a) % nfs_asyncdaemons)
 #define NFS_CMPFH(n, f, s) \
 	((n)->n_fhsize == (s) && !memcmp((caddr_t)(n)->n_fhp,  (caddr_t)(f),  (s)))
+#ifdef NFS_V2_ONLY
+#define NFS_ISV3(v)	(0)
+#else
 #define NFS_ISV3(v)	(VFSTONFS((v)->v_mount)->nm_flag & NFSMNT_NFSV3)
+#endif
 #define NFS_SRVMAXDATA(n) \
 		(((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
 		 NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
--- a/sys/nfs/nfs_bio.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_bio.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_bio.c,v 1.50 2000/06/27 17:52:28 mrg Exp $	*/
+/*	$NetBSD: nfs_bio.c,v 1.51 2000/09/19 17:04:50 bjh21 Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -38,6 +38,8 @@
  *	@(#)nfs_bio.c	8.9 (Berkeley) 3/30/95
  */
 
+#include "opt_nfs.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/resourcevar.h>
@@ -98,9 +100,11 @@
 	if (vp->v_type != VDIR && uio->uio_offset < 0)
 		return (EINVAL);
 	p = uio->uio_procp;
+#ifndef NFS_V2_ONLY
 	if ((nmp->nm_flag & NFSMNT_NFSV3) &&
 	    !(nmp->nm_iflag & NFSMNT_GOTFSINFO))
 		(void)nfs_fsinfo(nmp, vp, cred, p);
+#endif
 	if (vp->v_type != VDIR &&
 	    (uio->uio_offset + uio->uio_resid) > nmp->nm_maxfilesize)
 		return (EFBIG);
@@ -573,9 +577,11 @@
 		np->n_flag &= ~NWRITEERR;
 		return (np->n_error);
 	}
+#ifndef NFS_V2_ONLY
 	if ((nmp->nm_flag & NFSMNT_NFSV3) &&
 	    !(nmp->nm_iflag & NFSMNT_GOTFSINFO))
 		(void)nfs_fsinfo(nmp, vp, cred, p);
+#endif
 	if (ioflag & (IO_APPEND | IO_SYNC)) {
 		if (np->n_flag & NMODIFIED) {
 			np->n_attrstamp = 0;
--- a/sys/nfs/nfs_boot.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_boot.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_boot.c,v 1.53 2000/03/29 03:43:33 simonb Exp $	*/
+/*	$NetBSD: nfs_boot.c,v 1.54 2000/09/19 17:04:51 bjh21 Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1997 The NetBSD Foundation, Inc.
@@ -41,6 +41,7 @@
  * about where to mount root from, what pathnames, etc.
  */
 
+#include "opt_nfs.h"
 #include "opt_nfs_boot.h"
 
 #include <sys/param.h>
@@ -564,8 +565,11 @@
 #endif
 	args->fh       = ndm->ndm_fh;
 	args->hostname = ndm->ndm_host;
-	args->flags    = NFSMNT_NFSV3 | NFSMNT_NOCONN | NFSMNT_RESVPORT;
+	args->flags    = NFSMNT_NOCONN | NFSMNT_RESVPORT;
 
+#ifndef NFS_V2_ONLY
+	args->flags    |= NFSMNT_NFSV3;
+#endif
 #ifdef	NFS_BOOT_OPTIONS
 	args->flags    |= NFS_BOOT_OPTIONS;
 #endif
--- a/sys/nfs/nfs_node.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_node.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_node.c,v 1.34 2000/08/03 06:15:02 thorpej Exp $	*/
+/*	$NetBSD: nfs_node.c,v 1.35 2000/09/19 17:04:51 bjh21 Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -38,6 +38,7 @@
  *	@(#)nfs_node.c	8.6 (Berkeley) 5/22/95
  */
 
+#include "opt_nfs.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
--- a/sys/nfs/nfs_socket.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_socket.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_socket.c,v 1.58 2000/06/27 17:52:33 mrg Exp $	*/
+/*	$NetBSD: nfs_socket.c,v 1.59 2000/09/19 17:04:51 bjh21 Exp $	*/
 
 /*
  * Copyright (c) 1989, 1991, 1993, 1995
@@ -43,6 +43,7 @@
  */
 
 #include "fs_nfs.h"
+#include "opt_nfs.h"
 #include "opt_nfsserver.h"
 #include "opt_inet.h"
 
--- a/sys/nfs/nfs_subs.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_subs.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_subs.c,v 1.81 2000/08/03 20:41:32 thorpej Exp $	*/
+/*	$NetBSD: nfs_subs.c,v 1.82 2000/09/19 17:04:51 bjh21 Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -39,6 +39,7 @@
  */
 
 #include "fs_nfs.h"
+#include "opt_nfs.h"
 #include "opt_nfsserver.h"
 #include "opt_iso.h"
 #include "opt_inet.h"
--- a/sys/nfs/nfs_syscalls.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_syscalls.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_syscalls.c,v 1.42 2000/08/23 23:17:14 nathanw Exp $	*/
+/*	$NetBSD: nfs_syscalls.c,v 1.43 2000/09/19 17:04:51 bjh21 Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -39,6 +39,7 @@
  */
 
 #include "fs_nfs.h"
+#include "opt_nfs.h"
 #include "opt_nfsserver.h"
 #include "opt_iso.h"
 #include "opt_inet.h"
--- a/sys/nfs/nfs_vfsops.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_vfsops.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_vfsops.c,v 1.94 2000/08/23 09:59:22 enami Exp $	*/
+/*	$NetBSD: nfs_vfsops.c,v 1.95 2000/09/19 17:04:51 bjh21 Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993, 1995
@@ -40,6 +40,7 @@
 
 #if defined(_KERNEL) && !defined(_LKM)
 #include "opt_compat_netbsd.h"
+#include "opt_nfs.h"
 #endif
 
 #include <sys/param.h>
@@ -139,7 +140,12 @@
 	int32_t t1, t2;
 	caddr_t bpos, dpos, cp2;
 	struct nfsmount *nmp = VFSTONFS(mp);
-	int error = 0, v3 = (nmp->nm_flag & NFSMNT_NFSV3), retattr;
+	int error = 0, retattr;
+#ifdef NFS_V2_ONLY
+	const int v3 = 0;
+#else
+	int v3 = (nmp->nm_flag & NFSMNT_NFSV3);
+#endif
 	struct mbuf *mreq, *mrep = NULL, *md, *mb, *mb2;
 	struct ucred *cred;
 	struct nfsnode *np;
@@ -206,6 +212,7 @@
 	return (error);
 }
 
+#ifndef NFS_V2_ONLY
 /*
  * nfs version 3 fsinfo rpc call
  */
@@ -271,6 +278,7 @@
 	nfsm_reqdone;
 	return (error);
 }
+#endif
 
 /*
  * Mount a remote root fs via. NFS.  It goes like this:
@@ -447,12 +455,14 @@
 			nmp->nm_retry = NFS_MAXREXMIT;
 	}
 
+#ifndef NFS_V2_ONLY
 	if (argp->flags & NFSMNT_NFSV3) {
 		if (argp->sotype == SOCK_DGRAM)
 			maxio = NFS_MAXDGRAMDATA;
 		else
 			maxio = NFS_MAXDATA;
 	} else
+#endif
 		maxio = NFS_V2MAXDATA;
 
 	if ((argp->flags & NFSMNT_WSIZE) && argp->wsize > 0) {
@@ -558,6 +568,9 @@
 		return (error);
 	if (args.version != NFS_ARGSVERSION)
 		return (EPROGMISMATCH);
+#ifdef NFS_V2_ONLY
+	args.flags &= ~(NFSMNT_NFSV3 | NFSMNT_NQNFS);
+#endif
 	if (mp->mnt_flag & MNT_UPDATE) {
 		struct nfsmount *nmp = VFSTONFS(mp);
 
@@ -638,6 +651,7 @@
 	vfs_getnewfsid(mp);
 	nmp->nm_mountp = mp;
 
+#ifndef NFS_V2_ONLY
 	if (argp->flags & NFSMNT_NQNFS)
 		/*
 		 * We have to set mnt_maxsymlink to a non-zero value so
@@ -646,8 +660,11 @@
 		 * unsuspecting binaries).
 		 */
 		mp->mnt_maxsymlinklen = 1;
+#endif
 
+#ifndef NFS_V2_ONLY
 	if ((argp->flags & NFSMNT_NFSV3) == 0)
+#endif
 		/*
 		 * V2 can only handle 32 bit filesizes. For v3, nfs_fsinfo
 		 * will fill this in.
--- a/sys/nfs/nfs_vnops.c	Tue Sep 19 16:28:52 2000 +0000
+++ b/sys/nfs/nfs_vnops.c	Tue Sep 19 17:04:50 2000 +0000
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_vnops.c,v 1.118 2000/09/19 00:00:18 fvdl Exp $	*/
+/*	$NetBSD: nfs_vnops.c,v 1.119 2000/09/19 17:04:51 bjh21 Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -42,6 +42,8 @@
  * vnode op calls for Sun NFS version 2 and 3
  */
 
+#include "opt_nfs.h"
+
 #include <sys/param.h>
 #include <sys/proc.h>
 #include <sys/kernel.h>
@@ -301,7 +303,7 @@
 	int error = 0, attrflag, cachevalid;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
 	u_int32_t mode, rmode;
-	int v3 = NFS_ISV3(vp);
+	const int v3 = NFS_ISV3(vp);
 	struct nfsnode *np = VTONFS(vp);
 
 	cachevalid = (np->n_accstamp != -1 &&
@@ -577,7 +579,7 @@
 	caddr_t bpos, dpos;
 	int error = 0;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(vp);
+	const int v3 = NFS_ISV3(vp);
 	
 	/*
 	 * Update local times for special files.
@@ -705,7 +707,7 @@
 	u_int32_t *tl;
 	int error = 0, wccflag = NFSV3_WCCRATTR;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(vp);
+	const int v3 = NFS_ISV3(vp);
 
 	nfsstats.rpccnt[NFSPROC_SETATTR]++;
 	nfsm_reqhead(vp, NFSPROC_SETATTR, NFSX_FH(v3) + NFSX_SATTR(v3));
@@ -771,7 +773,7 @@
 	nfsfh_t *fhp;
 	struct nfsnode *np;
 	int lockparent, wantparent, error = 0, attrflag, fhsize;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 	cnp->cn_flags &= ~PDIRUNLOCK;
 	flags = cnp->cn_flags;
 
@@ -994,7 +996,7 @@
 	caddr_t bpos, dpos, cp2;
 	int error = 0, len, attrflag;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(vp);
+	const int v3 = NFS_ISV3(vp);
 
 	nfsstats.rpccnt[NFSPROC_READLINK]++;
 	nfsm_reqhead(vp, NFSPROC_READLINK, NFSX_FH(v3));
@@ -1027,7 +1029,7 @@
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
 	struct nfsmount *nmp;
 	int error = 0, len, retlen, tsiz, eof, attrflag;
-	int v3 = NFS_ISV3(vp);
+	const int v3 = NFS_ISV3(vp);
 
 #ifndef nolint
 	eof = 0;
@@ -1092,7 +1094,8 @@
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
 	struct nfsmount *nmp = VFSTONFS(vp->v_mount);
 	int error = 0, len, tsiz, wccflag = NFSV3_WCCRATTR, rlen, commit;
-	int v3 = NFS_ISV3(vp), committed = NFSV3WRITE_FILESYNC;
+	const int v3 = NFS_ISV3(vp);
+	int committed = NFSV3WRITE_FILESYNC;
 
 #ifndef DIAGNOSTIC
 	if (uiop->uio_iovcnt != 1)
@@ -1211,7 +1214,7 @@
 	int error = 0, wccflag = NFSV3_WCCRATTR, gotvp = 0;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
 	u_int32_t rdev;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 
 	if (vap->va_type == VCHR || vap->va_type == VBLK)
 		rdev = txdr_unsigned(vap->va_rdev);
@@ -1328,7 +1331,7 @@
 	caddr_t bpos, dpos, cp2;
 	int error, wccflag = NFSV3_WCCRATTR, gotvp = 0, fmode = 0;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 
 	/*
 	 * Oops, not for me..
@@ -1511,7 +1514,7 @@
 	caddr_t bpos, dpos, cp2;
 	int error = 0, wccflag = NFSV3_WCCRATTR;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 
 	nfsstats.rpccnt[NFSPROC_REMOVE]++;
 	nfsm_reqhead(dvp, NFSPROC_REMOVE,
@@ -1632,7 +1635,7 @@
 	caddr_t bpos, dpos, cp2;
 	int error = 0, fwccflag = NFSV3_WCCRATTR, twccflag = NFSV3_WCCRATTR;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(fdvp);
+	const int v3 = NFS_ISV3(fdvp);
 
 	nfsstats.rpccnt[NFSPROC_RENAME]++;
 	nfsm_reqhead(fdvp, NFSPROC_RENAME,
@@ -1678,6 +1681,7 @@
 	caddr_t bpos, dpos, cp2;
 	int error = 0, wccflag = NFSV3_WCCRATTR, attrflag = 0;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
+	/* XXX Should be const and initialised? */
 	int v3;
 
 	if (dvp->v_mount != vp->v_mount) {
@@ -1746,7 +1750,7 @@
 	int slen, error = 0, wccflag = NFSV3_WCCRATTR, gotvp;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
 	struct vnode *newvp = (struct vnode *)0;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 
 	nfsstats.rpccnt[NFSPROC_SYMLINK]++;
 	slen = strlen(ap->a_target);
@@ -1815,7 +1819,7 @@
 	int error = 0, wccflag = NFSV3_WCCRATTR;
 	int gotvp = 0;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 
 	len = cnp->cn_namelen;
 	nfsstats.rpccnt[NFSPROC_MKDIR]++;
@@ -1894,7 +1898,7 @@
 	caddr_t bpos, dpos, cp2;
 	int error = 0, wccflag = NFSV3_WCCRATTR;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 
 	if (dvp == vp) {
 		vrele(dvp);
@@ -2036,7 +2040,7 @@
 	u_quad_t fileno;
 	int error = 0, tlen, more_dirs = 1, blksiz = 0, bigenough = 1;
 	int attrflag, nrpcs = 0, reclen;
-	int v3 = NFS_ISV3(vp);
+	const int v3 = NFS_ISV3(vp);
 	nfsquad_t cookie;
 
 #ifdef DIAGNOSTIC
@@ -2528,7 +2532,7 @@
 	int error = 0, fhlen, attrflag;
 	struct mbuf *mreq, *mrep, *md, *mb, *mb2;
 	nfsfh_t *nfhp;
-	int v3 = NFS_ISV3(dvp);
+	const int v3 = NFS_ISV3(dvp);
 
 	nfsstats.rpccnt[NFSPROC_LOOKUP]++;
 	nfsm_reqhead(dvp, NFSPROC_LOOKUP,
@@ -2968,7 +2972,7 @@
 	int error = 0, attrflag;
 	unsigned int l;
 	u_int64_t maxsize;
-	int v3 = NFS_ISV3(vp);
+	const int v3 = NFS_ISV3(vp);
 
 	switch (ap->a_name) {
 		/* Names that can be resolved locally. */