diff --git a/lib/ftl/Makefile b/lib/ftl/Makefile index c1a8a86fb..f66a16aeb 100644 --- a/lib/ftl/Makefile +++ b/lib/ftl/Makefile @@ -33,7 +33,8 @@ C_SRCS += mngt/ftl_mngt_md.c mngt/ftl_mngt_misc.c mngt/ftl_mngt_ioch.c mngt/ftl_ C_SRCS += mngt/ftl_mngt_band.c mngt/ftl_mngt_self_test.c mngt/ftl_mngt_p2l.c C_SRCS += mngt/ftl_mngt_recovery.c mngt/ftl_mngt_upgrade.c C_SRCS += utils/ftl_conf.c utils/ftl_md.c utils/ftl_mempool.c utils/ftl_bitmap.c -C_SRCS += upgrade/ftl_layout_upgrade.c upgrade/ftl_sb_upgrade.c +C_SRCS += upgrade/ftl_layout_upgrade.c upgrade/ftl_sb_upgrade.c upgrade/ftl_p2l_upgrade.c +C_SRCS += upgrade/ftl_band_upgrade.c upgrade/ftl_chunk_upgrade.c SPDK_MAP_FILE = $(abspath $(CURDIR)/spdk_ftl.map) diff --git a/lib/ftl/ftl_sb.c b/lib/ftl/ftl_sb.c index 591534019..728369898 100644 --- a/lib/ftl/ftl_sb.c +++ b/lib/ftl/ftl_sb.c @@ -64,7 +64,7 @@ superblock_md_region_overflow(struct spdk_ftl_dev *dev, struct ftl_superblock_md } /* Make sure the entry doesn't overflow the pointer value (probably overkill to check) */ - if (UINT64_MAX - (uintptr_t)sb_reg < sizeof(*sb_reg)) { + if (UINT64_MAX - (uintptr_t)sb_reg <= sizeof(*sb_reg)) { return true; } diff --git a/lib/ftl/upgrade/ftl_band_upgrade.c b/lib/ftl/upgrade/ftl_band_upgrade.c new file mode 100644 index 000000000..0cf2e3387 --- /dev/null +++ b/lib/ftl/upgrade/ftl_band_upgrade.c @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) Intel Corporation. + * All rights reserved. + */ + +#include "ftl_band.h" +#include "ftl_layout_upgrade.h" + +struct ftl_region_upgrade_desc band_upgrade_desc[] = { + [FTL_BAND_VERSION_0] = { + .verify = ftl_region_upgrade_disabled, + }, +}; + +SPDK_STATIC_ASSERT(SPDK_COUNTOF(band_upgrade_desc) == FTL_BAND_VERSION_CURRENT, + "Missing band region upgrade descriptors"); diff --git a/lib/ftl/upgrade/ftl_chunk_upgrade.c b/lib/ftl/upgrade/ftl_chunk_upgrade.c new file mode 100644 index 000000000..e0a4e6411 --- /dev/null +++ b/lib/ftl/upgrade/ftl_chunk_upgrade.c @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) Intel Corporation. + * All rights reserved. + */ + +#include "ftl_nv_cache.h" +#include "ftl_layout_upgrade.h" + +struct ftl_region_upgrade_desc nvc_upgrade_desc[] = { + [FTL_NVC_VERSION_0] = { + .verify = ftl_region_upgrade_disabled, + }, +}; + +SPDK_STATIC_ASSERT(SPDK_COUNTOF(nvc_upgrade_desc) == FTL_NVC_VERSION_CURRENT, + "Missing NVC region upgrade descriptors"); diff --git a/lib/ftl/upgrade/ftl_layout_upgrade.c b/lib/ftl/upgrade/ftl_layout_upgrade.c index 24b92f3eb..67f862a44 100644 --- a/lib/ftl/upgrade/ftl_layout_upgrade.c +++ b/lib/ftl/upgrade/ftl_layout_upgrade.c @@ -45,17 +45,41 @@ static struct ftl_layout_upgrade_desc_list layout_upgrade_desc[] = { .desc = sb_upgrade_desc, }, [FTL_LAYOUT_REGION_TYPE_L2P] = {}, - [FTL_LAYOUT_REGION_TYPE_BAND_MD] = {}, - [FTL_LAYOUT_REGION_TYPE_BAND_MD_MIRROR] = {}, + [FTL_LAYOUT_REGION_TYPE_BAND_MD] = { + .count = FTL_BAND_VERSION_CURRENT, + .desc = band_upgrade_desc, + }, + [FTL_LAYOUT_REGION_TYPE_BAND_MD_MIRROR] = { + .count = FTL_BAND_VERSION_CURRENT, + .desc = band_upgrade_desc, + }, [FTL_LAYOUT_REGION_TYPE_VALID_MAP] = {}, - [FTL_LAYOUT_REGION_TYPE_NVC_MD] = {}, - [FTL_LAYOUT_REGION_TYPE_NVC_MD_MIRROR] = {}, + [FTL_LAYOUT_REGION_TYPE_NVC_MD] = { + .count = FTL_NVC_VERSION_CURRENT, + .desc = nvc_upgrade_desc, + }, + [FTL_LAYOUT_REGION_TYPE_NVC_MD_MIRROR] = { + .count = FTL_NVC_VERSION_CURRENT, + .desc = nvc_upgrade_desc, + }, [FTL_LAYOUT_REGION_TYPE_DATA_NVC] = {}, [FTL_LAYOUT_REGION_TYPE_DATA_BASE] = {}, - [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_GC] = {}, - [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_GC_NEXT] = {}, - [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_COMP] = {}, - [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_COMP_NEXT] = {}, + [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_GC] = { + .count = FTL_P2L_VERSION_CURRENT, + .desc = p2l_upgrade_desc, + }, + [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_GC_NEXT] = { + .count = FTL_P2L_VERSION_CURRENT, + .desc = p2l_upgrade_desc, + }, + [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_COMP] = { + .count = FTL_P2L_VERSION_CURRENT, + .desc = p2l_upgrade_desc, + }, + [FTL_LAYOUT_REGION_TYPE_P2L_CKPT_COMP_NEXT] = { + .count = FTL_P2L_VERSION_CURRENT, + .desc = p2l_upgrade_desc, + }, [FTL_LAYOUT_REGION_TYPE_TRIM_MD] = {}, [FTL_LAYOUT_REGION_TYPE_TRIM_MD_MIRROR] = {}, }; diff --git a/lib/ftl/upgrade/ftl_p2l_upgrade.c b/lib/ftl/upgrade/ftl_p2l_upgrade.c new file mode 100644 index 000000000..774a8e6ae --- /dev/null +++ b/lib/ftl/upgrade/ftl_p2l_upgrade.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) Intel Corporation. + * All rights reserved. + */ + +#include "mngt/ftl_mngt.h" +#include "mngt/ftl_mngt_steps.h" +#include "ftl_layout_upgrade.h" + +struct ftl_region_upgrade_desc p2l_upgrade_desc[] = { + [FTL_P2L_VERSION_0] = { + .verify = ftl_region_upgrade_disabled + }, +}; + +SPDK_STATIC_ASSERT(SPDK_COUNTOF(p2l_upgrade_desc) == FTL_P2L_VERSION_CURRENT, + "Missing P2L region upgrade descriptors");