1e49ccfc8SArtur Paszkiewicz /* SPDX-License-Identifier: BSD-3-Clause 217cf101bSMateusz Kozlowski * Copyright 2023 Solidigm All Rights Reserved 3a6dbe372Spaul luse * Copyright (C) 2022 Intel Corporation. 4e49ccfc8SArtur Paszkiewicz * All rights reserved. 5e49ccfc8SArtur Paszkiewicz */ 6e49ccfc8SArtur Paszkiewicz 7e49ccfc8SArtur Paszkiewicz #include "ftl_core.h" 8e49ccfc8SArtur Paszkiewicz #include "ftl_mngt.h" 9e49ccfc8SArtur Paszkiewicz #include "ftl_mngt_steps.h" 10e49ccfc8SArtur Paszkiewicz 11e49ccfc8SArtur Paszkiewicz static const struct ftl_mngt_process_desc desc_startup; 125022d8f3SKozlowski Mateusz static const struct ftl_mngt_process_desc desc_first_start; 1386619848SKozlowski Mateusz static const struct ftl_mngt_process_desc desc_restore; 1486619848SKozlowski Mateusz static const struct ftl_mngt_process_desc desc_clean_start; 15e49ccfc8SArtur Paszkiewicz 165022d8f3SKozlowski Mateusz static void 175022d8f3SKozlowski Mateusz ftl_mngt_select_startup_mode(struct spdk_ftl_dev *dev, 185022d8f3SKozlowski Mateusz struct ftl_mngt_process *mngt) 195022d8f3SKozlowski Mateusz { 205022d8f3SKozlowski Mateusz if (dev->conf.mode & SPDK_FTL_MODE_CREATE) { 219452abe6SMateusz Kozlowski ftl_mngt_call_process(mngt, &desc_first_start, NULL); 225022d8f3SKozlowski Mateusz } else { 239452abe6SMateusz Kozlowski ftl_mngt_call_process(mngt, &desc_restore, NULL); 2486619848SKozlowski Mateusz } 2586619848SKozlowski Mateusz } 2686619848SKozlowski Mateusz 2786619848SKozlowski Mateusz static void 2886619848SKozlowski Mateusz ftl_mngt_select_restore_mode(struct spdk_ftl_dev *dev, 2986619848SKozlowski Mateusz struct ftl_mngt_process *mngt) 3086619848SKozlowski Mateusz { 3186619848SKozlowski Mateusz if (dev->sb->clean) { 329452abe6SMateusz Kozlowski ftl_mngt_call_process(mngt, &desc_clean_start, NULL); 3386619848SKozlowski Mateusz } else { 34764a3675SKozlowski Mateusz ftl_mngt_recover(dev, mngt); 355022d8f3SKozlowski Mateusz } 365022d8f3SKozlowski Mateusz } 375022d8f3SKozlowski Mateusz 385022d8f3SKozlowski Mateusz /* 395022d8f3SKozlowski Mateusz * Common startup steps required by FTL in all cases (creation, load, dirty shutdown recovery). 405022d8f3SKozlowski Mateusz * Includes actions like opening the devices, calculating the expected size and version of metadata, etc. 415022d8f3SKozlowski Mateusz */ 42e49ccfc8SArtur Paszkiewicz static const struct ftl_mngt_process_desc desc_startup = { 43e49ccfc8SArtur Paszkiewicz .name = "FTL startup", 44e49ccfc8SArtur Paszkiewicz .steps = { 45e49ccfc8SArtur Paszkiewicz { 46b872e29fSKozlowski Mateusz .name = "Check configuration", 47b872e29fSKozlowski Mateusz .action = ftl_mngt_check_conf, 48b872e29fSKozlowski Mateusz }, 49b872e29fSKozlowski Mateusz { 50e49ccfc8SArtur Paszkiewicz .name = "Open base bdev", 51e49ccfc8SArtur Paszkiewicz .action = ftl_mngt_open_base_bdev, 52e49ccfc8SArtur Paszkiewicz .cleanup = ftl_mngt_close_base_bdev 53e49ccfc8SArtur Paszkiewicz }, 54e49ccfc8SArtur Paszkiewicz { 55e49ccfc8SArtur Paszkiewicz .name = "Open cache bdev", 56e49ccfc8SArtur Paszkiewicz .action = ftl_mngt_open_cache_bdev, 57e49ccfc8SArtur Paszkiewicz .cleanup = ftl_mngt_close_cache_bdev 58e49ccfc8SArtur Paszkiewicz }, 592b5bba56SArtur Paszkiewicz { 60c6880a39SArtur Paszkiewicz .name = "Initialize superblock", 61c6880a39SArtur Paszkiewicz .action = ftl_mngt_superblock_init, 62c6880a39SArtur Paszkiewicz .cleanup = ftl_mngt_superblock_deinit 63c6880a39SArtur Paszkiewicz }, 64c6880a39SArtur Paszkiewicz { 65c7213b9cSArtur Paszkiewicz .name = "Initialize memory pools", 66c7213b9cSArtur Paszkiewicz .action = ftl_mngt_init_mem_pools, 67c7213b9cSArtur Paszkiewicz .cleanup = ftl_mngt_deinit_mem_pools 68c7213b9cSArtur Paszkiewicz }, 69c7213b9cSArtur Paszkiewicz { 709dbdb029SKozlowski Mateusz .name = "Initialize bands", 719dbdb029SKozlowski Mateusz .action = ftl_mngt_init_bands, 729dbdb029SKozlowski Mateusz .cleanup = ftl_mngt_deinit_bands 739dbdb029SKozlowski Mateusz }, 749dbdb029SKozlowski Mateusz { 75d9a631adSArtur Paszkiewicz .name = "Register IO device", 76d9a631adSArtur Paszkiewicz .action = ftl_mngt_register_io_device, 77d9a631adSArtur Paszkiewicz .cleanup = ftl_mngt_unregister_io_device 78d9a631adSArtur Paszkiewicz }, 79d9a631adSArtur Paszkiewicz { 80d9a631adSArtur Paszkiewicz .name = "Initialize core IO channel", 81d9a631adSArtur Paszkiewicz .action = ftl_mngt_init_io_channel, 82d9a631adSArtur Paszkiewicz .cleanup = ftl_mngt_deinit_io_channel 83d9a631adSArtur Paszkiewicz }, 84d9a631adSArtur Paszkiewicz { 859dbdb029SKozlowski Mateusz .name = "Decorate bands", 869dbdb029SKozlowski Mateusz .action = ftl_mngt_decorate_bands 879dbdb029SKozlowski Mateusz }, 889dbdb029SKozlowski Mateusz { 892b5bba56SArtur Paszkiewicz .name = "Initialize layout", 902b5bba56SArtur Paszkiewicz .action = ftl_mngt_init_layout 912b5bba56SArtur Paszkiewicz }, 927a7ac2afSArtur Paszkiewicz { 93d748bc41SKozlowski Mateusz .name = "Verify layout", 94d748bc41SKozlowski Mateusz .action = ftl_mngt_layout_verify, 95d748bc41SKozlowski Mateusz }, 96d748bc41SKozlowski Mateusz { 979f42898aSLukasz Lasek .name = "Upgrade layout", 989f42898aSLukasz Lasek .action = ftl_mngt_layout_upgrade, 999f42898aSLukasz Lasek }, 1009f42898aSLukasz Lasek { 101a5c04e6dSMateusz Kozlowski .name = "Scrub NV cache", 102a5c04e6dSMateusz Kozlowski .action = ftl_mngt_scrub_nv_cache, 103a5c04e6dSMateusz Kozlowski }, 104a5c04e6dSMateusz Kozlowski { 1057a7ac2afSArtur Paszkiewicz .name = "Initialize metadata", 1067a7ac2afSArtur Paszkiewicz .action = ftl_mngt_init_md, 1077a7ac2afSArtur Paszkiewicz .cleanup = ftl_mngt_deinit_md 1087a7ac2afSArtur Paszkiewicz }, 1095022d8f3SKozlowski Mateusz { 110c3321813SKozlowski Mateusz .name = "Initialize band addresses", 111c3321813SKozlowski Mateusz .action = ftl_mngt_initialize_band_address 112c3321813SKozlowski Mateusz }, 113c3321813SKozlowski Mateusz { 114a68a12a4SKozlowski Mateusz .name = "Initialize NV cache", 115a68a12a4SKozlowski Mateusz .action = ftl_mngt_init_nv_cache, 116a68a12a4SKozlowski Mateusz .cleanup = ftl_mngt_deinit_nv_cache 117a68a12a4SKozlowski Mateusz }, 118a68a12a4SKozlowski Mateusz { 119cea8dadeSArtur Paszkiewicz .name = "Initialize valid map", 120cea8dadeSArtur Paszkiewicz .action = ftl_mngt_init_vld_map, 121cea8dadeSArtur Paszkiewicz .cleanup = ftl_mngt_deinit_vld_map 122cea8dadeSArtur Paszkiewicz }, 123cea8dadeSArtur Paszkiewicz { 12466fe5f75SKozlowski Mateusz .name = "Initialize trim map", 125106ad379SMateusz Kozlowski .action = ftl_mngt_init_trim_map, 126106ad379SMateusz Kozlowski .cleanup = ftl_mngt_deinit_trim_map 12766fe5f75SKozlowski Mateusz }, 12866fe5f75SKozlowski Mateusz { 1299dbdb029SKozlowski Mateusz .name = "Initialize bands metadata", 130cea8dadeSArtur Paszkiewicz .action = ftl_mngt_init_bands_md, 131cea8dadeSArtur Paszkiewicz .cleanup = ftl_mngt_deinit_bands_md 1329dbdb029SKozlowski Mateusz }, 1339dbdb029SKozlowski Mateusz { 13443a4d47aSKozlowski Mateusz .name = "Initialize reloc", 13543a4d47aSKozlowski Mateusz .action = ftl_mngt_init_reloc, 13643a4d47aSKozlowski Mateusz .cleanup = ftl_mngt_deinit_reloc 13743a4d47aSKozlowski Mateusz }, 13843a4d47aSKozlowski Mateusz { 1395022d8f3SKozlowski Mateusz .name = "Select startup mode", 1405022d8f3SKozlowski Mateusz .action = ftl_mngt_select_startup_mode 1415022d8f3SKozlowski Mateusz }, 1425022d8f3SKozlowski Mateusz {} 1435022d8f3SKozlowski Mateusz } 1445022d8f3SKozlowski Mateusz }; 1455022d8f3SKozlowski Mateusz 1465022d8f3SKozlowski Mateusz /* 1475022d8f3SKozlowski Mateusz * Steps executed when creating FTL for the first time - most important being scrubbing 1485022d8f3SKozlowski Mateusz * old data/metadata (so it's not leaked during dirty shutdown recovery) and laying out 1495022d8f3SKozlowski Mateusz * regions for the new metadata (initializing band states, etc). 1505022d8f3SKozlowski Mateusz */ 1515022d8f3SKozlowski Mateusz static const struct ftl_mngt_process_desc desc_first_start = { 1525022d8f3SKozlowski Mateusz .name = "FTL first start", 1535022d8f3SKozlowski Mateusz .steps = { 1545022d8f3SKozlowski Mateusz { 155b16bdc6dSArtur Paszkiewicz .name = "Initialize L2P", 156b16bdc6dSArtur Paszkiewicz .action = ftl_mngt_init_l2p, 157b16bdc6dSArtur Paszkiewicz .cleanup = ftl_mngt_deinit_l2p 158b16bdc6dSArtur Paszkiewicz }, 159b16bdc6dSArtur Paszkiewicz { 160b16bdc6dSArtur Paszkiewicz .name = "Clear L2P", 161b16bdc6dSArtur Paszkiewicz .action = ftl_mngt_clear_l2p, 162b16bdc6dSArtur Paszkiewicz }, 163b16bdc6dSArtur Paszkiewicz { 1649dbdb029SKozlowski Mateusz .name = "Finalize band initialization", 1659dbdb029SKozlowski Mateusz .action = ftl_mngt_finalize_init_bands, 1669dbdb029SKozlowski Mateusz }, 1679dbdb029SKozlowski Mateusz { 1689dbdb029SKozlowski Mateusz .name = "Save initial band info metadata", 1699dbdb029SKozlowski Mateusz .action = ftl_mngt_persist_band_info_metadata, 1709dbdb029SKozlowski Mateusz }, 1719dbdb029SKozlowski Mateusz { 172506315a6SKozlowski Mateusz .name = "Save initial chunk info metadata", 173506315a6SKozlowski Mateusz .action = ftl_mngt_persist_nv_cache_metadata, 174506315a6SKozlowski Mateusz }, 175506315a6SKozlowski Mateusz { 1761738488eSArtur Paszkiewicz .name = "Initialize P2L checkpointing", 1771738488eSArtur Paszkiewicz .action = ftl_mngt_p2l_init_ckpt, 1781738488eSArtur Paszkiewicz .cleanup = ftl_mngt_p2l_deinit_ckpt 1791738488eSArtur Paszkiewicz }, 1801738488eSArtur Paszkiewicz { 1811738488eSArtur Paszkiewicz .name = "Wipe P2L region", 1821738488eSArtur Paszkiewicz .action = ftl_mngt_p2l_wipe, 1831738488eSArtur Paszkiewicz }, 1841738488eSArtur Paszkiewicz { 185*6d6179ffSMateusz Kozlowski .name = "Wipe P2L Log IO region", 186*6d6179ffSMateusz Kozlowski .action = ftl_mngt_p2l_log_io_wipe, 187*6d6179ffSMateusz Kozlowski }, 188*6d6179ffSMateusz Kozlowski { 18966fe5f75SKozlowski Mateusz .name = "Clear trim map", 190106ad379SMateusz Kozlowski .action = ftl_mngt_trim_metadata_clear, 19166fe5f75SKozlowski Mateusz }, 19266fe5f75SKozlowski Mateusz { 1932d613454SMateusz Kozlowski .name = "Clear trim log", 1942d613454SMateusz Kozlowski .action = ftl_mngt_trim_log_clear, 1952d613454SMateusz Kozlowski }, 1962d613454SMateusz Kozlowski { 197c6880a39SArtur Paszkiewicz .name = "Set FTL dirty state", 198c6880a39SArtur Paszkiewicz .action = ftl_mngt_set_dirty, 199c6880a39SArtur Paszkiewicz }, 200c6880a39SArtur Paszkiewicz { 20117147949SArtur Paszkiewicz .name = "Start core poller", 20217147949SArtur Paszkiewicz .action = ftl_mngt_start_core_poller, 20317147949SArtur Paszkiewicz .cleanup = ftl_mngt_stop_core_poller 20417147949SArtur Paszkiewicz }, 20517147949SArtur Paszkiewicz { 2065022d8f3SKozlowski Mateusz .name = "Finalize initialization", 2075022d8f3SKozlowski Mateusz .action = ftl_mngt_finalize_startup, 2085022d8f3SKozlowski Mateusz }, 209e49ccfc8SArtur Paszkiewicz {} 210e49ccfc8SArtur Paszkiewicz } 211e49ccfc8SArtur Paszkiewicz }; 212e49ccfc8SArtur Paszkiewicz 21386619848SKozlowski Mateusz /* 21486619848SKozlowski Mateusz * Step utilized on loading of an FTL instance - decides on dirty/clean shutdown path. 21586619848SKozlowski Mateusz */ 21686619848SKozlowski Mateusz static const struct ftl_mngt_process_desc desc_restore = { 21786619848SKozlowski Mateusz .name = "FTL restore", 21886619848SKozlowski Mateusz .steps = { 21986619848SKozlowski Mateusz { 22086619848SKozlowski Mateusz .name = "Select recovery mode", 22186619848SKozlowski Mateusz .action = ftl_mngt_select_restore_mode, 22286619848SKozlowski Mateusz }, 22386619848SKozlowski Mateusz {} 22486619848SKozlowski Mateusz } 22586619848SKozlowski Mateusz }; 22686619848SKozlowski Mateusz 22786619848SKozlowski Mateusz /* 22886619848SKozlowski Mateusz * Loading of FTL after clean shutdown. 22986619848SKozlowski Mateusz */ 23086619848SKozlowski Mateusz static const struct ftl_mngt_process_desc desc_clean_start = { 23186619848SKozlowski Mateusz .name = "Clean startup", 23286619848SKozlowski Mateusz .steps = { 23386619848SKozlowski Mateusz { 23486619848SKozlowski Mateusz .name = "Restore metadata", 23586619848SKozlowski Mateusz .action = ftl_mngt_restore_md 23686619848SKozlowski Mateusz }, 23786619848SKozlowski Mateusz { 2381738488eSArtur Paszkiewicz .name = "Initialize P2L checkpointing", 2391738488eSArtur Paszkiewicz .action = ftl_mngt_p2l_init_ckpt, 2401738488eSArtur Paszkiewicz .cleanup = ftl_mngt_p2l_deinit_ckpt 2411738488eSArtur Paszkiewicz }, 2421738488eSArtur Paszkiewicz { 2431738488eSArtur Paszkiewicz .name = "Restore P2L checkpoints", 2441738488eSArtur Paszkiewicz .action = ftl_mngt_p2l_restore_ckpt 2451738488eSArtur Paszkiewicz }, 2461738488eSArtur Paszkiewicz { 24786619848SKozlowski Mateusz .name = "Initialize L2P", 24886619848SKozlowski Mateusz .action = ftl_mngt_init_l2p, 24986619848SKozlowski Mateusz .cleanup = ftl_mngt_deinit_l2p 25086619848SKozlowski Mateusz }, 25186619848SKozlowski Mateusz { 25286619848SKozlowski Mateusz .name = "Restore L2P", 25386619848SKozlowski Mateusz .action = ftl_mngt_restore_l2p, 25486619848SKozlowski Mateusz }, 25586619848SKozlowski Mateusz { 25686619848SKozlowski Mateusz .name = "Finalize band initialization", 25786619848SKozlowski Mateusz .action = ftl_mngt_finalize_init_bands, 25886619848SKozlowski Mateusz }, 25986619848SKozlowski Mateusz { 26086619848SKozlowski Mateusz .name = "Start core poller", 26186619848SKozlowski Mateusz .action = ftl_mngt_start_core_poller, 26286619848SKozlowski Mateusz .cleanup = ftl_mngt_stop_core_poller 26386619848SKozlowski Mateusz }, 26486619848SKozlowski Mateusz { 26586619848SKozlowski Mateusz .name = "Self test on startup", 26686619848SKozlowski Mateusz .action = ftl_mngt_self_test, 26786619848SKozlowski Mateusz }, 26886619848SKozlowski Mateusz { 26986619848SKozlowski Mateusz .name = "Set FTL dirty state", 27086619848SKozlowski Mateusz .action = ftl_mngt_set_dirty, 27186619848SKozlowski Mateusz }, 27286619848SKozlowski Mateusz { 27386619848SKozlowski Mateusz .name = "Finalize initialization", 27486619848SKozlowski Mateusz .action = ftl_mngt_finalize_startup, 27586619848SKozlowski Mateusz }, 27686619848SKozlowski Mateusz {} 27786619848SKozlowski Mateusz } 27886619848SKozlowski Mateusz }; 27986619848SKozlowski Mateusz 280e49ccfc8SArtur Paszkiewicz int 281e49ccfc8SArtur Paszkiewicz ftl_mngt_call_dev_startup(struct spdk_ftl_dev *dev, ftl_mngt_completion cb, void *cb_cntx) 282e49ccfc8SArtur Paszkiewicz { 283e49ccfc8SArtur Paszkiewicz return ftl_mngt_process_execute(dev, &desc_startup, cb, cb_cntx); 284e49ccfc8SArtur Paszkiewicz } 285e49ccfc8SArtur Paszkiewicz 286106ad379SMateusz Kozlowski struct ftl_trim_ctx { 2872c7c8b6cSKozlowski Mateusz uint64_t lba; 2882c7c8b6cSKozlowski Mateusz uint64_t num_blocks; 2892c7c8b6cSKozlowski Mateusz spdk_ftl_fn cb_fn; 2902c7c8b6cSKozlowski Mateusz void *cb_arg; 291be61c92aSKozlowski Mateusz struct spdk_thread *thread; 292be61c92aSKozlowski Mateusz int status; 2932c7c8b6cSKozlowski Mateusz }; 2942c7c8b6cSKozlowski Mateusz 2952c7c8b6cSKozlowski Mateusz static void 296106ad379SMateusz Kozlowski ftl_mngt_process_trim_cb(void *ctx, int status) 2972c7c8b6cSKozlowski Mateusz { 2982c7c8b6cSKozlowski Mateusz struct ftl_mngt_process *mngt = ctx; 2992c7c8b6cSKozlowski Mateusz 3002c7c8b6cSKozlowski Mateusz if (status) { 3012c7c8b6cSKozlowski Mateusz ftl_mngt_fail_step(ctx); 3022c7c8b6cSKozlowski Mateusz } else { 3032c7c8b6cSKozlowski Mateusz ftl_mngt_next_step(mngt); 3042c7c8b6cSKozlowski Mateusz } 3052c7c8b6cSKozlowski Mateusz } 3062c7c8b6cSKozlowski Mateusz 3072c7c8b6cSKozlowski Mateusz static void 308106ad379SMateusz Kozlowski ftl_mngt_process_trim(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 3092c7c8b6cSKozlowski Mateusz { 3102c7c8b6cSKozlowski Mateusz struct ftl_io *io = ftl_mngt_get_process_ctx(mngt); 311106ad379SMateusz Kozlowski struct ftl_trim_ctx *ctx = ftl_mngt_get_caller_ctx(mngt); 3122c7c8b6cSKozlowski Mateusz int rc; 3132c7c8b6cSKozlowski Mateusz 3142c7c8b6cSKozlowski Mateusz if (!dev->ioch) { 3152c7c8b6cSKozlowski Mateusz ftl_mngt_fail_step(mngt); 3162c7c8b6cSKozlowski Mateusz return; 3172c7c8b6cSKozlowski Mateusz } 3182c7c8b6cSKozlowski Mateusz 319106ad379SMateusz Kozlowski rc = spdk_ftl_unmap(dev, io, dev->ioch, ctx->lba, ctx->num_blocks, ftl_mngt_process_trim_cb, mngt); 3202c7c8b6cSKozlowski Mateusz if (rc == -EAGAIN) { 3212c7c8b6cSKozlowski Mateusz ftl_mngt_continue_step(mngt); 3222c7c8b6cSKozlowski Mateusz } 3232c7c8b6cSKozlowski Mateusz } 3242c7c8b6cSKozlowski Mateusz 3252c7c8b6cSKozlowski Mateusz /* 326106ad379SMateusz Kozlowski * RPC trim path. 3272c7c8b6cSKozlowski Mateusz */ 328106ad379SMateusz Kozlowski static const struct ftl_mngt_process_desc g_desc_trim = { 329106ad379SMateusz Kozlowski .name = "FTL trim", 3302c7c8b6cSKozlowski Mateusz .ctx_size = sizeof(struct ftl_io), 3312c7c8b6cSKozlowski Mateusz .steps = { 3322c7c8b6cSKozlowski Mateusz { 333106ad379SMateusz Kozlowski .name = "Process trim", 334106ad379SMateusz Kozlowski .action = ftl_mngt_process_trim, 3352c7c8b6cSKozlowski Mateusz }, 3362c7c8b6cSKozlowski Mateusz {} 3372c7c8b6cSKozlowski Mateusz } 3382c7c8b6cSKozlowski Mateusz }; 3392c7c8b6cSKozlowski Mateusz 3402c7c8b6cSKozlowski Mateusz static void 341106ad379SMateusz Kozlowski trim_user_cb(void *_ctx) 3422c7c8b6cSKozlowski Mateusz { 343106ad379SMateusz Kozlowski struct ftl_trim_ctx *ctx = _ctx; 3442c7c8b6cSKozlowski Mateusz 345be61c92aSKozlowski Mateusz ctx->cb_fn(ctx->cb_arg, ctx->status); 3462c7c8b6cSKozlowski Mateusz free(ctx); 3472c7c8b6cSKozlowski Mateusz } 3482c7c8b6cSKozlowski Mateusz 349be61c92aSKozlowski Mateusz static void 350106ad379SMateusz Kozlowski ftl_mngt_trim_cb(struct spdk_ftl_dev *dev, void *_ctx, int status) 351be61c92aSKozlowski Mateusz { 352106ad379SMateusz Kozlowski struct ftl_trim_ctx *ctx = _ctx; 353be61c92aSKozlowski Mateusz ctx->status = status; 354be61c92aSKozlowski Mateusz 355106ad379SMateusz Kozlowski if (spdk_thread_send_msg(ctx->thread, trim_user_cb, ctx)) { 356be61c92aSKozlowski Mateusz ftl_abort(); 357be61c92aSKozlowski Mateusz } 358be61c92aSKozlowski Mateusz } 359be61c92aSKozlowski Mateusz 3602c7c8b6cSKozlowski Mateusz int 361106ad379SMateusz Kozlowski ftl_mngt_trim(struct spdk_ftl_dev *dev, uint64_t lba, uint64_t num_blocks, spdk_ftl_fn cb, 3622c7c8b6cSKozlowski Mateusz void *cb_cntx) 3632c7c8b6cSKozlowski Mateusz { 364106ad379SMateusz Kozlowski struct ftl_trim_ctx *ctx; 3652c7c8b6cSKozlowski Mateusz 3662c7c8b6cSKozlowski Mateusz ctx = calloc(1, sizeof(*ctx)); 3672c7c8b6cSKozlowski Mateusz if (ctx == NULL) { 3682c7c8b6cSKozlowski Mateusz return -EAGAIN; 3692c7c8b6cSKozlowski Mateusz } 3702c7c8b6cSKozlowski Mateusz 3712c7c8b6cSKozlowski Mateusz ctx->lba = lba; 3722c7c8b6cSKozlowski Mateusz ctx->num_blocks = num_blocks; 3732c7c8b6cSKozlowski Mateusz ctx->cb_fn = cb; 3742c7c8b6cSKozlowski Mateusz ctx->cb_arg = cb_cntx; 375be61c92aSKozlowski Mateusz ctx->thread = spdk_get_thread(); 3762c7c8b6cSKozlowski Mateusz 377106ad379SMateusz Kozlowski return ftl_mngt_process_execute(dev, &g_desc_trim, ftl_mngt_trim_cb, ctx); 3782c7c8b6cSKozlowski Mateusz } 3792c7c8b6cSKozlowski Mateusz 380e49ccfc8SArtur Paszkiewicz void 381e49ccfc8SArtur Paszkiewicz ftl_mngt_rollback_device(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt) 382e49ccfc8SArtur Paszkiewicz { 383e49ccfc8SArtur Paszkiewicz ftl_mngt_call_process_rollback(mngt, &desc_startup); 384e49ccfc8SArtur Paszkiewicz } 385