All of lore.kernel.org
 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 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.