]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
libnvdimm: Hold reference on parent while scheduling async init
authorAlexander Duyck <alexander.h.duyck@linux.intel.com>
Tue, 25 Sep 2018 20:53:02 +0000 (13:53 -0700)
committerDan Williams <dan.j.williams@intel.com>
Wed, 26 Sep 2018 19:02:31 +0000 (12:02 -0700)
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>
drivers/nvdimm/bus.c

index 8aae6dcc839fed90a76e31eaf35a5f47ac04957d..9148015ed8036fc59a3ada2f364b558bd58201d9 100644 (file)
@@ -488,6 +488,8 @@ static void nd_async_device_register(void *d, async_cookie_t cookie)
                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)
@@ -507,6 +509,8 @@ void __nd_device_register(struct device *dev)
        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);