[PATCH] x86: kernel: olpc-xo1: fix error handling code

From: Vasiliy Kulikov
Date: Sun Oct 17 2010 - 10:52:00 EST


If anything failed during initialization then setup_bases() should
call pci_disable_device(). Also reference got from pci_get_device()
should be freed with pci_dev_put().

Signed-off-by: Vasiliy Kulikov <segooon@xxxxxxxxx>
---
arch/x86/kernel/olpc-xo1.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/olpc-xo1.c b/arch/x86/kernel/olpc-xo1.c
index f5442c0..05331cf 100644
--- a/arch/x86/kernel/olpc-xo1.c
+++ b/arch/x86/kernel/olpc-xo1.c
@@ -71,20 +71,25 @@ static int __devinit setup_bases(struct pci_dev *pdev)
r = pci_request_region(pdev, ACPI_BAR, DRV_NAME);
if (r) {
dev_err(&pdev->dev, "can't alloc PCI BAR #%d\n", ACPI_BAR);
- return r;
+ goto err_disable;
}

r = pci_request_region(pdev, PMS_BAR, DRV_NAME);
if (r) {
dev_err(&pdev->dev, "can't alloc PCI BAR #%d\n", PMS_BAR);
- pci_release_region(pdev, ACPI_BAR);
- return r;
+ goto err_region1;
}

acpi_base = pci_resource_start(pdev, ACPI_BAR);
pms_base = pci_resource_start(pdev, PMS_BAR);

return 0;
+
+err_region1:
+ pci_release_region(pdev, ACPI_BAR);
+err_disable:
+ pci_disable_device(pdev);
+ return r;
}

static int __devinit olpc_xo1_probe(struct platform_device *pdev)
@@ -98,6 +103,7 @@ static int __devinit olpc_xo1_probe(struct platform_device *pdev)
return -ENODEV;

r = setup_bases(pcidev);
+ pci_dev_put(pcidev);
if (r)
return r;

--
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/