diff options
author | James Smart <jsmart2021@gmail.com> | 2017-05-15 18:20:39 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2017-05-16 21:17:54 -0400 |
commit | 0c9c6a75141810acade82add4f4708959a5d3a1d (patch) | |
tree | 5a0490280fde16d0cde18363d9bf4fadf97fd90c | |
parent | 845d9e8df2fa879e6494e786f290e1fd5560ac8c (diff) |
scsi: lpfc: Fix system crash when port is reset.
The driver panic when using the els_wq during port reset.
Check for NULL els_wq before dereferencing.
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 8 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 6 |
2 files changed, 9 insertions, 5 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 6d7840b096e6..62571fa9c6ad 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -1228,7 +1228,11 @@ lpfc_sli_read_hs(struct lpfc_hba *phba) | |||
1228 | static inline struct lpfc_sli_ring * | 1228 | static inline struct lpfc_sli_ring * |
1229 | lpfc_phba_elsring(struct lpfc_hba *phba) | 1229 | lpfc_phba_elsring(struct lpfc_hba *phba) |
1230 | { | 1230 | { |
1231 | if (phba->sli_rev == LPFC_SLI_REV4) | 1231 | if (phba->sli_rev == LPFC_SLI_REV4) { |
1232 | return phba->sli4_hba.els_wq->pring; | 1232 | if (phba->sli4_hba.els_wq) |
1233 | return phba->sli4_hba.els_wq->pring; | ||
1234 | else | ||
1235 | return NULL; | ||
1236 | } | ||
1233 | return &phba->sli.sli3_ring[LPFC_ELS_RING]; | 1237 | return &phba->sli.sli3_ring[LPFC_ELS_RING]; |
1234 | } | 1238 | } |
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 0482c5580331..dcc9b3858778 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -693,9 +693,9 @@ lpfc_work_done(struct lpfc_hba *phba) | |||
693 | pring = lpfc_phba_elsring(phba); | 693 | pring = lpfc_phba_elsring(phba); |
694 | status = (ha_copy & (HA_RXMASK << (4*LPFC_ELS_RING))); | 694 | status = (ha_copy & (HA_RXMASK << (4*LPFC_ELS_RING))); |
695 | status >>= (4*LPFC_ELS_RING); | 695 | status >>= (4*LPFC_ELS_RING); |
696 | if ((status & HA_RXMASK) || | 696 | if (pring && (status & HA_RXMASK || |
697 | (pring->flag & LPFC_DEFERRED_RING_EVENT) || | 697 | pring->flag & LPFC_DEFERRED_RING_EVENT || |
698 | (phba->hba_flag & HBA_SP_QUEUE_EVT)) { | 698 | phba->hba_flag & HBA_SP_QUEUE_EVT)) { |
699 | if (pring->flag & LPFC_STOP_IOCB_EVENT) { | 699 | if (pring->flag & LPFC_STOP_IOCB_EVENT) { |
700 | pring->flag |= LPFC_DEFERRED_RING_EVENT; | 700 | pring->flag |= LPFC_DEFERRED_RING_EVENT; |
701 | /* Set the lpfc data pending flag */ | 701 | /* Set the lpfc data pending flag */ |