From 85e8b414c4b5b84cc98b84afc6512c29b0df8190 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Tue, 31 Aug 2021 18:56:08 +0200 Subject: [PATCH] Add ocf_metadata_load_unsafe() Signed-off-by: Robert Baldyga --- src/metadata/metadata.c | 73 +++++++++++++++++++++++++++++++++++++++++ src/metadata/metadata.h | 10 ++++++ 2 files changed, 83 insertions(+) diff --git a/src/metadata/metadata.c b/src/metadata/metadata.c index 0afae41..6d8207d 100644 --- a/src/metadata/metadata.c +++ b/src/metadata/metadata.c @@ -1146,6 +1146,79 @@ void ocf_metadata_load_all(ocf_cache_t cache, ocf_pipeline_next(pipeline); } +static void ocf_metadata_load_unsafe_finish(ocf_pipeline_t pipeline, + void *priv, int error) +{ + struct ocf_metadata_context *context = priv; + ocf_cache_t cache = context->cache; + + if (error) { + ocf_cache_log(cache, log_err, "Metadata read FAILURE\n"); + ocf_metadata_error(cache); + goto out; + } + + ocf_cache_log(cache, log_info, "Done loading cache state\n"); + +out: + context->cmpl(context->priv, error); + ocf_pipeline_destroy(pipeline); +} + +struct ocf_pipeline_arg ocf_metadata_load_unsafe_args[] = { + OCF_PL_ARG_INT(metadata_segment_sb_config), + OCF_PL_ARG_INT(metadata_segment_sb_runtime), + OCF_PL_ARG_INT(metadata_segment_part_config), + OCF_PL_ARG_INT(metadata_segment_part_runtime), + OCF_PL_ARG_INT(metadata_segment_core_config), + OCF_PL_ARG_INT(metadata_segment_core_runtime), + OCF_PL_ARG_INT(metadata_segment_core_uuid), + OCF_PL_ARG_INT(metadata_segment_cleaning), + OCF_PL_ARG_INT(metadata_segment_lru), + OCF_PL_ARG_INT(metadata_segment_collision), + OCF_PL_ARG_INT(metadata_segment_list_info), + OCF_PL_ARG_INT(metadata_segment_hash), + OCF_PL_ARG_TERMINATOR(), +}; + +struct ocf_pipeline_properties ocf_metadata_load_unsafe_pipeline_props = { + .priv_size = sizeof(struct ocf_metadata_context), + .finish = ocf_metadata_load_unsafe_finish, + .steps = { + OCF_PL_STEP_FOREACH(ocf_metadata_load_segment, + ocf_metadata_load_unsafe_args), + OCF_PL_STEP_TERMINATOR(), + }, +}; + +/* + * Load metadata unsafe + */ +void ocf_metadata_load_unsafe(ocf_cache_t cache, + ocf_metadata_end_t cmpl, void *priv) +{ + struct ocf_metadata_context *context; + ocf_pipeline_t pipeline; + int result; + + OCF_DEBUG_TRACE(cache); + + result = ocf_pipeline_create(&pipeline, cache, + &ocf_metadata_load_unsafe_pipeline_props); + if (result) + OCF_CMPL_RET(priv, result); + + context = ocf_pipeline_get_priv(pipeline); + + context->cmpl = cmpl; + context->priv = priv; + context->pipeline = pipeline; + context->cache = cache; + context->ctrl = cache->metadata.priv; + + ocf_pipeline_next(pipeline); +} + static void ocf_metadata_load_recovery_legacy_finish( ocf_pipeline_t pipeline, void *priv, int error) { diff --git a/src/metadata/metadata.h b/src/metadata/metadata.h index a084bb9..8a7e59b 100644 --- a/src/metadata/metadata.h +++ b/src/metadata/metadata.h @@ -164,6 +164,16 @@ void ocf_metadata_flush_do_asynch(struct ocf_cache *cache, void ocf_metadata_load_all(ocf_cache_t cache, ocf_metadata_end_t cmpl, void *priv); +/** + * @brief Load metadata unsafe + * + * @param cache - Cache instance + * @param cmpl - Completion callback + * @param priv - Completion context + */ +void ocf_metadata_load_unsafe(ocf_cache_t cache, + ocf_metadata_end_t cmpl, void *priv); + /** * @brief Load metadata required for recovery procedure *