xref: /spdk/lib/ftl/mngt/ftl_mngt_shutdown.c (revision b50af42b621bbd51f1fba7977706cc4e463a5c09)
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 = "Rollback FTL device",
52 			.action = ftl_mngt_rollback_device
53 		},
54 		{}
55 	}
56 };
57 
58 /*
59  * Steps executed during fast clean shutdown (shutting down to shared memory). Utilizes
60  * minimum amount of metadata persistence and rolls back any setup steps executed during
61  * startup (closing bdevs, io channels, etc)
62  */
63 static const struct ftl_mngt_process_desc desc_fast_shutdown = {
64 	.name = "FTL fast shutdown",
65 	.steps = {
66 		{
67 			.name = "Deinit core IO channel",
68 			.action = ftl_mngt_deinit_io_channel
69 		},
70 		{
71 			.name = "Unregister IO device",
72 			.action = ftl_mngt_unregister_io_device
73 		},
74 		{
75 			.name = "Stop core poller",
76 			.action = ftl_mngt_stop_core_poller
77 		},
78 		{
79 			.name = "Fast persist metadata",
80 			.action = ftl_mngt_fast_persist_md
81 		},
82 		{
83 			.name = "Set FTL SHM clean state",
84 			.action = ftl_mngt_set_shm_clean
85 		},
86 		{
87 			.name = "Dump statistics",
88 			.action = ftl_mngt_dump_stats
89 		},
90 		{
91 			.name = "Deinitialize L2P",
92 			.action = ftl_mngt_deinit_l2p
93 		},
94 		{
95 			.name = "Rollback FTL device",
96 			.action = ftl_mngt_rollback_device
97 		},
98 		{}
99 	}
100 };
101 
102 int
103 ftl_mngt_call_dev_shutdown(struct spdk_ftl_dev *dev, ftl_mngt_completion cb, void *cb_cntx)
104 {
105 	const struct ftl_mngt_process_desc *pdesc;
106 
107 	if (dev->conf.fast_shutdown) {
108 		pdesc = &desc_fast_shutdown;
109 	} else {
110 		pdesc = &desc_shutdown;
111 	}
112 	return ftl_mngt_process_execute(dev, pdesc, cb, cb_cntx);
113 }
114