In i3200_init_one(), a reference to the PCI device is taken with pci_dev_get() and stored in the global mci_pdev even when i3200_probe1() fails. On that path i3200_registered keeps its initial value of 1, so i3200_exit() skips the pci_dev_put() and the reference is leaked. Only take the reference after i3200_probe1() succeeds. Fixes: dd8ef1db87a4 ("edac: i3200 memory controller driver") Cc: stable@vger.kernel.org Signed-off-by: Wentao Liang --- drivers/edac/i3200_edac.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/edac/i3200_edac.c b/drivers/edac/i3200_edac.c index 6cade6d7ceff..c80c77230369 100644 --- a/drivers/edac/i3200_edac.c +++ b/drivers/edac/i3200_edac.c @@ -439,10 +439,13 @@ static int i3200_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) return -EIO; rc = i3200_probe1(pdev, ent->driver_data); + if (rc) + return rc; + if (!mci_pdev) mci_pdev = pci_dev_get(pdev); - return rc; + return 0; } static void i3200_remove_one(struct pci_dev *pdev) -- 2.34.1