FTL: Initialize nv_cache metadata on startup
Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com> Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com> Change-Id: Ie1a60ec8d1e05b1e4dec85a7187cffad24496460 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13320 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
ece0e0eee7
commit
506315a651
@ -325,6 +325,44 @@ chunk_free_p2l_map(struct ftl_nv_cache_chunk *chunk)
|
|||||||
ftl_chunk_free_md_entry(chunk);
|
ftl_chunk_free_md_entry(chunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ftl_nv_cache_save_state(struct ftl_nv_cache *nv_cache)
|
||||||
|
{
|
||||||
|
struct spdk_ftl_dev *dev = SPDK_CONTAINEROF(nv_cache, struct spdk_ftl_dev, nv_cache);
|
||||||
|
struct ftl_nv_cache_chunk *chunk;
|
||||||
|
int status = 0;
|
||||||
|
uint64_t i;
|
||||||
|
|
||||||
|
assert(nv_cache->chunk_open_count == 0);
|
||||||
|
|
||||||
|
chunk = nv_cache->chunks;
|
||||||
|
if (!chunk) {
|
||||||
|
FTL_ERRLOG(dev, "Cannot save NV cache state, no NV cache metadata\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nv_cache->chunk_count; i++, chunk++) {
|
||||||
|
nvc_validate_md(nv_cache, chunk->md);
|
||||||
|
|
||||||
|
if (chunk->md->blocks_written == nv_cache->chunk_blocks) {
|
||||||
|
/* Full chunk */
|
||||||
|
} else if (0 == chunk->md->blocks_written) {
|
||||||
|
/* Empty chunk */
|
||||||
|
} else {
|
||||||
|
assert(0);
|
||||||
|
status = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status) {
|
||||||
|
FTL_ERRLOG(dev, "Cannot save NV cache state, inconsistent NV cache"
|
||||||
|
"metadata\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
chunk_alloc_p2l_map(struct ftl_nv_cache_chunk *chunk)
|
chunk_alloc_p2l_map(struct ftl_nv_cache_chunk *chunk)
|
||||||
{
|
{
|
||||||
|
@ -137,6 +137,8 @@ int ftl_nv_cache_read(struct ftl_io *io, ftl_addr addr, uint32_t num_blocks,
|
|||||||
bool ftl_nv_cache_full(struct ftl_nv_cache *nv_cache);
|
bool ftl_nv_cache_full(struct ftl_nv_cache *nv_cache);
|
||||||
void ftl_nv_cache_process(struct spdk_ftl_dev *dev);
|
void ftl_nv_cache_process(struct spdk_ftl_dev *dev);
|
||||||
|
|
||||||
|
int ftl_nv_cache_save_state(struct ftl_nv_cache *nv_cache);
|
||||||
|
|
||||||
void ftl_nv_cache_halt(struct ftl_nv_cache *nv_cache);
|
void ftl_nv_cache_halt(struct ftl_nv_cache *nv_cache);
|
||||||
|
|
||||||
int ftl_nv_cache_chunks_busy(struct ftl_nv_cache *nv_cache);
|
int ftl_nv_cache_chunks_busy(struct ftl_nv_cache *nv_cache);
|
||||||
|
@ -120,6 +120,17 @@ persist(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt,
|
|||||||
ftl_md_persist(md);
|
ftl_md_persist(md);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ftl_mngt_persist_nv_cache_metadata(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt)
|
||||||
|
{
|
||||||
|
if (ftl_nv_cache_save_state(&dev->nv_cache)) {
|
||||||
|
ftl_mngt_fail_step(mngt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
persist(dev, mngt, FTL_LAYOUT_REGION_TYPE_NVC_MD);
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t
|
static uint32_t
|
||||||
get_sb_crc(struct ftl_superblock *sb)
|
get_sb_crc(struct ftl_superblock *sb)
|
||||||
{
|
{
|
||||||
|
@ -108,6 +108,10 @@ static const struct ftl_mngt_process_desc desc_first_start = {
|
|||||||
.name = "Scrub NV cache",
|
.name = "Scrub NV cache",
|
||||||
.action = ftl_mngt_scrub_nv_cache,
|
.action = ftl_mngt_scrub_nv_cache,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "Save initial chunk info metadata",
|
||||||
|
.action = ftl_mngt_persist_nv_cache_metadata,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "Set FTL dirty state",
|
.name = "Set FTL dirty state",
|
||||||
.action = ftl_mngt_set_dirty,
|
.action = ftl_mngt_set_dirty,
|
||||||
|
@ -68,4 +68,6 @@ void ftl_mngt_init_default_sb(struct spdk_ftl_dev *dev, struct ftl_mngt_process
|
|||||||
|
|
||||||
void ftl_mngt_set_dirty(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt);
|
void ftl_mngt_set_dirty(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt);
|
||||||
|
|
||||||
|
void ftl_mngt_persist_nv_cache_metadata(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt);
|
||||||
|
|
||||||
#endif /* FTL_MNGT_STEPS_H */
|
#endif /* FTL_MNGT_STEPS_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user