On 2017/12/21 14:36, alex chen wrote:
> Hi Joseph,
> 
> On 2017/12/21 9:30, Joseph Qi wrote:
>> Hi Alex,
>>
>> On 17/12/21 08:55, alex chen wrote:
>>> In dlm_reset_mleres_owner(), we will lock
>>> dlm_lock_resource->spinlock after locking dlm_ctxt->master_lock,
>>> which breaks the spinlock lock ordering:
>>>   dlm_domain_lock
>>>   struct dlm_ctxt->spinlock
>>>   struct dlm_lock_resource->spinlock
>>>   struct dlm_ctxt->master_lock
>>>
>>> Fix it by unlocking dlm_ctxt->master_lock before locking
>>> dlm_lock_resource->spinlock and restarting to clean master list.
>>>
>>> Signed-off-by: Alex Chen <alex.c...@huawei.com>
>>> Reviewed-by: Jun Piao <piao...@huawei.com>
>>> ---
>>>   fs/ocfs2/dlm/dlmmaster.c | 14 ++++++++++----
>>>   1 file changed, 10 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
>>> index 3e04279..d83ccdc 100644
>>> --- a/fs/ocfs2/dlm/dlmmaster.c
>>> +++ b/fs/ocfs2/dlm/dlmmaster.c
>>> @@ -3287,16 +3287,22 @@ static struct dlm_lock_resource 
>>> *dlm_reset_mleres_owner(struct dlm_ctxt *dlm,
>>>   {
>>>     struct dlm_lock_resource *res;
>>>
>>> +   assert_spin_locked(&dlm->spinlock);
>>> +   assert_spin_locked(&dlm->master_lock);
>>> +
>>>     /* Find the lockres associated to the mle and set its owner to UNK */
>>> -   res = __dlm_lookup_lockres(dlm, mle->mname, mle->mnamelen,
>>> +   res = __dlm_lookup_lockres_full(dlm, mle->mname, mle->mnamelen,
>>>                                mle->mnamehash);
>>>     if (res) {
>>>             spin_unlock(&dlm->master_lock);
>>>
>>> -           /* move lockres onto recovery list */
>>>             spin_lock(&res->spinlock);
>>> -           dlm_set_lockres_owner(dlm, res, DLM_LOCK_RES_OWNER_UNKNOWN);
>>> -           dlm_move_lockres_to_recovery_list(dlm, res);
>>> +           if (!(res->state & DLM_LOCK_RES_DROPPING_REF)) {
>>> +                   /* move lockres onto recovery list */
>>> +                   dlm_set_lockres_owner(dlm, res, 
>>> DLM_LOCK_RES_OWNER_UNKNOWN);
>>> +                   dlm_move_lockres_to_recovery_list(dlm, res);
>>> +           }
>>> +
>> I don't think this change is lock re-ordering *only*. It definitely
>> changes the logic of resetting mle resource owner.
>> Why do you detach mle from heartbeat if lock resource is in the process
>> of dropping its mastery reference? And why we have to restart in this
>> case?
> I think if the lock resource is being purge we don't need to set its owner to 
> UNKNOWN and
> it is the same as the original logic. We should drop the master lock if we 
> want to judge
> if the state of the lock resource is DLM_LOCK_RES_DROPPING_REF. Once we drop 
> the master lock
> we should restart to clean master list.
> Here the mle is not useful and will be released, so we detach it from 
> heartbeat.
> In fact, the mle has been detached in dlm_clean_migration_mle().
Hi Alex,

Perhaps, you can just judge if lock resource is marked  
DLM_LOCK_RES_DROPPING_REF and if so directly
return NULL with ::master_lock locked :)

Thanks,
Changwei

> 
> Thanks,
> Alex
>>
>> Thanks,
>> Joseph
>>
>>>             spin_unlock(&res->spinlock);
>>>             dlm_lockres_put(res);
>>>
>>
>> .
>>
> 
> 
> _______________________________________________
> Ocfs2-devel mailing list
> Ocfs2-devel@oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/ocfs2-devel
> 


_______________________________________________
Ocfs2-devel mailing list
Ocfs2-devel@oss.oracle.com
https://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to