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_mngt.h" 8 #include "ftl_mngt_steps.h" 9 10 static const struct ftl_mngt_process_desc desc_startup; 11 static const struct ftl_mngt_process_desc desc_first_start; 12 13 static void 14 ftl_mngt_select_startup_mode(struct spdk_ftl_dev *dev, 15 struct ftl_mngt_process *mngt) 16 { 17 if (dev->conf.mode & SPDK_FTL_MODE_CREATE) { 18 ftl_mngt_call_process(mngt, &desc_first_start); 19 } else { 20 ftl_mngt_fail_step(mngt); 21 } 22 } 23 24 /* 25 * Common startup steps required by FTL in all cases (creation, load, dirty shutdown recovery). 26 * Includes actions like opening the devices, calculating the expected size and version of metadata, etc. 27 */ 28 static const struct ftl_mngt_process_desc desc_startup = { 29 .name = "FTL startup", 30 .steps = { 31 { 32 .name = "Check configuration", 33 .action = ftl_mngt_check_conf, 34 }, 35 { 36 .name = "Open base bdev", 37 .action = ftl_mngt_open_base_bdev, 38 .cleanup = ftl_mngt_close_base_bdev 39 }, 40 { 41 .name = "Open cache bdev", 42 .action = ftl_mngt_open_cache_bdev, 43 .cleanup = ftl_mngt_close_cache_bdev 44 }, 45 { 46 .name = "Initialize layout", 47 .action = ftl_mngt_init_layout 48 }, 49 { 50 .name = "Initialize metadata", 51 .action = ftl_mngt_init_md, 52 .cleanup = ftl_mngt_deinit_md 53 }, 54 { 55 .name = "Select startup mode", 56 .action = ftl_mngt_select_startup_mode 57 }, 58 {} 59 } 60 }; 61 62 /* 63 * Steps executed when creating FTL for the first time - most important being scrubbing 64 * old data/metadata (so it's not leaked during dirty shutdown recovery) and laying out 65 * regions for the new metadata (initializing band states, etc). 66 */ 67 static const struct ftl_mngt_process_desc desc_first_start = { 68 .name = "FTL first start", 69 .steps = { 70 { 71 .name = "Scrub NV cache", 72 .action = ftl_mngt_scrub_nv_cache, 73 }, 74 { 75 .name = "Start core poller", 76 .action = ftl_mngt_start_core_poller, 77 .cleanup = ftl_mngt_stop_core_poller 78 }, 79 { 80 .name = "Finalize initialization", 81 .action = ftl_mngt_finalize_startup, 82 }, 83 {} 84 } 85 }; 86 87 int 88 ftl_mngt_call_dev_startup(struct spdk_ftl_dev *dev, ftl_mngt_completion cb, void *cb_cntx) 89 { 90 return ftl_mngt_process_execute(dev, &desc_startup, cb, cb_cntx); 91 } 92 93 void 94 ftl_mngt_rollback_device(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 95 { 96 ftl_mngt_call_process_rollback(mngt, &desc_startup); 97 } 98