xref: /spdk/lib/ftl/mngt/ftl_mngt_shutdown.c (revision ea8f5b27612fa03698a9ce3ad4bd37765d9cdfa5)
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 /*
11  * Steps executed during clean shutdown - includes persisting metadata and rolling
12  * back any setup steps executed during startup (closing bdevs, io channels, etc)
13  */
14 static const struct ftl_mngt_process_desc desc_shutdown = {
15 	.name = "FTL shutdown",
16 	.error_handler = ftl_mngt_rollback_device,
17 	.steps = {
18 		{
19 			.name = "Deinit core IO channel",
20 			.action = ftl_mngt_deinit_io_channel
21 		},
22 		{
23 			.name = "Unregister IO device",
24 			.action = ftl_mngt_unregister_io_device
25 		},
26 		{
27 			.name = "Stop core poller",
28 			.action = ftl_mngt_stop_core_poller
29 		},
30 		{
31 			.name = "Persist L2P",
32 			.action = ftl_mngt_persist_l2p
33 		},
34 		{
35 			.name = "Persist metadata",
36 			.action = ftl_mngt_persist_md
37 		},
38 		{
39 			.name = "Set FTL clean state",
40 			.action = ftl_mngt_set_clean
41 		},
42 		{
43 			.name = "Dump statistics",
44 			.action = ftl_mngt_dump_stats
45 		},
46 		{
47 			.name = "Deinitialize L2P",
48 			.action = ftl_mngt_deinit_l2p
49 		},
50 		{
51 			.name = "Deinitialize P2L checkpointing",
52 			.action = ftl_mngt_p2l_deinit_ckpt
53 		},
54 		{
55 			.name = "Rollback FTL device",
56 			.action = ftl_mngt_rollback_device
57 		},
58 		{}
59 	}
60 };
61 
62 /*
63  * Steps executed during fast clean shutdown (shutting down to shared memory). Utilizes
64  * minimum amount of metadata persistence and rolls back any setup steps executed during
65  * startup (closing bdevs, io channels, etc)
66  */
67 static const struct ftl_mngt_process_desc desc_fast_shutdown = {
68 	.name = "FTL fast shutdown",
69 	.steps = {
70 		{
71 			.name = "Deinit core IO channel",
72 			.action = ftl_mngt_deinit_io_channel
73 		},
74 		{
75 			.name = "Unregister IO device",
76 			.action = ftl_mngt_unregister_io_device
77 		},
78 		{
79 			.name = "Stop core poller",
80 			.action = ftl_mngt_stop_core_poller
81 		},
82 		{
83 			.name = "Fast persist metadata",
84 			.action = ftl_mngt_fast_persist_md
85 		},
86 		{
87 			.name = "Set FTL SHM clean state",
88 			.action = ftl_mngt_set_shm_clean
89 		},
90 		{
91 			.name = "Dump statistics",
92 			.action = ftl_mngt_dump_stats
93 		},
94 		{
95 			.name = "Deinitialize L2P",
96 			.action = ftl_mngt_deinit_l2p
97 		},
98 		{
99 			.name = "Deinitialize P2L checkpointing",
100 			.action = ftl_mngt_p2l_deinit_ckpt
101 		},
102 		{
103 			.name = "Rollback FTL device",
104 			.action = ftl_mngt_rollback_device
105 		},
106 		{}
107 	}
108 };
109 
110 int
111 ftl_mngt_call_dev_shutdown(struct spdk_ftl_dev *dev, ftl_mngt_completion cb, void *cb_cntx)
112 {
113 	const struct ftl_mngt_process_desc *pdesc;
114 
115 	if (dev->conf.fast_shutdown) {
116 		pdesc = &desc_fast_shutdown;
117 	} else {
118 		pdesc = &desc_shutdown;
119 	}
120 	return ftl_mngt_process_execute(dev, pdesc, cb, cb_cntx);
121 }
122