Merge pull request #148 from mmichal10/fix-cleaner-stopping

Distinguish stopping cache from attached and detached states.
This commit is contained in:
Michal Rakowski 2019-05-09 14:42:17 +02:00 committed by GitHub
commit 94ef5a5249
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1907,6 +1907,7 @@ struct ocf_mngt_cache_stop_context {
ocf_ctx_t ctx; ocf_ctx_t ctx;
char cache_name[OCF_CACHE_NAME_SIZE]; char cache_name[OCF_CACHE_NAME_SIZE];
int cache_write_error; int cache_write_error;
bool cache_attached;
}; };
static void ocf_mngt_cache_stop_wait_metadata_io_finish(void *priv) static void ocf_mngt_cache_stop_wait_metadata_io_finish(void *priv)
@ -1922,6 +1923,9 @@ static void ocf_mngt_cache_stop_wait_metadata_io(ocf_pipeline_t pipeline,
struct ocf_mngt_cache_stop_context *context = priv; struct ocf_mngt_cache_stop_context *context = priv;
ocf_cache_t cache = context->cache; ocf_cache_t cache = context->cache;
if (!context->cache_attached)
OCF_PL_NEXT_RET(pipeline);
ocf_refcnt_freeze(&cache->refcnt.metadata); ocf_refcnt_freeze(&cache->refcnt.metadata);
ocf_refcnt_register_zero_cb(&cache->refcnt.metadata, ocf_refcnt_register_zero_cb(&cache->refcnt.metadata,
ocf_mngt_cache_stop_wait_metadata_io_finish, context); ocf_mngt_cache_stop_wait_metadata_io_finish, context);
@ -1941,7 +1945,7 @@ static void ocf_mngt_cache_stop_remove_cores(ocf_pipeline_t pipeline,
if (!env_bit_test(i, cache->conf_meta->valid_core_bitmap)) if (!env_bit_test(i, cache->conf_meta->valid_core_bitmap))
continue; continue;
cache_mng_core_remove_from_cache(cache, i); cache_mng_core_remove_from_cache(cache, i);
if (ocf_cache_is_device_attached(cache)) if (context->cache_attached)
cache_mng_core_remove_from_cleaning_pol(cache, i); cache_mng_core_remove_from_cleaning_pol(cache, i);
cache_mng_core_close(cache, i); cache_mng_core_close(cache, i);
j++; j++;
@ -1969,7 +1973,7 @@ static void ocf_mngt_cache_stop_unplug(ocf_pipeline_t pipeline,
struct ocf_mngt_cache_stop_context *context = priv; struct ocf_mngt_cache_stop_context *context = priv;
ocf_cache_t cache = context->cache; ocf_cache_t cache = context->cache;
if (!ocf_cache_is_device_attached(cache)) if (!context->cache_attached)
OCF_PL_NEXT_RET(pipeline); OCF_PL_NEXT_RET(pipeline);
_ocf_mngt_cache_unplug(cache, true, &context->unplug_context, _ocf_mngt_cache_unplug(cache, true, &context->unplug_context,
@ -2077,6 +2081,7 @@ void ocf_mngt_cache_stop(ocf_cache_t cache,
context->pipeline = pipeline; context->pipeline = pipeline;
context->cache = cache; context->cache = cache;
context->ctx = cache->owner; context->ctx = cache->owner;
context->cache_attached = ocf_cache_is_device_attached(cache);
result = env_strncpy(context->cache_name, sizeof(context->cache_name), result = env_strncpy(context->cache_name, sizeof(context->cache_name),
ocf_cache_get_name(cache), sizeof(context->cache_name)); ocf_cache_get_name(cache), sizeof(context->cache_name));