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