[Ocfs2-devel] [PATCH] ocfs2: set OCFS2_LOCK_BLOCKED properly

Sunil Mushran sunil.mushran at oracle.com
Tue Jan 5 09:50:33 PST 2010


woah... this looks like a good catch.

Mark?

Wengang Wang wrote:
> for most cases ocfs2_generic_handle_bast() return 1 meaning that some down-
> converting work should be done. but when it return 0, the OCFS2_LOCK_BLOCKED is
> set inproperly.
> OCFS2_LOCK_BLOCKED is cleared in a down-convertion(dc) is done. if no dc is needed
> any more(done by another lock request queued before this one), OCFS2_LOCK_BLOCKED
> stays there unexpectly.
>
> the fix is that setting that flag when dc(s) is really needed.
>
> Signed-off-by: Wengang Wang <wen.gang.wang at oracle.com>
> ---
>  fs/ocfs2/dlmglue.c |    5 +++--
>  1 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
> index c5e4a49..e18eadf 100644
> --- a/fs/ocfs2/dlmglue.c
> +++ b/fs/ocfs2/dlmglue.c
> @@ -907,8 +907,6 @@ static int ocfs2_generic_handle_bast(struct ocfs2_lock_res *lockres,
>  
>  	assert_spin_locked(&lockres->l_lock);
>  
> -	lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED);
> -
>  	if (level > lockres->l_blocking) {
>  		/* only schedule a downconvert if we haven't already scheduled
>  		 * one that goes low enough to satisfy the level we're
> @@ -921,6 +919,9 @@ static int ocfs2_generic_handle_bast(struct ocfs2_lock_res *lockres,
>  		lockres->l_blocking = level;
>  	}
>  
> +	if (needs_downconvert)
> +		lockres_or_flags(lockres, OCFS2_LOCK_BLOCKED);
> +		
>  	mlog_exit(needs_downconvert);
>  	return needs_downconvert;
>  }
>   




More information about the Ocfs2-devel mailing list