ocfs2/dlm: unlock lockres spinlock before dlm_lockres_put
PATCH 1/1 ocfs2/dlm: unlock lockres spinlock before dlm_lockres_put
dlm_lockres_put will call dlm_lockres_release if it is the last reference, and then it may call dlm_print_one_lock_resource and take lockres spinlock.
So unlock lockres spinlock before dlm_lockres_put to avoid deadlock.
Signed-off-by Joseph Qi <[email protected]>
--- fs/ocfs2/dlm/dlmmaster.c | 3 ++- fs/ocfs2/dlm/dlmrecovery.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
fs/ocfs2/dlm/dlmmaster.c +2 -1
@@ -1658,12 +1658,13 @@ send_response:if (ret <0 ) {mlog (ML_ERROR ,"failed to dispatch assert master work\n" ); response =DLM_MASTER_RESP_ERROR ; +spin_unlock (&res->spinlock);dlm_lockres_put (res); }else { dispatched =1 ;__dlm_lockres_grab_inflight_worker (dlm, res); +spin_unlock (&res->spinlock); } -spin_unlock (&res->spinlock); }else {if (res)dlm_lockres_put (res);
fs/ocfs2/dlm/dlmrecovery.c +1 -1
@@ -1723,8 +1723,8 @@ int dlm_master_requery_handler(struct o2net_msg *msg, u32 len, void *data, }else { dispatched =1 ;__dlm_lockres_grab_inflight_worker (dlm, res); +spin_unlock (&res->spinlock); } -spin_unlock (&res->spinlock); }else {/* put.. incase we are not the master */ spin_unlock (&res->spinlock);
Signature · 1 line
1.8.4.3