diff options
author | James Smart <james.smart@emulex.com> | 2010-02-26 14:12:57 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-03-03 08:38:34 -0500 |
commit | 9f1177a3f8eee22427eb97e6e00b62ff0be2871f (patch) | |
tree | a004d94e7d406f791e420eec7c02c2d5bcf70587 /drivers | |
parent | 43aebfa12e7631124472237dc945c27af54ca646 (diff) |
[SCSI] lpfc 8.3.10: Fix Initialization issues
- Add NULL checks to the pointers for the config_async mailbox
and dump_wakeup_params mailbox.
- Add code to check return value of lpfc_read_sparams everywhere
and handle failures appropriately.
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 32 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 19 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 8 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_vport.c | 7 |
4 files changed, 48 insertions, 18 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 2359d0bfb734..e58d8aeec09e 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -2024,8 +2024,6 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | |||
2024 | int rc; | 2024 | int rc; |
2025 | struct fcf_record *fcf_record; | 2025 | struct fcf_record *fcf_record; |
2026 | 2026 | ||
2027 | sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
2028 | |||
2029 | spin_lock_irq(&phba->hbalock); | 2027 | spin_lock_irq(&phba->hbalock); |
2030 | switch (la->UlnkSpeed) { | 2028 | switch (la->UlnkSpeed) { |
2031 | case LA_1GHZ_LINK: | 2029 | case LA_1GHZ_LINK: |
@@ -2117,18 +2115,24 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | |||
2117 | spin_unlock_irq(&phba->hbalock); | 2115 | spin_unlock_irq(&phba->hbalock); |
2118 | 2116 | ||
2119 | lpfc_linkup(phba); | 2117 | lpfc_linkup(phba); |
2120 | if (sparam_mbox) { | 2118 | sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
2121 | lpfc_read_sparam(phba, sparam_mbox, 0); | 2119 | if (!sparam_mbox) |
2122 | sparam_mbox->vport = vport; | 2120 | goto out; |
2123 | sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; | 2121 | |
2124 | rc = lpfc_sli_issue_mbox(phba, sparam_mbox, MBX_NOWAIT); | 2122 | rc = lpfc_read_sparam(phba, sparam_mbox, 0); |
2125 | if (rc == MBX_NOT_FINISHED) { | 2123 | if (rc) { |
2126 | mp = (struct lpfc_dmabuf *) sparam_mbox->context1; | 2124 | mempool_free(sparam_mbox, phba->mbox_mem_pool); |
2127 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | 2125 | goto out; |
2128 | kfree(mp); | 2126 | } |
2129 | mempool_free(sparam_mbox, phba->mbox_mem_pool); | 2127 | sparam_mbox->vport = vport; |
2130 | goto out; | 2128 | sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; |
2131 | } | 2129 | rc = lpfc_sli_issue_mbox(phba, sparam_mbox, MBX_NOWAIT); |
2130 | if (rc == MBX_NOT_FINISHED) { | ||
2131 | mp = (struct lpfc_dmabuf *) sparam_mbox->context1; | ||
2132 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | ||
2133 | kfree(mp); | ||
2134 | mempool_free(sparam_mbox, phba->mbox_mem_pool); | ||
2135 | goto out; | ||
2132 | } | 2136 | } |
2133 | 2137 | ||
2134 | if (!(phba->hba_flag & HBA_FCOE_SUPPORT)) { | 2138 | if (!(phba->hba_flag & HBA_FCOE_SUPPORT)) { |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index d29ac7c317d9..b64cecafa7ab 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -350,7 +350,12 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
350 | mb = &pmb->u.mb; | 350 | mb = &pmb->u.mb; |
351 | 351 | ||
352 | /* Get login parameters for NID. */ | 352 | /* Get login parameters for NID. */ |
353 | lpfc_read_sparam(phba, pmb, 0); | 353 | rc = lpfc_read_sparam(phba, pmb, 0); |
354 | if (rc) { | ||
355 | mempool_free(pmb, phba->mbox_mem_pool); | ||
356 | return -ENOMEM; | ||
357 | } | ||
358 | |||
354 | pmb->vport = vport; | 359 | pmb->vport = vport; |
355 | if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) { | 360 | if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) { |
356 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 361 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
@@ -359,7 +364,7 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
359 | mb->mbxCommand, mb->mbxStatus); | 364 | mb->mbxCommand, mb->mbxStatus); |
360 | phba->link_state = LPFC_HBA_ERROR; | 365 | phba->link_state = LPFC_HBA_ERROR; |
361 | mp = (struct lpfc_dmabuf *) pmb->context1; | 366 | mp = (struct lpfc_dmabuf *) pmb->context1; |
362 | mempool_free( pmb, phba->mbox_mem_pool); | 367 | mempool_free(pmb, phba->mbox_mem_pool); |
363 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | 368 | lpfc_mbuf_free(phba, mp->virt, mp->phys); |
364 | kfree(mp); | 369 | kfree(mp); |
365 | return -EIO; | 370 | return -EIO; |
@@ -571,6 +576,11 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
571 | } | 576 | } |
572 | /* MBOX buffer will be freed in mbox compl */ | 577 | /* MBOX buffer will be freed in mbox compl */ |
573 | pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 578 | pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
579 | if (!pmb) { | ||
580 | phba->link_state = LPFC_HBA_ERROR; | ||
581 | return -ENOMEM; | ||
582 | } | ||
583 | |||
574 | lpfc_config_async(phba, pmb, LPFC_ELS_RING); | 584 | lpfc_config_async(phba, pmb, LPFC_ELS_RING); |
575 | pmb->mbox_cmpl = lpfc_config_async_cmpl; | 585 | pmb->mbox_cmpl = lpfc_config_async_cmpl; |
576 | pmb->vport = phba->pport; | 586 | pmb->vport = phba->pport; |
@@ -588,6 +598,11 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
588 | 598 | ||
589 | /* Get Option rom version */ | 599 | /* Get Option rom version */ |
590 | pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 600 | pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
601 | if (!pmb) { | ||
602 | phba->link_state = LPFC_HBA_ERROR; | ||
603 | return -ENOMEM; | ||
604 | } | ||
605 | |||
591 | lpfc_dump_wakeup_param(phba, pmb); | 606 | lpfc_dump_wakeup_param(phba, pmb); |
592 | pmb->mbox_cmpl = lpfc_dump_wakeup_param_cmpl; | 607 | pmb->mbox_cmpl = lpfc_dump_wakeup_param_cmpl; |
593 | pmb->vport = phba->pport; | 608 | pmb->vport = phba->pport; |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 35e3b96d4e07..d51ee7e3273b 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -4388,7 +4388,13 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) | |||
4388 | spin_unlock_irq(&phba->hbalock); | 4388 | spin_unlock_irq(&phba->hbalock); |
4389 | 4389 | ||
4390 | /* Read the port's service parameters. */ | 4390 | /* Read the port's service parameters. */ |
4391 | lpfc_read_sparam(phba, mboxq, vport->vpi); | 4391 | rc = lpfc_read_sparam(phba, mboxq, vport->vpi); |
4392 | if (rc) { | ||
4393 | phba->link_state = LPFC_HBA_ERROR; | ||
4394 | rc = -ENOMEM; | ||
4395 | goto out_free_vpd; | ||
4396 | } | ||
4397 | |||
4392 | mboxq->vport = vport; | 4398 | mboxq->vport = vport; |
4393 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); | 4399 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); |
4394 | mp = (struct lpfc_dmabuf *) mboxq->context1; | 4400 | mp = (struct lpfc_dmabuf *) mboxq->context1; |
diff --git a/drivers/scsi/lpfc/lpfc_vport.c b/drivers/scsi/lpfc/lpfc_vport.c index dc86e873102a..869f76cbc58a 100644 --- a/drivers/scsi/lpfc/lpfc_vport.c +++ b/drivers/scsi/lpfc/lpfc_vport.c | |||
@@ -123,7 +123,12 @@ lpfc_vport_sparm(struct lpfc_hba *phba, struct lpfc_vport *vport) | |||
123 | } | 123 | } |
124 | mb = &pmb->u.mb; | 124 | mb = &pmb->u.mb; |
125 | 125 | ||
126 | lpfc_read_sparam(phba, pmb, vport->vpi); | 126 | rc = lpfc_read_sparam(phba, pmb, vport->vpi); |
127 | if (rc) { | ||
128 | mempool_free(pmb, phba->mbox_mem_pool); | ||
129 | return -ENOMEM; | ||
130 | } | ||
131 | |||
127 | /* | 132 | /* |
128 | * Grab buffer pointer and clear context1 so we can use | 133 | * Grab buffer pointer and clear context1 so we can use |
129 | * lpfc_sli_issue_box_wait | 134 | * lpfc_sli_issue_box_wait |