From dd94984927fbee9f61d6500ade05645cadeb03d4 Mon Sep 17 00:00:00 2001 From: Kozlowski Mateusz Date: Tue, 10 Jan 2023 12:01:02 +0100 Subject: [PATCH] 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 Signed-off-by: Mariusz Barczak Change-Id: I1cffa2b39550421939731509c5a51c1565f0fa91 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16216 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/ftl/ftl_l2p.c | 6 ++++++ lib/ftl/ftl_l2p.h | 1 + lib/ftl/ftl_l2p_cache.c | 10 +++++++++- lib/ftl/ftl_l2p_cache.h | 1 + lib/ftl/ftl_l2p_flat.c | 5 +++++ lib/ftl/ftl_l2p_flat.h | 1 + lib/ftl/mngt/ftl_mngt_misc.c | 1 + lib/ftl/mngt/ftl_mngt_startup.c | 1 - 8 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/ftl/ftl_l2p.c b/lib/ftl/ftl_l2p.c index a08519eac..9b778d3fc 100644 --- a/lib/ftl/ftl_l2p.c +++ b/lib/ftl/ftl_l2p.c @@ -123,6 +123,12 @@ ftl_l2p_is_halted(struct spdk_ftl_dev *dev) return FTL_L2P_OP(is_halted)(dev); } +void +ftl_l2p_resume(struct spdk_ftl_dev *dev) +{ + return FTL_L2P_OP(resume)(dev); +} + void ftl_l2p_halt(struct spdk_ftl_dev *dev) { diff --git a/lib/ftl/ftl_l2p.h b/lib/ftl/ftl_l2p.h index 55f03f772..23fa0fa17 100644 --- a/lib/ftl/ftl_l2p.h +++ b/lib/ftl/ftl_l2p.h @@ -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); bool ftl_l2p_is_halted(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, ftl_addr old_addr); diff --git a/lib/ftl/ftl_l2p_cache.c b/lib/ftl/ftl_l2p_cache.c index 7f3fe380f..310427100 100644 --- a/lib/ftl/ftl_l2p_cache.c +++ b/lib/ftl/ftl_l2p_cache.c @@ -504,7 +504,6 @@ ftl_l2p_cache_init(struct spdk_ftl_dev *dev) cache->cache_layout_bdev_desc = reg->bdev_desc; cache->cache_layout_ioch = reg->ioch; - cache->state = L2P_CACHE_RUNNING; 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 * get_page(struct ftl_l2p_cache *cache, uint64_t lba) { diff --git a/lib/ftl/ftl_l2p_cache.h b/lib/ftl/ftl_l2p_cache.h index acf44b685..c1d189edf 100644 --- a/lib/ftl/ftl_l2p_cache.h +++ b/lib/ftl/ftl_l2p_cache.h @@ -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); 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_resume(struct spdk_ftl_dev *dev); #endif /* FTL_L2P_CACHE_H */ diff --git a/lib/ftl/ftl_l2p_flat.c b/lib/ftl/ftl_l2p_flat.c index 4f6ca9eef..52b09d38e 100644 --- a/lib/ftl/ftl_l2p_flat.c +++ b/lib/ftl/ftl_l2p_flat.c @@ -190,3 +190,8 @@ void ftl_l2p_flat_halt(struct spdk_ftl_dev *dev) { } + +void +ftl_l2p_flat_resume(struct spdk_ftl_dev *dev) +{ +} diff --git a/lib/ftl/ftl_l2p_flat.h b/lib/ftl/ftl_l2p_flat.h index eb5a900f5..20732c4e8 100644 --- a/lib/ftl/ftl_l2p_flat.h +++ b/lib/ftl/ftl_l2p_flat.h @@ -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); 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_resume(struct spdk_ftl_dev *dev); #endif /* FTL_L2P_FLAT_H */ diff --git a/lib/ftl/mngt/ftl_mngt_misc.c b/lib/ftl/mngt/ftl_mngt_misc.c index 44edfcfec..a7d47da48 100644 --- a/lib/ftl/mngt/ftl_mngt_misc.c +++ b/lib/ftl/mngt/ftl_mngt_misc.c @@ -189,6 +189,7 @@ ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mng dev->initialized = 1; dev->sb_shm->shm_ready = true; + ftl_l2p_resume(dev); ftl_reloc_resume(dev->reloc); ftl_writer_resume(&dev->writer_user); ftl_writer_resume(&dev->writer_gc); diff --git a/lib/ftl/mngt/ftl_mngt_startup.c b/lib/ftl/mngt/ftl_mngt_startup.c index ff56e129d..0ffd1e00b 100644 --- a/lib/ftl/mngt/ftl_mngt_startup.c +++ b/lib/ftl/mngt/ftl_mngt_startup.c @@ -161,7 +161,6 @@ static const struct ftl_mngt_process_desc desc_first_start = { { .name = "Clear L2P", .action = ftl_mngt_clear_l2p, - .cleanup = ftl_mngt_clear_l2p }, { .name = "Scrub NV cache",