Forráskód Böngészése

ocfs2_dlm: fix race in dlm_remaster_locks

There is a possibility that dlm_remaster_locks could overwride node->state
with DLM_RECO_NODE_DATA_REQUESTED after dlm_reco_data_done_handler sets the
node->state to DLM_RECO_NODE_DATA_DONE. This could lead to recovery getting
stuck and requires a cluster reboot. Synchronize with dlm_reco_state_lock
spinlock.

Signed-off-by: Srinivas Eeda <srinivas.eeda@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Srinivas Eeda 18 éve
szülő
commit
756a1501dd
1 módosított fájl, 2 hozzáadás és 0 törlés
  1. 2 0
      fs/ocfs2/dlm/dlmrecovery.c

+ 2 - 0
fs/ocfs2/dlm/dlmrecovery.c

@@ -611,6 +611,7 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node)
 			}
 			}
 		} while (status != 0);
 		} while (status != 0);
 
 
+		spin_lock(&dlm_reco_state_lock);
 		switch (ndata->state) {
 		switch (ndata->state) {
 			case DLM_RECO_NODE_DATA_INIT:
 			case DLM_RECO_NODE_DATA_INIT:
 			case DLM_RECO_NODE_DATA_FINALIZE_SENT:
 			case DLM_RECO_NODE_DATA_FINALIZE_SENT:
@@ -641,6 +642,7 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node)
 				     ndata->node_num, dead_node);
 				     ndata->node_num, dead_node);
 				break;
 				break;
 		}
 		}
+		spin_unlock(&dlm_reco_state_lock);
 	}
 	}
 
 
 	mlog(0, "done requesting all lock info\n");
 	mlog(0, "done requesting all lock info\n");