Merge pull request #397 from robertbaldyga/fix-metadata-crc-missmatch-issues

Fix metadata checksum mismatch issues
This commit is contained in:
Robert Baldyga 2020-08-05 10:06:53 +02:00 committed by GitHub
commit 95743ec80f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 11 deletions

View File

@ -1273,8 +1273,8 @@ static void ocf_medatata_hash_check_crc_sb_config(ocf_pipeline_t pipeline,
ocf_pipeline_next(pipeline); ocf_pipeline_next(pipeline);
} }
static void ocf_medatata_hash_check_crc(ocf_pipeline_t pipeline, static void ocf_medatata_hash_check_crc_skip(ocf_pipeline_t pipeline,
void *priv, ocf_pipeline_arg_t arg) void *priv, ocf_pipeline_arg_t arg, bool skip_on_dirty_shutdown)
{ {
struct ocf_metadata_hash_context *context = priv; struct ocf_metadata_hash_context *context = priv;
int segment = ocf_pipeline_arg_get_int(arg); int segment = ocf_pipeline_arg_get_int(arg);
@ -1286,19 +1286,40 @@ static void ocf_medatata_hash_check_crc(ocf_pipeline_t pipeline,
ctrl = (struct ocf_metadata_hash_ctrl *)cache->metadata.iface_priv; ctrl = (struct ocf_metadata_hash_ctrl *)cache->metadata.iface_priv;
sb_config = METADATA_MEM_POOL(ctrl, metadata_segment_sb_config); sb_config = METADATA_MEM_POOL(ctrl, metadata_segment_sb_config);
if (!sb_config->clean_shutdown && skip_on_dirty_shutdown)
OCF_PL_NEXT_RET(pipeline);
crc = ocf_metadata_raw_checksum(cache, &(ctrl->raw_desc[segment])); crc = ocf_metadata_raw_checksum(cache, &(ctrl->raw_desc[segment]));
if (crc != sb_config->checksum[segment]) { if (crc != sb_config->checksum[segment]) {
/* Checksum does not match */ /* Checksum does not match */
ocf_cache_log(cache, log_err, if (!sb_config->clean_shutdown) {
"Loading %s ERROR, invalid checksum", ocf_cache_log(cache, log_warn,
ocf_metadata_hash_raw_names[segment]); "Loading %s WARNING, invalid checksum",
OCF_PL_FINISH_RET(pipeline, -OCF_ERR_INVAL); ocf_metadata_hash_raw_names[segment]);
} else {
ocf_cache_log(cache, log_err,
"Loading %s ERROR, invalid checksum",
ocf_metadata_hash_raw_names[segment]);
OCF_PL_FINISH_RET(pipeline, -OCF_ERR_INVAL);
}
} }
ocf_pipeline_next(pipeline); ocf_pipeline_next(pipeline);
} }
static void ocf_medatata_hash_check_crc(ocf_pipeline_t pipeline,
void *priv, ocf_pipeline_arg_t arg)
{
ocf_medatata_hash_check_crc_skip(pipeline, priv, arg, false);
}
static void ocf_medatata_hash_check_crc_if_clean(ocf_pipeline_t pipeline,
void *priv, ocf_pipeline_arg_t arg)
{
ocf_medatata_hash_check_crc_skip(pipeline, priv, arg, true);
}
static void ocf_medatata_hash_load_superblock_post(ocf_pipeline_t pipeline, static void ocf_medatata_hash_load_superblock_post(ocf_pipeline_t pipeline,
void *priv, ocf_pipeline_arg_t arg) void *priv, ocf_pipeline_arg_t arg)
{ {
@ -1409,14 +1430,18 @@ struct ocf_pipeline_arg ocf_metadata_hash_load_sb_load_segment_args[] = {
}; };
struct ocf_pipeline_arg ocf_metadata_hash_load_sb_check_crc_args[] = { struct ocf_pipeline_arg ocf_metadata_hash_load_sb_check_crc_args[] = {
OCF_PL_ARG_INT(metadata_segment_sb_runtime),
OCF_PL_ARG_INT(metadata_segment_part_config), 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_config),
OCF_PL_ARG_INT(metadata_segment_core_uuid), OCF_PL_ARG_INT(metadata_segment_core_uuid),
OCF_PL_ARG_TERMINATOR(), OCF_PL_ARG_TERMINATOR(),
}; };
struct ocf_pipeline_arg ocf_metadata_hash_load_sb_check_crc_args_clean[] = {
OCF_PL_ARG_INT(metadata_segment_sb_runtime),
OCF_PL_ARG_INT(metadata_segment_part_runtime),
OCF_PL_ARG_TERMINATOR(),
};
struct ocf_pipeline_properties ocf_metadata_hash_load_sb_pipeline_props = { struct ocf_pipeline_properties ocf_metadata_hash_load_sb_pipeline_props = {
.priv_size = sizeof(struct ocf_metadata_hash_context), .priv_size = sizeof(struct ocf_metadata_hash_context),
.finish = ocf_metadata_hash_load_superblock_finish, .finish = ocf_metadata_hash_load_superblock_finish,
@ -1428,6 +1453,8 @@ struct ocf_pipeline_properties ocf_metadata_hash_load_sb_pipeline_props = {
OCF_PL_STEP(ocf_medatata_hash_check_crc_sb_config), OCF_PL_STEP(ocf_medatata_hash_check_crc_sb_config),
OCF_PL_STEP_FOREACH(ocf_medatata_hash_check_crc, OCF_PL_STEP_FOREACH(ocf_medatata_hash_check_crc,
ocf_metadata_hash_load_sb_check_crc_args), ocf_metadata_hash_load_sb_check_crc_args),
OCF_PL_STEP_FOREACH(ocf_medatata_hash_check_crc_if_clean,
ocf_metadata_hash_load_sb_check_crc_args_clean),
OCF_PL_STEP(ocf_medatata_hash_load_superblock_post), OCF_PL_STEP(ocf_medatata_hash_load_superblock_post),
OCF_PL_STEP_TERMINATOR(), OCF_PL_STEP_TERMINATOR(),
}, },

View File

@ -373,6 +373,7 @@ static int _ocf_mngt_init_instance_add_cores(
ocf_core_id_t core_id; ocf_core_id_t core_id;
int ret = -1; int ret = -1;
uint64_t hd_lines = 0; uint64_t hd_lines = 0;
uint64_t length;
OCF_ASSERT_PLUGGED(cache); OCF_ASSERT_PLUGGED(cache);
@ -439,8 +440,15 @@ static int _ocf_mngt_init_instance_add_cores(
ocf_core_seq_cutoff_init(core); ocf_core_seq_cutoff_init(core);
hd_lines = ocf_bytes_2_lines(cache, length = ocf_volume_get_length(&core->volume);
ocf_volume_get_length(&core->volume)); if (length != core->conf_meta->length) {
ocf_cache_log(cache, log_err,
"Size of core volume doesn't match with"
" the size stored in cache metadata!");
goto err;
}
hd_lines = ocf_bytes_2_lines(cache, length);
if (hd_lines) { if (hd_lines) {
ocf_cache_log(cache, log_info, ocf_cache_log(cache, log_info,

View File

@ -279,7 +279,10 @@ static void ocf_mngt_cache_try_add_core_insert(ocf_pipeline_t pipeline,
if (result) if (result)
OCF_PL_FINISH_RET(pipeline, result); OCF_PL_FINISH_RET(pipeline, result);
if (!ocf_volume_get_length(volume)) { if (ocf_volume_get_length(volume) != core->conf_meta->length) {
ocf_cache_log(cache, log_err,
"Size of core volume doesn't match with"
" the size stored in cache metadata!");
result = -OCF_ERR_CORE_NOT_AVAIL; result = -OCF_ERR_CORE_NOT_AVAIL;
goto error_after_open; goto error_after_open;
} }