From: Todd Poynor <toddpoynor@xxxxxxxxxx> Remove device registration on class creation fail. Hold mutex around device removal updates for proper ordering of updates. Signed-off-by: Zhongze Hu <frankhu@xxxxxxxxxxxx> Signed-off-by: Todd Poynor <toddpoynor@xxxxxxxxxx> --- drivers/staging/gasket/gasket_core.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/staging/gasket/gasket_core.c b/drivers/staging/gasket/gasket_core.c index 45914ebc8f44..3bdf7d36b397 100644 --- a/drivers/staging/gasket/gasket_core.c +++ b/drivers/staging/gasket/gasket_core.c @@ -342,7 +342,8 @@ int gasket_register_device(const struct gasket_driver_desc *driver_desc) if (IS_ERR_OR_NULL(internal->class)) { gasket_nodev_error("Cannot register %s class [ret=%ld]", driver_desc->name, PTR_ERR(internal->class)); - return PTR_ERR(internal->class); + ret = PTR_ERR(internal->class); + goto fail0; } /* @@ -376,7 +377,10 @@ int gasket_register_device(const struct gasket_driver_desc *driver_desc) fail1: class_destroy(internal->class); +fail0: + mutex_lock(&g_mutex); g_descs[desc_idx].driver_desc = NULL; + mutex_unlock(&g_mutex); return ret; } EXPORT_SYMBOL(gasket_register_device); @@ -413,7 +417,9 @@ void gasket_unregister_device(const struct gasket_driver_desc *driver_desc) class_destroy(internal_desc->class); /* Finally, effectively "remove" the driver. */ + mutex_lock(&g_mutex); g_descs[desc_idx].driver_desc = NULL; + mutex_unlock(&g_mutex); gasket_nodev_info("removed %s driver", driver_desc->name); } -- 2.18.0.203.gfac676dfb9-goog _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel