[SCSI] lpfc 8.1.2: Fixed a race condition in the PLOGI retry logic.
authorJamie Wellnitz <Jamie.Wellnitz@emulex.com>
Wed, 1 Mar 2006 00:25:16 +0000 (19:25 -0500)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Wed, 1 Mar 2006 00:53:33 +0000 (18:53 -0600)
Fixed a race condition in the PLOGI retry logic.

Signed-off-by: Jamie Wellnitz <Jamie.Wellnitz@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_nportdisc.c

index 9c9e7661de59b3a3802b31ffad9778d9c76367e6..056f9157d2c8572b236444c10609038b96dd26ac 100644 (file)
@@ -1467,24 +1467,28 @@ lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
                lpfc_issue_els_flogi(phba, ndlp, retry);
                break;
        case ELS_CMD_PLOGI:
-               ndlp->nlp_state = NLP_STE_PLOGI_ISSUE;
-               lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST);
-               lpfc_issue_els_plogi(phba, ndlp, retry);
+               if (!lpfc_issue_els_plogi(phba, ndlp, retry)) {
+                       ndlp->nlp_state = NLP_STE_PLOGI_ISSUE;
+                       lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST);
+               }
                break;
        case ELS_CMD_ADISC:
-               ndlp->nlp_state = NLP_STE_ADISC_ISSUE;
-               lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST);
-               lpfc_issue_els_adisc(phba, ndlp, retry);
+               if (!lpfc_issue_els_adisc(phba, ndlp, retry)) {
+                       ndlp->nlp_state = NLP_STE_ADISC_ISSUE;
+                       lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST);
+               }
                break;
        case ELS_CMD_PRLI:
-               ndlp->nlp_state = NLP_STE_PRLI_ISSUE;
-               lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST);
-               lpfc_issue_els_prli(phba, ndlp, retry);
+               if (!lpfc_issue_els_prli(phba, ndlp, retry)) {
+                       ndlp->nlp_state = NLP_STE_PRLI_ISSUE;
+                       lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST);
+               }
                break;
        case ELS_CMD_LOGO:
-               ndlp->nlp_state = NLP_STE_NPR_NODE;
-               lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
-               lpfc_issue_els_logo(phba, ndlp, retry);
+               if (!lpfc_issue_els_logo(phba, ndlp, retry)) {
+                       ndlp->nlp_state = NLP_STE_NPR_NODE;
+                       lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
+               }
                break;
        }
        return;
index fbead786031f9ec948df36249d557d6e646a2d17..1c04ea353ffa8e024bc914e3d92519dd639b9eea 100644 (file)
@@ -1627,6 +1627,14 @@ lpfc_device_recov_npr_node(struct lpfc_hba * phba,
 {
        spin_lock_irq(phba->host->host_lock);
        ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       if (ndlp->nlp_flag & NLP_DELAY_TMO) {
+               ndlp->nlp_flag &= ~NLP_DELAY_TMO;
+               if (!list_empty(&ndlp->els_retry_evt.evt_listp))
+                       list_del_init(&ndlp->els_retry_evt.evt_listp);
+               spin_unlock_irq(phba->host->host_lock);
+               del_timer_sync(&ndlp->nlp_delayfunc);
+               return (ndlp->nlp_state);
+       }
        spin_unlock_irq(phba->host->host_lock);
        return (ndlp->nlp_state);
 }