Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 127470
b: refs/heads/master
c: 77a3ef3
h: refs/heads/master
v: v3
  • Loading branch information
Chuck Lever authored and J. Bruce Fields committed Jan 6, 2009
1 parent 95611d5 commit dff6764
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b39b897c259fc1fd1998505f2b1d4ec1f115bce1
refs/heads/master: 77a3ef33e2de6fc8aabd7cb1700bfef81757c28a
62 changes: 35 additions & 27 deletions trunk/fs/lockd/mon.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,16 @@ static struct nsm_handle *nsm_lookup_hostname(const char *hostname,
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)
{
struct nsm_handle *nsm;
Expand Down Expand Up @@ -281,8 +291,7 @@ struct nsm_handle *nsm_get_handle(const struct sockaddr *sap,
const size_t salen, const char *hostname,
const size_t hostname_len)
{
struct nsm_handle *nsm = NULL;
struct nsm_handle *pos;
struct nsm_handle *cached, *new = NULL;

if (hostname && memchr(hostname, '/', hostname_len) != NULL) {
if (printk_ratelimit()) {
Expand All @@ -295,38 +304,37 @@ struct nsm_handle *nsm_get_handle(const struct sockaddr *sap,

retry:
spin_lock(&nsm_lock);
list_for_each_entry(pos, &nsm_handles, sm_link) {

if (hostname && nsm_use_hostnames) {
if (strlen(pos->sm_name) != hostname_len
|| memcmp(pos->sm_name, hostname, hostname_len))
continue;
} else if (!nlm_cmp_addr(nsm_addr(pos), sap))
continue;
atomic_inc(&pos->sm_count);
kfree(nsm);
nsm = pos;
dprintk("lockd: found nsm_handle for %s (%s), cnt %d\n",
pos->sm_name, pos->sm_addrbuf,
atomic_read(&pos->sm_count));
goto found;

if (nsm_use_hostnames && hostname != NULL)
cached = nsm_lookup_hostname(hostname, hostname_len);
else
cached = nsm_lookup_addr(sap);

if (cached != NULL) {
atomic_inc(&cached->sm_count);
spin_unlock(&nsm_lock);
kfree(new);
dprintk("lockd: found nsm_handle for %s (%s), "
"cnt %d\n", cached->sm_name,
cached->sm_addrbuf,
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",
nsm->sm_name, nsm->sm_addrbuf);
goto found;
new->sm_name, new->sm_addrbuf);
return new;
}

spin_unlock(&nsm_lock);

nsm = nsm_create_handle(sap, salen, hostname, hostname_len);
if (unlikely(nsm == NULL))
new = nsm_create_handle(sap, salen, hostname, hostname_len);
if (unlikely(new == NULL))
return NULL;
goto retry;

found:
spin_unlock(&nsm_lock);
return nsm;
}

/**
Expand Down

0 comments on commit dff6764

Please sign in to comment.