xref: /spdk/lib/ftl/mngt/ftl_mngt_startup.c (revision 6d6179ff420a322c5161a49a5af5bfd30e78674e)
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