xref: /spdk/lib/ftl/mngt/ftl_mngt_md.c (revision 806744b7c81d91effc0d64616d26527fe34f35b7)
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