[Ocfs2-devel] [PATCH] ocfs2/dlm: Wait on lockres instead of erroring cancel requests

Sunil Mushran sunil.mushran at oracle.com
Thu Aug 20 17:35:26 PDT 2009


Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>

Goldwyn Rodrigues wrote:
> In case a downconvert is queued, and a flock receives a signal,
> BUG_ON(lockres->l_action != OCFS2_AST_INVALID) is triggered
> because a lock cancel triggers a dlmunlock while an AST is
> scheduled.
>
> To avoid this, allow a LKM_CANCEL to pass through, and let it
> wait on __dlm_wait_on_lockres().
>
> Signed-off-by: Goldwyn Rodrigues <rgoldwyn at suse.de>
> Signed-off-by: Mark Fasheh <mfasheh at suse.com>
> ---
> diff --git a/fs/ocfs2/dlm/dlmunlock.c b/fs/ocfs2/dlm/dlmunlock.c
> index fcf879e..756f5b0 100644
> --- a/fs/ocfs2/dlm/dlmunlock.c
> +++ b/fs/ocfs2/dlm/dlmunlock.c
> @@ -122,7 +122,7 @@ static enum dlm_status dlmunlock_common(struct
> dlm_ctxt *dlm,
>  	 * that still has AST's pending... */
>  	in_use = !list_empty(&lock->ast_list);
>  	spin_unlock(&dlm->ast_lock);
> -	if (in_use) {
> +	if (in_use && !(flags & LKM_CANCEL)) {
>  	       mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock "
>  		    "while waiting for an ast!", res->lockname.len,
>  		    res->lockname.name);
> @@ -131,7 +131,7 @@ static enum dlm_status dlmunlock_common(struct
> dlm_ctxt *dlm,
>
>  	spin_lock(&res->spinlock);
>  	if (res->state & DLM_LOCK_RES_IN_PROGRESS) {
> -		if (master_node) {
> +		if (master_node && !(flags & LKM_CANCEL)) {
>  			mlog(ML_ERROR, "lockres in progress!\n");
>  			spin_unlock(&res->spinlock);
>  			return DLM_FORWARD;
>
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel at oss.oracle.com
> http://oss.oracle.com/mailman/listinfo/ocfs2-devel
>   




More information about the Ocfs2-devel mailing list