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