Add missing checks for values returned by various functions for graceful exit in the event of failure. Signed-off-by: Kumar Amit Mehta <gmate.amit@xxxxxxxxx> --- Driver/dm-lc.c | 61 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/Driver/dm-lc.c b/Driver/dm-lc.c index 6644115..4a65042 100644 --- a/Driver/dm-lc.c +++ b/Driver/dm-lc.c @@ -2924,14 +2924,7 @@ static struct target_type lc_mgr_target = { static int __init lc_module_init(void) { - int r; - - safe_io_wq = alloc_workqueue("safeiowq", - WQ_NON_REENTRANT | WQ_MEM_RECLAIM, 0); - if (!safe_io_wq) - return -ENOMEM; - - lc_io_client = dm_io_client_create(); + int r = -ENOMEM; r = dm_register_target(&lc_target); if (r < 0) { @@ -2942,18 +2935,9 @@ static int __init lc_module_init(void) r = dm_register_target(&lc_mgr_target); if (r < 0) { DMERR("register lc-mgr failed %d", r); - return r; + goto bad_register_mgr_target; } - cache_id_ptr = 0; - - size_t i; - for (i = 0; i < LC_NR_SLOTS; i++) - lc_devices[i] = NULL; - - for (i = 0; i < LC_NR_SLOTS; i++) - lc_caches[i] = NULL; - /* * /sys/module/dm_lc/devices * /caches @@ -2961,10 +2945,51 @@ static int __init lc_module_init(void) struct module *mod = THIS_MODULE; struct kobject *lc_kobj = &(mod->mkobj.kobj); + devices_kobj = kobject_create_and_add("devices", lc_kobj); + if (!devices_kobj) + goto bad_kobj_devices; + caches_kobj = kobject_create_and_add("caches", lc_kobj); + if (!caches_kobj) + goto bad_kobj_caches; + + safe_io_wq = alloc_workqueue("safeiowq", + WQ_NON_REENTRANT | WQ_MEM_RECLAIM, 0); + if (!safe_io_wq) { + DMERR("failed to create workqueue safeiowq"); + goto bad_wq; + } + + lc_io_client = dm_io_client_create(); + if (IS_ERR(lc_io_client)) { + r = PTR_ERR(lc_io_client); + goto bad_io_client; + } + + cache_id_ptr = 0; + + size_t i; + for (i = 0; i < LC_NR_SLOTS; i++) + lc_devices[i] = NULL; + + for (i = 0; i < LC_NR_SLOTS; i++) + lc_caches[i] = NULL; return 0; + +bad_io_client: + destroy_workqueue(safe_io_wq); +bad_wq: + kobject_put(caches_kobj); +bad_kobj_caches: + kobject_put(devices_kobj); +bad_kobj_devices: + dm_unregister_target(&lc_mgr_target); +bad_register_mgr_target: + dm_unregister_target(&lc_target); + + return ERR_PTR(r); } static void __exit lc_module_exit(void) -- 1.8.3.1 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel