Commit c8c23c42 authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields

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: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
parent 1e49323c
...@@ -37,6 +37,7 @@ static struct nsm_handle *nsm_find(const struct sockaddr *sap, ...@@ -37,6 +37,7 @@ static struct nsm_handle *nsm_find(const struct sockaddr *sap,
const char *hostname, const char *hostname,
const size_t hostname_len, const size_t hostname_len,
const int create); const int create);
static void nsm_release(struct nsm_handle *nsm);
struct nlm_lookup_host_info { struct nlm_lookup_host_info {
const int server; /* search for server|client */ const int server; /* search for server|client */
...@@ -263,10 +264,8 @@ nlm_destroy_host(struct nlm_host *host) ...@@ -263,10 +264,8 @@ nlm_destroy_host(struct nlm_host *host)
BUG_ON(!list_empty(&host->h_lockowners)); BUG_ON(!list_empty(&host->h_lockowners));
BUG_ON(atomic_read(&host->h_count)); BUG_ON(atomic_read(&host->h_count));
/*
* Release NSM handle and unmonitor host.
*/
nsm_unmonitor(host); nsm_unmonitor(host);
nsm_release(host->h_nsmhandle);
clnt = host->h_rpcclnt; clnt = host->h_rpcclnt;
if (clnt != NULL) if (clnt != NULL)
...@@ -711,8 +710,7 @@ static struct nsm_handle *nsm_find(const struct sockaddr *sap, ...@@ -711,8 +710,7 @@ static struct nsm_handle *nsm_find(const struct sockaddr *sap,
/* /*
* Release an NSM handle * Release an NSM handle
*/ */
void static void nsm_release(struct nsm_handle *nsm)
nsm_release(struct nsm_handle *nsm)
{ {
if (!nsm) if (!nsm)
return; return;
......
...@@ -117,10 +117,6 @@ nsm_unmonitor(struct nlm_host *host) ...@@ -117,10 +117,6 @@ nsm_unmonitor(struct nlm_host *host)
struct nsm_res res; struct nsm_res res;
int status = 0; int status = 0;
if (nsm == NULL)
return 0;
host->h_nsmhandle = NULL;
if (atomic_read(&nsm->sm_count) == 1 if (atomic_read(&nsm->sm_count) == 1
&& nsm->sm_monitored && !nsm->sm_sticky) { && nsm->sm_monitored && !nsm->sm_sticky) {
dprintk("lockd: nsm_unmonitor(%s)\n", nsm->sm_name); dprintk("lockd: nsm_unmonitor(%s)\n", nsm->sm_name);
...@@ -132,7 +128,6 @@ nsm_unmonitor(struct nlm_host *host) ...@@ -132,7 +128,6 @@ nsm_unmonitor(struct nlm_host *host)
else else
nsm->sm_monitored = 0; nsm->sm_monitored = 0;
} }
nsm_release(nsm);
return status; return status;
} }
......
...@@ -240,7 +240,6 @@ void nlm_release_host(struct nlm_host *); ...@@ -240,7 +240,6 @@ void nlm_release_host(struct nlm_host *);
void nlm_shutdown_hosts(void); void nlm_shutdown_hosts(void);
extern void nlm_host_rebooted(const struct sockaddr_in *, const char *, extern void nlm_host_rebooted(const struct sockaddr_in *, const char *,
unsigned int, u32); unsigned int, u32);
void nsm_release(struct nsm_handle *);
/* /*
* Host monitoring * Host monitoring
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment