From: Todd Poynor <toddpoy...@google.com>

Hold a reference to the struct device while a gasket sysfs mapping
exists for the device and a pointer to the struct is kept in the mapping
data structures.

Signed-off-by: Todd Poynor <toddpoy...@google.com>
---
 drivers/staging/gasket/gasket_sysfs.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/gasket/gasket_sysfs.c 
b/drivers/staging/gasket/gasket_sysfs.c
index da972ce0e0db0..fde04658419bc 100644
--- a/drivers/staging/gasket/gasket_sysfs.c
+++ b/drivers/staging/gasket/gasket_sysfs.c
@@ -126,6 +126,7 @@ static void put_mapping(struct gasket_sysfs_mapping 
*mapping)
                kfree(mapping->attributes);
                mapping->attributes = NULL;
                mapping->attribute_count = 0;
+               put_device(mapping->device);
                mapping->device = NULL;
                mapping->gasket_dev = NULL;
        }
@@ -208,22 +209,20 @@ int gasket_sysfs_create_mapping(
                device->kobj.name);
 
        mapping = &dev_mappings[map_idx];
-       kref_init(&mapping->refcount);
-       mapping->device = device;
-       mapping->gasket_dev = gasket_dev;
        mapping->attributes = kcalloc(GASKET_SYSFS_MAX_NODES,
                                      sizeof(*mapping->attributes),
                                      GFP_KERNEL);
-       mapping->attribute_count = 0;
        if (!mapping->attributes) {
                dev_dbg(device, "Unable to allocate sysfs attribute array\n");
-               mapping->device = NULL;
-               mapping->gasket_dev = NULL;
                mutex_unlock(&mapping->mutex);
                mutex_unlock(&function_mutex);
                return -ENOMEM;
        }
 
+       kref_init(&mapping->refcount);
+       mapping->device = get_device(device);
+       mapping->gasket_dev = gasket_dev;
+       mapping->attribute_count = 0;
        mutex_unlock(&mapping->mutex);
        mutex_unlock(&function_mutex);
 
-- 
2.18.0.345.g5c9ce644c3-goog

Reply via email to