1b872e29fSKozlowski Mateusz /* SPDX-License-Identifier: BSD-3-Clause 2b872e29fSKozlowski Mateusz * Copyright (c) Intel Corporation. 3b872e29fSKozlowski Mateusz * All rights reserved. 4b872e29fSKozlowski Mateusz */ 5b872e29fSKozlowski Mateusz 6b872e29fSKozlowski Mateusz #include "ftl_core.h" 7b872e29fSKozlowski Mateusz #include "ftl_utils.h" 8b872e29fSKozlowski Mateusz #include "ftl_mngt.h" 9b872e29fSKozlowski Mateusz #include "ftl_mngt_steps.h" 10b872e29fSKozlowski Mateusz #include "ftl_internal.h" 11b872e29fSKozlowski Mateusz 12b872e29fSKozlowski Mateusz void 13b872e29fSKozlowski Mateusz ftl_mngt_check_conf(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 14b872e29fSKozlowski Mateusz { 15b872e29fSKozlowski Mateusz if (ftl_conf_is_valid(&dev->conf)) { 16b872e29fSKozlowski Mateusz ftl_mngt_next_step(mngt); 17b872e29fSKozlowski Mateusz } else { 18b872e29fSKozlowski Mateusz ftl_mngt_fail_step(mngt); 19b872e29fSKozlowski Mateusz } 20b872e29fSKozlowski Mateusz } 21*5022d8f3SKozlowski Mateusz 22*5022d8f3SKozlowski Mateusz static void 23*5022d8f3SKozlowski Mateusz user_clear_cb(struct spdk_ftl_dev *dev, struct ftl_md *md, int status) 24*5022d8f3SKozlowski Mateusz { 25*5022d8f3SKozlowski Mateusz struct ftl_mngt_process *mngt = md->owner.cb_ctx; 26*5022d8f3SKozlowski Mateusz 27*5022d8f3SKozlowski Mateusz if (status) { 28*5022d8f3SKozlowski Mateusz FTL_ERRLOG(ftl_mngt_get_dev(mngt), "FTL NV Cache: ERROR of clearing user cache data\n"); 29*5022d8f3SKozlowski Mateusz ftl_mngt_fail_step(mngt); 30*5022d8f3SKozlowski Mateusz } else { 31*5022d8f3SKozlowski Mateusz ftl_mngt_next_step(mngt); 32*5022d8f3SKozlowski Mateusz } 33*5022d8f3SKozlowski Mateusz } 34*5022d8f3SKozlowski Mateusz 35*5022d8f3SKozlowski Mateusz void 36*5022d8f3SKozlowski Mateusz ftl_mngt_scrub_nv_cache(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 37*5022d8f3SKozlowski Mateusz { 38*5022d8f3SKozlowski Mateusz struct ftl_layout_region *region = &dev->layout.region[FTL_LAYOUT_REGION_TYPE_DATA_NVC]; 39*5022d8f3SKozlowski Mateusz struct ftl_md *md = dev->layout.md[FTL_LAYOUT_REGION_TYPE_DATA_NVC]; 40*5022d8f3SKozlowski Mateusz union ftl_md_vss vss; 41*5022d8f3SKozlowski Mateusz 42*5022d8f3SKozlowski Mateusz FTL_NOTICELOG(dev, "First startup needs to scrub nv cache data region, this may take some time.\n"); 43*5022d8f3SKozlowski Mateusz FTL_NOTICELOG(dev, "Scrubbing %lluGiB\n", region->current.blocks * FTL_BLOCK_SIZE / GiB); 44*5022d8f3SKozlowski Mateusz 45*5022d8f3SKozlowski Mateusz /* Need to scrub user data, so in case of dirty shutdown the recovery won't 46*5022d8f3SKozlowski Mateusz * pull in data during open chunks recovery from any previous instance 47*5022d8f3SKozlowski Mateusz */ 48*5022d8f3SKozlowski Mateusz md->cb = user_clear_cb; 49*5022d8f3SKozlowski Mateusz md->owner.cb_ctx = mngt; 50*5022d8f3SKozlowski Mateusz 51*5022d8f3SKozlowski Mateusz vss.version.md_version = region->current.version; 52*5022d8f3SKozlowski Mateusz vss.nv_cache.lba = FTL_ADDR_INVALID; 53*5022d8f3SKozlowski Mateusz ftl_md_clear(md, 0, &vss); 54*5022d8f3SKozlowski Mateusz } 55*5022d8f3SKozlowski Mateusz 56*5022d8f3SKozlowski Mateusz void 57*5022d8f3SKozlowski Mateusz ftl_mngt_finalize_startup(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 58*5022d8f3SKozlowski Mateusz { 59*5022d8f3SKozlowski Mateusz dev->initialized = 1; 60*5022d8f3SKozlowski Mateusz 61*5022d8f3SKozlowski Mateusz ftl_mngt_next_step(mngt); 62*5022d8f3SKozlowski Mateusz } 63