Ftl: Add clean restore management path

Adds ability for FTL to startup after clean shutdown.

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I2f1b83bb3eb1487b6665c95e76c48881e8899b16
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13364
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Kozlowski Mateusz 2022-05-31 13:41:15 +02:00 committed by Ben Walker
parent d4b9f2c68b
commit 86619848ec

View File

@ -9,6 +9,8 @@
static const struct ftl_mngt_process_desc desc_startup;
static const struct ftl_mngt_process_desc desc_first_start;
static const struct ftl_mngt_process_desc desc_restore;
static const struct ftl_mngt_process_desc desc_clean_start;
static void
ftl_mngt_select_startup_mode(struct spdk_ftl_dev *dev,
@ -16,6 +18,17 @@ ftl_mngt_select_startup_mode(struct spdk_ftl_dev *dev,
{
if (dev->conf.mode & SPDK_FTL_MODE_CREATE) {
ftl_mngt_call_process(mngt, &desc_first_start);
} else {
ftl_mngt_call_process(mngt, &desc_restore);
}
}
static void
ftl_mngt_select_restore_mode(struct spdk_ftl_dev *dev,
struct ftl_mngt_process *mngt)
{
if (dev->sb->clean) {
ftl_mngt_call_process(mngt, &desc_clean_start);
} else {
ftl_mngt_fail_step(mngt);
}
@ -166,6 +179,64 @@ static const struct ftl_mngt_process_desc desc_first_start = {
}
};
/*
* Step utilized on loading of an FTL instance - decides on dirty/clean shutdown path.
*/
static const struct ftl_mngt_process_desc desc_restore = {
.name = "FTL restore",
.steps = {
{
.name = "Select recovery mode",
.action = ftl_mngt_select_restore_mode,
},
{}
}
};
/*
* Loading of FTL after clean shutdown.
*/
static const struct ftl_mngt_process_desc desc_clean_start = {
.name = "Clean startup",
.steps = {
{
.name = "Restore metadata",
.action = ftl_mngt_restore_md
},
{
.name = "Initialize L2P",
.action = ftl_mngt_init_l2p,
.cleanup = ftl_mngt_deinit_l2p
},
{
.name = "Restore L2P",
.action = ftl_mngt_restore_l2p,
},
{
.name = "Finalize band initialization",
.action = ftl_mngt_finalize_init_bands,
},
{
.name = "Start core poller",
.action = ftl_mngt_start_core_poller,
.cleanup = ftl_mngt_stop_core_poller
},
{
.name = "Self test on startup",
.action = ftl_mngt_self_test,
},
{
.name = "Set FTL dirty state",
.action = ftl_mngt_set_dirty,
},
{
.name = "Finalize initialization",
.action = ftl_mngt_finalize_startup,
},
{}
}
};
int
ftl_mngt_call_dev_startup(struct spdk_ftl_dev *dev, ftl_mngt_completion cb, void *cb_cntx)
{