xref: /spdk/lib/blob/request.h (revision b47cee6c96303f16c01318884c2969cf855c49e9)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2017 Intel Corporation.
3d89352a9SBen Walker  *   All rights reserved.
44d5ee263SMike Gerdts  *   Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
5d89352a9SBen Walker  */
6d89352a9SBen Walker 
7d89352a9SBen Walker #ifndef SPDK_BS_REQUEST_H
8d89352a9SBen Walker #define SPDK_BS_REQUEST_H
9d89352a9SBen Walker 
10b961d9ccSBen Walker #include "spdk/stdinc.h"
11d89352a9SBen Walker 
12d89352a9SBen Walker #include "spdk/blob.h"
13d89352a9SBen Walker 
14d89352a9SBen Walker enum spdk_bs_cpl_type {
15130d278aSPaul Luse 	SPDK_BS_CPL_TYPE_NONE,
16d89352a9SBen Walker 	SPDK_BS_CPL_TYPE_BS_BASIC,
17d89352a9SBen Walker 	SPDK_BS_CPL_TYPE_BS_HANDLE,
18d89352a9SBen Walker 	SPDK_BS_CPL_TYPE_BLOB_BASIC,
19d89352a9SBen Walker 	SPDK_BS_CPL_TYPE_BLOBID,
20d89352a9SBen Walker 	SPDK_BS_CPL_TYPE_BLOB_HANDLE,
21d89352a9SBen Walker 	SPDK_BS_CPL_TYPE_NESTED_SEQUENCE,
22d89352a9SBen Walker };
23d89352a9SBen Walker 
24b2503cb3SJim Harris enum spdk_blob_op_type;
25b2503cb3SJim Harris 
26d89352a9SBen Walker struct spdk_bs_request_set;
27d89352a9SBen Walker 
28d89352a9SBen Walker /* Use a sequence to submit a set of requests serially */
29d89352a9SBen Walker typedef struct spdk_bs_request_set spdk_bs_sequence_t;
30d89352a9SBen Walker 
31d89352a9SBen Walker /* Use a batch to submit a set of requests in parallel */
32d89352a9SBen Walker typedef struct spdk_bs_request_set spdk_bs_batch_t;
33d89352a9SBen Walker 
34b2503cb3SJim Harris /* Use a user_op to queue a user operation for later execution */
35b2503cb3SJim Harris typedef struct spdk_bs_request_set spdk_bs_user_op_t;
36b2503cb3SJim Harris 
37d89352a9SBen Walker typedef void (*spdk_bs_nested_seq_complete)(void *cb_arg, spdk_bs_sequence_t *parent, int bserrno);
38d89352a9SBen Walker 
39d89352a9SBen Walker struct spdk_bs_cpl {
40d89352a9SBen Walker 	enum spdk_bs_cpl_type type;
41d89352a9SBen Walker 	union {
42d89352a9SBen Walker 		struct {
43d89352a9SBen Walker 			spdk_bs_op_complete     cb_fn;
44d89352a9SBen Walker 			void                    *cb_arg;
45d89352a9SBen Walker 		} bs_basic;
46d89352a9SBen Walker 
47d89352a9SBen Walker 		struct {
48d89352a9SBen Walker 			spdk_bs_op_with_handle_complete cb_fn;
49d89352a9SBen Walker 			void                            *cb_arg;
50d89352a9SBen Walker 			struct spdk_blob_store          *bs;
51d89352a9SBen Walker 		} bs_handle;
52d89352a9SBen Walker 
53d89352a9SBen Walker 		struct {
54d89352a9SBen Walker 			spdk_blob_op_complete   cb_fn;
55d89352a9SBen Walker 			void                    *cb_arg;
56d89352a9SBen Walker 		} blob_basic;
57d89352a9SBen Walker 
58d89352a9SBen Walker 		struct {
59d89352a9SBen Walker 			spdk_blob_op_with_id_complete   cb_fn;
60d89352a9SBen Walker 			void                            *cb_arg;
61d89352a9SBen Walker 			spdk_blob_id                     blobid;
62d89352a9SBen Walker 		} blobid;
63d89352a9SBen Walker 
64d89352a9SBen Walker 		struct {
65d89352a9SBen Walker 			spdk_blob_op_with_handle_complete       cb_fn;
66d89352a9SBen Walker 			void                                    *cb_arg;
67d89352a9SBen Walker 			struct spdk_blob                        *blob;
684d5ee263SMike Gerdts 			void					*esnap_ctx;
69d89352a9SBen Walker 		} blob_handle;
70d89352a9SBen Walker 
71d89352a9SBen Walker 		struct {
72d89352a9SBen Walker 			spdk_bs_nested_seq_complete	cb_fn;
73d89352a9SBen Walker 			void				*cb_arg;
74d89352a9SBen Walker 			spdk_bs_sequence_t		*parent;
75d89352a9SBen Walker 		} nested_seq;
76d89352a9SBen Walker 	} u;
77d89352a9SBen Walker };
78d89352a9SBen Walker 
79d89352a9SBen Walker typedef void (*spdk_bs_sequence_cpl)(spdk_bs_sequence_t *sequence,
80d89352a9SBen Walker 				     void *cb_arg, int bserrno);
81d89352a9SBen Walker 
82b2503cb3SJim Harris /* A generic request set. Can be a sequence, batch or a user_op. */
83d89352a9SBen Walker struct spdk_bs_request_set {
84d89352a9SBen Walker 	struct spdk_bs_cpl      cpl;
85d89352a9SBen Walker 
86d89352a9SBen Walker 	int                     bserrno;
87d89352a9SBen Walker 
8831c2852bSMike Gerdts 	/*
8931c2852bSMike Gerdts 	 * The blobstore's channel, obtained by blobstore consumers via
9031c2852bSMike Gerdts 	 * spdk_bs_alloc_io_channel(). Used for IO to the blobstore.
9131c2852bSMike Gerdts 	 */
92d89352a9SBen Walker 	struct spdk_bs_channel		*channel;
9331c2852bSMike Gerdts 	/*
94*b47cee6cSMike Gerdts 	 * The channel used by the blobstore to perform IO on back_bs_dev. Unless the blob
95*b47cee6cSMike Gerdts 	 * is an esnap clone, back_channel == spdk_io_channel_get_ctx(set->channel).
9631c2852bSMike Gerdts 	 */
9731c2852bSMike Gerdts 	struct spdk_io_channel		*back_channel;
98d89352a9SBen Walker 
99d89352a9SBen Walker 	struct spdk_bs_dev_cb_args	cb_args;
100d89352a9SBen Walker 
101d89352a9SBen Walker 	union {
102d89352a9SBen Walker 		struct {
103d89352a9SBen Walker 			spdk_bs_sequence_cpl    cb_fn;
104d89352a9SBen Walker 			void                    *cb_arg;
105d89352a9SBen Walker 		} sequence;
106d89352a9SBen Walker 
107d89352a9SBen Walker 		struct {
108d89352a9SBen Walker 			uint32_t		outstanding_ops;
109d89352a9SBen Walker 			uint32_t		batch_closed;
110d89352a9SBen Walker 			spdk_bs_sequence_cpl	cb_fn;
111d89352a9SBen Walker 			void			*cb_arg;
112d89352a9SBen Walker 		} batch;
113b2503cb3SJim Harris 
114b2503cb3SJim Harris 		struct spdk_bs_user_op_args {
115b2503cb3SJim Harris 			int			type;
116b2503cb3SJim Harris 			int			iovcnt;
117b2503cb3SJim Harris 			struct spdk_blob	*blob;
118b2503cb3SJim Harris 			uint64_t		offset;
119b2503cb3SJim Harris 			uint64_t		length;
120b2503cb3SJim Harris 			spdk_blob_op_complete	cb_fn;
121b2503cb3SJim Harris 			void			*cb_arg;
122b2503cb3SJim Harris 			void			*payload; /* cast to iov for readv/writev */
123b2503cb3SJim Harris 		} user_op;
124d89352a9SBen Walker 	} u;
125a2360845SAlexey Marchuk 	/* Pointer to ext_io_opts passed by the user */
126a2360845SAlexey Marchuk 	struct spdk_blob_ext_io_opts *ext_io_opts;
127d89352a9SBen Walker 	TAILQ_ENTRY(spdk_bs_request_set) link;
128d89352a9SBen Walker };
129d89352a9SBen Walker 
130ad7fdd12SSeth Howell void bs_call_cpl(struct spdk_bs_cpl *cpl, int bserrno);
131d89352a9SBen Walker 
1322948183fSMike Gerdts spdk_bs_sequence_t *bs_sequence_start_bs(struct spdk_io_channel *channel,
133d89352a9SBen Walker 		struct spdk_bs_cpl *cpl);
134d89352a9SBen Walker 
1352948183fSMike Gerdts spdk_bs_sequence_t *bs_sequence_start_blob(struct spdk_io_channel *channel,
1362948183fSMike Gerdts 		struct spdk_bs_cpl *cpl, struct spdk_blob *blob);
1372948183fSMike Gerdts 
138*b47cee6cSMike Gerdts spdk_bs_sequence_t *bs_sequence_start_esnap(struct spdk_io_channel *channel,
139*b47cee6cSMike Gerdts 		struct spdk_bs_cpl *cpl, struct spdk_blob *blob);
140*b47cee6cSMike Gerdts 
141ad7fdd12SSeth Howell void bs_sequence_read_bs_dev(spdk_bs_sequence_t *seq, struct spdk_bs_dev *bs_dev,
1420e917256SMaciej Szwed 			     void *payload, uint64_t lba, uint32_t lba_count,
1430e917256SMaciej Szwed 			     spdk_bs_sequence_cpl cb_fn, void *cb_arg);
1440e917256SMaciej Szwed 
145ad7fdd12SSeth Howell void bs_sequence_read_dev(spdk_bs_sequence_t *seq, void *payload,
146d89352a9SBen Walker 			  uint64_t lba, uint32_t lba_count,
147d89352a9SBen Walker 			  spdk_bs_sequence_cpl cb_fn, void *cb_arg);
148d89352a9SBen Walker 
149ad7fdd12SSeth Howell void bs_sequence_write_dev(spdk_bs_sequence_t *seq, void *payload,
150d89352a9SBen Walker 			   uint64_t lba, uint32_t lba_count,
151d89352a9SBen Walker 			   spdk_bs_sequence_cpl cb_fn, void *cb_arg);
152d89352a9SBen Walker 
153ad7fdd12SSeth Howell void bs_sequence_readv_bs_dev(spdk_bs_batch_t *batch, struct spdk_bs_dev *bs_dev,
1540e917256SMaciej Szwed 			      struct iovec *iov, int iovcnt, uint64_t lba, uint32_t lba_count,
155179ed697SJim Harris 			      spdk_bs_sequence_cpl cb_fn, void *cb_arg);
156179ed697SJim Harris 
157ad7fdd12SSeth Howell void bs_sequence_readv_dev(spdk_bs_batch_t *batch, struct iovec *iov, int iovcnt,
158179ed697SJim Harris 			   uint64_t lba, uint32_t lba_count,
159179ed697SJim Harris 			   spdk_bs_sequence_cpl cb_fn, void *cb_arg);
160179ed697SJim Harris 
161ad7fdd12SSeth Howell void bs_sequence_writev_dev(spdk_bs_batch_t *batch, struct iovec *iov, int iovcnt,
162d89352a9SBen Walker 			    uint64_t lba, uint32_t lba_count,
163d89352a9SBen Walker 			    spdk_bs_sequence_cpl cb_fn, void *cb_arg);
164d89352a9SBen Walker 
165ad7fdd12SSeth Howell void bs_sequence_write_zeroes_dev(spdk_bs_sequence_t *seq,
166f01146aeSJim Harris 				  uint64_t lba, uint64_t lba_count,
1673f9cbe51SSeth Howell 				  spdk_bs_sequence_cpl cb_fn, void *cb_arg);
1683f9cbe51SSeth Howell 
169b7bfa504SEvgeniy Kochetov void bs_sequence_copy_dev(spdk_bs_sequence_t *seq,
170b7bfa504SEvgeniy Kochetov 			  uint64_t dst_lba, uint64_t src_lba, uint64_t lba_count,
171b7bfa504SEvgeniy Kochetov 			  spdk_bs_sequence_cpl cb_fn, void *cb_arg);
172b7bfa504SEvgeniy Kochetov 
173ad7fdd12SSeth Howell void bs_sequence_finish(spdk_bs_sequence_t *seq, int bserrno);
174d89352a9SBen Walker 
175ad7fdd12SSeth Howell void bs_user_op_sequence_finish(void *cb_arg, int bserrno);
1764132ac52SMaciej Szwed 
177ad7fdd12SSeth Howell spdk_bs_batch_t *bs_batch_open(struct spdk_io_channel *channel,
178*b47cee6cSMike Gerdts 			       struct spdk_bs_cpl *cpl, struct spdk_blob *blob);
179d89352a9SBen Walker 
180964463e4SSeth Howell void bs_batch_read_bs_dev(spdk_bs_batch_t *batch, struct spdk_bs_dev *bs_dev,
1810e917256SMaciej Szwed 			  void *payload, uint64_t lba, uint32_t lba_count);
1820e917256SMaciej Szwed 
183ad7fdd12SSeth Howell void bs_batch_read_dev(spdk_bs_batch_t *batch, void *payload,
184d89352a9SBen Walker 		       uint64_t lba, uint32_t lba_count);
185d89352a9SBen Walker 
186ad7fdd12SSeth Howell void bs_batch_write_dev(spdk_bs_batch_t *batch, void *payload,
187d89352a9SBen Walker 			uint64_t lba, uint32_t lba_count);
188d89352a9SBen Walker 
189ad7fdd12SSeth Howell void bs_batch_unmap_dev(spdk_bs_batch_t *batch,
190f01146aeSJim Harris 			uint64_t lba, uint64_t lba_count);
191d89352a9SBen Walker 
192ad7fdd12SSeth Howell void bs_batch_write_zeroes_dev(spdk_bs_batch_t *batch,
193f01146aeSJim Harris 			       uint64_t lba, uint64_t lba_count);
1943f9cbe51SSeth Howell 
195ad7fdd12SSeth Howell void bs_batch_close(spdk_bs_batch_t *batch);
196d89352a9SBen Walker 
197ad7fdd12SSeth Howell spdk_bs_batch_t *bs_sequence_to_batch(spdk_bs_sequence_t *seq,
198d89352a9SBen Walker 				      spdk_bs_sequence_cpl cb_fn,
199d89352a9SBen Walker 				      void *cb_arg);
200d89352a9SBen Walker 
201ad7fdd12SSeth Howell spdk_bs_user_op_t *bs_user_op_alloc(struct spdk_io_channel *channel, struct spdk_bs_cpl *cpl,
202b2503cb3SJim Harris 				    enum spdk_blob_op_type op_type, struct spdk_blob *blob,
203b2503cb3SJim Harris 				    void *payload, int iovcnt, uint64_t offset, uint64_t length);
204b2503cb3SJim Harris 
205ad7fdd12SSeth Howell void bs_user_op_execute(spdk_bs_user_op_t *op);
206b2503cb3SJim Harris 
2070b034da1STomasz Zawadzki void bs_user_op_abort(spdk_bs_user_op_t *op, int bserrno);
208b2503cb3SJim Harris 
209d89352a9SBen Walker #endif
210