From c5505ad15cc881905f2dd4d6fb62cfb55cbdcd95 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 --- gasket_sysfs.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/gasket_sysfs.c b/gasket_sysfs.c index da972ce..fde0465 100644 --- a/gasket_sysfs.c +++ b/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);