Author: rmacklem
Date: Wed Dec 16 00:52:35 2015
New Revision: 292307
URL: https://svnweb.freebsd.org/changeset/base/292307

Log:
  MFC: r291638
  Fix the memory leak that occurs when the nfscommon.ko module is unloaded.
  This leak was introduced by r291527 (r292223 in stable/10).
  Since the nfscommon.ko module is rarely unloaded, this leak would not
  have been much of an issue.

Modified:
  stable/10/sys/fs/nfs/nfs_commonport.c
  stable/10/sys/fs/nfs/nfs_commonsubs.c
  stable/10/sys/fs/nfs/nfs_var.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/fs/nfs/nfs_commonport.c
==============================================================================
--- stable/10/sys/fs/nfs/nfs_commonport.c       Wed Dec 16 00:22:58 2015        
(r292306)
+++ stable/10/sys/fs/nfs/nfs_commonport.c       Wed Dec 16 00:52:35 2015        
(r292307)
@@ -624,6 +624,8 @@ nfscommon_modevent(module_t mod, int typ
 
                nfsd_call_nfscommon = NULL;
                callout_drain(&newnfsd_callout);
+               /* Clean out the name<-->id cache. */
+               nfsrv_cleanusergroup();
                /* and get rid of the mutexes */
                mtx_destroy(&nfs_nameid_mutex);
                mtx_destroy(&newnfsd_mtx);

Modified: stable/10/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- stable/10/sys/fs/nfs/nfs_commonsubs.c       Wed Dec 16 00:22:58 2015        
(r292306)
+++ stable/10/sys/fs/nfs/nfs_commonsubs.c       Wed Dec 16 00:52:35 2015        
(r292307)
@@ -3539,6 +3539,55 @@ nfsrv_removeuser(struct nfsusrgrp *usrp,
 }
 
 /*
+ * Free up all the allocations related to the name<-->id cache.
+ * This function should only be called when the nfsuserd daemon isn't
+ * running, since it doesn't do any locking.
+ * This function is meant to be used when the nfscommon module is unloaded.
+ */
+APPLESTATIC void
+nfsrv_cleanusergroup(void)
+{
+       struct nfsrv_lughash *hp, *hp2;
+       struct nfsusrgrp *nusrp, *usrp;
+       int i;
+
+       if (nfsuserhash == NULL)
+               return;
+
+       for (i = 0; i < nfsrv_lughashsize; i++) {
+               hp = &nfsuserhash[i];
+               TAILQ_FOREACH_SAFE(usrp, &hp->lughead, lug_numhash, nusrp) {
+                       TAILQ_REMOVE(&hp->lughead, usrp, lug_numhash);
+                       hp2 = NFSUSERNAMEHASH(usrp->lug_name,
+                           usrp->lug_namelen);
+                       TAILQ_REMOVE(&hp2->lughead, usrp, lug_namehash);
+                       if (usrp->lug_cred != NULL)
+                               crfree(usrp->lug_cred);
+                       free(usrp, M_NFSUSERGROUP);
+               }
+               hp = &nfsgrouphash[i];
+               TAILQ_FOREACH_SAFE(usrp, &hp->lughead, lug_numhash, nusrp) {
+                       TAILQ_REMOVE(&hp->lughead, usrp, lug_numhash);
+                       hp2 = NFSGROUPNAMEHASH(usrp->lug_name,
+                           usrp->lug_namelen);
+                       TAILQ_REMOVE(&hp2->lughead, usrp, lug_namehash);
+                       if (usrp->lug_cred != NULL)
+                               crfree(usrp->lug_cred);
+                       free(usrp, M_NFSUSERGROUP);
+               }
+               mtx_destroy(&nfsuserhash[i].mtx);
+               mtx_destroy(&nfsusernamehash[i].mtx);
+               mtx_destroy(&nfsgroupnamehash[i].mtx);
+               mtx_destroy(&nfsgrouphash[i].mtx);
+       }
+       free(nfsuserhash, M_NFSUSERGROUP);
+       free(nfsusernamehash, M_NFSUSERGROUP);
+       free(nfsgrouphash, M_NFSUSERGROUP);
+       free(nfsgroupnamehash, M_NFSUSERGROUP);
+       free(nfsrv_dnsname, M_NFSSTRING);
+}
+
+/*
  * This function scans a byte string and checks for UTF-8 compliance.
  * It returns 0 if it conforms and NFSERR_INVAL if not.
  */

Modified: stable/10/sys/fs/nfs/nfs_var.h
==============================================================================
--- stable/10/sys/fs/nfs/nfs_var.h      Wed Dec 16 00:22:58 2015        
(r292306)
+++ stable/10/sys/fs/nfs/nfs_var.h      Wed Dec 16 00:52:35 2015        
(r292307)
@@ -283,6 +283,7 @@ void nfsv4_getref(struct nfsv4lock *, in
 int nfsv4_getref_nonblock(struct nfsv4lock *);
 int nfsv4_testlock(struct nfsv4lock *);
 int nfsrv_mtostr(struct nfsrv_descript *, char *, int);
+void nfsrv_cleanusergroup(void);
 int nfsrv_checkutf8(u_int8_t *, int);
 int newnfs_sndlock(int *);
 void newnfs_sndunlock(int *);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to