Commit 7a7ac2af authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Konrad Sztyber
Browse files

ftl: metadata utils and initialization



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


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 2b5bba56
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ FTL_SUBDIRS := mngt utils
C_SRCS = ftl_core.c ftl_init.c ftl_layout.c
C_SRCS += mngt/ftl_mngt.c mngt/ftl_mngt_bdev.c mngt/ftl_mngt_shutdown.c mngt/ftl_mngt_startup.c
C_SRCS += mngt/ftl_mngt_md.c
C_SRCS += utils/ftl_conf.c
C_SRCS += utils/ftl_conf.c utils/ftl_md.c

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

+3 −0
Original line number Diff line number Diff line
@@ -101,6 +101,9 @@ struct ftl_layout {
	} l2p;

	struct ftl_layout_region region[FTL_LAYOUT_REGION_TYPE_MAX];

	/* Metadata object corresponding to the regions */
	struct ftl_md *md[FTL_LAYOUT_REGION_TYPE_MAX];
};

/**
+1 −0
Original line number Diff line number Diff line
@@ -8,5 +8,6 @@

#include "utils/ftl_defs.h"
#include "utils/ftl_conf.h"
#include "utils/ftl_md.h"

#endif /* FTL_FTL_UTILS_H */
+6 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include "ftl_internal.h"
#include "ftl_core.h"
#include "utils/ftl_defs.h"
#include "utils/ftl_md.h"

#define MINIMUM_CACHE_SIZE_GIB 5
#define MINIMUM_BASE_SIZE_GIB 20
@@ -210,6 +211,11 @@ ftl_mngt_open_cache_bdev(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt
	}

	dev->cache_md_size = spdk_bdev_get_md_size(bdev);
	if (dev->cache_md_size != sizeof(union ftl_md_vss)) {
		FTL_ERRLOG(dev, "Bdev's %s metadata is invalid size (%"PRIu32")\n",
			   spdk_bdev_get_name(bdev), spdk_bdev_get_md_size(bdev));
		goto error;
	}

	if (spdk_bdev_get_dif_type(bdev) != SPDK_DIF_DISABLE) {
		FTL_ERRLOG(dev, "Unsupported DIF type used by bdev %s\n",
+58 −0
Original line number Diff line number Diff line
@@ -21,3 +21,61 @@ ftl_mngt_init_layout(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
		ftl_mngt_next_step(mngt);
	}
}

static bool
is_buffer_needed(enum ftl_layout_region_type type)
{
	switch (type) {
	case FTL_LAYOUT_REGION_TYPE_DATA_NVC:
	case FTL_LAYOUT_REGION_TYPE_DATA_BASE:
		return false;

	default:
		return true;
	}
}

void
ftl_mngt_init_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	struct ftl_layout *layout = &dev->layout;
	struct ftl_layout_region *region = layout->region;
	uint64_t i;

	for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; i++, region++) {
		if (layout->md[i]) {
			/*
			 * Some metadata objects are initialized by other FTL
			 * components. At the moment it's only used by superblock (and its mirror) -
			 * during load time we need to read it earlier in order to get the layout for the
			 * other regions.
			 */
			continue;
		}
		layout->md[i] = ftl_md_create(dev, region->current.blocks, region->vss_blksz, region->name,
					      !is_buffer_needed(i), region);
		if (NULL == layout->md[i]) {
			ftl_mngt_fail_step(mngt);
			return;
		}
	}

	ftl_mngt_next_step(mngt);
}

void
ftl_mngt_deinit_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
	struct ftl_layout *layout = &dev->layout;
	struct ftl_layout_region *region = layout->region;
	uint64_t i;

	for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; i++, region++) {
		if (layout->md[i]) {
			ftl_md_destroy(layout->md[i]);
			layout->md[i] = NULL;
		}
	}

	ftl_mngt_next_step(mngt);
}
Loading