Spdk/lib/ftl/mngt/ftl_mngt_md.c
Artur Paszkiewicz 7a7ac2af33 ftl: metadata utils and initialization
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Signed-off-by: Kozlowski 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: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
2022-07-21 10:53:01 +00:00

82 lines
1.8 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) Intel Corporation.
* All rights reserved.
*/
#include "spdk/thread.h"
#include "spdk/crc32.h"
#include "ftl_core.h"
#include "ftl_mngt.h"
#include "ftl_mngt_steps.h"
#include "ftl_utils.h"
#include "ftl_internal.h"
void
ftl_mngt_init_layout(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
{
if (ftl_layout_setup(dev)) {
ftl_mngt_fail_step(mngt);
} else {
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);
}