| From fe0f3168169f7c34c29b0cf0c489f126a7f29643 Mon Sep 17 00:00:00 2001 |
| From: Johan Hovold <johan@kernel.org> |
| Date: Tue, 1 Nov 2016 16:26:00 +0100 |
| Subject: powerpc/ibmebus: Fix device reference leaks in sysfs interface |
| |
| From: Johan Hovold <johan@kernel.org> |
| |
| commit fe0f3168169f7c34c29b0cf0c489f126a7f29643 upstream. |
| |
| Make sure to drop any reference taken by bus_find_device() in the sysfs |
| callbacks that are used to create and destroy devices based on |
| device-tree entries. |
| |
| Fixes: 6bccf755ff53 ("[POWERPC] ibmebus: dynamic addition/removal of adapters, some code cleanup") |
| Signed-off-by: Johan Hovold <johan@kernel.org> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/kernel/ibmebus.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/arch/powerpc/kernel/ibmebus.c |
| +++ b/arch/powerpc/kernel/ibmebus.c |
| @@ -266,6 +266,7 @@ static ssize_t ibmebus_store_probe(struc |
| const char *buf, size_t count) |
| { |
| struct device_node *dn = NULL; |
| + struct device *dev; |
| char *path; |
| ssize_t rc = 0; |
| |
| @@ -273,8 +274,10 @@ static ssize_t ibmebus_store_probe(struc |
| if (!path) |
| return -ENOMEM; |
| |
| - if (bus_find_device(&ibmebus_bus_type, NULL, path, |
| - ibmebus_match_path)) { |
| + dev = bus_find_device(&ibmebus_bus_type, NULL, path, |
| + ibmebus_match_path); |
| + if (dev) { |
| + put_device(dev); |
| printk(KERN_WARNING "%s: %s has already been probed\n", |
| __func__, path); |
| rc = -EEXIST; |
| @@ -311,6 +314,7 @@ static ssize_t ibmebus_store_remove(stru |
| if ((dev = bus_find_device(&ibmebus_bus_type, NULL, path, |
| ibmebus_match_path))) { |
| of_device_unregister(to_platform_device(dev)); |
| + put_device(dev); |
| |
| kfree(path); |
| return count; |