ocfs2: dlm_request_all_locks() should deal with the status sent from target node
PATCH 1/1 ocfs2: dlm_request_all_locks() should deal with the status sent from target node
dlm_request_all_locks() should deal with the status sent from target node if DLM_LOCK_REQUEST_MSG is sent successfully, or recovery master will fall into endless loop, waiting for other nodes to send locks and DLM_RECO_DATA_DONE_MSG to me.
NodeA NodeB
selected as recovery master dlm_remaster_locks() ->dlm_request_all_locks() send DLM_LOCK_REQUEST_MSG to nodeA
It happened that NodeA cannot alloc
memory when it processes this message.dlm_request_all_locks_handler() do
not queue dlm_request_all_locks_worker
and returns -ENOMEM. It will never
send locks andDLM_RECO_DATA_DONE_MSG
to NodeB.
NodeB do not deal with the status sent from nodeA, and will fall in endless loop waiting for the recovery state of NodeA to be changed.
--- fs/ocfs2/dlm/dlmrecovery.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/ocfs2/dlm/dlmrecovery.c +4 -1
@@ -787,6 +787,7 @@ static int dlm_request_all_locks(struct dlm_ctxt *dlm, u8 request_from, {struct dlm_lock_request lr;int ret; +int status;mlog (0 ,"\n" );
@@ -800,13 +801,15 @@ static int dlm_request_all_locks(struct dlm_ctxt *dlm, u8 request_from,// send message ret =o2net_send_message (DLM_LOCK_REQUEST_MSG , dlm->key, - &lr,sizeof (lr), request_from,NULL ); + &lr,sizeof (lr), request_from, &status);/* negative status is handled by caller */ if (ret <0 )mlog (ML_ERROR ,"%s: Error %d send LOCK_REQUEST to node %u " "to recover dead node %u\n" , dlm->name, ret, request_from, dead_node); +else + ret = status;// return from here, then // sleep until all received or error return ret;
Signature · 1 line
1.7.9.7