Linux NFS development
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 15/27] NSM: Add nsm_lookup() function
Date: Wed, 10 Dec 2008 17:58:03 -0500	[thread overview]
Message-ID: <20081210225803.GN1212@fieldses.org> (raw)
In-Reply-To: <20081206000346.24075.23426.stgit-07a7zB5ZJzbwdl/1UfZZQIVfYA8g3rJ/@public.gmane.org>

On Fri, Dec 05, 2008 at 07:03:46PM -0500, Chuck Lever wrote:
> Introduce a new API to fs/lockd/mon.c that allows nlm_host_rebooted()
> to lookup up nsm_handles via the contents of an nlm_reboot struct.
> 
> The new function is equivalent to calling nsm_find() with @create set
> to zero, but it takes a struct nlm_reboot instead of separate
> arguments.

For next time: would prefer this combined with the following patch (on
the try-to-introduce-new-code-with-its-users principal), but OK for now;
applied.--b.

> 
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
> 
>  fs/lockd/mon.c              |   64 +++++++++++++++++++++++++++++++++++++++++++
>  include/linux/lockd/lockd.h |    1 +
>  2 files changed, 65 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c
> index e0a799d..65fb904 100644
> --- a/fs/lockd/mon.c
> +++ b/fs/lockd/mon.c
> @@ -202,6 +202,29 @@ void nsm_unmonitor(const struct nlm_host *host)
>  	}
>  }
>  
> +static struct nsm_handle *nsm_lookup_hostname(const char *hostname,
> +					      const size_t len)
> +{
> +	struct nsm_handle *nsm;
> +
> +	list_for_each_entry(nsm, &nsm_handles, sm_link)
> +		if (strlen(nsm->sm_name) == len &&
> +		    memcmp(nsm->sm_name, hostname, len) == 0)
> +			return nsm;
> +	return NULL;
> +}
> +
> +static struct nsm_handle *nsm_lookup_priv(const struct nsm_private *priv)
> +{
> +	struct nsm_handle *nsm;
> +
> +	list_for_each_entry(nsm, &nsm_handles, sm_link)
> +		if (memcmp(nsm->sm_priv.data, priv->data,
> +					sizeof(priv->data)) == 0)
> +			return nsm;
> +	return NULL;
> +}
> +
>  /*
>   * Construct a unique cookie to match this nsm_handle to this monitored
>   * host.  It is passed to the local rpc.statd via NSMPROC_MON, and
> @@ -298,6 +321,47 @@ retry:
>  }
>  
>  /**
> + * nsm_reboot_lookup - match NLMPROC_SM_NOTIFY arguments to an nsm_handle
> + * @info: pointer to NLMPROC_SM_NOTIFY arguments
> + *
> + * Returns a matching nsm_handle if found in the nsm cache; the returned
> + * nsm_handle's reference count is bumped and sm_monitored is cleared.
> + * Otherwise returns NULL if some error occurred.
> + */
> +struct nsm_handle *nsm_reboot_lookup(const struct nlm_reboot *info)
> +{
> +	struct nsm_handle *cached;
> +
> +	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);
> +
> +	if (unlikely(cached == NULL)) {
> +		spin_unlock(&nsm_lock);
> +		dprintk("lockd: never saw rebooted peer '%.*s' before\n",
> +				info->len, info->mon);
> +		return cached;
> +	}
> +
> +	atomic_inc(&cached->sm_count);
> +	spin_unlock(&nsm_lock);
> +
> +	/*
> +	 * During subsequent lock activity, force a fresh
> +	 * notification to be set up for this host.
> +	 */
> +	cached->sm_monitored = 0;
> +
> +	dprintk("lockd: host %s (%s) rebooted, cnt %d\n",
> +			cached->sm_name, cached->sm_addrbuf,
> +			atomic_read(&cached->sm_count));
> +	return cached;
> +}
> +
> +/**
>   * nsm_release - Release an NSM handle
>   * @nsm: pointer to handle to be released
>   *
> diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
> index 2a3533e..5e3ad92 100644
> --- a/include/linux/lockd/lockd.h
> +++ b/include/linux/lockd/lockd.h
> @@ -251,6 +251,7 @@ struct nsm_handle *nsm_find(const struct sockaddr *sap, const size_t salen,
>  					const char *hostname,
>  					const size_t hostname_len,
>  					const int create);
> +struct nsm_handle *nsm_reboot_lookup(const struct nlm_reboot *info);
>  void		  nsm_release(struct nsm_handle *nsm);
>  
>  /*
> 

  parent reply	other threads:[~2008-12-10 22:58 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 [this message]
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
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=20081210225803.GN1212@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox