diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2008-12-04 14:21:31 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2009-01-06 11:53:52 -0500 |
commit | c8c23c423dec49cb439697d3dc714e1500ff1610 (patch) | |
tree | 161035f51e31cce6d9f8dc104bad62a329496a77 /fs/lockd | |
parent | 1e49323c4ab044d05bbc68cf13cadcbd4372468c (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.c | 8 | ||||
-rw-r--r-- | fs/lockd/mon.c | 5 |
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); |
40 | static void nsm_release(struct nsm_handle *nsm); | ||
40 | 41 | ||
41 | struct nlm_lookup_host_info { | 42 | struct 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 | */ |
714 | void | 713 | static void nsm_release(struct nsm_handle *nsm) |
715 | nsm_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 | ||