Spdk/lib/ftl/ftl_sb_common.h
Kozlowski Mateusz 920c1cca18 ftl: Change metadata to use structure packing
Don't rely on compiler for metadata packing to 4KiB size and add
reserved fields manually. For compatibility reasons against metadata
relying on automatic padding the reserved fields are also added in-between
existing fields as needed.

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Change-Id: I5e342d5bf5948c213d455590d09597ae120b3c62
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14307
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
2022-09-20 19:24:26 +00:00

77 lines
2.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) Intel Corporation.
* All rights reserved.
*/
#ifndef FTL_SB_COMMON_H
#define FTL_SB_COMMON_H
#include "spdk/stdinc.h"
#include "utils/ftl_defs.h"
#include "utils/ftl_df.h"
/* Size of superblock on NV cache, make it bigger for future fields */
#define FTL_SUPERBLOCK_SIZE (128ULL * KiB)
#define FTL_MAGIC(a, b, c, d) \
((UINT64_C(a) << 48) | (UINT64_C(b) << 32) | (UINT64_C(c) << 16) | \
UINT64_C(d))
/**
* Magic number identifies FTL superblock
*/
#define FTL_SUPERBLOCK_MAGIC FTL_MAGIC(0x1410, 0x1683, 0x1920, 0x1989)
struct ftl_superblock_gc_info {
/* High priority band; if there's no free bands after dirty shutdown, don't restart GC from same id, or phys_id -
* pick actual lowest validity band to avoid being stuck and try to write it to the open band.
*/
uint64_t band_id_high_prio;
/* Currently relocated band (note it's just id, not seq_id ie. its actual location on disk) */
uint64_t current_band_id;
/* Bands are grouped together into larger reclaim units; this is the band id translated to those units */
uint64_t band_phys_id;
/* May be updating multiple fields at the same time, clearing/setting this marks the transaction */
uint64_t is_valid;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct ftl_superblock_gc_info) == 32,
"ftl_superblock_gc_info incorrect size");
struct ftl_superblock_header {
uint64_t magic;
uint64_t crc;
uint64_t version;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct ftl_superblock_header) == 24,
"ftl_superblock_header incorrect size");
struct ftl_superblock_md_region {
uint32_t type;
uint32_t version;
uint64_t blk_offs;
uint64_t blk_sz;
ftl_df_obj_id df_next;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct ftl_superblock_md_region) == 32,
"ftl_superblock_md_region incorrect size");
struct ftl_superblock_shm {
/* SHM initialization completed */
bool shm_ready;
/* SHM status - fast restart */
bool shm_clean;
/* Used to continue trim after SHM recovery */
struct {
bool in_progress;
uint64_t start_lba;
uint64_t num_blocks;
uint64_t seq_id;
} trim;
struct ftl_superblock_gc_info gc_info;
};
#endif /* FTL_SB_COMMON_H */