xref: /spdk/lib/blob/request.h (revision 307b8c112ffd90a26d53dd15fad67bd9038ef526)
1  /*   SPDX-License-Identifier: BSD-3-Clause
2   *   Copyright (c) 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