lib/ftl: Make each ftl_l2p_set persistent when using pmem device for l2p

Signed-off-by: Maciej Szczepaniak <maciej.szczepaniak@intel.com>
Change-Id: Ic176988664dc74d5c1d321914d7665516ba6704d
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/911
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Maciej Szczepaniak 2020-02-07 18:22:51 +01:00 committed by Tomasz Zawadzki
parent 12642633bf
commit 8b27fbba38

View File

@ -49,6 +49,10 @@
#include "ftl_io.h"
#include "ftl_trace.h"
#ifdef SPDK_CONFIG_PMDK
#include "libpmem.h"
#endif /* SPDK_CONFIG_PMDK */
struct spdk_ftl_dev;
struct ftl_band;
struct ftl_zone;
@ -376,6 +380,18 @@ ftl_addr_packed(const struct spdk_ftl_dev *dev)
return dev->addr_len < 32;
}
static inline void
ftl_l2p_lba_persist(const struct spdk_ftl_dev *dev, uint64_t lba)
{
#ifdef SPDK_CONFIG_PMDK
size_t ftl_addr_size = ftl_addr_packed(dev) ? 4 : 8;
pmem_persist((char *)dev->l2p + (lba * ftl_addr_size), ftl_addr_size);
#else /* SPDK_CONFIG_PMDK */
SPDK_ERRLOG("Libpmem not available, cannot flush l2p to pmem\n");
assert(0);
#endif /* SPDK_CONFIG_PMDK */
}
static inline int
ftl_addr_invalid(struct ftl_addr addr)
{
@ -453,6 +469,10 @@ ftl_l2p_set(struct spdk_ftl_dev *dev, uint64_t lba, struct ftl_addr addr)
} else {
_ftl_l2p_set64(dev->l2p, lba, addr.offset);
}
if (dev->l2p_pmem_len != 0) {
ftl_l2p_lba_persist(dev, lba);
}
}
static inline struct ftl_addr