diff --git a/lib/ftl/mngt/ftl_mngt.c b/lib/ftl/mngt/ftl_mngt.c index 5faadd3e7..ca61acc58 100644 --- a/lib/ftl/mngt/ftl_mngt.c +++ b/lib/ftl/mngt/ftl_mngt.c @@ -28,11 +28,11 @@ struct ftl_mngt_step { struct ftl_mngt_process { struct spdk_ftl_dev *dev; int status; - int silent; + bool silent; bool rollback; bool continuing; struct { - ftl_mngt_fn cb; + ftl_mngt_completion cb; void *cb_ctx; struct spdk_thread *thread; } caller; @@ -121,9 +121,8 @@ free_mngt(struct ftl_mngt_process *mngt) } static struct ftl_mngt_process * -allocate_mngt(struct spdk_ftl_dev *dev, - const struct ftl_mngt_process_desc *pdesc, - ftl_mngt_fn cb, void *cb_ctx) +allocate_mngt(struct spdk_ftl_dev *dev, const struct ftl_mngt_process_desc *pdesc, + ftl_mngt_completion cb, void *cb_ctx, bool silent) { struct ftl_mngt_process *mngt; @@ -133,6 +132,7 @@ allocate_mngt(struct spdk_ftl_dev *dev, goto error; } mngt->dev = dev; + mngt->silent = silent; mngt->caller.cb = cb; mngt->caller.cb_ctx = cb_ctx; mngt->caller.thread = spdk_get_thread(); @@ -157,16 +157,15 @@ error: return NULL; } -int -ftl_mngt_process_execute(struct spdk_ftl_dev *dev, - const struct ftl_mngt_process_desc *pdesc, - ftl_mngt_fn cb, void *cb_ctx) +static int +_ftl_mngt_process_execute(struct spdk_ftl_dev *dev, const struct ftl_mngt_process_desc *pdesc, + ftl_mngt_completion cb, void *cb_ctx, bool silent) { const struct ftl_mngt_step_desc *sdesc; struct ftl_mngt_process *mngt; int rc = 0; - mngt = allocate_mngt(dev, pdesc, cb, cb_ctx); + mngt = allocate_mngt(dev, pdesc, cb, cb_ctx, silent); if (!mngt) { rc = -ENOMEM; goto error; @@ -201,15 +200,21 @@ error: } int -ftl_mngt_process_rollback(struct spdk_ftl_dev *dev, - const struct ftl_mngt_process_desc *pdesc, - ftl_mngt_fn cb, void *cb_ctx) +ftl_mngt_process_execute(struct spdk_ftl_dev *dev, const struct ftl_mngt_process_desc *pdesc, + ftl_mngt_completion cb, void *cb_ctx) +{ + return _ftl_mngt_process_execute(dev, pdesc, cb, cb_ctx, false); +} + +int +ftl_mngt_process_rollback(struct spdk_ftl_dev *dev, const struct ftl_mngt_process_desc *pdesc, + ftl_mngt_completion cb, void *cb_ctx) { const struct ftl_mngt_step_desc *sdesc; struct ftl_mngt_process *mngt; int rc = 0; - mngt = allocate_mngt(dev, pdesc, cb, cb_ctx); + mngt = allocate_mngt(dev, pdesc, cb, cb_ctx, true); if (!mngt) { rc = -ENOMEM; goto error; @@ -285,12 +290,6 @@ ftl_mngt_get_caller_ctx(struct ftl_mngt_process *mngt) return mngt->caller.cb_ctx; } -int -ftl_mngt_get_status(struct ftl_mngt_process *mngt) -{ - return mngt->status; -} - void ftl_mngt_next_step(struct ftl_mngt_process *mngt) { @@ -328,12 +327,9 @@ ftl_mngt_continue_step(struct ftl_mngt_process *mngt) } static void -child_cb(struct spdk_ftl_dev *dev, struct ftl_mngt_process *child) +child_cb(struct spdk_ftl_dev *dev, void *ctx, int status) { - int status = ftl_mngt_get_status(child); - struct ftl_mngt_process *parent = ftl_mngt_get_caller_ctx(child); - - child->silent = true; + struct ftl_mngt_process *parent = ctx; if (status) { ftl_mngt_fail_step(parent); @@ -346,7 +342,7 @@ void ftl_mngt_call_process(struct ftl_mngt_process *mngt, const struct ftl_mngt_process_desc *pdesc) { - if (ftl_mngt_process_execute(mngt->dev, pdesc, child_cb, mngt)) { + if (_ftl_mngt_process_execute(mngt->dev, pdesc, child_cb, mngt, true)) { ftl_mngt_fail_step(mngt); } else { if (mngt->rollback) { @@ -436,7 +432,7 @@ finish_msg(void *ctx) { struct ftl_mngt_process *mngt = ctx; - mngt->caller.cb(mngt->dev, mngt); + mngt->caller.cb(mngt->dev, mngt->caller.cb_ctx, mngt->status); process_summary(mngt); free_mngt(mngt); } diff --git a/lib/ftl/mngt/ftl_mngt.h b/lib/ftl/mngt/ftl_mngt.h index fe4100287..b78a6f79b 100644 --- a/lib/ftl/mngt/ftl_mngt.h +++ b/lib/ftl/mngt/ftl_mngt.h @@ -20,6 +20,15 @@ struct ftl_mngt_process; */ typedef void (*ftl_mngt_fn)(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt); +/** + * The FTL management process completion callback function + * + * @param dev FTL device + * @param ctx Caller context + * @param status The operation result of the management process + */ +typedef void (*ftl_mngt_completion)(struct spdk_ftl_dev *dev, void *ctx, int status); + /** * The FTL management step descriptior */ @@ -116,7 +125,7 @@ struct ftl_mngt_process_desc { */ int ftl_mngt_process_execute(struct spdk_ftl_dev *dev, const struct ftl_mngt_process_desc *process, - ftl_mngt_fn cb, void *cb_ctx); + ftl_mngt_completion cb, void *cb_ctx); /** * @brief Executes rollback on the FTL management process defined by the process @@ -135,7 +144,7 @@ int ftl_mngt_process_execute(struct spdk_ftl_dev *dev, */ int ftl_mngt_process_rollback(struct spdk_ftl_dev *dev, const struct ftl_mngt_process_desc *process, - ftl_mngt_fn cb, void *cb_ctx); + ftl_mngt_completion cb, void *cb_ctx); /* * FTL management API for steps @@ -199,19 +208,6 @@ void *ftl_mngt_get_process_ctx(struct ftl_mngt_process *mngt); */ void *ftl_mngt_get_caller_ctx(struct ftl_mngt_process *mngt); -/** - * @brief Gets the status of executed management process - * - * @param mngt FTL management handle - * - * @note This function can be invoked within ftl_mngt_fn callback only - * - * @return The operation result of the management process - * @retval 0 Operation successful - * @retval Non-zero Operation failure - */ -int ftl_mngt_get_status(struct ftl_mngt_process *mngt); - /** * @brief Finishes the management process immediately * diff --git a/test/unit/lib/ftl/ftl_mngt/ftl_mngt_ut.c b/test/unit/lib/ftl/ftl_mngt/ftl_mngt_ut.c index 92dc413ad..f86e6c87b 100644 --- a/test/unit/lib/ftl/ftl_mngt/ftl_mngt_ut.c +++ b/test/unit/lib/ftl/ftl_mngt/ftl_mngt_ut.c @@ -80,7 +80,7 @@ check_elem_on_list_and_remove(int compared_elem) } static void -fn_finish(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) +fn_finish(struct spdk_ftl_dev *dev, void *ctx, int status) { add_elem_to_test_list(CALLER_CB_RET_VALUE); g_thread_send_msg_container.fn = NULL; @@ -89,7 +89,7 @@ fn_finish(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) typedef int (*ftl_execute_fn)(struct spdk_ftl_dev *dev, const struct ftl_mngt_process_desc *process, - ftl_mngt_fn cb, void *cb_cntx); + ftl_mngt_completion cb, void *cb_cntx); static void run_ftl_mngt_with_cb_cntx(ftl_execute_fn exec_fn,