Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Apr 2011 23:04:09 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r221002 - in stable/8/sys/fs: nfs nfsserver
Message-ID:  <201104242304.p3ON49Xf050829@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Sun Apr 24 23:04:08 2011
New Revision: 221002
URL: http://svn.freebsd.org/changeset/base/221002

Log:
  MFC: r220530
  Add some cleanup code to the module unload operation for
  the experimental NFS server, so that it doesn't leak memory
  when unloaded. However, unloading the NFSv4 server is not
  recommended, since all NFSv4 state will be lost by the unload
  and clients will have to recover the state after a server
  reload/restart as if the server crashed/rebooted.

Modified:
  stable/8/sys/fs/nfs/nfs_var.h
  stable/8/sys/fs/nfsserver/nfs_nfsdport.c
  stable/8/sys/fs/nfsserver/nfs_nfsdstate.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/fs/nfs/nfs_var.h
==============================================================================
--- stable/8/sys/fs/nfs/nfs_var.h	Sun Apr 24 22:28:26 2011	(r221001)
+++ stable/8/sys/fs/nfs/nfs_var.h	Sun Apr 24 23:04:08 2011	(r221002)
@@ -124,6 +124,7 @@ int nfsrv_checkgetattr(struct nfsrv_desc
     struct nfsvattr *, nfsattrbit_t *, struct ucred *, NFSPROC_T *);
 int nfsrv_nfsuserdport(u_short, NFSPROC_T *);
 void nfsrv_nfsuserddelport(void);
+void nfsrv_throwawayallstate(NFSPROC_T *);
 
 /* nfs_nfsdserv.c */
 int nfsrvd_access(struct nfsrv_descript *, int,

Modified: stable/8/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- stable/8/sys/fs/nfsserver/nfs_nfsdport.c	Sun Apr 24 22:28:26 2011	(r221001)
+++ stable/8/sys/fs/nfsserver/nfs_nfsdport.c	Sun Apr 24 23:04:08 2011	(r221002)
@@ -52,6 +52,7 @@ extern int newnfs_numnfsd;
 extern struct mount nfsv4root_mnt;
 extern struct nfsrv_stablefirst nfsrv_stablefirst;
 extern void (*nfsd_call_servertimer)(void);
+extern SVCPOOL	*nfsrvd_pool;
 struct vfsoptlist nfsv4root_opt, nfsv4root_newopt;
 NFSDLOCKMUTEX;
 struct mtx nfs_cache_mutex;
@@ -3122,9 +3123,16 @@ nfsd_modevent(module_t mod, int type, vo
 		nfsd_call_servertimer = NULL;
 		nfsd_call_nfsd = NULL;
 
+		/* Clean out all NFSv4 state. */
+		nfsrv_throwawayallstate(curthread);
+
 		/* Clean the NFS server reply cache */
 		nfsrvd_cleancache();
 
+		/* Free up the krpc server pool. */
+		if (nfsrvd_pool != NULL)
+			svcpool_destroy(nfsrvd_pool);
+
 		/* and get rid of the locks */
 		mtx_destroy(&nfs_cache_mutex);
 		mtx_destroy(&nfs_v4root_mutex);

Modified: stable/8/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- stable/8/sys/fs/nfsserver/nfs_nfsdstate.c	Sun Apr 24 22:28:26 2011	(r221001)
+++ stable/8/sys/fs/nfsserver/nfs_nfsdstate.c	Sun Apr 24 23:04:08 2011	(r221002)
@@ -5194,3 +5194,37 @@ nfsrv_unlocklf(struct nfslockfile *lfp)
 	nfsv4_unlock(&lfp->lf_locallock_lck, 0);
 }
 
+/*
+ * Clear out all state for the NFSv4 server.
+ * Must be called by a thread that can sleep when no nfsds are running.
+ */
+void
+nfsrv_throwawayallstate(NFSPROC_T *p)
+{
+	struct nfsclient *clp, *nclp;
+	struct nfslockfile *lfp, *nlfp;
+	int i;
+
+	/*
+	 * For each client, clean out the state and then free the structure.
+	 */
+	for (i = 0; i < NFSCLIENTHASHSIZE; i++) {
+		LIST_FOREACH_SAFE(clp, &nfsclienthash[i], lc_hash, nclp) {
+			nfsrv_cleanclient(clp, p);
+			nfsrv_freedeleglist(&clp->lc_deleg);
+			nfsrv_freedeleglist(&clp->lc_olddeleg);
+			free(clp, M_NFSDCLIENT);
+		}
+	}
+
+	/*
+	 * Also, free up any remaining lock file structures.
+	 */
+	for (i = 0; i < NFSLOCKHASHSIZE; i++) {
+		LIST_FOREACH_SAFE(lfp, &nfslockhash[i], lf_hash, nlfp) {
+			printf("nfsd unload: fnd a lock file struct\n");
+			nfsrv_freenfslockfile(lfp);
+		}
+	}
+}
+



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104242304.p3ON49Xf050829>