It's included in Mark's upstream-linus branch in ocfs2.git. He will be
posting the patch today for review.

Coly Li wrote:
> 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. */
>>     
>
>   


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

Reply via email to