[Ocfs2-devel] [PATCH 2/4] ocfs2/dlm: Ignore LVBs of locks in the Blocked list

Joel Becker Joel.Becker at oracle.com
Mon Jan 25 19:53:05 PST 2010


On Mon, Jan 25, 2010 at 04:57:39PM -0800, Sunil Mushran wrote:
> During lock resource migration, o2dlm fills the packet with a LVB from the
> first valid lock. For sanity, it ensures that the other valid locks have the
> same LVB. If not, it BUGs.
> 
> The valid locks are ones that have granted EX or PR lock levels and are either
> on the Granted or Converting lists. Locks in the Blocked list cannot have a
> valid LVB.
> 
> This patch ensures that we skip the locks in the Blocked list.
> 
> Fixes oss bugzilla#1202
> http://oss.oracle.com/bugzilla/show_bug.cgi?id=1202
> 
> Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>

This patch is now part of the 'fixes' branch of ocfs2.git.

Joel

> ---
>  fs/ocfs2/dlm/dlmrecovery.c |   48 +++++++++++++++++++++++++++++++------------
>  1 files changed, 34 insertions(+), 14 deletions(-)
> 
> diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
> index 57736d3..9d67894 100644
> --- a/fs/ocfs2/dlm/dlmrecovery.c
> +++ b/fs/ocfs2/dlm/dlmrecovery.c
> @@ -1164,6 +1164,39 @@ static void dlm_init_migratable_lockres(struct dlm_migratable_lockres *mres,
>  	mres->master = master;
>  }
>  
> +static void dlm_prepare_lvb_for_migration(struct dlm_lock *lock,
> +					  struct dlm_migratable_lockres *mres,
> +					  int queue)
> +{
> +	if (!lock->lksb)
> +	       return;
> +
> +	/* Ignore lvb in all locks in the blocked list */
> +	if (queue == DLM_BLOCKED_LIST)
> +		return;
> +
> +	/* Only consider lvbs in locks with granted EX or PR lock levels */
> +	if (lock->ml.type != LKM_EXMODE && lock->ml.type != LKM_PRMODE)
> +		return;
> +
> +	if (dlm_lvb_is_empty(mres->lvb)) {
> +		memcpy(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN);
> +		return;
> +	}
> +
> +	/* Ensure the lvb copied for migration matches in other valid locks */
> +	if (!memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))
> +		return;
> +
> +	mlog(ML_ERROR, "Mismatched lvb in lock cookie=%u:%llu, name=%.*s, "
> +	     "node=%u\n",
> +	     dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)),
> +	     dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)),
> +	     lock->lockres->lockname.len, lock->lockres->lockname.name,
> +	     lock->ml.node);
> +	dlm_print_one_lock_resource(lock->lockres);
> +	BUG();
> +}
>  
>  /* returns 1 if this lock fills the network structure,
>   * 0 otherwise */
> @@ -1181,20 +1214,7 @@ static int dlm_add_lock_to_array(struct dlm_lock *lock,
>  	ml->list = queue;
>  	if (lock->lksb) {
>  		ml->flags = lock->lksb->flags;
> -		/* send our current lvb */
> -		if (ml->type == LKM_EXMODE ||
> -		    ml->type == LKM_PRMODE) {
> -			/* if it is already set, this had better be a PR
> -			 * and it has to match */
> -			if (!dlm_lvb_is_empty(mres->lvb) &&
> -			    (ml->type == LKM_EXMODE ||
> -			     memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) {
> -				mlog(ML_ERROR, "mismatched lvbs!\n");
> -				dlm_print_one_lock_resource(lock->lockres);
> -				BUG();
> -			}
> -			memcpy(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN);
> -		}
> +		dlm_prepare_lvb_for_migration(lock, mres, queue);
>  	}
>  	ml->node = lock->ml.node;
>  	mres->num_locks++;
> -- 
> 1.5.6.5
> 

-- 

"The first thing we do, let's kill all the lawyers."
                                        -Henry VI, IV:ii

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127



More information about the Ocfs2-devel mailing list