xref: /spdk/lib/ftl/mngt/ftl_mngt_misc.c (revision 5022d8f3722d48a32f9d423eea98dabf66b0b04c)
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