xref: /spdk/lib/blob/request.h (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2017 Intel Corporation.
3  *   All rights reserved.
4  *   Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
5  */
6 
7 #ifndef SPDK_BS_REQUEST_H
8 #define SPDK_BS_REQUEST_H
9 
10 #include "spdk/stdinc.h"
11 
12 #include "spdk/blob.h"
13 
14 enum spdk_bs_cpl_type {
15 	SPDK_BS_CPL_TYPE_NONE,
16 	SPDK_BS_CPL_TYPE_BS_BASIC,
17 	SPDK_BS_CPL_TYPE_BS_HANDLE,
18 	SPDK_BS_CPL_TYPE_BLOB_BASIC,
19 	SPDK_BS_CPL_TYPE_BLOBID,
20 	SPDK_BS_CPL_TYPE_BLOB_HANDLE,
21 	SPDK_BS_CPL_TYPE_NESTED_SEQUENCE,
22 };
23 
24 enum spdk_blob_op_type;
25 
26 struct spdk_bs_request_set;
27 
28 /* Use a sequence to submit a set of requests serially */
29 typedef struct spdk_bs_request_set spdk_bs_sequence_t;
30 
31 /* Use a batch to submit a set of requests in parallel */
32 typedef struct spdk_bs_request_set spdk_bs_batch_t;
33 
34 /* Use a user_op to queue a user operation for later execution */
35 typedef struct spdk_bs_request_set spdk_bs_user_op_t;
36 
37 typedef void (*spdk_bs_nested_seq_complete)(void *cb_arg, spdk_bs_sequence_t *parent, int bserrno);
38 
39 struct spdk_bs_cpl {
40 	enum spdk_bs_cpl_type type;
41 	union {
42 		struct {
43 			spdk_bs_op_complete     cb_fn;
44 			void                    *cb_arg;
45 		} bs_basic;
46 
47 		struct {
48 			spdk_bs_op_with_handle_complete cb_fn;
49 			void                            *cb_arg;
50 			struct spdk_blob_store          *bs;
51 		} bs_handle;
52 
53 		struct {
54 			spdk_blob_op_complete   cb_fn;
55 			void                    *cb_arg;
56 		} blob_basic;
57 
58 		struct {
59 			spdk_blob_op_with_id_complete   cb_fn;
60 			void                            *cb_arg;
61 			spdk_blob_id                     blobid;
62 		} blobid;
63 
64 		struct {
65 			spdk_blob_op_with_handle_complete       cb_fn;
66 			void                                    *cb_arg;
67 			struct spdk_blob                        *blob;
68 		} blob_handle;
69 
70 		struct {
71 			spdk_bs_nested_seq_complete	cb_fn;
72 			void				*cb_arg;
73 			spdk_bs_sequence_t		*parent;
74 		} nested_seq;
75 	} u;
76 };
77 
78 typedef void (*spdk_bs_sequence_cpl)(spdk_bs_sequence_t *sequence,
79 				     void *cb_arg, int bserrno);
80 
81 /* A generic request set. Can be a sequence, batch or a user_op. */
82 struct spdk_bs_request_set {
83 	struct spdk_bs_cpl      cpl;
84 
85 	int                     bserrno;
86 
87 	struct spdk_bs_channel		*channel;
88 
89 	struct spdk_bs_dev_cb_args	cb_args;
90 
91 	union {
92 		struct {
93 			spdk_bs_sequence_cpl    cb_fn;
94 			void                    *cb_arg;
95 		} sequence;
96 
97 		struct {
98 			uint32_t		outstanding_ops;
99 			uint32_t		batch_closed;
100 			spdk_bs_sequence_cpl	cb_fn;
101 			void			*cb_arg;
102 		} batch;
103 
104 		struct spdk_bs_user_op_args {
105 			int			type;
106 			int			iovcnt;
107 			struct spdk_blob	*blob;
108 			uint64_t		offset;
109 			uint64_t		length;
110 			spdk_blob_op_complete	cb_fn;
111 			void			*cb_arg;
112 			void			*payload; /* cast to iov for readv/writev */
113 		} user_op;
114 	} u;
115 	/* Pointer to ext_io_opts passed by the user */
116 	struct spdk_blob_ext_io_opts *ext_io_opts;
117 	TAILQ_ENTRY(spdk_bs_request_set) link;
118 };
119 
120 void bs_call_cpl(struct spdk_bs_cpl *cpl, int bserrno);
121 
122 spdk_bs_sequence_t *bs_sequence_start(struct spdk_io_channel *channel,
123 				      struct spdk_bs_cpl *cpl);
124 
125 void bs_sequence_read_bs_dev(spdk_bs_sequence_t *seq, struct spdk_bs_dev *bs_dev,
126 			     void *payload, uint64_t lba, uint32_t lba_count,
127 			     spdk_bs_sequence_cpl cb_fn, void *cb_arg);
128 
129 void bs_sequence_read_dev(spdk_bs_sequence_t *seq, void *payload,
130 			  uint64_t lba, uint32_t lba_count,
131 			  spdk_bs_sequence_cpl cb_fn, void *cb_arg);
132 
133 void bs_sequence_write_dev(spdk_bs_sequence_t *seq, void *payload,
134 			   uint64_t lba, uint32_t lba_count,
135 			   spdk_bs_sequence_cpl cb_fn, void *cb_arg);
136 
137 void bs_sequence_readv_bs_dev(spdk_bs_batch_t *batch, struct spdk_bs_dev *bs_dev,
138 			      struct iovec *iov, int iovcnt, uint64_t lba, uint32_t lba_count,
139 			      spdk_bs_sequence_cpl cb_fn, void *cb_arg);
140 
141 void bs_sequence_readv_dev(spdk_bs_batch_t *batch, struct iovec *iov, int iovcnt,
142 			   uint64_t lba, uint32_t lba_count,
143 			   spdk_bs_sequence_cpl cb_fn, void *cb_arg);
144 
145 void bs_sequence_writev_dev(spdk_bs_batch_t *batch, struct iovec *iov, int iovcnt,
146 			    uint64_t lba, uint32_t lba_count,
147 			    spdk_bs_sequence_cpl cb_fn, void *cb_arg);
148 
149 void bs_sequence_write_zeroes_dev(spdk_bs_sequence_t *seq,
150 				  uint64_t lba, uint64_t lba_count,
151 				  spdk_bs_sequence_cpl cb_fn, void *cb_arg);
152 
153 void bs_sequence_finish(spdk_bs_sequence_t *seq, int bserrno);
154 
155 void bs_user_op_sequence_finish(void *cb_arg, int bserrno);
156 
157 spdk_bs_batch_t *bs_batch_open(struct spdk_io_channel *channel,
158 			       struct spdk_bs_cpl *cpl);
159 
160 void bs_batch_read_bs_dev(spdk_bs_batch_t *batch, struct spdk_bs_dev *bs_dev,
161 			  void *payload, uint64_t lba, uint32_t lba_count);
162 
163 void bs_batch_read_dev(spdk_bs_batch_t *batch, void *payload,
164 		       uint64_t lba, uint32_t lba_count);
165 
166 void bs_batch_write_dev(spdk_bs_batch_t *batch, void *payload,
167 			uint64_t lba, uint32_t lba_count);
168 
169 void bs_batch_unmap_dev(spdk_bs_batch_t *batch,
170 			uint64_t lba, uint64_t lba_count);
171 
172 void bs_batch_write_zeroes_dev(spdk_bs_batch_t *batch,
173 			       uint64_t lba, uint64_t lba_count);
174 
175 void bs_batch_close(spdk_bs_batch_t *batch);
176 
177 spdk_bs_batch_t *bs_sequence_to_batch(spdk_bs_sequence_t *seq,
178 				      spdk_bs_sequence_cpl cb_fn,
179 				      void *cb_arg);
180 
181 spdk_bs_user_op_t *bs_user_op_alloc(struct spdk_io_channel *channel, struct spdk_bs_cpl *cpl,
182 				    enum spdk_blob_op_type op_type, struct spdk_blob *blob,
183 				    void *payload, int iovcnt, uint64_t offset, uint64_t length);
184 
185 void bs_user_op_execute(spdk_bs_user_op_t *op);
186 
187 void bs_user_op_abort(spdk_bs_user_op_t *op, int bserrno);
188 
189 #endif
190