From: Julia Lawall <Julia.Lawall@xxxxxxx> Add a call to pci_dev_put in each error case. This is motivated by the associated remove function, which always calls pci_dev_put. Shift the error-handling code to the end of the function. Signed-off-by: Julia Lawall <Julia.Lawall@xxxxxxx> --- drivers/edac/amd8131_edac.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/edac/amd8131_edac.c b/drivers/edac/amd8131_edac.c index a5c6805..dcfd53b 100644 --- a/drivers/edac/amd8131_edac.c +++ b/drivers/edac/amd8131_edac.c @@ -249,6 +249,7 @@ static struct amd8131_info amd8131_chipset = { static int amd8131_probe(struct pci_dev *dev, const struct pci_device_id *id) { struct amd8131_dev_info *dev_info; + int ret; for (dev_info = amd8131_chipset.devices; dev_info->inst != NO_BRIDGE; dev_info++) @@ -265,12 +266,12 @@ static int amd8131_probe(struct pci_dev *dev, const struct pci_device_id *id) dev_info->dev = pci_dev_get(dev); if (pci_enable_device(dev_info->dev)) { - pci_dev_put(dev_info->dev); printk(KERN_ERR "failed to enable:" "vendor %x, device %x, devfn %x, name %s\n", PCI_VENDOR_ID_AMD, amd8131_chipset.err_dev, dev_info->devfn, dev_info->ctl_name); - return -ENODEV; + ret = -ENODEV; + goto error; } /* @@ -280,8 +281,10 @@ static int amd8131_probe(struct pci_dev *dev, const struct pci_device_id *id) */ dev_info->edac_idx = edac_pci_alloc_index(); dev_info->edac_dev = edac_pci_alloc_ctl_info(0, dev_info->ctl_name); - if (!dev_info->edac_dev) - return -ENOMEM; + if (!dev_info->edac_dev) { + ret = -ENOMEM; + goto error; + } dev_info->edac_dev->pvt_info = dev_info; dev_info->edac_dev->dev = &dev_info->dev->dev; @@ -298,8 +301,8 @@ static int amd8131_probe(struct pci_dev *dev, const struct pci_device_id *id) if (edac_pci_add_device(dev_info->edac_dev, dev_info->edac_idx) > 0) { printk(KERN_ERR "failed edac_pci_add_device() for %s\n", dev_info->ctl_name); - edac_pci_free_ctl_info(dev_info->edac_dev); - return -ENODEV; + ret = -ENODEV; + goto error_info; } printk(KERN_INFO "added one device on AMD8131 " @@ -308,6 +311,11 @@ static int amd8131_probe(struct pci_dev *dev, const struct pci_device_id *id) dev_info->devfn, dev_info->ctl_name); return 0; +error_info: + edac_pci_free_ctl_info(dev_info->edac_dev); +error: + pci_dev_put(dev_info->dev); + return ret; } static void amd8131_remove(struct pci_dev *dev) -- To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html