| From b6eae0f61db27748606cc00dafcfd1e2c032f0a5 Mon Sep 17 00:00:00 2001 |
| From: Alexander Duyck <alexander.h.duyck@linux.intel.com> |
| Date: Tue, 25 Sep 2018 13:53:02 -0700 |
| Subject: libnvdimm: Hold reference on parent while scheduling async init |
| |
| From: Alexander Duyck <alexander.h.duyck@linux.intel.com> |
| |
| commit b6eae0f61db27748606cc00dafcfd1e2c032f0a5 upstream. |
| |
| Unlike asynchronous initialization in the core we have not yet associated |
| the device with the parent, and as such the device doesn't hold a reference |
| to the parent. |
| |
| In order to resolve that we should be holding a reference on the parent |
| until the asynchronous initialization has completed. |
| |
| Cc: <stable@vger.kernel.org> |
| Fixes: 4d88a97aa9e8 ("libnvdimm: ...base ... infrastructure") |
| Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> |
| Signed-off-by: Dan Williams <dan.j.williams@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/nvdimm/bus.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/nvdimm/bus.c |
| +++ b/drivers/nvdimm/bus.c |
| @@ -424,6 +424,8 @@ static void nd_async_device_register(voi |
| put_device(dev); |
| } |
| put_device(dev); |
| + if (dev->parent) |
| + put_device(dev->parent); |
| } |
| |
| static void nd_async_device_unregister(void *d, async_cookie_t cookie) |
| @@ -443,6 +445,8 @@ void __nd_device_register(struct device |
| if (!dev) |
| return; |
| dev->bus = &nvdimm_bus_type; |
| + if (dev->parent) |
| + get_device(dev->parent); |
| get_device(dev); |
| async_schedule_domain(nd_async_device_register, dev, |
| &nd_async_domain); |