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