From: "J. Bruce Fields" <bfields@fieldses.org>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 08/10] lockd: struct nlm_reboot should contain a full socket address
Date: Wed, 1 Oct 2008 14:18:01 -0400 [thread overview]
Message-ID: <20081001181801.GF6001@fieldses.org> (raw)
In-Reply-To: <E908BC09-5443-440E-9402-E2E319A3BD8E@oracle.com>
On Wed, Oct 01, 2008 at 12:17:02PM -0400, Chuck Lever wrote:
> On Sep 26, 2008, at Sep 26, 2008, 7:09 PM, J. Bruce Fields wrote:
>> On Wed, Sep 17, 2008 at 11:18:11AM -0500, Chuck Lever wrote:
>>> The XDR decoders for the NSM NOTIFY procedure should construct a full
>>> socket address and store it in the nlm_reboot structure. In addition
>>> to being able to store larger addresses, this means upper layer
>>> routines get an address family tag so they can distinguish between
>>> AF_INET and AF_INET6 addresses.
>>>
>>> This also keeps potentially large socket addresses off the stack and
>>> instead in dynamically allocated storage.
>>
>> So one way to think of this would be that you're extending the
>> kernel<->statd interface by using the address family of statd's notify
>> call to communicate the address family of the host that rebooted.
>>
>> Do I have that right?
>
> For statd, we're using the same technique that we used when constructing
> the source address in nlmsvc_lookup_host(). There's no family tag
> associated with the address because the 16-byte opaque in the on-the-wire
> format has room only for the sin6_addr part of the address.
OK. It seems a bit tricky, but I can't see why it doesn't work.
--b.
> The notification downcall for IPv6 peers has to come via IPv6 loopback
> for this to work.
>
>>
>>
>> --b.
>>
>>>
>>> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
>>> ---
>>>
>>> fs/lockd/svc4proc.c | 10 +---------
>>> fs/lockd/svcproc.c | 10 +---------
>>> fs/lockd/xdr.c | 28 ++++++++++++++++++++++++++--
>>> fs/lockd/xdr4.c | 27 +++++++++++++++++++++++++--
>>> include/linux/lockd/xdr.h | 3 ++-
>>> 5 files changed, 55 insertions(+), 23 deletions(-)
>>>
>>> diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
>>> index 6a5ef9f..e61c05f 100644
>>> --- a/fs/lockd/svc4proc.c
>>> +++ b/fs/lockd/svc4proc.c
>>> @@ -430,8 +430,6 @@ static __be32
>>> nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot
>>> *argp,
>>> void *resp)
>>> {
>>> - struct sockaddr_in saddr;
>>> -
>>> dprintk("lockd: SM_NOTIFY called\n");
>>>
>>> if (!nlm_privileged_requester(rqstp)) {
>>> @@ -441,13 +439,7 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp,
>>> struct nlm_reboot *argp,
>>> return rpc_system_err;
>>> }
>>>
>>> - /* Obtain the host pointer for this NFS server and try to
>>> - * reclaim all locks we hold on this server.
>>> - */
>>> - memset(&saddr, 0, sizeof(saddr));
>>> - saddr.sin_family = AF_INET;
>>> - saddr.sin_addr.s_addr = argp->addr;
>>> - nlm_host_rebooted((struct sockaddr *)&saddr, sizeof(saddr),
>>> + nlm_host_rebooted((struct sockaddr *)&argp->addr, argp->addrlen,
>>> argp->mon, argp->len, argp->state);
>>>
>>> return rpc_success;
>>> diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c
>>> index 62fcfdb..86a487a 100644
>>> --- a/fs/lockd/svcproc.c
>>> +++ b/fs/lockd/svcproc.c
>>> @@ -462,8 +462,6 @@ static __be32
>>> nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot
>>> *argp,
>>> void *resp)
>>> {
>>> - struct sockaddr_in saddr;
>>> -
>>> dprintk("lockd: SM_NOTIFY called\n");
>>>
>>> if (!nlm_privileged_requester(rqstp)) {
>>> @@ -473,13 +471,7 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp,
>>> struct nlm_reboot *argp,
>>> return rpc_system_err;
>>> }
>>>
>>> - /* Obtain the host pointer for this NFS server and try to
>>> - * reclaim all locks we hold on this server.
>>> - */
>>> - memset(&saddr, 0, sizeof(saddr));
>>> - saddr.sin_family = AF_INET;
>>> - saddr.sin_addr.s_addr = argp->addr;
>>> - nlm_host_rebooted((struct sockaddr *)&saddr, sizeof(saddr),
>>> + nlm_host_rebooted((struct sockaddr *)&argp->addr, argp->addrlen,
>>> argp->mon, argp->len, argp->state);
>>>
>>> return rpc_success;
>>> diff --git a/fs/lockd/xdr.c b/fs/lockd/xdr.c
>>> index 1f22629..92c5695 100644
>>> --- a/fs/lockd/xdr.c
>>> +++ b/fs/lockd/xdr.c
>>> @@ -9,6 +9,7 @@
>>> #include <linux/types.h>
>>> #include <linux/sched.h>
>>> #include <linux/utsname.h>
>>> +#include <linux/in.h>
>>> #include <linux/nfs.h>
>>>
>>> #include <linux/sunrpc/xdr.h>
>>> @@ -346,11 +347,34 @@ nlmsvc_decode_notify(struct svc_rqst *rqstp,
>>> __be32 *p, struct nlm_args *argp)
>>> int
>>> nlmsvc_decode_reboot(struct svc_rqst *rqstp, __be32 *p, struct
>>> nlm_reboot *argp)
>>> {
>>> + struct sockaddr_in *sin = (struct sockaddr_in *)&argp->addr;
>>> + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&argp->addr;
>>> +
>>> if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len,
>>> SM_MAXSTRLEN)))
>>> return 0;
>>> argp->state = ntohl(*p++);
>>> - /* Preserve the address in network byte order */
>>> - argp->addr = *p++;
>>> +
>>> + /* Decode the 16-byte private field */
>>> + memset(&argp->addr, 0, sizeof(argp->addr));
>>> + switch (svc_addr(rqstp)->sa_family) {
>>> + case AF_INET:
>>> + /* data in recv buffer is already in network byte order */
>>> + sin->sin_family = AF_INET;
>>> + sin->sin_addr.s_addr = *p++;
>>> + argp->addrlen = sizeof(*sin);
>>> + break;
>>> + case AF_INET6:
>>> + sin6->sin6_family = AF_INET6;
>>> + sin6->sin6_addr.s6_addr32[0] = *p++;
>>> + sin6->sin6_addr.s6_addr32[1] = *p++;
>>> + sin6->sin6_addr.s6_addr32[2] = *p++;
>>> + sin6->sin6_addr.s6_addr32[3] = *p++;
>>> + argp->addrlen = sizeof(*sin6);
>>> + break;
>>> + default:
>>> + return -EIO;
>>> + }
>>> +
>>> return xdr_argsize_check(rqstp, p);
>>> }
>>>
>>> diff --git a/fs/lockd/xdr4.c b/fs/lockd/xdr4.c
>>> index 50c493a..2009020 100644
>>> --- a/fs/lockd/xdr4.c
>>> +++ b/fs/lockd/xdr4.c
>>> @@ -353,11 +353,34 @@ nlm4svc_decode_notify(struct svc_rqst *rqstp,
>>> __be32 *p, struct nlm_args *argp)
>>> int
>>> nlm4svc_decode_reboot(struct svc_rqst *rqstp, __be32 *p, struct
>>> nlm_reboot *argp)
>>> {
>>> + struct sockaddr_in *sin = (struct sockaddr_in *)&argp->addr;
>>> + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&argp->addr;
>>> +
>>> if (!(p = xdr_decode_string_inplace(p, &argp->mon, &argp->len,
>>> SM_MAXSTRLEN)))
>>> return 0;
>>> argp->state = ntohl(*p++);
>>> - /* Preserve the address in network byte order */
>>> - argp->addr = *p++;
>>> +
>>> + /* Decode the 16-byte private field */
>>> + memset(&argp->addr, 0, sizeof(argp->addr));
>>> + switch (svc_addr(rqstp)->sa_family) {
>>> + case AF_INET:
>>> + /* address in recv buffer is already in network byte order */
>>> + sin->sin_family = AF_INET;
>>> + sin->sin_addr.s_addr = *p++;
>>> + argp->addrlen = sizeof(*sin);
>>> + break;
>>> + case AF_INET6:
>>> + sin6->sin6_family = AF_INET6;
>>> + sin6->sin6_addr.s6_addr32[0] = *p++;
>>> + sin6->sin6_addr.s6_addr32[1] = *p++;
>>> + sin6->sin6_addr.s6_addr32[2] = *p++;
>>> + sin6->sin6_addr.s6_addr32[3] = *p++;
>>> + argp->addrlen = sizeof(*sin6);
>>> + break;
>>> + default:
>>> + return -EIO;
>>> + }
>>> +
>>> return xdr_argsize_check(rqstp, p);
>>> }
>>>
>>> diff --git a/include/linux/lockd/xdr.h b/include/linux/lockd/xdr.h
>>> index d6b3a80..6057b7e 100644
>>> --- a/include/linux/lockd/xdr.h
>>> +++ b/include/linux/lockd/xdr.h
>>> @@ -80,7 +80,8 @@ struct nlm_reboot {
>>> char * mon;
>>> unsigned int len;
>>> u32 state;
>>> - __be32 addr;
>>> + struct sockaddr_storage addr;
>>> + size_t addrlen;
>>> };
>>>
>>> /*
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-nfs"
>> in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> --
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com
>
>
>
>
next prev parent reply other threads:[~2008-10-01 18:18 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
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 [this message]
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=20081001181801.GF6001@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.