Hi Sunil,

I do not find this patch in upstream yet. Do we have a recent plan to push this 
patch into upstream
? Once this patch get merged into linus tree, I can add it into sles10 sp2 
kernel.

Thanks.

Sunil Mushran Wrote:
> dlm_get_lock_resource() is supposed to return a lock resource with a proper
> master. If multiple concurrent threads attempt to lookup the lockres for the
> same lockid while the lock mastery in underway, one or more threads are likely
> to return a lockres without a proper master.
> 
> This patch makes the threads wait in dlm_get_lock_resource() while the mastery
> is underway, ensuring all threads return the lockres with a proper master.
> 
> This issue is known to be limited to users using the flock() syscall. For all
> other fs operations, the ocfs2 dlmglue layer serializes the dlm op for each
> lockid.
> 
> Patch fixes Novell bz#425491
> https://bugzilla.novell.com/show_bug.cgi?id=425491
> 
> Users encountering this bug will see flock() return EINVAL and dmesg have the
> following error:
> ERROR: Dlm error "DLM_BADARGS" while calling dlmlock on resource <LOCKID>: 
> bad api args
> 
> Reported-by: Coly Li <[email protected]>
> Signed-off-by: Sunil Mushran <[email protected]>
> ---
>  fs/ocfs2/dlm/dlmmaster.c |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
> index cbf3abe..54e182a 100644
> --- a/fs/ocfs2/dlm/dlmmaster.c
> +++ b/fs/ocfs2/dlm/dlmmaster.c
> @@ -732,14 +732,21 @@ lookup:
>       if (tmpres) {
>               int dropping_ref = 0;
>  
> +             spin_unlock(&dlm->spinlock);
> +
>               spin_lock(&tmpres->spinlock);
> +             /* We wait for the other thread that is mastering the resource 
> */
> +             if (tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN) {
> +                     __dlm_wait_on_lockres(tmpres);
> +                     BUG_ON(tmpres->owner == DLM_LOCK_RES_OWNER_UNKNOWN);
> +             }
> +
>               if (tmpres->owner == dlm->node_num) {
>                       BUG_ON(tmpres->state & DLM_LOCK_RES_DROPPING_REF);
>                       dlm_lockres_grab_inflight_ref(dlm, tmpres);
>               } else if (tmpres->state & DLM_LOCK_RES_DROPPING_REF)
>                       dropping_ref = 1;
>               spin_unlock(&tmpres->spinlock);
> -             spin_unlock(&dlm->spinlock);
>  
>               /* wait until done messaging the master, drop our ref to allow
>                * the lockres to be purged, start over. */

-- 
Coly Li
SuSE PRC Labs

_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to