watchdog: iTCO_wdt.c: remove extra pci_dev_put()'s from init code
Prarit Bhargava [Wed, 27 Oct 2010 13:50:22 +0000 (09:50 -0400)]
The iTCO_wdt driver erroneously releases the pci_dev, and causes PCI hotremove
to fail because of an incorrect usage count.

The probe for this driver does a for_each_pci_dev() which gets a reference for
a pci_dev when iTCO_wdt_init() is successful.  The for_each_pci_dev() loop
puts a reference for a pci_dev when iTCO_wdt_init() fails, so the
iTCO_wdt_init() does not need to do any pci_dev_put()'s.

The only pci_dev_put() that is required is in the iTCO_wdt_cleanup() function.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>

drivers/watchdog/iTCO_wdt.c

index bc69731..f7e90fe 100644 (file)
@@ -786,7 +786,6 @@ static int __devinit iTCO_wdt_init(struct pci_dev *pdev,
                /* Something's wrong here, ACPIBASE has to be set */
                printk(KERN_ERR PFX "failed to get TCOBASE address, "
                                        "device disabled by hardware/BIOS\n");
-               pci_dev_put(pdev);
                return -ENODEV;
        }
        iTCO_wdt_private.iTCO_version =
@@ -886,7 +885,6 @@ out_unmap:
        if (iTCO_wdt_private.iTCO_version == 2)
                iounmap(iTCO_wdt_private.gcs);
 out:
-       pci_dev_put(iTCO_wdt_private.pdev);
        iTCO_wdt_private.ACPIBASE = 0;
        return ret;
 }