diff options
author | Yinghai Lu <yinghai@kernel.org> | 2012-03-03 16:29:20 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2012-03-30 03:38:40 -0400 |
commit | 89e96ada572fb216e582dbe3f64e1a6939a37f74 (patch) | |
tree | e59a7c8e6ba83992114f7232f831b34e699f24cc /drivers/pnp | |
parent | ac909ec308ce8d5177963c780564824d12bc3fa2 (diff) |
PNPACPI: Fix device ref leaking in acpi_pnp_match
During testing pci root bus removal, found some root bus bridge is not freed.
If booting with pnpacpi=off, those hostbridge could be freed without problem.
It turns out that some devices reference are not released during acpi_pnp_match.
that match should not hold one device ref during every calling.
Add pu_device calling before returning.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: stable@vger.kernel.org
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/pnp')
-rw-r--r-- | drivers/pnp/pnpacpi/core.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c index b00c17612a89..d21e8f59c84e 100644 --- a/drivers/pnp/pnpacpi/core.c +++ b/drivers/pnp/pnpacpi/core.c | |||
@@ -321,9 +321,14 @@ static int __init acpi_pnp_match(struct device *dev, void *_pnp) | |||
321 | { | 321 | { |
322 | struct acpi_device *acpi = to_acpi_device(dev); | 322 | struct acpi_device *acpi = to_acpi_device(dev); |
323 | struct pnp_dev *pnp = _pnp; | 323 | struct pnp_dev *pnp = _pnp; |
324 | struct device *physical_device; | ||
325 | |||
326 | physical_device = acpi_get_physical_device(acpi->handle); | ||
327 | if (physical_device) | ||
328 | put_device(physical_device); | ||
324 | 329 | ||
325 | /* true means it matched */ | 330 | /* true means it matched */ |
326 | return !acpi_get_physical_device(acpi->handle) | 331 | return !physical_device |
327 | && compare_pnp_id(pnp->id, acpi_device_hid(acpi)); | 332 | && compare_pnp_id(pnp->id, acpi_device_hid(acpi)); |
328 | } | 333 | } |
329 | 334 | ||