mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
NSM: More clean up of nsm_get_handle()
Clean up: refactor nsm_get_handle() so it is organized the same way that nsm_reboot_lookup() is. There is an additional micro-optimization here. This change moves the "hostname & nsm_use_hostnames" test out of the list_for_each_entry() clause in nsm_get_handle(), since it is loop-invariant. 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
b39b897c25
commit
77a3ef33e2
1 changed files with 34 additions and 26 deletions
|
@ -213,6 +213,16 @@ static struct nsm_handle *nsm_lookup_hostname(const char *hostname,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct nsm_handle *nsm_lookup_addr(const struct sockaddr *sap)
|
||||||
|
{
|
||||||
|
struct nsm_handle *nsm;
|
||||||
|
|
||||||
|
list_for_each_entry(nsm, &nsm_handles, sm_link)
|
||||||
|
if (nlm_cmp_addr(nsm_addr(nsm), sap))
|
||||||
|
return nsm;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static struct nsm_handle *nsm_lookup_priv(const struct nsm_private *priv)
|
static struct nsm_handle *nsm_lookup_priv(const struct nsm_private *priv)
|
||||||
{
|
{
|
||||||
struct nsm_handle *nsm;
|
struct nsm_handle *nsm;
|
||||||
|
@ -281,8 +291,7 @@ struct nsm_handle *nsm_get_handle(const struct sockaddr *sap,
|
||||||
const size_t salen, const char *hostname,
|
const size_t salen, const char *hostname,
|
||||||
const size_t hostname_len)
|
const size_t hostname_len)
|
||||||
{
|
{
|
||||||
struct nsm_handle *nsm = NULL;
|
struct nsm_handle *cached, *new = NULL;
|
||||||
struct nsm_handle *pos;
|
|
||||||
|
|
||||||
if (hostname && memchr(hostname, '/', hostname_len) != NULL) {
|
if (hostname && memchr(hostname, '/', hostname_len) != NULL) {
|
||||||
if (printk_ratelimit()) {
|
if (printk_ratelimit()) {
|
||||||
|
@ -295,38 +304,37 @@ struct nsm_handle *nsm_get_handle(const struct sockaddr *sap,
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
spin_lock(&nsm_lock);
|
spin_lock(&nsm_lock);
|
||||||
list_for_each_entry(pos, &nsm_handles, sm_link) {
|
|
||||||
|
|
||||||
if (hostname && nsm_use_hostnames) {
|
if (nsm_use_hostnames && hostname != NULL)
|
||||||
if (strlen(pos->sm_name) != hostname_len
|
cached = nsm_lookup_hostname(hostname, hostname_len);
|
||||||
|| memcmp(pos->sm_name, hostname, hostname_len))
|
else
|
||||||
continue;
|
cached = nsm_lookup_addr(sap);
|
||||||
} else if (!nlm_cmp_addr(nsm_addr(pos), sap))
|
|
||||||
continue;
|
if (cached != NULL) {
|
||||||
atomic_inc(&pos->sm_count);
|
atomic_inc(&cached->sm_count);
|
||||||
kfree(nsm);
|
spin_unlock(&nsm_lock);
|
||||||
nsm = pos;
|
kfree(new);
|
||||||
dprintk("lockd: found nsm_handle for %s (%s), cnt %d\n",
|
dprintk("lockd: found nsm_handle for %s (%s), "
|
||||||
pos->sm_name, pos->sm_addrbuf,
|
"cnt %d\n", cached->sm_name,
|
||||||
atomic_read(&pos->sm_count));
|
cached->sm_addrbuf,
|
||||||
goto found;
|
atomic_read(&cached->sm_count));
|
||||||
|
return cached;
|
||||||
}
|
}
|
||||||
if (nsm) {
|
|
||||||
list_add(&nsm->sm_link, &nsm_handles);
|
if (new != NULL) {
|
||||||
|
list_add(&new->sm_link, &nsm_handles);
|
||||||
|
spin_unlock(&nsm_lock);
|
||||||
dprintk("lockd: created nsm_handle for %s (%s)\n",
|
dprintk("lockd: created nsm_handle for %s (%s)\n",
|
||||||
nsm->sm_name, nsm->sm_addrbuf);
|
new->sm_name, new->sm_addrbuf);
|
||||||
goto found;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock(&nsm_lock);
|
spin_unlock(&nsm_lock);
|
||||||
|
|
||||||
nsm = nsm_create_handle(sap, salen, hostname, hostname_len);
|
new = nsm_create_handle(sap, salen, hostname, hostname_len);
|
||||||
if (unlikely(nsm == NULL))
|
if (unlikely(new == NULL))
|
||||||
return NULL;
|
return NULL;
|
||||||
goto retry;
|
goto retry;
|
||||||
|
|
||||||
found:
|
|
||||||
spin_unlock(&nsm_lock);
|
|
||||||
return nsm;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue