mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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>
This commit is contained in:
parent
1e49323c4a
commit
c8c23c423d
3 changed files with 3 additions and 11 deletions
|
@ -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)
|
||||||
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 @@ found:
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
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)
|
||||||
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 *);
|
||||||
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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue