Commit 8fc78fd8 authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Tomasz Zawadzki
Browse files

lib/ftl: Add ability to upgrade to version 5 of superblock



Add the upgrade functions and ability to load older version to convert
to the blob format.

Change-Id: I13a2f52ca4e3b3e5d40aa847fccd0e761e5d16ce
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20554


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
parent 845c9ae2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ md_region_open(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type, u
	region->entry_size = entry_size / FTL_BLOCK_SIZE;
	region->num_entries = entry_count;

	region->current.version = region->prev.version = reg_version;
	region->current.version = reg_version;
	region->current.offset = reg_search_ctx->blk_offs;
	region->current.blocks = reg_search_ctx->blk_sz;

+8 −1
Original line number Diff line number Diff line
@@ -125,13 +125,20 @@ ftl_validate_regions(struct spdk_ftl_dev *dev, struct ftl_layout *layout)
	enum ftl_layout_region_type i, j;

	/* Validate if regions doesn't overlap each other  */
	/* TODO: major upgrades: keep track of and validate free_nvc/free_btm regions */
	for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; i++) {
		struct ftl_layout_region *r1 = ftl_layout_region_get(dev, i);

		if (!r1) {
			continue;
		}

		for (j = 0; j < FTL_LAYOUT_REGION_TYPE_MAX; j++) {
			struct ftl_layout_region *r2 = ftl_layout_region_get(dev, j);

			if (!r2) {
				continue;
			}

			if (r1->bdev_desc != r2->bdev_desc) {
				continue;
			}
+1 −6
Original line number Diff line number Diff line
@@ -81,8 +81,6 @@ struct ftl_layout_region_descriptor {

	/* Number of blocks in FTL_BLOCK_SIZE unit */
	uint64_t blocks;

	struct ftl_superblock_v3_md_region *sb_md_reg;
};

/* Data or metadata region on devices */
@@ -96,12 +94,9 @@ struct ftl_layout_region {
	/* Mirror region type - a region may be mirrored for higher durability */
	enum ftl_layout_region_type mirror_type;

	/* Latest region version */
	/* Current region version */
	struct ftl_layout_region_descriptor current;

	/* Previous region version, if found */
	struct ftl_layout_region_descriptor prev;

	/* Number of blocks in FTL_BLOCK_SIZE unit of a single entry.
	 * A metadata region may be subdivided into multiple smaller entries.
	 * Eg. there's one region describing all bands, but you may be able to access
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ sb_get_ops(uint64_t version)
			.blob_validate = ftl_superblock_v5_validate_blob_area,
			.blob_store = ftl_superblock_v5_store_blob_area,
			.blob_load = ftl_superblock_v5_load_blob_area,
			.upgrade_region = ftl_superblock_v5_md_layout_upgrade_region,
			.layout_apply = ftl_superblock_v5_md_layout_apply,
			.layout_dump = ftl_superblock_v5_md_layout_dump,
		},
+1 −1
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ md_region_open(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type, u
	region->entry_size = entry_size / FTL_BLOCK_SIZE;
	region->num_entries = entry_count;

	region->current.version = region->prev.version = reg_version;
	region->current.version = reg_version;
	region->current.offset = reg_search_ctx->blk_offs;
	region->current.blocks = reg_search_ctx->blk_sz;

Loading