aboutsummaryrefslogtreecommitdiffstats
path: root/fs/lockd
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2008-12-04 14:21:31 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-01-06 11:53:52 -0500
commitc8c23c423dec49cb439697d3dc714e1500ff1610 (patch)
tree161035f51e31cce6d9f8dc104bad62a329496a77 /fs/lockd
parent1e49323c4ab044d05bbc68cf13cadcbd4372468c (diff)
NSM: Release nsmhandle in nlm_destroy_host
The nsm_handle's reference count is bumped in nlm_lookup_host(). It should be decremented in nlm_destroy_host() to make it easier to see the balance of these two operations. Move the nsm_release() call to fs/lockd/host.c. The h_nsmhandle pointer is set in nlm_lookup_host(), and never cleared. The nlm_destroy_host() function is never called for the same nlm_host twice, so h_nsmhandle won't ever be NULL when nsm_unmonitor() is called. All references to the nlm_host are gone before it is freed. We can skip making h_nsmhandle NULL just before the nlm_host is deallocated. It's also likely we can remove the h_nsmhandle NULL check in nlmsvc_is_client() as well, but we can do that later when rearchitect- ing the nlm_host cache. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/lockd')
-rw-r--r--fs/lockd/host.c8
-rw-r--r--fs/lockd/mon.c5
2 files changed, 3 insertions, 10 deletions
diff --git a/fs/lockd/host.c b/fs/lockd/host.c
index 780918acd6f4..1d523c1a7b62 100644
--- a/fs/lockd/host.c
+++ b/fs/lockd/host.c
@@ -37,6 +37,7 @@ static struct nsm_handle *nsm_find(const struct sockaddr *sap,
37 const char *hostname, 37 const char *hostname,
38 const size_t hostname_len, 38 const size_t hostname_len,
39 const int create); 39 const int create);
40static void nsm_release(struct nsm_handle *nsm);
40 41
41struct nlm_lookup_host_info { 42struct nlm_lookup_host_info {
42 const int server; /* search for server|client */ 43 const int server; /* search for server|client */
@@ -263,10 +264,8 @@ nlm_destroy_host(struct nlm_host *host)
263 BUG_ON(!list_empty(&host->h_lockowners)); 264 BUG_ON(!list_empty(&host->h_lockowners));
264 BUG_ON(atomic_read(&host->h_count)); 265 BUG_ON(atomic_read(&host->h_count));
265 266
266 /*
267 * Release NSM handle and unmonitor host.
268 */
269 nsm_unmonitor(host); 267 nsm_unmonitor(host);
268 nsm_release(host->h_nsmhandle);
270 269
271 clnt = host->h_rpcclnt; 270 clnt = host->h_rpcclnt;
272 if (clnt != NULL) 271 if (clnt != NULL)
@@ -711,8 +710,7 @@ found:
711/* 710/*
712 * Release an NSM handle 711 * Release an NSM handle
713 */ 712 */
714void 713static void nsm_release(struct nsm_handle *nsm)
715nsm_release(struct nsm_handle *nsm)
716{ 714{
717 if (!nsm) 715 if (!nsm)
718 return; 716 return;
diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c
index aaaa08e7ae7a..15fab22db028 100644
--- a/fs/lockd/mon.c
+++ b/fs/lockd/mon.c
@@ -117,10 +117,6 @@ nsm_unmonitor(struct nlm_host *host)
117 struct nsm_res res; 117 struct nsm_res res;
118 int status = 0; 118 int status = 0;
119 119
120 if (nsm == NULL)
121 return 0;
122 host->h_nsmhandle = NULL;
123
124 if (atomic_read(&nsm->sm_count) == 1 120 if (atomic_read(&nsm->sm_count) == 1
125 && nsm->sm_monitored && !nsm->sm_sticky) { 121 && nsm->sm_monitored && !nsm->sm_sticky) {
126 dprintk("lockd: nsm_unmonitor(%s)\n", nsm->sm_name); 122 dprintk("lockd: nsm_unmonitor(%s)\n", nsm->sm_name);
@@ -132,7 +128,6 @@ nsm_unmonitor(struct nlm_host *host)
132 else 128 else
133 nsm->sm_monitored = 0; 129 nsm->sm_monitored = 0;
134 } 130 }
135 nsm_release(nsm);
136 return status; 131 return status;
137} 132}
138 133