[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[dm-devel] [PATCH] dm-lc.c: Audit return values of functions invoked in module init routine



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 gmail com>
---
 Driver/dm-lc.c | 60 +++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 43 insertions(+), 17 deletions(-)

diff --git a/Driver/dm-lc.c b/Driver/dm-lc.c
index 9d394ee..3ac7173 100644
--- a/Driver/dm-lc.c
+++ b/Driver/dm-lc.c
@@ -2959,14 +2959,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) {
@@ -2980,15 +2973,6 @@ static int __init lc_module_init(void)
 		return r;
 	}
 
-	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
@@ -2996,10 +2980,52 @@ 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 fail_kobj_devices;
+
 	caches_kobj = kobject_create_and_add("caches", lc_kobj);
+	if (!caches_kobj)
+		goto fail_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 fail_wq;
+	}
+
+	lc_io_client = dm_io_client_create();
+	if (IS_ERR(lc_io_client)) {
+		r = PTR_ERR(lc_io_client);
+		goto fail_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;
+
+fail_io_client:
+	destroy_workqueue(safe_io_wq);
+
+fail_wq:
+	kobject_put(caches_kobj);
+
+fail_kobj_caches:
+	kobject_put(devices_kobj);
+
+fail_kobj_devices:
+	dm_unregister_target(&lc_mgr_target);
+	dm_unregister_target(&lc_target);
+	return ERR_PTR(r);
 }
 
 static void __exit lc_module_exit(void)
-- 
1.8.3.1


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]