1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include "spdk/thread.h" 7 #include "spdk/crc32.h" 8 9 #include "ftl_core.h" 10 #include "ftl_mngt.h" 11 #include "ftl_mngt_steps.h" 12 #include "ftl_utils.h" 13 #include "ftl_internal.h" 14 15 void 16 ftl_mngt_init_layout(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 17 { 18 if (ftl_layout_setup(dev)) { 19 ftl_mngt_fail_step(mngt); 20 } else { 21 ftl_mngt_next_step(mngt); 22 } 23 } 24 25 static bool 26 is_buffer_needed(enum ftl_layout_region_type type) 27 { 28 switch (type) { 29 case FTL_LAYOUT_REGION_TYPE_DATA_NVC: 30 case FTL_LAYOUT_REGION_TYPE_DATA_BASE: 31 return false; 32 33 default: 34 return true; 35 } 36 } 37 38 void 39 ftl_mngt_init_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 40 { 41 struct ftl_layout *layout = &dev->layout; 42 struct ftl_layout_region *region = layout->region; 43 uint64_t i; 44 45 for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; i++, region++) { 46 if (layout->md[i]) { 47 /* 48 * Some metadata objects are initialized by other FTL 49 * components. At the moment it's only used by superblock (and its mirror) - 50 * during load time we need to read it earlier in order to get the layout for the 51 * other regions. 52 */ 53 continue; 54 } 55 layout->md[i] = ftl_md_create(dev, region->current.blocks, region->vss_blksz, region->name, 56 !is_buffer_needed(i), region); 57 if (NULL == layout->md[i]) { 58 ftl_mngt_fail_step(mngt); 59 return; 60 } 61 } 62 63 ftl_mngt_next_step(mngt); 64 } 65 66 void 67 ftl_mngt_deinit_md(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 68 { 69 struct ftl_layout *layout = &dev->layout; 70 struct ftl_layout_region *region = layout->region; 71 uint64_t i; 72 73 for (i = 0; i < FTL_LAYOUT_REGION_TYPE_MAX; i++, region++) { 74 if (layout->md[i]) { 75 ftl_md_destroy(layout->md[i]); 76 layout->md[i] = NULL; 77 } 78 } 79 80 ftl_mngt_next_step(mngt); 81 } 82