aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJamie Wellnitz <Jamie.Wellnitz@emulex.com>2006-02-28 19:25:16 -0500
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-02-28 19:53:33 -0500
commit6ad425356bba9664393b579d81df8135ca1510e6 (patch)
treed8eeed5accb502d9e099e2dc9d440169a4b50e78
parent7bb3b137abf2b7073e683c14cfe062d811d35247 (diff)
[SCSI] lpfc 8.1.2: Fixed a race condition in the PLOGI retry logic.
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>
-rw-r--r--drivers/scsi/lpfc/lpfc_els.c28
-rw-r--r--drivers/scsi/lpfc/lpfc_nportdisc.c8
2 files changed, 24 insertions, 12 deletions
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index 9c9e7661de59..056f9157d2c8 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -1467,24 +1467,28 @@ lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
1467 lpfc_issue_els_flogi(phba, ndlp, retry); 1467 lpfc_issue_els_flogi(phba, ndlp, retry);
1468 break; 1468 break;
1469 case ELS_CMD_PLOGI: 1469 case ELS_CMD_PLOGI:
1470 ndlp->nlp_state = NLP_STE_PLOGI_ISSUE; 1470 if (!lpfc_issue_els_plogi(phba, ndlp, retry)) {
1471 lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST); 1471 ndlp->nlp_state = NLP_STE_PLOGI_ISSUE;
1472 lpfc_issue_els_plogi(phba, ndlp, retry); 1472 lpfc_nlp_list(phba, ndlp, NLP_PLOGI_LIST);
1473 }
1473 break; 1474 break;
1474 case ELS_CMD_ADISC: 1475 case ELS_CMD_ADISC:
1475 ndlp->nlp_state = NLP_STE_ADISC_ISSUE; 1476 if (!lpfc_issue_els_adisc(phba, ndlp, retry)) {
1476 lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST); 1477 ndlp->nlp_state = NLP_STE_ADISC_ISSUE;
1477 lpfc_issue_els_adisc(phba, ndlp, retry); 1478 lpfc_nlp_list(phba, ndlp, NLP_ADISC_LIST);
1479 }
1478 break; 1480 break;
1479 case ELS_CMD_PRLI: 1481 case ELS_CMD_PRLI:
1480 ndlp->nlp_state = NLP_STE_PRLI_ISSUE; 1482 if (!lpfc_issue_els_prli(phba, ndlp, retry)) {
1481 lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST); 1483 ndlp->nlp_state = NLP_STE_PRLI_ISSUE;
1482 lpfc_issue_els_prli(phba, ndlp, retry); 1484 lpfc_nlp_list(phba, ndlp, NLP_PRLI_LIST);
1485 }
1483 break; 1486 break;
1484 case ELS_CMD_LOGO: 1487 case ELS_CMD_LOGO:
1485 ndlp->nlp_state = NLP_STE_NPR_NODE; 1488 if (!lpfc_issue_els_logo(phba, ndlp, retry)) {
1486 lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST); 1489 ndlp->nlp_state = NLP_STE_NPR_NODE;
1487 lpfc_issue_els_logo(phba, ndlp, retry); 1490 lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
1491 }
1488 break; 1492 break;
1489 } 1493 }
1490 return; 1494 return;
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index fbead786031f..1c04ea353ffa 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -1627,6 +1627,14 @@ lpfc_device_recov_npr_node(struct lpfc_hba * phba,
1627{ 1627{
1628 spin_lock_irq(phba->host->host_lock); 1628 spin_lock_irq(phba->host->host_lock);
1629 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC; 1629 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
1630 if (ndlp->nlp_flag & NLP_DELAY_TMO) {
1631 ndlp->nlp_flag &= ~NLP_DELAY_TMO;
1632 if (!list_empty(&ndlp->els_retry_evt.evt_listp))
1633 list_del_init(&ndlp->els_retry_evt.evt_listp);
1634 spin_unlock_irq(phba->host->host_lock);
1635 del_timer_sync(&ndlp->nlp_delayfunc);
1636 return (ndlp->nlp_state);
1637 }
1630 spin_unlock_irq(phba->host->host_lock); 1638 spin_unlock_irq(phba->host->host_lock);
1631 return (ndlp->nlp_state); 1639 return (ndlp->nlp_state);
1632} 1640}