diff options
author | jhb <jhb@FreeBSD.org> | 2006-08-01 16:27:14 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2006-08-01 16:27:14 +0000 |
commit | 4dc640e56e164af7bfa43acfe36b6a8037512f66 (patch) | |
tree | 37dd7fcc8f2e00c87c785f35c3c31843f7eb1b29 /sys/nfsserver/nfs_srvcache.c | |
parent | dcdaa35dc670769cb6106cbfd637c36bbb1422f3 (diff) | |
download | FreeBSD-src-4dc640e56e164af7bfa43acfe36b6a8037512f66.zip FreeBSD-src-4dc640e56e164af7bfa43acfe36b6a8037512f66.tar.gz |
- Add a new function nfsrv_destroycache() to tear down the server request
cache when unloading the nfsserver module. This fixes a memory leak and
a stale pointer.
- Use callout_drain() rather than callout_stop() when unloading the
nfsserver module.
MFC after: 3 days
Diffstat (limited to 'sys/nfsserver/nfs_srvcache.c')
-rw-r--r-- | sys/nfsserver/nfs_srvcache.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/sys/nfsserver/nfs_srvcache.c b/sys/nfsserver/nfs_srvcache.c index 272534f..7d0c126 100644 --- a/sys/nfsserver/nfs_srvcache.c +++ b/sys/nfsserver/nfs_srvcache.c @@ -65,6 +65,7 @@ static long desirednfsrvcache; static LIST_HEAD(nfsrvhash, nfsrvcache) *nfsrvhashtbl; static TAILQ_HEAD(nfsrvlru, nfsrvcache) nfsrvlruhead; static u_long nfsrvhash; +static eventhandler_tag nfsrv_nmbclusters_tag; #define TRUE 1 #define FALSE 0 @@ -147,8 +148,19 @@ nfsrv_initcache(void) nfsrvcache_size_change(NULL); nfsrvhashtbl = hashinit(desirednfsrvcache, M_NFSD, &nfsrvhash); TAILQ_INIT(&nfsrvlruhead); - EVENTHANDLER_REGISTER(nmbclusters_change, nfsrvcache_size_change, NULL, - EVENTHANDLER_PRI_FIRST); + nfsrv_nmbclusters_tag = EVENTHANDLER_REGISTER(nmbclusters_change, + nfsrvcache_size_change, NULL, EVENTHANDLER_PRI_FIRST); +} + +/* + * Teardown the server request cache list + */ +void +nfsrv_destroycache(void) +{ + KASSERT(TAILQ_EMPTY(&nfsrvlruhead), ("%s: pending requests", __func__)); + EVENTHANDLER_DEREGISTER(nmbclusters_change, nfsrv_nmbclusters_tag); + hashdestroy(nfsrvhashtbl, M_NFSD, nfsrvhash); } /* |