summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/pm8001
diff options
context:
space:
mode:
authorTomas Henzl <thenzl@redhat.com>2014-07-09 07:51:11 -0400
committerChristoph Hellwig <hch@lst.de>2014-07-25 17:17:04 -0400
commit5b4ce882d56e5356ea38ab86f6da91df4ac57842 (patch)
treef07fdde86da1f5f749af3bf0d463b3524780942d /drivers/scsi/pm8001
parent646cdf0083e3d4a9b995f37b72c3c8a22d9307de (diff)
pm8001: more fixes to honor return value
The driver ignores the return value in a lot of places, fix it at least somewhere (and release the resources in such cases), to avoid that bad things happen. A memory leak is fixed too. Signed-off-by: Tomas Henzl <thenzl@redhat.com> Acked-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com> Acked-by: Jack Wang <xjtuwjp@gmail.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi/pm8001')
-rw-r--r--drivers/scsi/pm8001/pm8001_ctl.c5
-rw-r--r--drivers/scsi/pm8001/pm8001_init.c22
2 files changed, 24 insertions, 3 deletions
diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
index a368d77b8d41..ade62c8a19fa 100644
--- a/drivers/scsi/pm8001/pm8001_ctl.c
+++ b/drivers/scsi/pm8001/pm8001_ctl.c
@@ -397,7 +397,10 @@ static ssize_t pm8001_ctl_bios_version_show(struct device *cdev,
397 payload.func_specific = kzalloc(4096, GFP_KERNEL); 397 payload.func_specific = kzalloc(4096, GFP_KERNEL);
398 if (!payload.func_specific) 398 if (!payload.func_specific)
399 return -ENOMEM; 399 return -ENOMEM;
400 PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload); 400 if (PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload)) {
401 kfree(payload.func_specific);
402 return -ENOMEM;
403 }
401 wait_for_completion(&completion); 404 wait_for_completion(&completion);
402 virt_addr = pm8001_ha->memoryMap.region[NVMD].virt_ptr; 405 virt_addr = pm8001_ha->memoryMap.region[NVMD].virt_ptr;
403 for (bios_index = BIOSOFFSET; bios_index < BIOS_OFFSET_LIMIT; 406 for (bios_index = BIOSOFFSET; bios_index < BIOS_OFFSET_LIMIT;
diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index acef7d6a5790..236fba40e540 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -622,6 +622,8 @@ static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
622 DECLARE_COMPLETION_ONSTACK(completion); 622 DECLARE_COMPLETION_ONSTACK(completion);
623 struct pm8001_ioctl_payload payload; 623 struct pm8001_ioctl_payload payload;
624 u16 deviceid; 624 u16 deviceid;
625 int rc;
626
625 pci_read_config_word(pm8001_ha->pdev, PCI_DEVICE_ID, &deviceid); 627 pci_read_config_word(pm8001_ha->pdev, PCI_DEVICE_ID, &deviceid);
626 pm8001_ha->nvmd_completion = &completion; 628 pm8001_ha->nvmd_completion = &completion;
627 629
@@ -639,7 +641,16 @@ static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
639 } 641 }
640 payload.offset = 0; 642 payload.offset = 0;
641 payload.func_specific = kzalloc(payload.length, GFP_KERNEL); 643 payload.func_specific = kzalloc(payload.length, GFP_KERNEL);
642 PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload); 644 if (!payload.func_specific) {
645 PM8001_INIT_DBG(pm8001_ha, pm8001_printk("mem alloc fail\n"));
646 return;
647 }
648 rc = PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload);
649 if (rc) {
650 kfree(payload.func_specific);
651 PM8001_INIT_DBG(pm8001_ha, pm8001_printk("nvmd failed\n"));
652 return;
653 }
643 wait_for_completion(&completion); 654 wait_for_completion(&completion);
644 655
645 for (i = 0, j = 0; i <= 7; i++, j++) { 656 for (i = 0, j = 0; i <= 7; i++, j++) {
@@ -662,6 +673,7 @@ static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
662 pm8001_printk("phy %d sas_addr = %016llx\n", i, 673 pm8001_printk("phy %d sas_addr = %016llx\n", i,
663 pm8001_ha->phy[i].dev_sas_addr)); 674 pm8001_ha->phy[i].dev_sas_addr));
664 } 675 }
676 kfree(payload.func_specific);
665#else 677#else
666 for (i = 0; i < pm8001_ha->chip->n_phy; i++) { 678 for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
667 pm8001_ha->phy[i].dev_sas_addr = 0x50010c600047f9d0ULL; 679 pm8001_ha->phy[i].dev_sas_addr = 0x50010c600047f9d0ULL;
@@ -685,6 +697,7 @@ static int pm8001_get_phy_settings_info(struct pm8001_hba_info *pm8001_ha)
685 /*OPTION ROM FLASH read for the SPC cards */ 697 /*OPTION ROM FLASH read for the SPC cards */
686 DECLARE_COMPLETION_ONSTACK(completion); 698 DECLARE_COMPLETION_ONSTACK(completion);
687 struct pm8001_ioctl_payload payload; 699 struct pm8001_ioctl_payload payload;
700 int rc;
688 701
689 pm8001_ha->nvmd_completion = &completion; 702 pm8001_ha->nvmd_completion = &completion;
690 /* SAS ADDRESS read from flash / EEPROM */ 703 /* SAS ADDRESS read from flash / EEPROM */
@@ -695,7 +708,12 @@ static int pm8001_get_phy_settings_info(struct pm8001_hba_info *pm8001_ha)
695 if (!payload.func_specific) 708 if (!payload.func_specific)
696 return -ENOMEM; 709 return -ENOMEM;
697 /* Read phy setting values from flash */ 710 /* Read phy setting values from flash */
698 PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload); 711 rc = PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload);
712 if (rc) {
713 kfree(payload.func_specific);
714 PM8001_INIT_DBG(pm8001_ha, pm8001_printk("nvmd failed\n"));
715 return -ENOMEM;
716 }
699 wait_for_completion(&completion); 717 wait_for_completion(&completion);
700 pm8001_set_phy_profile(pm8001_ha, sizeof(u8), payload.func_specific); 718 pm8001_set_phy_profile(pm8001_ha, sizeof(u8), payload.func_specific);
701 kfree(payload.func_specific); 719 kfree(payload.func_specific);