lpfc 8.3.18: Fix critical errors
Subsystems (2)
PATCH 5/7 lpfc 8.3.18: Fix critical errors
Fix critical errors
- Update send_scsi_event to validate pnode pointer active before copying the wwpn information.
- Add a message, mailbox_idle, and unlock before failing SECURITY_MGMT or AUTH_PORT mailbox commands
- Prevent spin_lock_irqsave from being called twice in a row.
Signed-off-by Alex Iannicelli <[email protected]>
Signed-off-by James Smart <[email protected]>
---
lpfc_attr.c | 7 ++++++- lpfc_bsg.c | 4 ++-- lpfc_scsi.c | 9 +++++++-- 3 files changed, 15 insertions(+), 5 deletions(-)
drivers/scsi/lpfc/lpfc_attr.c +6 -1
@@ -3789,8 +3789,13 @@ sysfs_mbox_read(struct file *filp, strucbreak ;case MBX_SECURITY_MGMT :case MBX_AUTH_PORT : -if (phba->pci_dev_grp ==LPFC_PCI_DEV_OC ) +if (phba->pci_dev_grp ==LPFC_PCI_DEV_OC ) { +printk (KERN_WARNING "mbox_read:Command 0x%x " +"is not permitted\n" , pmb->mbxCommand); +sysfs_mbox_idle (phba); +spin_unlock_irq (&phba->hbalock);return -EPERM ; + }break ;case MBX_READ_SPARM64 :case MBX_READ_LA :
drivers/scsi/lpfc/lpfc_bsg.c +2 -2
@@ -3142,12 +3142,12 @@ lpfc_bsg_menlo_cmd_cmp(struct lpfc_hba * job = menlo->set_job; job->dd_data =NULL ;/* so timeout handler does not reply */ -spin_lock_irqsave (&phba->hbalock, flags); +spin_lock (&phba->hbalock); cmdiocbq->iocb_flag |=LPFC_IO_WAKE ;if (cmdiocbq->context2 && rspiocbq)memcpy (&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb, &rspiocbq->iocb,sizeof (IOCB_t)); -spin_unlock_irqrestore (&phba->hbalock, flags); +spin_unlock (&phba->hbalock); bmp = menlo->bmp; rspiocbq = menlo->rspiocbq;
drivers/scsi/lpfc/lpfc_scsi.c +7 -2
@@ -169,6 +169,7 @@ lpfc_update_stats(struct lpfc_hba *phba,spin_lock_irqsave (shost->host_lock, flags);if (!vport->stat_data_enabled || vport->stat_data_blocked || + !pnode || !pnode->lat_data || (phba->bucket_type ==LPFC_NO_BUCKET )) {spin_unlock_irqrestore (shost->host_lock, flags);
@@ -2040,6 +2041,9 @@ lpfc_send_scsi_error_event(struct lpfc_hstruct lpfc_nodelist *pnode = lpfc_cmd->rdata->pnode;unsigned long flags; +if (!pnode || !NLP_CHK_NODE_ACT (pnode)) +return ; +/* If there is queuefull or busy condition send a scsi event */ if ((cmnd->result ==SAM_STAT_TASK_SET_FULL ) || (cmnd->result ==SAM_STAT_BUSY )) {
@@ -3226,10 +3230,11 @@ lpfc_send_taskmgmt(struct lpfc_vport *vpstruct lpfc_scsi_buf *lpfc_cmd;struct lpfc_iocbq *iocbq;struct lpfc_iocbq *iocbqrsp; +struct lpfc_nodelist *pnode = rdata->pnode;int ret;int status; -if (!rdata->pnode || !NLP_CHK_NODE_ACT (rdata->pnode)) +if (!pnode || !NLP_CHK_NODE_ACT (pnode))return FAILED ; lpfc_cmd =lpfc_get_scsi_buf (phba);
@@ -3256,7 +3261,7 @@ lpfc_send_taskmgmt(struct lpfc_vport *vp"0702 Issue %s to TGT %d LUN %d " "rpi x%x nlp_flag x%x\n" ,lpfc_taskmgmt_name (task_mgmt_cmd), tgt_id, lun_id, - rdata->pnode->nlp_rpi, rdata->pnode->nlp_flag); + pnode->nlp_rpi, pnode->nlp_flag); status =lpfc_sli_issue_iocb_wait (phba,LPFC_FCP_RING , iocbq, iocbqrsp, lpfc_cmd->timeout);