From 34cf3ea8dae7f0aa2ab544c1d30a803016af779e Mon Sep 17 00:00:00 2001 From: Todd Poynor Date: Sun, 29 Jul 2018 12:36:35 -0700 Subject: [PATCH] staging: gasket: sysfs: hold reference to device while in use 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 Signed-off-by: Greg Kroah-Hartman --- 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 da972ce0e0db..fde04658419b 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);