Commit c2b9712e authored by James Smart's avatar James Smart Committed by James Bottomley

[SCSI] lpfc 8.3.40: Fixed a race condition between SLI host and port failed FCF rediscovery

Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent b230b8a2
...@@ -4049,52 +4049,6 @@ lpfc_sli4_perform_all_vport_cvl(struct lpfc_hba *phba) ...@@ -4049,52 +4049,6 @@ lpfc_sli4_perform_all_vport_cvl(struct lpfc_hba *phba)
lpfc_destroy_vport_work_array(phba, vports); lpfc_destroy_vport_work_array(phba, vports);
} }
/**
* lpfc_sli4_perform_inuse_fcf_recovery - Perform inuse fcf recovery
* @vport: pointer to lpfc hba data structure.
*
* This routine is to perform FCF recovery when the in-use FCF either dead or
* got modified.
**/
static void
lpfc_sli4_perform_inuse_fcf_recovery(struct lpfc_hba *phba,
struct lpfc_acqe_fip *acqe_fip)
{
int rc;
spin_lock_irq(&phba->hbalock);
/* Mark the fast failover process in progress */
phba->fcf.fcf_flag |= FCF_DEAD_DISC;
spin_unlock_irq(&phba->hbalock);
lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY,
"2771 Start FCF fast failover process due to in-use "
"FCF DEAD/MODIFIED event: evt_tag:x%x, index:x%x\n",
acqe_fip->event_tag, acqe_fip->index);
rc = lpfc_sli4_redisc_fcf_table(phba);
if (rc) {
lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY,
"2772 Issue FCF rediscover mabilbox command "
"failed, fail through to FCF dead event\n");
spin_lock_irq(&phba->hbalock);
phba->fcf.fcf_flag &= ~FCF_DEAD_DISC;
spin_unlock_irq(&phba->hbalock);
/*
* Last resort will fail over by treating this as a link
* down to FCF registration.
*/
lpfc_sli4_fcf_dead_failthrough(phba);
} else {
/* Reset FCF roundrobin bmask for new discovery */
lpfc_sli4_clear_fcf_rr_bmask(phba);
/*
* Handling fast FCF failover to a DEAD FCF event is
* considered equalivant to receiving CVL to all vports.
*/
lpfc_sli4_perform_all_vport_cvl(phba);
}
}
/** /**
* lpfc_sli4_async_fip_evt - Process the asynchronous FCoE FIP event * lpfc_sli4_async_fip_evt - Process the asynchronous FCoE FIP event
* @phba: pointer to lpfc hba data structure. * @phba: pointer to lpfc hba data structure.
...@@ -4160,22 +4114,9 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba, ...@@ -4160,22 +4114,9 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
break; break;
} }
/* If FCF has been in discovered state, perform rediscovery /* If the FCF has been in discovered state, do nothing. */
* only if the FCF with the same index of the in-use FCF got if (phba->fcf.fcf_flag & FCF_SCAN_DONE) {
* modified during normal operation. Otherwise, do nothing.
*/
if (phba->pport->port_state > LPFC_FLOGI) {
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->hbalock);
if (phba->fcf.current_rec.fcf_indx ==
acqe_fip->index) {
lpfc_printf_log(phba, KERN_ERR, LOG_FIP,
"3300 In-use FCF (%d) "
"modified, perform FCF "
"rediscovery\n",
acqe_fip->index);
lpfc_sli4_perform_inuse_fcf_recovery(phba,
acqe_fip);
}
break; break;
} }
spin_unlock_irq(&phba->hbalock); spin_unlock_irq(&phba->hbalock);
...@@ -4228,7 +4169,39 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba, ...@@ -4228,7 +4169,39 @@ lpfc_sli4_async_fip_evt(struct lpfc_hba *phba,
* is no longer valid as we are not in the middle of FCF * is no longer valid as we are not in the middle of FCF
* failover process already. * failover process already.
*/ */
lpfc_sli4_perform_inuse_fcf_recovery(phba, acqe_fip); spin_lock_irq(&phba->hbalock);
/* Mark the fast failover process in progress */
phba->fcf.fcf_flag |= FCF_DEAD_DISC;
spin_unlock_irq(&phba->hbalock);
lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY,
"2771 Start FCF fast failover process due to "
"FCF DEAD event: evt_tag:x%x, fcf_index:x%x "
"\n", acqe_fip->event_tag, acqe_fip->index);
rc = lpfc_sli4_redisc_fcf_table(phba);
if (rc) {
lpfc_printf_log(phba, KERN_ERR, LOG_FIP |
LOG_DISCOVERY,
"2772 Issue FCF rediscover mabilbox "
"command failed, fail through to FCF "
"dead event\n");
spin_lock_irq(&phba->hbalock);
phba->fcf.fcf_flag &= ~FCF_DEAD_DISC;
spin_unlock_irq(&phba->hbalock);
/*
* Last resort will fail over by treating this
* as a link down to FCF registration.
*/
lpfc_sli4_fcf_dead_failthrough(phba);
} else {
/* Reset FCF roundrobin bmask for new discovery */
lpfc_sli4_clear_fcf_rr_bmask(phba);
/*
* Handling fast FCF failover to a DEAD FCF event is
* considered equalivant to receiving CVL to all vports.
*/
lpfc_sli4_perform_all_vport_cvl(phba);
}
break; break;
case LPFC_FIP_EVENT_TYPE_CVL: case LPFC_FIP_EVENT_TYPE_CVL:
phba->fcoe_cvl_eventtag = acqe_fip->event_tag; phba->fcoe_cvl_eventtag = acqe_fip->event_tag;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment