From: "J. Bruce Fields" <bfields@fieldses.org>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 01/10] lockd: Support non-AF_INET addresses in nlm_lookup_host()
Date: Wed, 1 Oct 2008 14:21:25 -0400 [thread overview]
Message-ID: <20081001182125.GG6001@fieldses.org> (raw)
In-Reply-To: <C23C367A-ECD8-424C-A3AA-3DF6F5886CDF@oracle.com>
On Wed, Oct 01, 2008 at 11:50:27AM -0400, Chuck Lever wrote:
> On Sep 26, 2008, at Sep 26, 2008, 5:53 PM, J. Bruce Fields wrote:
>> On Wed, Sep 17, 2008 at 11:17:21AM -0500, Chuck Lever wrote:
>>> Make nlm_lookup_host() agnostic to address families. As a clean up,
>>> convert
>>> nlm_lookup_host() to use a single structure instead of nearly a
>>> dozen separate
>>> arguments.
>>
>> Could you do those two steps as two separate patches, and resend?
>
> I tried that before, but it didn't make sense as two patches.
>
> I can try it again.
It should be very straightforward; I'd do the cleanup first, so:
1. Bundle up nlm_lookup_host arguments into a single structure.
2. Fix the address fields in that structure.
And it'd make change #2 trivial to verify.
--b.
>
>>
>>
>> --b.
>>
>>>
>>> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
>>> ---
>>>
>>> fs/lockd/host.c | 88 ++++++++++++++++++++++++++++++++++
>>> +--------------------
>>> 1 files changed, 56 insertions(+), 32 deletions(-)
>>>
>>> diff --git a/fs/lockd/host.c b/fs/lockd/host.c
>>> index be8f19d..c9d25d1 100644
>>> --- a/fs/lockd/host.c
>>> +++ b/fs/lockd/host.c
>>> @@ -38,6 +38,21 @@ static struct nsm_handle *nsm_find(const struct
>>> sockaddr *sap,
>>> const size_t hostname_len,
>>> const int create);
>>>
>>> +#define NLM_SERVER (0)
>>> +#define NLM_CLIENT (1)
>>> +
>>> +struct nlm_lookup_host_info {
>>> + const int peer; /* search for server|client */
>>> + const struct sockaddr *sap; /* address to search for */
>>> + const size_t salen; /* it's length */
>>> + const unsigned short protocol; /* transport to search for*/
>>> + const u32 version; /* NLM version to search for */
>>> + const char *hostname; /* remote's hostname */
>>> + const size_t hostname_len; /* it's length */
>>> + const struct sockaddr *src_sap; /* our address (optional) */
>>> + const size_t src_len; /* it's length */
>>> +};
>>> +
>>> /*
>>> * Hash function must work well on big- and little-endian platforms
>>> */
>>> @@ -121,23 +136,13 @@ static void nlm_display_address(const struct
>>> sockaddr *sap,
>>> /*
>>> * Common host lookup routine for server & client
>>> */
>>> -static struct nlm_host *nlm_lookup_host(int server,
>>> - const struct sockaddr_in *sin,
>>> - int proto, u32 version,
>>> - const char *hostname,
>>> - unsigned int hostname_len,
>>> - const struct sockaddr_in *ssin)
>>> +static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info
>>> *ni)
>>> {
>>> struct hlist_head *chain;
>>> struct hlist_node *pos;
>>> struct nlm_host *host;
>>> struct nsm_handle *nsm = NULL;
>>>
>>> - dprintk("lockd: nlm_lookup_host(proto=%d, vers=%u,"
>>> - " my role is %s, hostname=%.*s)\n",
>>> - proto, version, server ? "server" : "client",
>>> - hostname_len, hostname ? hostname : "<none>");
>>> -
>>> mutex_lock(&nlm_host_mutex);
>>>
>>> if (time_after_eq(jiffies, next_gc))
>>> @@ -150,22 +155,22 @@ static struct nlm_host *nlm_lookup_host(int
>>> server,
>>> * different NLM rpc_clients into one single nlm_host object.
>>> * This would allow us to have one nlm_host per address.
>>> */
>>> - chain = &nlm_hosts[nlm_hash_address((struct sockaddr *)sin)];
>>> + chain = &nlm_hosts[nlm_hash_address(ni->sap)];
>>> hlist_for_each_entry(host, pos, chain, h_hash) {
>>> - if (!nlm_cmp_addr(nlm_addr(host), (struct sockaddr *)sin))
>>> + if (!nlm_cmp_addr(nlm_addr(host), ni->sap))
>>> continue;
>>>
>>> /* See if we have an NSM handle for this client */
>>> if (!nsm)
>>> nsm = host->h_nsmhandle;
>>>
>>> - if (host->h_proto != proto)
>>> + if (host->h_proto != ni->protocol)
>>> continue;
>>> - if (host->h_version != version)
>>> + if (host->h_version != ni->version)
>>> continue;
>>> - if (host->h_server != server)
>>> + if (host->h_server != ni->peer)
>>> continue;
>>> - if (!nlm_cmp_addr(nlm_srcaddr(host), (struct sockaddr *)ssin))
>>> + if (!nlm_cmp_addr(nlm_srcaddr(host), ni->src_sap))
>>> continue;
>>>
>>> /* Move to head of hash chain. */
>>> @@ -186,8 +191,8 @@ static struct nlm_host *nlm_lookup_host(int
>>> server,
>>> atomic_inc(&nsm->sm_count);
>>> else {
>>> host = NULL;
>>> - nsm = nsm_find((struct sockaddr *)sin, sizeof(*sin),
>>> - hostname, hostname_len, 1);
>>> + nsm = nsm_find(ni->sap, ni->salen,
>>> + ni->hostname, ni->hostname_len, 1);
>>> if (!nsm) {
>>> dprintk("lockd: nlm_lookup_host failed; "
>>> "no nsm handle\n");
>>> @@ -202,12 +207,12 @@ static struct nlm_host *nlm_lookup_host(int
>>> server,
>>> goto out;
>>> }
>>> host->h_name = nsm->sm_name;
>>> - memcpy(nlm_addr(host), sin, sizeof(*sin));
>>> - host->h_addrlen = sizeof(*sin);
>>> + memcpy(nlm_addr(host), ni->sap, ni->salen);
>>> + host->h_addrlen = ni->salen;
>>> nlm_clear_port(nlm_addr(host));
>>> - memcpy(nlm_srcaddr(host), ssin, sizeof(*ssin));
>>> - host->h_version = version;
>>> - host->h_proto = proto;
>>> + memcpy(nlm_srcaddr(host), ni->src_sap, ni->src_len);
>>> + host->h_version = ni->version;
>>> + host->h_proto = ni->protocol;
>>> host->h_rpcclnt = NULL;
>>> mutex_init(&host->h_mutex);
>>> host->h_nextrebind = jiffies + NLM_HOST_REBIND;
>>> @@ -218,7 +223,7 @@ static struct nlm_host *nlm_lookup_host(int
>>> server,
>>> host->h_state = 0; /* pseudo NSM state */
>>> host->h_nsmstate = 0; /* real NSM state */
>>> host->h_nsmhandle = nsm;
>>> - host->h_server = server;
>>> + host->h_server = ni->peer;
>>> hlist_add_head(&host->h_hash, chain);
>>> INIT_LIST_HEAD(&host->h_lockowners);
>>> spin_lock_init(&host->h_lock);
>>> @@ -270,12 +275,22 @@ struct nlm_host *nlmclnt_lookup_host(const
>>> struct sockaddr_in *sin,
>>> const char *hostname,
>>> unsigned int hostname_len)
>>> {
>>> - const struct sockaddr_in source = {
>>> - .sin_family = AF_UNSPEC,
>>> + const struct sockaddr source = {
>>> + .sa_family = AF_UNSPEC,
>>> + };
>>> + struct nlm_lookup_host_info ni = {
>>> + .peer = NLM_SERVER,
>>> + .sap = (struct sockaddr *)sin,
>>> + .salen = sizeof(*sin),
>>> + .protocol = proto,
>>> + .version = version,
>>> + .hostname = hostname,
>>> + .hostname_len = hostname_len,
>>> + .src_sap = &source,
>>> + .src_len = sizeof(source),
>>> };
>>>
>>> - return nlm_lookup_host(0, sin, proto, version,
>>> - hostname, hostname_len, &source);
>>> + return nlm_lookup_host(&ni);
>>> }
>>>
>>> /*
>>> @@ -289,10 +304,19 @@ nlmsvc_lookup_host(struct svc_rqst *rqstp,
>>> .sin_family = AF_INET,
>>> .sin_addr = rqstp->rq_daddr.addr,
>>> };
>>> + struct nlm_lookup_host_info ni = {
>>> + .peer = NLM_CLIENT,
>>> + .sap = svc_addr(rqstp),
>>> + .salen = rqstp->rq_addrlen,
>>> + .protocol = rqstp->rq_prot,
>>> + .version = rqstp->rq_vers,
>>> + .hostname = hostname,
>>> + .hostname_len = hostname_len,
>>> + .src_sap = (struct sockaddr *)&source,
>>> + .src_len = sizeof(source),
>>> + };
>>>
>>> - return nlm_lookup_host(1, svc_addr_in(rqstp),
>>> - rqstp->rq_prot, rqstp->rq_vers,
>>> - hostname, hostname_len, &source);
>>> + return nlm_lookup_host(&ni);
>>> }
>>>
>>> /*
>>>
>
> --
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com
>
>
>
>
next prev parent reply other threads:[~2008-10-01 18:21 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-17 16:17 [PATCH 00/10] Next series of IPv6 patches for lockd Chuck Lever
[not found] ` <20080917161337.4963.74674.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-17 16:17 ` [PATCH 01/10] lockd: Support non-AF_INET addresses in nlm_lookup_host() Chuck Lever
[not found] ` <20080917161720.4963.42788.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 21:53 ` J. Bruce Fields
2008-10-01 15:50 ` Chuck Lever
2008-10-01 18:21 ` J. Bruce Fields [this message]
2008-09-17 16:17 ` [PATCH 02/10] lockd: Adjust nlmclnt_lookup_host() signature to accomodate non-AF_INET Chuck Lever
[not found] ` <20080917161728.4963.48337.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 22:02 ` J. Bruce Fields
2008-10-01 15:52 ` Chuck Lever
2008-10-01 18:23 ` J. Bruce Fields
2008-09-17 16:17 ` [PATCH 03/10] lockd: Adjust nlmsvc_lookup_host() to accomodate AF_INET6 addresses Chuck Lever
[not found] ` <20080917161735.4963.86248.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 22:19 ` J. Bruce Fields
2008-10-01 15:59 ` Chuck Lever
2008-10-01 18:00 ` J. Bruce Fields
2008-09-17 16:17 ` [PATCH 04/10] lockd: change nlmclnt_grant() to take a "struct sockaddr *" Chuck Lever
[not found] ` <20080917161742.4963.24984.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 22:21 ` J. Bruce Fields
2008-09-17 16:17 ` [PATCH 05/10] lockd: Adjust signature of nlm_host_rebooted to handle non-AF_INET Chuck Lever
[not found] ` <20080917161749.4963.84067.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 22:27 ` J. Bruce Fields
2008-09-17 16:17 ` [PATCH 06/10] lockd: Add helper to sanity check incoming NOTIFY requests Chuck Lever
[not found] ` <20080917161757.4963.82230.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 22:43 ` J. Bruce Fields
2008-10-01 16:01 ` Chuck Lever
2008-10-01 18:05 ` J. Bruce Fields
2008-09-17 16:18 ` [PATCH 07/10] lockd: Remove unused fields in the nlm_reboot structure Chuck Lever
[not found] ` <20080917161804.4963.71981.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 22:53 ` J. Bruce Fields
2008-09-26 23:07 ` J. Bruce Fields
2008-09-17 16:18 ` [PATCH 08/10] lockd: struct nlm_reboot should contain a full socket address Chuck Lever
[not found] ` <20080917161811.4963.60224.stgit-ewv44WTpT0t9HhUboXbp9zCvJB+x5qRC@public.gmane.org>
2008-09-26 23:09 ` J. Bruce Fields
2008-10-01 16:17 ` Chuck Lever
2008-10-01 18:18 ` J. Bruce Fields
2008-10-01 19:40 ` Chuck Lever
2008-10-01 20:08 ` J. Bruce Fields
2008-10-01 20:33 ` J. Bruce Fields
2008-10-01 20:48 ` Chuck Lever
2008-10-01 20:55 ` J. Bruce Fields
2008-10-01 21:16 ` Chuck Lever
2008-10-01 21:30 ` J. Bruce Fields
2008-10-01 20:42 ` Chuck Lever
2008-10-01 20:51 ` J. Bruce Fields
2008-10-01 20:52 ` J. Bruce Fields
2008-09-17 16:18 ` [PATCH 09/10] lockd: IPv6 support for SM_MON / SM_UNMON Chuck Lever
2008-09-17 16:18 ` [PATCH 10/10] lockd: Use "unsigned short" for lockd_up() "proto" argument Chuck Lever
2008-09-26 23:21 ` [PATCH 00/10] Next series of IPv6 patches for lockd J. Bruce Fields
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081001182125.GG6001@fieldses.org \
--to=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.