Commit 9452abe6 authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Tomasz Zawadzki
Browse files

lib/ftl: Introduce init handler in FTL management



When executing, management call procedure, the FTL
management process might provide init handler. This will
be invoked before the process' steps execution.

Change-Id: I0caf865a9190a863193748efa81ba2faf0f2b306
Signed-off-by: default avatarMariusz Barczak <Mariusz.Barczak@solidigmtechnology.com>
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19606


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
parent f491ecfe
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -157,9 +157,24 @@ error:
	return NULL;
}

static int
invoke_init_handler(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt,
		    const struct ftl_mngt_process_desc *pdesc, void *init_ctx)
{
	int rc = 0;

	if (init_ctx || pdesc->init_handler) {
		ftl_bug(!init_ctx);
		ftl_bug(!pdesc->init_handler);
		rc = pdesc->init_handler(dev, mngt, init_ctx);
	}

	return rc;
}

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)
			  ftl_mngt_completion cb, void *cb_ctx, bool silent, void *init_ctx)
{
	const struct ftl_mngt_step_desc *sdesc;
	struct ftl_mngt_process *mngt;
@@ -192,6 +207,11 @@ _ftl_mngt_process_execute(struct spdk_ftl_dev *dev, const struct ftl_mngt_proces
		sdesc++;
	}

	rc = invoke_init_handler(dev, mngt, pdesc, init_ctx);
	if (rc) {
		goto error;
	}

	action_execute(mngt);
	return 0;
error:
@@ -203,7 +223,7 @@ int
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);
	return _ftl_mngt_process_execute(dev, pdesc, cb, cb_ctx, false, NULL);
}

int
@@ -340,9 +360,10 @@ child_cb(struct spdk_ftl_dev *dev, void *ctx, int status)

void
ftl_mngt_call_process(struct ftl_mngt_process *mngt,
		      const struct ftl_mngt_process_desc *pdesc)
		      const struct ftl_mngt_process_desc *pdesc,
		      void *init_ctx)
{
	if (_ftl_mngt_process_execute(mngt->dev, pdesc, child_cb, mngt, true)) {
	if (_ftl_mngt_process_execute(mngt->dev, pdesc, child_cb, mngt, true, init_ctx)) {
		ftl_mngt_fail_step(mngt);
	} else {
		if (mngt->rollback) {
+26 −1
Original line number Diff line number Diff line
@@ -20,6 +20,20 @@ struct ftl_mngt_process;
 */
typedef void (*ftl_mngt_fn)(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt);

/**
 * The FTL management init function
 *
 * @param dev FTL device
 * @param mngt FTL management handle
 * @param init_ctx The initialization context
 *
 * @return Initialization status
 * @retval 0 initialization successful, the process can be executed
 * @retval non-zero an error occurred during initialization, fail the process
 */
typedef int (*ftl_mngt_init_fn)(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt,
				void *init_ctx);

/**
 * The FTL management process completion callback function
 *
@@ -97,6 +111,12 @@ struct ftl_mngt_process_desc {
	 */
	ftl_mngt_fn error_handler;

	/**
	 * The initialization handler is invoked when the management process is
	 * being created before the execution of the process
	 */
	ftl_mngt_init_fn init_handler;

	/**
	 * The FTL process steps
	 *
@@ -271,9 +291,14 @@ void ftl_mngt_fail_step(struct ftl_mngt_process *mngt);
 *
 * @param mngt The management handle
 * @param process The management process to be called
 * @param init_ctx Process initialization context
 *
 * @note If the initialization procedure is required then both init_ctx and
 * init_handler in the process descriptor must be provided.
 */
void ftl_mngt_call_process(struct ftl_mngt_process *mngt,
			   const struct ftl_mngt_process_desc *process);
			   const struct ftl_mngt_process_desc *process,
			   void *init_ctx);

/**
 * @brief Calls rollback steps of another management process
+5 −5
Original line number Diff line number Diff line
@@ -351,7 +351,7 @@ static const struct ftl_mngt_process_desc desc_persist = {
void
ftl_mngt_persist_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	ftl_mngt_call_process(mngt, &desc_persist);
	ftl_mngt_call_process(mngt, &desc_persist, NULL);
}

/*
@@ -372,7 +372,7 @@ static const struct ftl_mngt_process_desc desc_fast_persist = {
void
ftl_mngt_fast_persist_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	ftl_mngt_call_process(mngt, &desc_fast_persist);
	ftl_mngt_call_process(mngt, &desc_fast_persist, NULL);
}

void
@@ -636,9 +636,9 @@ shm_retry:

	/* Initialize the superblock */
	if (dev->conf.mode & SPDK_FTL_MODE_CREATE) {
		ftl_mngt_call_process(mngt, &desc_init_sb);
		ftl_mngt_call_process(mngt, &desc_init_sb, NULL);
	} else {
		ftl_mngt_call_process(mngt, &desc_restore_sb);
		ftl_mngt_call_process(mngt, &desc_restore_sb, NULL);
	}
}

@@ -754,7 +754,7 @@ static const struct ftl_mngt_process_desc desc_restore = {
void
ftl_mngt_restore_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	ftl_mngt_call_process(mngt, &desc_restore);
	ftl_mngt_call_process(mngt, &desc_restore, NULL);
}

void
+2 −2
Original line number Diff line number Diff line
@@ -810,7 +810,7 @@ static void
ftl_mngt_recovery_shm_l2p(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	if (ftl_fast_recovery(dev)) {
		ftl_mngt_call_process(mngt, &g_desc_recovery_shm);
		ftl_mngt_call_process(mngt, &g_desc_recovery_shm, NULL);
	} else {
		ftl_mngt_skip_step(mngt);
	}
@@ -968,5 +968,5 @@ static const struct ftl_mngt_process_desc g_desc_recovery_shm = {
void
ftl_mngt_recover(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	ftl_mngt_call_process(mngt, &g_desc_recovery);
	ftl_mngt_call_process(mngt, &g_desc_recovery, NULL);
}
+1 −1
Original line number Diff line number Diff line
@@ -203,7 +203,7 @@ void
ftl_mngt_self_test(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	if (getenv("FTL_SELF_TEST")) {
		ftl_mngt_call_process(mngt, &desc_self_test);
		ftl_mngt_call_process(mngt, &desc_self_test, NULL);
	} else {
		FTL_NOTICELOG(dev, "Self test skipped\n");
		ftl_mngt_next_step(mngt);
Loading