lib/ftl: Update L2P management initialization flow

It fixes segmentation fault in cleanup path of L2P
after failure in L2P initialization.

Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Signed-off-by: Mariusz Barczak <mariusz.barczak@intel.com>
Change-Id: I1cffa2b39550421939731509c5a51c1565f0fa91
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16216
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
This commit is contained in:
Kozlowski Mateusz 2023-01-10 12:01:02 +01:00 committed by Tomasz Zawadzki
parent 9bd8b264ec
commit dd94984927
8 changed files with 24 additions and 2 deletions

View File

@ -123,6 +123,12 @@ ftl_l2p_is_halted(struct spdk_ftl_dev *dev)
return FTL_L2P_OP(is_halted)(dev); return FTL_L2P_OP(is_halted)(dev);
} }
void
ftl_l2p_resume(struct spdk_ftl_dev *dev)
{
return FTL_L2P_OP(resume)(dev);
}
void void
ftl_l2p_halt(struct spdk_ftl_dev *dev) ftl_l2p_halt(struct spdk_ftl_dev *dev)
{ {

View File

@ -47,6 +47,7 @@ void ftl_l2p_persist(struct spdk_ftl_dev *dev, ftl_l2p_cb cb, void *cb_ctx);
void ftl_l2p_process(struct spdk_ftl_dev *dev); void ftl_l2p_process(struct spdk_ftl_dev *dev);
bool ftl_l2p_is_halted(struct spdk_ftl_dev *dev); bool ftl_l2p_is_halted(struct spdk_ftl_dev *dev);
void ftl_l2p_halt(struct spdk_ftl_dev *dev); void ftl_l2p_halt(struct spdk_ftl_dev *dev);
void ftl_l2p_resume(struct spdk_ftl_dev *dev);
void ftl_l2p_update_cache(struct spdk_ftl_dev *dev, uint64_t lba, ftl_addr new_addr, void ftl_l2p_update_cache(struct spdk_ftl_dev *dev, uint64_t lba, ftl_addr new_addr,
ftl_addr old_addr); ftl_addr old_addr);

View File

@ -504,7 +504,6 @@ ftl_l2p_cache_init(struct spdk_ftl_dev *dev)
cache->cache_layout_bdev_desc = reg->bdev_desc; cache->cache_layout_bdev_desc = reg->bdev_desc;
cache->cache_layout_ioch = reg->ioch; cache->cache_layout_ioch = reg->ioch;
cache->state = L2P_CACHE_RUNNING;
return 0; return 0;
} }
@ -959,6 +958,15 @@ ftl_l2p_cache_halt(struct spdk_ftl_dev *dev)
} }
} }
void
ftl_l2p_cache_resume(struct spdk_ftl_dev *dev)
{
struct ftl_l2p_cache *cache = (struct ftl_l2p_cache *)dev->l2p;
assert(cache->state == L2P_CACHE_INIT);
cache->state = L2P_CACHE_RUNNING;
}
static inline struct ftl_l2p_page * static inline struct ftl_l2p_page *
get_page(struct ftl_l2p_cache *cache, uint64_t lba) get_page(struct ftl_l2p_cache *cache, uint64_t lba)
{ {

View File

@ -23,5 +23,6 @@ void ftl_l2p_cache_persist(struct spdk_ftl_dev *dev, ftl_l2p_cb cb, void *cb_ctx
void ftl_l2p_cache_process(struct spdk_ftl_dev *dev); void ftl_l2p_cache_process(struct spdk_ftl_dev *dev);
bool ftl_l2p_cache_is_halted(struct spdk_ftl_dev *dev); bool ftl_l2p_cache_is_halted(struct spdk_ftl_dev *dev);
void ftl_l2p_cache_halt(struct spdk_ftl_dev *dev); void ftl_l2p_cache_halt(struct spdk_ftl_dev *dev);
void ftl_l2p_cache_resume(struct spdk_ftl_dev *dev);
#endif /* FTL_L2P_CACHE_H */ #endif /* FTL_L2P_CACHE_H */

View File

@ -190,3 +190,8 @@ void
ftl_l2p_flat_halt(struct spdk_ftl_dev *dev) ftl_l2p_flat_halt(struct spdk_ftl_dev *dev)
{ {
} }
void
ftl_l2p_flat_resume(struct spdk_ftl_dev *dev)
{
}

View File

@ -19,5 +19,6 @@ void ftl_l2p_flat_persist(struct spdk_ftl_dev *dev, ftl_l2p_cb cb, void *cb_ctx)
void ftl_l2p_flat_process(struct spdk_ftl_dev *dev); void ftl_l2p_flat_process(struct spdk_ftl_dev *dev);
bool ftl_l2p_flat_is_halted(struct spdk_ftl_dev *dev); bool ftl_l2p_flat_is_halted(struct spdk_ftl_dev *dev);
void ftl_l2p_flat_halt(struct spdk_ftl_dev *dev); void ftl_l2p_flat_halt(struct spdk_ftl_dev *dev);
void ftl_l2p_flat_resume(struct spdk_ftl_dev *dev);
#endif /* FTL_L2P_FLAT_H */ #endif /* FTL_L2P_FLAT_H */

View File

@ -189,6 +189,7 @@ ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mng
dev->initialized = 1; dev->initialized = 1;
dev->sb_shm->shm_ready = true; dev->sb_shm->shm_ready = true;
ftl_l2p_resume(dev);
ftl_reloc_resume(dev->reloc); ftl_reloc_resume(dev->reloc);
ftl_writer_resume(&dev->writer_user); ftl_writer_resume(&dev->writer_user);
ftl_writer_resume(&dev->writer_gc); ftl_writer_resume(&dev->writer_gc);

View File

@ -161,7 +161,6 @@ static const struct ftl_mngt_process_desc desc_first_start = {
{ {
.name = "Clear L2P", .name = "Clear L2P",
.action = ftl_mngt_clear_l2p, .action = ftl_mngt_clear_l2p,
.cleanup = ftl_mngt_clear_l2p
}, },
{ {
.name = "Scrub NV cache", .name = "Scrub NV cache",