diff options
author | Jamie Wellnitz <Jamie.Wellnitz@emulex.com> | 2006-02-28 19:25:16 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-02-28 19:53:33 -0500 |
commit | 6ad425356bba9664393b579d81df8135ca1510e6 (patch) | |
tree | d8eeed5accb502d9e099e2dc9d440169a4b50e78 /drivers/scsi/lpfc | |
parent | 7bb3b137abf2b7073e683c14cfe062d811d35247 (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>
Diffstat (limited to 'drivers/scsi/lpfc')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 28 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_nportdisc.c | 8 |
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 | } |