[SCSI] lpfc 8.3.30: Fixed the system panic during EEH recovery
authorJames Smart <james.smart@emulex.com>
Fri, 2 Mar 2012 03:36:29 +0000 (22:36 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Tue, 27 Mar 2012 07:26:31 +0000 (08:26 +0100)
Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_sli.c

index 421e0a36041c62380893c211bc77a13a0e294e8b..8945ac04277af069ccba8f1dff2fd7e7d3b18139 100644 (file)
@@ -7252,11 +7252,13 @@ lpfc_sli4_post_async_mbox(struct lpfc_hba *phba)
 
 out_not_finished:
        spin_lock_irqsave(&phba->hbalock, iflags);
-       mboxq->u.mb.mbxStatus = MBX_NOT_FINISHED;
-       __lpfc_mbox_cmpl_put(phba, mboxq);
-       /* Release the token */
-       psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
-       phba->sli.mbox_active = NULL;
+       if (phba->sli.mbox_active) {
+               mboxq->u.mb.mbxStatus = MBX_NOT_FINISHED;
+               __lpfc_mbox_cmpl_put(phba, mboxq);
+               /* Release the token */
+               psli->sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
+               phba->sli.mbox_active = NULL;
+       }
        spin_unlock_irqrestore(&phba->hbalock, iflags);
 
        return MBX_NOT_FINISHED;
@@ -9818,12 +9820,11 @@ lpfc_sli_mbox_sys_shutdown(struct lpfc_hba *phba)
        unsigned long timeout;
 
        timeout = msecs_to_jiffies(LPFC_MBOX_TMO * 1000) + jiffies;
+
        spin_lock_irq(&phba->hbalock);
        psli->sli_flag |= LPFC_SLI_ASYNC_MBX_BLK;
-       spin_unlock_irq(&phba->hbalock);
 
        if (psli->sli_flag & LPFC_SLI_ACTIVE) {
-               spin_lock_irq(&phba->hbalock);
                /* Determine how long we might wait for the active mailbox
                 * command to be gracefully completed by firmware.
                 */
@@ -9842,7 +9843,9 @@ lpfc_sli_mbox_sys_shutdown(struct lpfc_hba *phba)
                                 */
                                break;
                }
-       }
+       } else
+               spin_unlock_irq(&phba->hbalock);
+
        lpfc_sli_mbox_sys_flush(phba);
 }