From: "J. Bruce Fields" <bfields@fieldses.org>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 20/27] NSM: Replace IP address as our nlm_reboot lookup key
Date: Wed, 10 Dec 2008 18:43:34 -0500 [thread overview]
Message-ID: <20081210234334.GQ1212@fieldses.org> (raw)
In-Reply-To: <20081206000424.24075.72384.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
On Fri, Dec 05, 2008 at 07:04:24PM -0500, Chuck Lever wrote:
> NLM provides file locking services for NFS files. Part of this service
> includes a second protocol, known as NSM, which is a reboot
> notification service. NLM uses this service to determine when to
> reclaim locks or enter a grace period after a client or server reboots.
>
> The NLM service (implemented by lockd in the Linux kernel) contacts
> the local NSM service (implemented by rpc.statd in Linux user space)
> via NSM protocol upcalls to register a callback when a particular
> remote peer reboots.
>
> To match the callback to the correct remote peer, the NLM service
> constructs a cookie that it passes in the request. The NSM service
> passes that cookie back to the NLM service when it is notified that
> the given remote peer has indeed rebooted.
>
> Currently on Linux, the cookie is the raw 32-bit IPv4 address of the
> remote peer. To support IPv6 addresses, which are larger, we could
> use all 16 bytes of the cookie to represent a full IPv6 address,
> although we still can't represent an IPv6 address with a scope ID in
> just 16 bytes.
>
> Instead, to avoid the need for future changes to support additional
> address types, we'll use a manufactured value for the cookie, and use
> that to find the corresponding nsm_handle struct in the kernel during
> the NLMPROC_SM_NOTIFY callback.
>
> This should provide complete support in the kernel's NSM
> implementation for IPv6 hosts, while remaining backwards compatible
> with older rpc.statd implementations.
>
> Note we also deal with another case where nsm_use_hostnames can change
> while there are outstanding notifications, possibly resulting in the
> loss of reboot notifications. After this patch, the priv cookie is
> always used to lookup rebooted hosts in the kernel.
>
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
>
> fs/lockd/mon.c | 39 ++++++++++++++++++++++++++++++---------
> 1 files changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c
> index a5f26f3..4113ed1 100644
> --- a/fs/lockd/mon.c
> +++ b/fs/lockd/mon.c
> @@ -241,13 +241,38 @@ static struct nsm_handle *nsm_lookup_priv(const struct nsm_private *priv)
> * returned via NLMPROC_SM_NOTIFY, in the "priv" field of these
> * requests.
> *
> - * Linux provides the raw IP address of the monitored host,
> - * left in network byte order.
> + * These cookies are not required to last across reboots, but they
> + * must be unique for each nsm_handle during the same boot.
> + * Uniqueness is guaranteed by using the memory address of the
> + * nsm_handle data structure. Such memory addresses are only reused
> + * if the nsm_handle is destroyed by an nsm_release().
> + *
> + * A time stamp is added in case rpc.statd returns a stale cookie.
> + * That would be a bug in rpc.statd, but it would result in some
> + * client losing its locks inappropriately, which we would like to
> + * avoid.
I forget what the arguments were against using a simple counter here.
> + *
> + * For safety, the cookie returned via NLM_SM_NOTIFY is treated as
> + * an opaque -- the address is not used directly to access the
> + * associated nsm_handle. This also means it would be simple to
> + * change the cookie generator again at some later point without
> + * having to mess with the nsm_handle lookup code in
> + * nsm_reboot_lookup().
> + *
> + * The cookies are exposed only to local user space via loopback.
> + * They do not appear on the physical network. If we want greater
> + * security for some reason, nsm_init_private() could perform a
> + * one-way hash to obscure the contents of the cookie.
> */
> static void nsm_init_private(struct nsm_handle *nsm)
> {
> - __be32 *p = (__be32 *)&nsm->sm_priv.data;
> - *p = nsm_addr_in(nsm)->sin_addr.s_addr;
> + u64 *p = (u64 *)&nsm->sm_priv.data;
> + struct timeval tv;
> +
> + do_gettimeofday(&tv);
I see there's a note on do_gettimeofday advising callers to use
getnstimeofday instead.
--b.
> +
> + *p++ = (unsigned long)nsm;
> + *p = timeval_to_ns(&tv);
> }
>
> static struct nsm_handle *nsm_create_handle(const struct sockaddr *sap,
> @@ -351,11 +376,7 @@ struct nsm_handle *nsm_reboot_lookup(const struct nlm_reboot *info)
>
> spin_lock(&nsm_lock);
>
> - if (nsm_use_hostnames && info->mon != NULL)
> - cached = nsm_lookup_hostname(info->mon, info->len);
> - else
> - cached = nsm_lookup_priv(&info->priv);
> -
> + cached = nsm_lookup_priv(&info->priv);
> if (unlikely(cached == NULL)) {
> spin_unlock(&nsm_lock);
> dprintk("lockd: never saw rebooted peer '%.*s' before\n",
>
next prev parent reply other threads:[~2008-12-10 23:43 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-06 0:01 [PATCH 00/27] Remaining IPv6 NSM patches for 2.6.29 Chuck Lever
[not found] ` <20081205235557.24075.12511.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-06 0:01 ` [PATCH 01/27] NSM: Move NSM-related XDR data structures to lockd's xdr.h Chuck Lever
2008-12-06 0:02 ` [PATCH 02/27] NSM: Move NSM program and procedure numbers to fs/lockd/mon.c Chuck Lever
[not found] ` <20081206000206.24075.32502.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 20:09 ` J. Bruce Fields
2008-12-06 0:02 ` [PATCH 03/27] NSM: Add xdr_stream-based XDR encoders Chuck Lever
[not found] ` <20081206000214.24075.58074.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 20:35 ` J. Bruce Fields
2008-12-10 20:36 ` J. Bruce Fields
2008-12-10 20:54 ` Chuck Lever
2008-12-10 21:15 ` J. Bruce Fields
2008-12-06 0:02 ` [PATCH 04/27] " Chuck Lever
2008-12-06 0:02 ` [PATCH 05/27] NSM: Switch over to the new-style XDR functions Chuck Lever
2008-12-06 0:02 ` [PATCH 06/27] NSM: Remove unused old-style " Chuck Lever
2008-12-06 0:02 ` [PATCH 07/27] NSM: Move nsm_find() to fs/lockd/mon.c Chuck Lever
[not found] ` <20081206000244.24075.75258.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 20:58 ` J. Bruce Fields
2008-12-10 21:08 ` Chuck Lever
2008-12-06 0:02 ` [PATCH 08/27] NSM: Add dprintk() calls in nsm_find and nsm_release Chuck Lever
[not found] ` <20081206000252.24075.51827.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 21:05 ` J. Bruce Fields
2008-12-10 21:10 ` Chuck Lever
2008-12-10 21:14 ` J. Bruce Fields
2008-12-06 0:03 ` [PATCH 09/27] NSM: Remove NULL pointer check from nsm_find() Chuck Lever
2008-12-06 0:03 ` [PATCH 10/27] NSM: Remove !nsm check from nsm_release() Chuck Lever
[not found] ` <20081206000308.24075.73629.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 21:11 ` J. Bruce Fields
2008-12-06 0:03 ` [PATCH 11/27] NSM: Generate NSMPROC_MON's "priv" argument when nsm_handle is created Chuck Lever
2008-12-06 0:03 ` [PATCH 12/27] NSM: Encode the new "priv" cookie for NSMPROC_MON requests Chuck Lever
2008-12-06 0:03 ` [PATCH 13/27] NLM: Change nlm_host_rebooted() to take a single nlm_reboot argument Chuck Lever
2008-12-06 0:03 ` [PATCH 14/27] NLM: Decode "priv" argument of NLMPROC_SM_NOTIFY as an opaque Chuck Lever
[not found] ` <20081206000338.24075.50442.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 22:29 ` J. Bruce Fields
2008-12-06 0:03 ` [PATCH 15/27] NSM: Add nsm_lookup() function Chuck Lever
[not found] ` <20081206000346.24075.23426.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 22:58 ` J. Bruce Fields
2008-12-06 0:03 ` [PATCH 16/27] NLM: Call nsm_reboot_lookup() instead of nsm_find() Chuck Lever
2008-12-06 0:04 ` [PATCH 17/27] NLM: Remove "create" argument from nsm_find() Chuck Lever
[not found] ` <20081206000401.24075.77127.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 23:00 ` J. Bruce Fields
2008-12-06 0:04 ` [PATCH 18/27] NSM: Refactor nsm_handle creation into a helper function Chuck Lever
[not found] ` <20081206000409.24075.37859.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 23:28 ` J. Bruce Fields
2008-12-11 17:09 ` Chuck Lever
2008-12-11 18:53 ` J. Bruce Fields
2008-12-06 0:04 ` [PATCH 19/27] NSM: More clean up of nsm_get_handle() Chuck Lever
2008-12-06 0:04 ` [PATCH 20/27] NSM: Replace IP address as our nlm_reboot lookup key Chuck Lever
[not found] ` <20081206000424.24075.72384.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>
2008-12-10 23:43 ` J. Bruce Fields [this message]
2008-12-11 16:20 ` Chuck Lever
2008-12-06 0:04 ` [PATCH 21/27] NSM: Remove include/linux/lockd/sm_inter.h Chuck Lever
2008-12-06 0:04 ` [PATCH 22/27] NSM: Move nsm_addr() to fs/lockd/mon.c Chuck Lever
2008-12-06 0:04 ` [PATCH 23/27] NSM: Move nsm_use_hostnames to mon.c Chuck Lever
2008-12-06 0:04 ` [PATCH 24/27] NSM: Move nsm_create() Chuck Lever
2008-12-06 0:05 ` [PATCH 25/27] NLM: nlm_privileged_requester() doesn't recognize mapped loopback address Chuck Lever
2008-12-06 0:05 ` [PATCH 26/27] NLM: Rewrite IPv4 privileged requester's check Chuck Lever
2008-12-06 0:05 ` [PATCH 27/27] lockd: Enable NLM use of AF_INET6 Chuck Lever
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=20081210234334.GQ1212@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.