All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Fasheh <mfasheh@suse.com>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH 1/3] ocfs2/dlm: dlm_is_lockres_migrateable() returns boolean
Date: Thu, 5 May 2011 15:09:30 -0700	[thread overview]
Message-ID: <20110505220930.GD17822@wotan.suse.de> (raw)
In-Reply-To: <1303859005-29529-1-git-send-email-sunil.mushran@oracle.com>

On Tue, Apr 26, 2011 at 04:03:23PM -0700, Sunil Mushran wrote:
> Patch cleans up the gunk added by commit 388c4bcb4e63e88fb1f312a2f5f9eb2623afcf5b.
> dlm_is_lockres_migrateable() now returns 1 if lockresource is deemed
> migrateable and 0 if not.
> 
> Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
> ---
>  fs/ocfs2/dlm/dlmcommon.h |   12 ++++
>  fs/ocfs2/dlm/dlmmaster.c |  135 +++++++++++++++++----------------------------
>  2 files changed, 63 insertions(+), 84 deletions(-)
> 
> diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h
> index 4bdf7ba..1aac42a 100644
> --- a/fs/ocfs2/dlm/dlmcommon.h
> +++ b/fs/ocfs2/dlm/dlmcommon.h
> @@ -401,6 +401,18 @@ static inline int dlm_lvb_is_empty(char *lvb)
>  	return 1;
>  }
>  
> +static inline char *dlm_list_in_text(enum dlm_lockres_list idx)
> +{
> +	if (idx == DLM_GRANTED_LIST)
> +		return "granted";
> +	else if (idx == DLM_CONVERTING_LIST)
> +		return "converting";
> +	else if (idx == DLM_BLOCKED_LIST)
> +		return "blocked";
> +	else
> +		return "unknown";
> +}
> +
>  static inline struct list_head *
>  dlm_list_idx_to_ptr(struct dlm_lock_resource *res, enum dlm_lockres_list idx)
>  {
> diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
> index 9d67610..3e59ff9 100644
> --- a/fs/ocfs2/dlm/dlmmaster.c
> +++ b/fs/ocfs2/dlm/dlmmaster.c
> @@ -2339,65 +2339,55 @@ static void dlm_deref_lockres_worker(struct dlm_work_item *item, void *data)
>  	dlm_lockres_put(res);
>  }
>  
> -/* Checks whether the lockres can be migrated. Returns 0 if yes, < 0
> - * if not. If 0, numlocks is set to the number of locks in the lockres.
> +/*
> + * A migrateable resource is one that is :
> + * 1. locally mastered, and,
> + * 2. zero local locks, and,
> + * 3. one or more non-local locks, or, one or more references
> + * Returns 1 if yes, 0 if not.
>   */
>  static int dlm_is_lockres_migrateable(struct dlm_ctxt *dlm,
> -				      struct dlm_lock_resource *res,
> -				      int *numlocks,
> -				      int *hasrefs)
> +				      struct dlm_lock_resource *res)
>  {
> -	int ret;
> -	int i;
> -	int count = 0;
> +	enum dlm_lockres_list idx;
> +	int nonlocal = 0;
>  	struct list_head *queue;
>  	struct dlm_lock *lock;
> +	u64 cookie;
>  
>  	assert_spin_locked(&res->spinlock);
>  
> -	*numlocks = 0;
> -	*hasrefs = 0;
> -
> -	ret = -EINVAL;
> -	if (res->owner == DLM_LOCK_RES_OWNER_UNKNOWN) {
> -		mlog(0, "cannot migrate lockres with unknown owner!\n");
> -		goto leave;
> -	}
> -
> -	if (res->owner != dlm->node_num) {
> -		mlog(0, "cannot migrate lockres this node doesn't own!\n");
> -		goto leave;
> -	}
> +	if (res->owner != dlm->node_num)
> +		return 0;
>  
> -	ret = 0;
> -	queue = &res->granted;
> -	for (i = 0; i < 3; i++) {
> +        for (idx = DLM_GRANTED_LIST; idx <= DLM_BLOCKED_LIST; idx++) {
> +		queue = dlm_list_idx_to_ptr(res, idx);
>  		list_for_each_entry(lock, queue, list) {
> -			++count;
> -			if (lock->ml.node == dlm->node_num) {
> -				mlog(0, "found a lock owned by this node still "
> -				     "on the %s queue!  will not migrate this "
> -				     "lockres\n", (i == 0 ? "granted" :
> -						   (i == 1 ? "converting" :
> -						    "blocked")));
> -				ret = -ENOTEMPTY;
> -				goto leave;
> +			if (lock->ml.node != dlm->node_num) {
> +				nonlocal++;
> +				continue;
>  			}
> +			cookie = be64_to_cpu(lock->ml.cookie);
> +			mlog(0, "%s: Not migrateable res %.*s, lock %u:%llu on "
> +			     "%s list\n", dlm->name, res->lockname.len,
> +			     res->lockname.name,
> +			     dlm_get_lock_cookie_node(cookie),
> +			     dlm_get_lock_cookie_seq(cookie),
> +			     dlm_list_in_text(idx));
> +			return 0;
>  		}
> -		queue++;
>  	}
>  
> -	*numlocks = count;
> -
> -	count = find_next_bit(res->refmap, O2NM_MAX_NODES, 0);
> -	if (count < O2NM_MAX_NODES)
> -		*hasrefs = 1;
> +	if (!nonlocal) {
> +		nonlocal = find_next_bit(res->refmap, O2NM_MAX_NODES, 0);
> +		if (nonlocal >= O2NM_MAX_NODES)
> +			return 0;

Minor quibble, but can you use a new variable for these two lines? It took
me a minute to realize that what you were doing was gettting a refcount on
the lockres. Maybe:

if (!nonlocal) {
	/*
	 * We have no locks on the resource (local or remote). Check for
	 * references now.
	 */
	node_ref = find_next_bit(res->refmap, O2NM_MAX_NODES, 0);
	if (node_ref >= O2NM_MAX_NODES)
		return 0;
	}
}

Otherwise this looks much nicer than before, thanks.
	--Mark

--
Mark Fasheh

  parent reply	other threads:[~2011-05-05 22:09 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-26 23:03 [Ocfs2-devel] [PATCH 1/3] ocfs2/dlm: dlm_is_lockres_migrateable() returns boolean Sunil Mushran
2011-04-26 23:03 ` [Ocfs2-devel] [PATCH 2/3] ocfs2/dlm: Add new dlm message DLM_BEGIN_EXIT_DOMAIN_MSG Sunil Mushran
2011-05-05 22:12   ` Mark Fasheh
2011-04-26 23:03 ` [Ocfs2-devel] [PATCH 3/3] ocfs2/dlm: Do not migrate resource to a node that is leaving the domain Sunil Mushran
2011-05-05 22:24   ` Mark Fasheh
2011-05-05 22:44     ` Sunil Mushran
2011-05-05 23:28       ` Mark Fasheh
2011-05-05 23:44         ` Sunil Mushran
2011-05-10  6:19   ` Wengang Wang
2011-05-10 17:17     ` Sunil Mushran
2011-05-05 22:09 ` Mark Fasheh [this message]
2011-05-05 22:15   ` [Ocfs2-devel] [PATCH 1/3] ocfs2/dlm: dlm_is_lockres_migrateable() returns boolean Sunil Mushran
2011-05-24  6:53     ` Joel Becker

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=20110505220930.GD17822@wotan.suse.de \
    --to=mfasheh@suse.com \
    --cc=ocfs2-devel@oss.oracle.com \
    /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.