[PATCH v3 4/4] drivers: lustre: obdclass: check result of register_shrinker()
Aliaksei Karaliou
akaraliou.dev at gmail.com
Thu Dec 7 07:25:53 UTC 2017
lu_global_init() does not check result of register_shrinker()
which was tagged __must_check recently, reported by sparse.
Patch also fixes missed cleanup of resources allocated prior to
register_shrinker() invocation and not freed after any failure.
Signed-off-by: Aliaksei Karaliou <akaraliou.dev at gmail.com>
---
drivers/staging/lustre/lustre/obdclass/lu_object.c | 27 ++++++++++++++++++----
1 file changed, 22 insertions(+), 5 deletions(-)
v3: Also address incomplate resource cleanup, noticed by Dan Carpenter.
diff --git a/drivers/staging/lustre/lustre/obdclass/lu_object.c b/drivers/staging/lustre/lustre/obdclass/lu_object.c
index b938a3f9d50a..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,17 +1945,31 @@ 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
* inode, one for ea. Unfortunately setting this high value results in
* lu_object/inode cache consuming all the memory.
*/
- register_shrinker(&lu_site_shrinker);
+ 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;
}
/**
@@ -1961,7 +1977,8 @@ int lu_global_init(void)
*/
void lu_global_fini(void)
{
- unregister_shrinker(&lu_site_shrinker);
+ if (lu_site_shrinker.nr_deferred)
+ unregister_shrinker(&lu_site_shrinker);
lu_context_key_degister(&lu_global_key);
/*
--
2.11.0
More information about the devel
mailing list