Commit c8ab874d authored by Kozlowski Mateusz's avatar Kozlowski Mateusz Committed by Jim Harris
Browse files

ftl: Add upgrade of superblock from version 2 to version 3



Layout of metadata will be part of the superblock at the end of the upgrade.

Signed-off-by: default avatarKozlowski Mateusz <mateusz.kozlowski@intel.com>
Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: If888866806e948ee07f0777612da73ab8b7548b1
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13385


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
parent 7ff28519
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ 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
C_SRCS += upgrade/ftl_layout_upgrade.c upgrade/ftl_sb_upgrade.c

SPDK_MAP_FILE = $(abspath $(CURDIR)/spdk_ftl.map)

+4 −4
Original line number Diff line number Diff line
@@ -503,8 +503,8 @@ ftl_layout_setup_superblock(struct spdk_ftl_dev *dev)
	region->type = FTL_LAYOUT_REGION_TYPE_SB;
	region->mirror_type = FTL_LAYOUT_REGION_TYPE_SB_BASE;
	region->name = "sb";
	region->current.version = FTL_METADATA_VERSION_CURRENT;
	region->prev.version = FTL_METADATA_VERSION_CURRENT;
	region->current.version = FTL_SB_VERSION_CURRENT;
	region->prev.version = FTL_SB_VERSION_CURRENT;
	region->current.offset = 0;

	/*
@@ -527,8 +527,8 @@ ftl_layout_setup_superblock(struct spdk_ftl_dev *dev)
	region->type = FTL_LAYOUT_REGION_TYPE_SB_BASE;
	region->mirror_type = FTL_LAYOUT_REGION_TYPE_MAX;
	region->name = "sb_mirror";
	region->current.version = FTL_METADATA_VERSION_CURRENT;
	region->prev.version = FTL_METADATA_VERSION_CURRENT;
	region->current.version = FTL_SB_VERSION_CURRENT;
	region->prev.version = FTL_SB_VERSION_CURRENT;
	/* TODO: This should really be at offset 0 - think how best to upgrade between the two layouts
	 * This is an issue if some other metadata appears at block 0 of base device (most likely GPT or blobstore)
	 */
+15 −5
Original line number Diff line number Diff line
@@ -6,11 +6,16 @@
#include "ftl_sb.h"
#include "ftl_core.h"
#include "ftl_layout.h"
#include "upgrade/ftl_sb_prev.h"

bool
ftl_superblock_check_magic(struct ftl_superblock *sb)
{
	if (sb->header.version >= FTL_SB_VERSION_3) {
		return sb->header.magic == FTL_SUPERBLOCK_MAGIC;
	} else {
		return sb->header.magic == FTL_SUPERBLOCK_MAGIC_V2;
	}
}
bool
ftl_superblock_md_layout_is_empty(struct ftl_superblock *sb)
@@ -58,13 +63,13 @@ superblock_md_region_overflow(struct spdk_ftl_dev *dev, struct ftl_superblock_md
		return true;
	}

	/* There's only a finite (FTL_SUPERBLOCK_SIZE) amount of space in the superblock. Make sure the region wholly fits in that space. */
	if ((uintptr_t)(sb_reg + 1) > ((uintptr_t)(dev->sb) + FTL_SUPERBLOCK_SIZE)) {
	/* Make sure the entry doesn't overflow the pointer value (probably overkill to check) */
	if (UINT64_MAX - (uintptr_t)sb_reg < sizeof(*sb_reg)) {
		return true;
	}

	/* Make sure the entry doesn't overflow the pointer value (probably overkill to check) */
	if ((uintptr_t)(sb_reg + 1) < (uintptr_t)sb_reg) {
	/* There's only a finite (FTL_SUPERBLOCK_SIZE) amount of space in the superblock. Make sure the region wholly fits in that space. */
	if ((uintptr_t)(sb_reg + 1) > ((uintptr_t)(dev->sb) + FTL_SUPERBLOCK_SIZE)) {
		return true;
	}

@@ -258,6 +263,11 @@ next_sb_reg:
			break;
		}

		if (UINT64_MAX - (uintptr_t)sb <= sb_reg->df_next) {
			FTL_ERRLOG(dev, "Buffer overflow\n");
			return -EOVERFLOW;
		}

		sb_reg = ftl_df_get_obj_ptr(sb, sb_reg->df_next);
		if (superblock_md_region_overflow(dev, sb_reg)) {
			FTL_ERRLOG(dev, "Buffer overflow\n");
+2 −2
Original line number Diff line number Diff line
@@ -9,8 +9,8 @@
#include "spdk/uuid.h"
#include "ftl_sb_common.h"

#define FTL_METADATA_VERSION_4			4
#define FTL_METADATA_VERSION_CURRENT	FTL_METADATA_VERSION_4
#define FTL_SB_VERSION_4			4
#define FTL_SB_VERSION_CURRENT			FTL_SB_VERSION_4

struct ftl_superblock {
	struct ftl_superblock_header	header;
+11 −3
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include "ftl_internal.h"
#include "ftl_sb.h"
#include "upgrade/ftl_layout_upgrade.h"
#include "upgrade/ftl_sb_upgrade.h"

void
ftl_mngt_init_layout(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
@@ -255,8 +256,15 @@ get_sb_crc(struct ftl_superblock *sb)
	crc = spdk_crc32c_update(buffer, size, crc);

	buffer += offset + sizeof(sb->header.crc);
	if (sb->header.version > FTL_SB_VERSION_2) {
		/* whole buf for v3 and on: */
		size = FTL_SUPERBLOCK_SIZE - offset - sizeof(sb->header.crc);
		crc = spdk_crc32c_update(buffer, size, crc);
	} else {
		/* special for sb v2 only: */
		size = sizeof(struct ftl_superblock_v2) - offset - sizeof(sb->header.crc);
		sb->header.crc = spdk_crc32c_update(buffer, size, crc);
	}

	return crc;
}
@@ -358,7 +366,7 @@ ftl_mngt_init_default_sb(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt
	struct ftl_superblock *sb = dev->sb;

	sb->header.magic = FTL_SUPERBLOCK_MAGIC;
	sb->header.version = FTL_METADATA_VERSION_CURRENT;
	sb->header.version = FTL_SB_VERSION_CURRENT;
	sb->uuid = dev->conf.uuid;
	sb->clean = 0;
	dev->sb_shm->shm_clean = false;
Loading