Introduce OCF_CMPL_RET() macro

This simplifies cases when we want to call completion callback
and immediately return from void-returning function, by allowing
to explicitly express programmers intent. That way we can avoid
cases when return statement is missing by mistake (this patch
fixes at least one bug related to this).

Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
This commit is contained in:
Robert Baldyga
2019-05-02 15:43:38 +02:00
parent bcb2e670f3
commit 1373471af7
9 changed files with 114 additions and 192 deletions

View File

@@ -251,44 +251,37 @@ static void ocf_metadata_load_properties_cmpl(
if (superblock->magic_number != CACHE_MAGIC_NUMBER) {
ocf_log(ctx, log_info, "Cannot detect pre-existing metadata\n");
cmpl(priv, -ENODATA, NULL);
return;
OCF_CMPL_RET(priv, -ENODATA, NULL);
}
if (METADATA_VERSION() != superblock->metadata_version) {
ocf_log(ctx, log_err, "Metadata version mismatch!\n");
cmpl(priv, -EBADF, NULL);
return;
OCF_CMPL_RET(priv, -EBADF, NULL);
}
if (!ocf_cache_line_size_is_valid(superblock->line_size)) {
ocf_log(ctx, log_err, "ERROR: Invalid cache line size!\n");
cmpl(priv, -EINVAL, NULL);
return;
OCF_CMPL_RET(priv, -EINVAL, NULL);
}
if ((unsigned)superblock->metadata_layout >= ocf_metadata_layout_max) {
ocf_log(ctx, log_err, "ERROR: Invalid metadata layout!\n");
cmpl(priv, -EINVAL, NULL);
return;
OCF_CMPL_RET(priv, -EINVAL, NULL);
}
if (superblock->cache_mode >= ocf_cache_mode_max) {
ocf_log(ctx, log_err, "ERROR: Invalid cache mode!\n");
cmpl(priv, -EINVAL, NULL);
return;
OCF_CMPL_RET(priv, -EINVAL, NULL);
}
if (superblock->clean_shutdown > ocf_metadata_clean_shutdown) {
ocf_log(ctx, log_err, "ERROR: Invalid shutdown status!\n");
cmpl(priv, -EINVAL, NULL);
return;
OCF_CMPL_RET(priv, -EINVAL, NULL);
}
if (superblock->dirty_flushed > DIRTY_FLUSHED) {
ocf_log(ctx, log_err, "ERROR: Invalid flush status!\n");
cmpl(priv, -EINVAL, NULL);
return;
OCF_CMPL_RET(priv, -EINVAL, NULL);
}
properties.line_size = superblock->line_size;
@@ -297,7 +290,7 @@ static void ocf_metadata_load_properties_cmpl(
properties.shutdown_status = superblock->clean_shutdown;
properties.dirty_flushed = superblock->dirty_flushed;
cmpl(priv, 0, &properties);
OCF_CMPL_RET(priv, 0, &properties);
}
void ocf_metadata_load_properties(ocf_volume_t volume,
@@ -310,7 +303,7 @@ void ocf_metadata_load_properties(ocf_volume_t volume,
result = ocf_metadata_read_sb(volume->cache->owner, volume,
ocf_metadata_load_properties_cmpl, cmpl, priv);
if (result)
cmpl(priv, result, NULL);
OCF_CMPL_RET(priv, result, NULL);
}
static void ocf_metadata_probe_cmpl(struct ocf_metadata_read_sb_ctx *context)
@@ -320,31 +313,23 @@ static void ocf_metadata_probe_cmpl(struct ocf_metadata_read_sb_ctx *context)
ocf_metadata_probe_end_t cmpl = context->priv1;
void *priv = context->priv2;
if (superblock->magic_number != CACHE_MAGIC_NUMBER) {
cmpl(priv, -ENODATA, NULL);
return;
}
if (superblock->magic_number != CACHE_MAGIC_NUMBER)
OCF_CMPL_RET(priv, -ENODATA, NULL);
if (METADATA_VERSION() != superblock->metadata_version) {
cmpl(priv, -EBADF, NULL);
return;
}
if (METADATA_VERSION() != superblock->metadata_version)
OCF_CMPL_RET(priv, -EBADF, NULL);
if (superblock->clean_shutdown > ocf_metadata_clean_shutdown) {
cmpl(priv, -EINVAL, NULL);
return;
}
if (superblock->clean_shutdown > ocf_metadata_clean_shutdown)
OCF_CMPL_RET(priv, -EINVAL, NULL);
if (superblock->dirty_flushed > DIRTY_FLUSHED) {
cmpl(priv, -EINVAL, NULL);
return;
}
if (superblock->dirty_flushed > DIRTY_FLUSHED)
OCF_CMPL_RET(priv, -EINVAL, NULL);
status.clean_shutdown = (superblock->clean_shutdown !=
ocf_metadata_dirty_shutdown);
status.cache_dirty = (superblock->dirty_flushed == DIRTY_NOT_FLUSHED);
cmpl(priv, 0, &status);
OCF_CMPL_RET(priv, 0, &status);
}
void ocf_metadata_probe(ocf_ctx_t ctx, ocf_volume_t volume,
@@ -358,7 +343,7 @@ void ocf_metadata_probe(ocf_ctx_t ctx, ocf_volume_t volume,
result = ocf_metadata_read_sb(ctx, volume, ocf_metadata_probe_cmpl,
cmpl, priv);
if (result)
cmpl(priv, result, NULL);
OCF_CMPL_RET(priv, result, NULL);
}
/* completion context for query_cores */
@@ -385,10 +370,8 @@ void ocf_metadata_probe_cores(ocf_ctx_t ctx, ocf_volume_t volume,
const struct ocf_metadata_iface *iface;
context = env_vzalloc(sizeof(*context));
if (!context) {
cmpl(priv, -OCF_ERR_NO_MEM, 0);
return;
}
if (!context)
OCF_CMPL_RET(priv, -OCF_ERR_NO_MEM, 0);
context->cmpl = cmpl;
context->priv = priv;

View File

@@ -12,6 +12,7 @@
#include "../utils/utils_cache_line.h"
#include "../utils/utils_pipeline.h"
#include "../ocf_def_priv.h"
#include "../ocf_priv.h"
#define OCF_METADATA_HASH_DEBUG 0
@@ -794,17 +795,14 @@ void ocf_metadata_hash_query_cores(ocf_ctx_t owner, ocf_volume_t volume,
struct query_cores_context *context;
int err;
if (count > OCF_CORE_MAX) {
cmpl(priv, -EINVAL, 0);
return;
}
if (count > OCF_CORE_MAX)
OCF_CMPL_RET(priv, -EINVAL, 0);
/* intialize query context */
context = env_secure_alloc(sizeof(*context));
if (!context) {
cmpl(priv, -ENOMEM, 0);
return;
}
if (!context)
OCF_CMPL_RET(priv, -ENOMEM, 0);
ENV_BUG_ON(env_memset(context, sizeof(*context), 0));
context->ctx = owner;
context->params.cmpl = cmpl;
@@ -1392,10 +1390,8 @@ static void ocf_metadata_hash_load_superblock(ocf_cache_t cache,
result = ocf_pipeline_create(&pipeline, cache,
&ocf_metadata_hash_load_sb_pipeline_props);
if (result) {
cmpl(priv, result);
return;
}
if (result)
OCF_CMPL_RET(priv, result);
context = ocf_pipeline_get_priv(pipeline);
@@ -1527,10 +1523,8 @@ static void ocf_metadata_hash_flush_superblock(ocf_cache_t cache,
result = ocf_pipeline_create(&pipeline, cache,
&ocf_metadata_hash_flush_sb_pipeline_props);
if (result) {
cmpl(priv, result);
return;
}
if (result)
OCF_CMPL_RET(priv, result);
context = ocf_pipeline_get_priv(pipeline);
@@ -1683,10 +1677,8 @@ static void ocf_metadata_hash_flush_all(ocf_cache_t cache,
result = ocf_pipeline_create(&pipeline, cache,
&ocf_metadata_hash_flush_all_pipeline_props);
if (result) {
cmpl(priv, result);
return;
}
if (result)
OCF_CMPL_RET(priv, result);
context = ocf_pipeline_get_priv(pipeline);
@@ -1807,10 +1799,8 @@ static void ocf_metadata_hash_load_all(ocf_cache_t cache,
result = ocf_pipeline_create(&pipeline, cache,
&ocf_metadata_hash_load_all_pipeline_props);
if (result) {
cmpl(priv, result);
return;
}
if (result)
OCF_CMPL_RET(priv, result);
context = ocf_pipeline_get_priv(pipeline);
@@ -1968,10 +1958,8 @@ static void _ocf_metadata_hash_load_recovery_legacy(ocf_cache_t cache,
result = ocf_pipeline_create(&pipeline, cache,
&ocf_metadata_hash_load_recovery_legacy_pl_props);
if (result) {
cmpl(priv, result);
return;
}
if (result)
OCF_CMPL_RET(priv, result);
context = ocf_pipeline_get_priv(pipeline);
@@ -2117,10 +2105,8 @@ static void _ocf_metadata_hash_load_recovery_atomic(ocf_cache_t cache,
result = ocf_pipeline_create(&pipeline, cache,
&ocf_metadata_hash_load_recovery_atomic_pl_props);
if (result) {
cmpl(priv, result);
return;
}
if (result)
OCF_CMPL_RET(priv, result);
context = ocf_pipeline_get_priv(pipeline);

View File

@@ -9,6 +9,7 @@
#include "metadata_io.h"
#include "metadata_raw_atomic.h"
#include "../ocf_def_priv.h"
#include "../ocf_priv.h"
#define OCF_METADATA_RAW_DEBUG 0
@@ -250,10 +251,8 @@ static void _raw_ram_load_all(ocf_cache_t cache, struct ocf_metadata_raw *raw,
OCF_DEBUG_TRACE(cache);
context = env_vmalloc(sizeof(*context));
if (!context) {
cmpl(priv, -OCF_ERR_NO_MEM);
return;
}
if (!context)
OCF_CMPL_RET(priv, -OCF_ERR_NO_MEM);
context->raw = raw;
context->cmpl = cmpl;
@@ -319,10 +318,8 @@ static void _raw_ram_flush_all(ocf_cache_t cache, struct ocf_metadata_raw *raw,
OCF_DEBUG_TRACE(cache);
context = env_vmalloc(sizeof(*context));
if (!context) {
cmpl(priv, -OCF_ERR_NO_MEM);
return;
}
if (!context)
OCF_CMPL_RET(priv, -OCF_ERR_NO_MEM);
context->raw = raw;
context->cmpl = cmpl;

View File

@@ -13,6 +13,7 @@
#include "../utils/utils_io.h"
#include "../utils/utils_req.h"
#include "../ocf_def_priv.h"
#include "../ocf_priv.h"
#define OCF_METADATA_RAW_DEBUG 0
@@ -434,10 +435,8 @@ void raw_dynamic_load_all(ocf_cache_t cache, struct ocf_metadata_raw *raw,
OCF_DEBUG_TRACE(cache);
context = env_vzalloc(sizeof(*context));
if (!context) {
cmpl(priv, -OCF_ERR_NO_MEM);
return;
}
if (!context)
OCF_CMPL_RET(priv, -OCF_ERR_NO_MEM);
context->raw = raw;
context->cache = cache;
@@ -475,7 +474,7 @@ err_zpage:
ctx_data_free(cache->owner, context->data);
err_data:
env_vfree(context);
cmpl(priv, result);
OCF_CMPL_RET(priv, result);
}
/*
@@ -534,10 +533,8 @@ void raw_dynamic_flush_all(ocf_cache_t cache, struct ocf_metadata_raw *raw,
OCF_DEBUG_TRACE(cache);
context = env_vmalloc(sizeof(*context));
if (!context) {
cmpl(priv, -OCF_ERR_NO_MEM);
return;
}
if (!context)
OCF_CMPL_RET(priv, -OCF_ERR_NO_MEM);
context->raw = raw;
context->cmpl = cmpl;
@@ -548,7 +545,7 @@ void raw_dynamic_flush_all(ocf_cache_t cache, struct ocf_metadata_raw *raw,
raw_dynamic_flush_all_fill,
raw_dynamic_flush_all_complete);
if (result)
cmpl(priv, result);
OCF_CMPL_RET(priv, result);
}
/*