lu_global_init() does not clean internals on failure, and its
cleanup procedure lu_global_fini() is also not called on any failure.
Patch addresses this problem by adding appropriate error handling.

Signed-off-by: Aliaksei Karaliou <akaraliou....@gmail.com>
---
 drivers/staging/lustre/lustre/obdclass/lu_object.c | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/lustre/lustre/obdclass/lu_object.c 
b/drivers/staging/lustre/lustre/obdclass/lu_object.c
index 9e0256ca2079..8e2e6b89e494 100644
--- a/drivers/staging/lustre/lustre/obdclass/lu_object.c
+++ b/drivers/staging/lustre/lustre/obdclass/lu_object.c
@@ -1932,8 +1932,10 @@ int lu_global_init(void)
 
        LU_CONTEXT_KEY_INIT(&lu_global_key);
        result = lu_context_key_register(&lu_global_key);
-       if (result != 0)
+       if (result != 0) {
+               lu_ref_global_fini();
                return result;
+       }
 
        /*
         * At this level, we don't know what tags are needed, so allocate them
@@ -1943,8 +1945,11 @@ int lu_global_init(void)
        down_write(&lu_sites_guard);
        result = lu_env_init(&lu_shrink_env, LCT_SHRINKER);
        up_write(&lu_sites_guard);
-       if (result != 0)
+       if (result != 0) {
+               lu_context_key_degister(&lu_global_key);
+               lu_ref_global_fini();
                return result;
+       }
 
        /*
         * seeks estimation: 3 seeks to read a record from oi, one to read
@@ -1952,8 +1957,19 @@ int lu_global_init(void)
         * lu_object/inode cache consuming all the memory.
         */
        result = register_shrinker(&lu_site_shrinker);
+       if (result != 0) {
+               /* Order explained in lu_global_fini(). */
+               lu_context_key_degister(&lu_global_key);
 
-       return result;
+               down_write(&lu_sites_guard);
+               lu_env_fini(&lu_shrink_env);
+               up_write(&lu_sites_guard);
+
+               lu_ref_global_fini();
+               return result;
+       }
+
+       return 0;
 }
 
 /**
-- 
2.11.0

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to