xref: /spdk/include/spdk/nvme_zns.h (revision 488570ebd418ba07c9e69e65106dcc964f3bb41b)
1*488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
23be29357SNiklas Cassel  *   Copyright (c) 2020, Western Digital Corporation. All rights reserved.
33be29357SNiklas Cassel  */
43be29357SNiklas Cassel 
53be29357SNiklas Cassel /**
63be29357SNiklas Cassel  * \file
73be29357SNiklas Cassel  * NVMe driver public API extension for Zoned Namespace Command Set
83be29357SNiklas Cassel  */
93be29357SNiklas Cassel 
103be29357SNiklas Cassel #ifndef SPDK_NVME_ZNS_H
113be29357SNiklas Cassel #define SPDK_NVME_ZNS_H
123be29357SNiklas Cassel 
133be29357SNiklas Cassel #include "spdk/stdinc.h"
143be29357SNiklas Cassel 
153be29357SNiklas Cassel #ifdef __cplusplus
163be29357SNiklas Cassel extern "C" {
173be29357SNiklas Cassel #endif
183be29357SNiklas Cassel 
193be29357SNiklas Cassel #include "spdk/nvme.h"
203be29357SNiklas Cassel 
213be29357SNiklas Cassel /**
223be29357SNiklas Cassel  * Get the Zoned Namespace Command Set Specific Identify Namespace data
233be29357SNiklas Cassel  * as defined by the NVMe Zoned Namespace Command Set Specification.
243be29357SNiklas Cassel  *
253be29357SNiklas Cassel  * This function is thread safe and can be called at any point while the controller
263be29357SNiklas Cassel  * is attached to the SPDK NVMe driver.
273be29357SNiklas Cassel  *
283be29357SNiklas Cassel  * \param ns Namespace.
293be29357SNiklas Cassel  *
303be29357SNiklas Cassel  * \return a pointer to the namespace data, or NULL if the namespace is not
313be29357SNiklas Cassel  * a Zoned Namespace.
323be29357SNiklas Cassel  */
333be29357SNiklas Cassel const struct spdk_nvme_zns_ns_data *spdk_nvme_zns_ns_get_data(struct spdk_nvme_ns *ns);
343be29357SNiklas Cassel 
353be29357SNiklas Cassel /**
369a800c38SNiklas Cassel  * Get the zone size, in number of sectors, of the given namespace.
379a800c38SNiklas Cassel  *
389a800c38SNiklas Cassel  * This function is thread safe and can be called at any point while the controller
399a800c38SNiklas Cassel  * is attached to the SPDK NVMe driver.
409a800c38SNiklas Cassel  *
419a800c38SNiklas Cassel  * \param ns Namespace to query.
429a800c38SNiklas Cassel  *
439a800c38SNiklas Cassel  * \return the zone size of the given namespace in number of sectors.
449a800c38SNiklas Cassel  */
459a800c38SNiklas Cassel uint64_t spdk_nvme_zns_ns_get_zone_size_sectors(struct spdk_nvme_ns *ns);
469a800c38SNiklas Cassel 
479a800c38SNiklas Cassel /**
486abee9a2SNiklas Cassel  * Get the zone size, in bytes, of the given namespace.
496abee9a2SNiklas Cassel  *
506abee9a2SNiklas Cassel  * This function is thread safe and can be called at any point while the controller
516abee9a2SNiklas Cassel  * is attached to the SPDK NVMe driver.
526abee9a2SNiklas Cassel  *
536abee9a2SNiklas Cassel  * \param ns Namespace to query.
546abee9a2SNiklas Cassel  *
556abee9a2SNiklas Cassel  * \return the zone size of the given namespace in bytes.
566abee9a2SNiklas Cassel  */
576abee9a2SNiklas Cassel uint64_t spdk_nvme_zns_ns_get_zone_size(struct spdk_nvme_ns *ns);
586abee9a2SNiklas Cassel 
596abee9a2SNiklas Cassel /**
60be3ff9c0SNiklas Cassel  * Get the number of zones for the given namespace.
61be3ff9c0SNiklas Cassel  *
62be3ff9c0SNiklas Cassel  * This function is thread safe and can be called at any point while the controller
63be3ff9c0SNiklas Cassel  * is attached to the SPDK NVMe driver.
64be3ff9c0SNiklas Cassel  *
65be3ff9c0SNiklas Cassel  * \param ns Namespace to query.
66be3ff9c0SNiklas Cassel  *
67be3ff9c0SNiklas Cassel  * \return the number of zones.
68be3ff9c0SNiklas Cassel  */
69be3ff9c0SNiklas Cassel uint64_t spdk_nvme_zns_ns_get_num_zones(struct spdk_nvme_ns *ns);
70be3ff9c0SNiklas Cassel 
71be3ff9c0SNiklas Cassel /**
72bb5330c0SNiklas Cassel  * Get the maximum number of open zones for the given namespace.
73bb5330c0SNiklas Cassel  *
74bb5330c0SNiklas Cassel  * An open zone is a zone in any of the zone states:
75bb5330c0SNiklas Cassel  * EXPLICIT OPEN or IMPLICIT OPEN.
76bb5330c0SNiklas Cassel  *
77bb5330c0SNiklas Cassel  * If this value is 0, there is no limit.
78bb5330c0SNiklas Cassel  *
79bb5330c0SNiklas Cassel  * This function is thread safe and can be called at any point while the controller
80bb5330c0SNiklas Cassel  * is attached to the SPDK NVMe driver.
81bb5330c0SNiklas Cassel  *
82bb5330c0SNiklas Cassel  * \param ns Namespace to query.
83bb5330c0SNiklas Cassel  *
84bb5330c0SNiklas Cassel  * \return the maximum number of open zones.
85bb5330c0SNiklas Cassel  */
86bb5330c0SNiklas Cassel uint32_t spdk_nvme_zns_ns_get_max_open_zones(struct spdk_nvme_ns *ns);
87bb5330c0SNiklas Cassel 
88bb5330c0SNiklas Cassel /**
899d79d27eSNiklas Cassel  * Get the maximum number of active zones for the given namespace.
909d79d27eSNiklas Cassel  *
919d79d27eSNiklas Cassel  * An active zone is a zone in any of the zone states:
929d79d27eSNiklas Cassel  * EXPLICIT OPEN, IMPLICIT OPEN or CLOSED.
939d79d27eSNiklas Cassel  *
949d79d27eSNiklas Cassel  * If this value is 0, there is no limit.
959d79d27eSNiklas Cassel  *
969d79d27eSNiklas Cassel  * This function is thread safe and can be called at any point while the controller
979d79d27eSNiklas Cassel  * is attached to the SPDK NVMe driver.
989d79d27eSNiklas Cassel  *
999d79d27eSNiklas Cassel  * \param ns Namespace to query.
1009d79d27eSNiklas Cassel  *
1019d79d27eSNiklas Cassel  * \return the maximum number of active zones.
1029d79d27eSNiklas Cassel  */
1039d79d27eSNiklas Cassel uint32_t spdk_nvme_zns_ns_get_max_active_zones(struct spdk_nvme_ns *ns);
1049d79d27eSNiklas Cassel 
1059d79d27eSNiklas Cassel /**
1063be29357SNiklas Cassel  * Get the Zoned Namespace Command Set Specific Identify Controller data
1073be29357SNiklas Cassel  * as defined by the NVMe Zoned Namespace Command Set Specification.
1083be29357SNiklas Cassel  *
1093be29357SNiklas Cassel  * This function is thread safe and can be called at any point while the controller
1103be29357SNiklas Cassel  * is attached to the SPDK NVMe driver.
1113be29357SNiklas Cassel  *
1123be29357SNiklas Cassel  * \param ctrlr Opaque handle to NVMe controller.
1133be29357SNiklas Cassel  *
1143be29357SNiklas Cassel  * \return pointer to the controller data, or NULL if the controller does not
1153be29357SNiklas Cassel  * support the Zoned Command Set.
1163be29357SNiklas Cassel  */
1173be29357SNiklas Cassel const struct spdk_nvme_zns_ctrlr_data *spdk_nvme_zns_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr);
1183be29357SNiklas Cassel 
11967475a58SNiklas Cassel /**
12023a19169SNiklas Cassel  * Get the maximum zone append data transfer size of a given NVMe controller.
12123a19169SNiklas Cassel  *
12223a19169SNiklas Cassel  * \param ctrlr Opaque handle to NVMe controller.
12323a19169SNiklas Cassel  *
12423a19169SNiklas Cassel  * \return Maximum zone append data transfer size of the NVMe controller in bytes.
12523a19169SNiklas Cassel  */
12623a19169SNiklas Cassel uint32_t spdk_nvme_zns_ctrlr_get_max_zone_append_size(const struct spdk_nvme_ctrlr *ctrlr);
12723a19169SNiklas Cassel 
12823a19169SNiklas Cassel /**
129aa6767fbSNiklas Cassel  * Submit a zone append I/O to the specified NVMe namespace.
130aa6767fbSNiklas Cassel  *
131aa6767fbSNiklas Cassel  * The command is submitted to a qpair allocated by spdk_nvme_ctrlr_alloc_io_qpair().
132aa6767fbSNiklas Cassel  * The user must ensure that only one thread submits I/O on a given qpair at any
133aa6767fbSNiklas Cassel  * given time.
134aa6767fbSNiklas Cassel  *
135c56fb6d3SNiklas Cassel  * \param ns NVMe namespace to submit the zone append I/O.
136aa6767fbSNiklas Cassel  * \param qpair I/O queue pair to submit the request.
137aa6767fbSNiklas Cassel  * \param buffer Virtual address pointer to the data payload buffer.
138aa6767fbSNiklas Cassel  * \param zslba Zone Start LBA of the zone that we are appending to.
139c56fb6d3SNiklas Cassel  * \param lba_count Length (in sectors) for the zone append operation.
140aa6767fbSNiklas Cassel  * \param cb_fn Callback function to invoke when the I/O is completed.
141aa6767fbSNiklas Cassel  * \param cb_arg Argument to pass to the callback function.
142aa6767fbSNiklas Cassel  * \param io_flags Set flags, defined by the SPDK_NVME_IO_FLAGS_* entries in
143aa6767fbSNiklas Cassel  * spdk/nvme_spec.h, for this I/O.
144aa6767fbSNiklas Cassel  *
145aa6767fbSNiklas Cassel  * \return 0 if successfully submitted, negated errnos on the following error conditions:
146aa6767fbSNiklas Cassel  * -EINVAL: The request is malformed.
147aa6767fbSNiklas Cassel  * -ENOMEM: The request cannot be allocated.
148aa6767fbSNiklas Cassel  * -ENXIO: The qpair is failed at the transport level.
149aa6767fbSNiklas Cassel  */
150aa6767fbSNiklas Cassel int spdk_nvme_zns_zone_append(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
151aa6767fbSNiklas Cassel 			      void *buffer, uint64_t zslba,
152aa6767fbSNiklas Cassel 			      uint32_t lba_count, spdk_nvme_cmd_cb cb_fn, void *cb_arg,
153aa6767fbSNiklas Cassel 			      uint32_t io_flags);
154aa6767fbSNiklas Cassel 
155aa6767fbSNiklas Cassel /**
156aa6767fbSNiklas Cassel  * Submit a zone append I/O to the specified NVMe namespace.
157aa6767fbSNiklas Cassel  *
158aa6767fbSNiklas Cassel  * The command is submitted to a qpair allocated by spdk_nvme_ctrlr_alloc_io_qpair().
159aa6767fbSNiklas Cassel  * The user must ensure that only one thread submits I/O on a given qpair at any
160aa6767fbSNiklas Cassel  * given time.
161aa6767fbSNiklas Cassel  *
162c56fb6d3SNiklas Cassel  * \param ns NVMe namespace to submit the zone append I/O.
163aa6767fbSNiklas Cassel  * \param qpair I/O queue pair to submit the request.
164aa6767fbSNiklas Cassel  * \param buffer Virtual address pointer to the data payload buffer.
165aa6767fbSNiklas Cassel  * \param metadata Virtual address pointer to the metadata payload, the length
166aa6767fbSNiklas Cassel  * of metadata is specified by spdk_nvme_ns_get_md_size().
167aa6767fbSNiklas Cassel  * \param zslba Zone Start LBA of the zone that we are appending to.
168c56fb6d3SNiklas Cassel  * \param lba_count Length (in sectors) for the zone append operation.
169aa6767fbSNiklas Cassel  * \param cb_fn Callback function to invoke when the I/O is completed.
170aa6767fbSNiklas Cassel  * \param cb_arg Argument to pass to the callback function.
171aa6767fbSNiklas Cassel  * \param io_flags Set flags, defined by the SPDK_NVME_IO_FLAGS_* entries in
172aa6767fbSNiklas Cassel  * spdk/nvme_spec.h, for this I/O.
173aa6767fbSNiklas Cassel  * \param apptag_mask Application tag mask.
174aa6767fbSNiklas Cassel  * \param apptag Application tag to use end-to-end protection information.
175aa6767fbSNiklas Cassel  *
176aa6767fbSNiklas Cassel  * \return 0 if successfully submitted, negated errnos on the following error conditions:
177aa6767fbSNiklas Cassel  * -EINVAL: The request is malformed.
178aa6767fbSNiklas Cassel  * -ENOMEM: The request cannot be allocated.
179aa6767fbSNiklas Cassel  * -ENXIO: The qpair is failed at the transport level.
180aa6767fbSNiklas Cassel  */
181aa6767fbSNiklas Cassel int spdk_nvme_zns_zone_append_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
182aa6767fbSNiklas Cassel 				      void *buffer, void *metadata, uint64_t zslba,
183aa6767fbSNiklas Cassel 				      uint32_t lba_count, spdk_nvme_cmd_cb cb_fn, void *cb_arg,
184aa6767fbSNiklas Cassel 				      uint32_t io_flags, uint16_t apptag_mask, uint16_t apptag);
185aa6767fbSNiklas Cassel 
186aa6767fbSNiklas Cassel /**
187014baeb8SNiklas Cassel  * Submit a zone append I/O to the specified NVMe namespace.
188014baeb8SNiklas Cassel  *
189014baeb8SNiklas Cassel  * The command is submitted to a qpair allocated by spdk_nvme_ctrlr_alloc_io_qpair().
190014baeb8SNiklas Cassel  * The user must ensure that only one thread submits I/O on a given qpair at any
191014baeb8SNiklas Cassel  * given time.
192014baeb8SNiklas Cassel  *
193014baeb8SNiklas Cassel  * \param ns NVMe namespace to submit the zone append I/O.
194014baeb8SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
195014baeb8SNiklas Cassel  * \param zslba Zone Start LBA of the zone that we are appending to.
196014baeb8SNiklas Cassel  * \param lba_count Length (in sectors) for the zone append operation.
197014baeb8SNiklas Cassel  * \param cb_fn Callback function to invoke when the I/O is completed.
198014baeb8SNiklas Cassel  * \param cb_arg Argument to pass to the callback function.
199014baeb8SNiklas Cassel  * \param io_flags Set flags, defined in nvme_spec.h, for this I/O.
200014baeb8SNiklas Cassel  * \param reset_sgl_fn Callback function to reset scattered payload.
201014baeb8SNiklas Cassel  * \param next_sge_fn Callback function to iterate each scattered payload memory
202014baeb8SNiklas Cassel  * segment.
203014baeb8SNiklas Cassel  *
204014baeb8SNiklas Cassel  * \return 0 if successfully submitted, negated errnos on the following error conditions:
205014baeb8SNiklas Cassel  * -EINVAL: The request is malformed.
206014baeb8SNiklas Cassel  * -ENOMEM: The request cannot be allocated.
207014baeb8SNiklas Cassel  * -ENXIO: The qpair is failed at the transport level.
208014baeb8SNiklas Cassel  */
209014baeb8SNiklas Cassel int spdk_nvme_zns_zone_appendv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
210014baeb8SNiklas Cassel 			       uint64_t zslba, uint32_t lba_count,
211014baeb8SNiklas Cassel 			       spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags,
212014baeb8SNiklas Cassel 			       spdk_nvme_req_reset_sgl_cb reset_sgl_fn,
213014baeb8SNiklas Cassel 			       spdk_nvme_req_next_sge_cb next_sge_fn);
214014baeb8SNiklas Cassel 
215014baeb8SNiklas Cassel /**
216014baeb8SNiklas Cassel  * Submit a zone append I/O to the specified NVMe namespace.
217014baeb8SNiklas Cassel  *
218014baeb8SNiklas Cassel  * The command is submitted to a qpair allocated by spdk_nvme_ctrlr_alloc_io_qpair().
219014baeb8SNiklas Cassel  * The user must ensure that only one thread submits I/O on a given qpair at any
220014baeb8SNiklas Cassel  * given time.
221014baeb8SNiklas Cassel  *
222014baeb8SNiklas Cassel  * \param ns NVMe namespace to submit the zone append I/O.
223014baeb8SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
224014baeb8SNiklas Cassel  * \param zslba Zone Start LBA of the zone that we are appending to.
225014baeb8SNiklas Cassel  * \param lba_count Length (in sectors) for the zone append operation.
226014baeb8SNiklas Cassel  * \param cb_fn Callback function to invoke when the I/O is completed.
227014baeb8SNiklas Cassel  * \param cb_arg Argument to pass to the callback function.
228014baeb8SNiklas Cassel  * \param io_flags Set flags, defined in nvme_spec.h, for this I/O.
229014baeb8SNiklas Cassel  * \param reset_sgl_fn Callback function to reset scattered payload.
230014baeb8SNiklas Cassel  * \param next_sge_fn Callback function to iterate each scattered payload memory
231014baeb8SNiklas Cassel  * segment.
232014baeb8SNiklas Cassel  * \param metadata Virtual address pointer to the metadata payload, the length
233014baeb8SNiklas Cassel  * of metadata is specified by spdk_nvme_ns_get_md_size().
234014baeb8SNiklas Cassel  * \param apptag_mask Application tag mask.
235014baeb8SNiklas Cassel  * \param apptag Application tag to use end-to-end protection information.
236014baeb8SNiklas Cassel  *
237014baeb8SNiklas Cassel  * \return 0 if successfully submitted, negated errnos on the following error conditions:
238014baeb8SNiklas Cassel  * -EINVAL: The request is malformed.
239014baeb8SNiklas Cassel  * -ENOMEM: The request cannot be allocated.
240014baeb8SNiklas Cassel  * -ENXIO: The qpair is failed at the transport level.
241014baeb8SNiklas Cassel  */
242014baeb8SNiklas Cassel int spdk_nvme_zns_zone_appendv_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
243014baeb8SNiklas Cassel 				       uint64_t zslba, uint32_t lba_count,
244014baeb8SNiklas Cassel 				       spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags,
245014baeb8SNiklas Cassel 				       spdk_nvme_req_reset_sgl_cb reset_sgl_fn,
246014baeb8SNiklas Cassel 				       spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata,
247014baeb8SNiklas Cassel 				       uint16_t apptag_mask, uint16_t apptag);
248014baeb8SNiklas Cassel 
249014baeb8SNiklas Cassel /**
25067475a58SNiklas Cassel  * Submit a Close Zone operation to the specified NVMe namespace.
25167475a58SNiklas Cassel  *
25267475a58SNiklas Cassel  * \param ns Namespace.
25367475a58SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
25467475a58SNiklas Cassel  * \param slba starting LBA of the zone to operate on.
25567475a58SNiklas Cassel  * \param select_all If this is set, slba will be ignored, and operation will
25667475a58SNiklas Cassel  * be performed on all zones that are in ZSIO or ZSEO state.
25767475a58SNiklas Cassel  * \param cb_fn Callback function invoked when the I/O command completes.
25867475a58SNiklas Cassel  * \param cb_arg Argument passed to callback function.
25967475a58SNiklas Cassel  *
26067475a58SNiklas Cassel  * \return 0 on success. Negated errno on failure.
26167475a58SNiklas Cassel  */
26267475a58SNiklas Cassel int spdk_nvme_zns_close_zone(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
26367475a58SNiklas Cassel 			     uint64_t slba, bool select_all,
26467475a58SNiklas Cassel 			     spdk_nvme_cmd_cb cb_fn, void *cb_arg);
26567475a58SNiklas Cassel 
26667475a58SNiklas Cassel /**
26767475a58SNiklas Cassel  * Submit a Finish Zone operation to the specified NVMe namespace.
26867475a58SNiklas Cassel  *
26967475a58SNiklas Cassel  * \param ns Namespace.
27067475a58SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
27167475a58SNiklas Cassel  * \param slba starting LBA of the zone to operate on.
27267475a58SNiklas Cassel  * \param select_all If this is set, slba will be ignored, and operation will
27367475a58SNiklas Cassel  * be performed on all zones that are in ZSIO, ZSEO, or ZSC state.
27467475a58SNiklas Cassel  * \param cb_fn Callback function invoked when the I/O command completes.
27567475a58SNiklas Cassel  * \param cb_arg Argument passed to callback function.
27667475a58SNiklas Cassel  *
27767475a58SNiklas Cassel  * \return 0 on success. Negated errno on failure.
27867475a58SNiklas Cassel  */
27967475a58SNiklas Cassel int spdk_nvme_zns_finish_zone(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
28067475a58SNiklas Cassel 			      uint64_t slba, bool select_all,
28167475a58SNiklas Cassel 			      spdk_nvme_cmd_cb cb_fn, void *cb_arg);
28267475a58SNiklas Cassel 
28367475a58SNiklas Cassel /**
28467475a58SNiklas Cassel  * Submit a Open Zone operation to the specified NVMe namespace.
28567475a58SNiklas Cassel  *
28667475a58SNiklas Cassel  * \param ns Namespace.
28767475a58SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
28867475a58SNiklas Cassel  * \param slba starting LBA of the zone to operate on.
28967475a58SNiklas Cassel  * \param select_all If this is set, slba will be ignored, and operation will
29067475a58SNiklas Cassel  * be performed on all zones that are in ZSC state.
29167475a58SNiklas Cassel  * \param cb_fn Callback function invoked when the I/O command completes.
29267475a58SNiklas Cassel  * \param cb_arg Argument passed to callback function.
29367475a58SNiklas Cassel  *
29467475a58SNiklas Cassel  * \return 0 on success. Negated errno on failure.
29567475a58SNiklas Cassel  */
29667475a58SNiklas Cassel int spdk_nvme_zns_open_zone(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
29767475a58SNiklas Cassel 			    uint64_t slba, bool select_all,
29867475a58SNiklas Cassel 			    spdk_nvme_cmd_cb cb_fn, void *cb_arg);
29967475a58SNiklas Cassel 
30067475a58SNiklas Cassel /**
30167475a58SNiklas Cassel  * Submit a Reset Zone operation to the specified NVMe namespace.
30267475a58SNiklas Cassel  *
30367475a58SNiklas Cassel  * \param ns Namespace.
30467475a58SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
30567475a58SNiklas Cassel  * \param slba starting LBA of the zone to operate on.
30667475a58SNiklas Cassel  * \param select_all If this is set, slba will be ignored, and operation will
30767475a58SNiklas Cassel  * be performed on all zones that are in ZSIO, ZSEO, ZSC, or ZSF state.
30867475a58SNiklas Cassel  * \param cb_fn Callback function invoked when the I/O command completes.
30967475a58SNiklas Cassel  * \param cb_arg Argument passed to callback function.
31067475a58SNiklas Cassel  *
31167475a58SNiklas Cassel  * \return 0 on success. Negated errno on failure.
31267475a58SNiklas Cassel  */
31367475a58SNiklas Cassel int spdk_nvme_zns_reset_zone(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
31467475a58SNiklas Cassel 			     uint64_t slba, bool select_all,
31567475a58SNiklas Cassel 			     spdk_nvme_cmd_cb cb_fn, void *cb_arg);
31667475a58SNiklas Cassel 
31767475a58SNiklas Cassel /**
31867475a58SNiklas Cassel  * Submit a Offline Zone operation to the specified NVMe namespace.
31967475a58SNiklas Cassel  *
32067475a58SNiklas Cassel  * \param ns Namespace.
32167475a58SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
32267475a58SNiklas Cassel  * \param slba starting LBA of the zone to operate on.
32367475a58SNiklas Cassel  * \param select_all If this is set, slba will be ignored, and operation will
32467475a58SNiklas Cassel  * be performed on all zones that are in ZSRO state.
32567475a58SNiklas Cassel  * \param cb_fn Callback function invoked when the I/O command completes.
32667475a58SNiklas Cassel  * \param cb_arg Argument passed to callback function.
32767475a58SNiklas Cassel  *
32867475a58SNiklas Cassel  * \return 0 on success. Negated errno on failure.
32967475a58SNiklas Cassel  */
33067475a58SNiklas Cassel int spdk_nvme_zns_offline_zone(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
33167475a58SNiklas Cassel 			       uint64_t slba, bool select_all,
33267475a58SNiklas Cassel 			       spdk_nvme_cmd_cb cb_fn, void *cb_arg);
33367475a58SNiklas Cassel 
3346dec7623SNiklas Cassel /**
335490c83c6SKrishna Kanth Reddy  * Submit a Set Zone Descriptor Extension operation to the specified NVMe namespace.
336490c83c6SKrishna Kanth Reddy  *
337490c83c6SKrishna Kanth Reddy  * \param ns Namespace.
338490c83c6SKrishna Kanth Reddy  * \param qpair I/O queue pair to submit the request.
339490c83c6SKrishna Kanth Reddy  * \param slba starting LBA of the zone to operate on.
340490c83c6SKrishna Kanth Reddy  * \param buffer Virtual address pointer to the data payload buffer.
341490c83c6SKrishna Kanth Reddy  * \param payload_size Payload buffer size.
342490c83c6SKrishna Kanth Reddy  * \param cb_fn Callback function invoked when the I/O command completes.
343490c83c6SKrishna Kanth Reddy  * \param cb_arg Argument passed to callback function.
344490c83c6SKrishna Kanth Reddy  *
345490c83c6SKrishna Kanth Reddy  * \return 0 on success. Negated errno on failure.
346490c83c6SKrishna Kanth Reddy  */
347490c83c6SKrishna Kanth Reddy int spdk_nvme_zns_set_zone_desc_ext(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
348490c83c6SKrishna Kanth Reddy 				    uint64_t slba, void *buffer, uint32_t payload_size,
349490c83c6SKrishna Kanth Reddy 				    spdk_nvme_cmd_cb cb_fn, void *cb_arg);
350490c83c6SKrishna Kanth Reddy 
351490c83c6SKrishna Kanth Reddy /**
3526dec7623SNiklas Cassel  * Get a zone report from the specified NVMe namespace.
3536dec7623SNiklas Cassel  *
3546dec7623SNiklas Cassel  * \param ns Namespace.
3556dec7623SNiklas Cassel  * \param qpair I/O queue pair to submit the request.
3566dec7623SNiklas Cassel  * \param payload The pointer to the payload buffer.
3576dec7623SNiklas Cassel  * \param payload_size The size of payload buffer.
3586dec7623SNiklas Cassel  * \param slba starting LBA of the zone to operate on.
3596dec7623SNiklas Cassel  * \param report_opts Filter on which zone states to include in the zone report.
3606dec7623SNiklas Cassel  * \param partial_report If true, nr_zones field in the zone report indicates the number of zone
3616dec7623SNiklas Cassel  * descriptors that were successfully written to the zone report. If false, nr_zones field in the
3626dec7623SNiklas Cassel  * zone report indicates the number of zone descriptors that match the report_opts criteria.
3636dec7623SNiklas Cassel  * \param cb_fn Callback function invoked when the I/O command completes.
3646dec7623SNiklas Cassel  * \param cb_arg Argument passed to callback function.
3656dec7623SNiklas Cassel  *
3666dec7623SNiklas Cassel  * \return 0 on success. Negated errno on failure.
3676dec7623SNiklas Cassel  */
3686dec7623SNiklas Cassel int spdk_nvme_zns_report_zones(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
3696dec7623SNiklas Cassel 			       void *payload, uint32_t payload_size, uint64_t slba,
3706dec7623SNiklas Cassel 			       enum spdk_nvme_zns_zra_report_opts report_opts, bool partial_report,
3716dec7623SNiklas Cassel 			       spdk_nvme_cmd_cb cb_fn, void *cb_arg);
3726dec7623SNiklas Cassel 
373490c83c6SKrishna Kanth Reddy /**
374490c83c6SKrishna Kanth Reddy  * Get a extended zone report from the specified NVMe namespace.
375490c83c6SKrishna Kanth Reddy  *
376490c83c6SKrishna Kanth Reddy  * \param ns Namespace.
377490c83c6SKrishna Kanth Reddy  * \param qpair I/O queue pair to submit the request.
378490c83c6SKrishna Kanth Reddy  * \param payload The pointer to the payload buffer.
379490c83c6SKrishna Kanth Reddy  * \param payload_size The size of payload buffer.
380490c83c6SKrishna Kanth Reddy  * \param slba starting LBA of the zone to operate on.
381490c83c6SKrishna Kanth Reddy  * \param report_opts Filter on which zone states to include in the extended zone report.
382490c83c6SKrishna Kanth Reddy  * \param partial_report If true, nr_zones field in the extended zone report indicates the number of zone
383490c83c6SKrishna Kanth Reddy  * descriptors that were successfully written to the extended zone report. If false, nr_zones field in the
384490c83c6SKrishna Kanth Reddy  * extended zone report indicates the number of zone descriptors that match the report_opts criteria.
385490c83c6SKrishna Kanth Reddy  * \param cb_fn Callback function invoked when the I/O command completes.
386490c83c6SKrishna Kanth Reddy  * \param cb_arg Argument passed to callback function.
387490c83c6SKrishna Kanth Reddy  *
388490c83c6SKrishna Kanth Reddy  * \return 0 on success. Negated errno on failure.
389490c83c6SKrishna Kanth Reddy  */
390490c83c6SKrishna Kanth Reddy int spdk_nvme_zns_ext_report_zones(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
391490c83c6SKrishna Kanth Reddy 				   void *payload, uint32_t payload_size, uint64_t slba,
392490c83c6SKrishna Kanth Reddy 				   enum spdk_nvme_zns_zra_report_opts report_opts, bool partial_report,
393490c83c6SKrishna Kanth Reddy 				   spdk_nvme_cmd_cb cb_fn, void *cb_arg);
394490c83c6SKrishna Kanth Reddy 
3953be29357SNiklas Cassel #ifdef __cplusplus
3963be29357SNiklas Cassel }
3973be29357SNiklas Cassel #endif
3983be29357SNiklas Cassel 
3993be29357SNiklas Cassel #endif
400