From d9d8062f7c84d7c5aae97a5306434ca47618519f Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Thu, 24 Mar 2022 09:05:14 +0100 Subject: [PATCH 1/3] Mark cache priv as inited during activate Cache priv is being allocated on starting cache instance and is freed only when stopping cache. This cachnge allows to properly handle rollback if activate has failed. Without setting this flag managment queue is not being stopped despite its cache doesn't exist. Signed-off-by: Michal Mielewczyk --- modules/cas_cache/layer_cache_management.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 18b504b..613bc8e 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -2352,6 +2352,9 @@ int cache_mngt_activate(struct ocf_mngt_cache_standby_activate_config *cfg, cache_priv = ocf_cache_get_priv(cache); cache_priv->attach_context = context; + /* All the required memory has been alocated and initialized on cache_init, + * just set the flag to allow deinit*/ + context->priv_inited = true; context->rollback_thread = cas_lazy_thread_create(cache_start_rollback, context, "cas_cache_rollback_complete"); From 387e22eaaac6d64817e3c6a7a8795b19698aaafb Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Thu, 24 Mar 2022 09:13:37 +0100 Subject: [PATCH 2/3] Remain in standby in case of minor activate error Instead of stopping passive instance in case of every possible error, allow it to remain in standby mode if the error was handleable Signed-off-by: Michal Mielewczyk --- modules/cas_cache/layer_cache_management.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 613bc8e..73f2023 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -2372,12 +2372,13 @@ int cache_mngt_activate(struct ocf_mngt_cache_standby_activate_config *cfg, if (result == -KCAS_ERR_WAITING_INTERRUPTED) goto out_cache_put; if (result) - goto err; + goto activate_err; result = _cache_start_finalize(cache, -1, true); if (result) - goto err; + goto finalize_err; +activate_err: cas_lazy_thread_stop(context->rollback_thread); err_free_context: @@ -2392,7 +2393,7 @@ out_module_put: module_put(THIS_MODULE); return result; -err: +finalize_err: _cache_mngt_async_context_reinit(&context->async); ocf_mngt_cache_stop(cache, _cache_mngt_cache_stop_rollback_complete, context); From 3f525179e48a42072a3dbfa0b2ecf1a2bc070f73 Mon Sep 17 00:00:00 2001 From: Michal Mielewczyk Date: Thu, 24 Mar 2022 09:14:27 +0100 Subject: [PATCH 3/3] Put module in case of failing to finalize activate Signed-off-by: Michal Mielewczyk --- modules/cas_cache/layer_cache_management.c | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 73f2023..b5ce52a 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -2405,6 +2405,7 @@ finalize_err: if (rollback_result != -KCAS_ERR_WAITING_INTERRUPTED) kfree(context); + module_put(THIS_MODULE); return result; }