xref: /spdk/lib/blob/request.c (revision a5ecbadb2c6c57737e3e3776687f970514c0afeb)
1d89352a9SBen Walker /*-
2d89352a9SBen Walker  *   BSD LICENSE
3d89352a9SBen Walker  *
4d89352a9SBen Walker  *   Copyright (c) Intel Corporation.
5d89352a9SBen Walker  *   All rights reserved.
6d89352a9SBen Walker  *
7d89352a9SBen Walker  *   Redistribution and use in source and binary forms, with or without
8d89352a9SBen Walker  *   modification, are permitted provided that the following conditions
9d89352a9SBen Walker  *   are met:
10d89352a9SBen Walker  *
11d89352a9SBen Walker  *     * Redistributions of source code must retain the above copyright
12d89352a9SBen Walker  *       notice, this list of conditions and the following disclaimer.
13d89352a9SBen Walker  *     * Redistributions in binary form must reproduce the above copyright
14d89352a9SBen Walker  *       notice, this list of conditions and the following disclaimer in
15d89352a9SBen Walker  *       the documentation and/or other materials provided with the
16d89352a9SBen Walker  *       distribution.
17d89352a9SBen Walker  *     * Neither the name of Intel Corporation nor the names of its
18d89352a9SBen Walker  *       contributors may be used to endorse or promote products derived
19d89352a9SBen Walker  *       from this software without specific prior written permission.
20d89352a9SBen Walker  *
21d89352a9SBen Walker  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22d89352a9SBen Walker  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23d89352a9SBen Walker  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24d89352a9SBen Walker  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25d89352a9SBen Walker  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26d89352a9SBen Walker  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27d89352a9SBen Walker  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28d89352a9SBen Walker  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29d89352a9SBen Walker  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30d89352a9SBen Walker  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31d89352a9SBen Walker  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32d89352a9SBen Walker  */
33d89352a9SBen Walker 
34b961d9ccSBen Walker #include "spdk/stdinc.h"
35d89352a9SBen Walker 
36d89352a9SBen Walker #include "blobstore.h"
37d89352a9SBen Walker #include "request.h"
38d89352a9SBen Walker 
39d89352a9SBen Walker #include "spdk/io_channel.h"
40d89352a9SBen Walker #include "spdk/queue.h"
41d89352a9SBen Walker 
42d89352a9SBen Walker #include "spdk_internal/log.h"
43d89352a9SBen Walker 
44d89352a9SBen Walker void
45d89352a9SBen Walker spdk_bs_call_cpl(struct spdk_bs_cpl *cpl, int bserrno)
46d89352a9SBen Walker {
47d89352a9SBen Walker 	switch (cpl->type) {
48d89352a9SBen Walker 	case SPDK_BS_CPL_TYPE_BS_BASIC:
49d89352a9SBen Walker 		cpl->u.bs_basic.cb_fn(cpl->u.bs_basic.cb_arg,
50d89352a9SBen Walker 				      bserrno);
51d89352a9SBen Walker 		break;
52d89352a9SBen Walker 	case SPDK_BS_CPL_TYPE_BS_HANDLE:
53d89352a9SBen Walker 		cpl->u.bs_handle.cb_fn(cpl->u.bs_handle.cb_arg,
54d89352a9SBen Walker 				       cpl->u.bs_handle.bs,
55d89352a9SBen Walker 				       bserrno);
56d89352a9SBen Walker 		break;
57d89352a9SBen Walker 	case SPDK_BS_CPL_TYPE_BLOB_BASIC:
58d89352a9SBen Walker 		cpl->u.blob_basic.cb_fn(cpl->u.blob_basic.cb_arg,
59d89352a9SBen Walker 					bserrno);
60d89352a9SBen Walker 		break;
61d89352a9SBen Walker 	case SPDK_BS_CPL_TYPE_BLOBID:
62d89352a9SBen Walker 		cpl->u.blobid.cb_fn(cpl->u.blobid.cb_arg,
63d89352a9SBen Walker 				    cpl->u.blobid.blobid,
64d89352a9SBen Walker 				    bserrno);
65d89352a9SBen Walker 		break;
66d89352a9SBen Walker 	case SPDK_BS_CPL_TYPE_BLOB_HANDLE:
67d89352a9SBen Walker 		cpl->u.blob_handle.cb_fn(cpl->u.blob_handle.cb_arg,
68d89352a9SBen Walker 					 cpl->u.blob_handle.blob,
69d89352a9SBen Walker 					 bserrno);
70d89352a9SBen Walker 		break;
71d89352a9SBen Walker 	case SPDK_BS_CPL_TYPE_NESTED_SEQUENCE:
72d89352a9SBen Walker 		cpl->u.nested_seq.cb_fn(cpl->u.nested_seq.cb_arg,
73d89352a9SBen Walker 					cpl->u.nested_seq.parent,
74d89352a9SBen Walker 					bserrno);
75d89352a9SBen Walker 		break;
76130d278aSPaul Luse 	case SPDK_BS_CPL_TYPE_NONE:
77130d278aSPaul Luse 		/* this completion's callback is handled elsewhere */
78130d278aSPaul Luse 		break;
79d89352a9SBen Walker 	}
80d89352a9SBen Walker }
81d89352a9SBen Walker 
82d89352a9SBen Walker static void
83d89352a9SBen Walker spdk_bs_request_set_complete(struct spdk_bs_request_set *set)
84d89352a9SBen Walker {
85d89352a9SBen Walker 	struct spdk_bs_cpl cpl = set->cpl;
86d89352a9SBen Walker 	int bserrno = set->bserrno;
87d89352a9SBen Walker 
88d89352a9SBen Walker 	TAILQ_INSERT_TAIL(&set->channel->reqs, set, link);
89d89352a9SBen Walker 
90d89352a9SBen Walker 	spdk_bs_call_cpl(&cpl, bserrno);
91d89352a9SBen Walker }
92d89352a9SBen Walker 
93d89352a9SBen Walker static void
94d89352a9SBen Walker spdk_bs_sequence_completion(struct spdk_io_channel *channel, void *cb_arg, int bserrno)
95d89352a9SBen Walker {
96d89352a9SBen Walker 	struct spdk_bs_request_set *set = cb_arg;
97d89352a9SBen Walker 
98d89352a9SBen Walker 	set->bserrno = bserrno;
99d89352a9SBen Walker 	set->u.sequence.cb_fn((spdk_bs_sequence_t *)set, set->u.sequence.cb_arg, bserrno);
100d89352a9SBen Walker }
101d89352a9SBen Walker 
102d89352a9SBen Walker spdk_bs_sequence_t *
103d89352a9SBen Walker spdk_bs_sequence_start(struct spdk_io_channel *_channel,
104d89352a9SBen Walker 		       struct spdk_bs_cpl *cpl)
105d89352a9SBen Walker {
106d89352a9SBen Walker 	struct spdk_bs_channel		*channel;
107d89352a9SBen Walker 	struct spdk_bs_request_set	*set;
108d89352a9SBen Walker 
109d89352a9SBen Walker 	channel = spdk_io_channel_get_ctx(_channel);
110d89352a9SBen Walker 
111d89352a9SBen Walker 	set = TAILQ_FIRST(&channel->reqs);
112d89352a9SBen Walker 	if (!set) {
113d89352a9SBen Walker 		return NULL;
114d89352a9SBen Walker 	}
115d89352a9SBen Walker 	TAILQ_REMOVE(&channel->reqs, set, link);
116d89352a9SBen Walker 
117d89352a9SBen Walker 	set->cpl = *cpl;
118d89352a9SBen Walker 	set->bserrno = 0;
119d89352a9SBen Walker 	set->channel = channel;
120d89352a9SBen Walker 
121d89352a9SBen Walker 	set->cb_args.cb_fn = spdk_bs_sequence_completion;
122d89352a9SBen Walker 	set->cb_args.cb_arg = set;
123d89352a9SBen Walker 	set->cb_args.channel = channel->dev_channel;
124d89352a9SBen Walker 
125d89352a9SBen Walker 	return (spdk_bs_sequence_t *)set;
126d89352a9SBen Walker }
127d89352a9SBen Walker 
128d89352a9SBen Walker void
1290e917256SMaciej Szwed spdk_bs_sequence_read_bs_dev(spdk_bs_sequence_t *seq, struct spdk_bs_dev *bs_dev,
1300e917256SMaciej Szwed 			     void *payload, uint64_t lba, uint32_t lba_count,
131d89352a9SBen Walker 			     spdk_bs_sequence_cpl cb_fn, void *cb_arg)
132d89352a9SBen Walker {
133d89352a9SBen Walker 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
134d89352a9SBen Walker 	struct spdk_bs_channel       *channel = set->channel;
135d89352a9SBen Walker 
136ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Reading %u blocks from LBA %lu\n", lba_count, lba);
137d89352a9SBen Walker 
138d89352a9SBen Walker 	set->u.sequence.cb_fn = cb_fn;
139d89352a9SBen Walker 	set->u.sequence.cb_arg = cb_arg;
140d89352a9SBen Walker 
1410e917256SMaciej Szwed 	bs_dev->read(bs_dev, channel->dev_channel, payload, lba, lba_count, &set->cb_args);
1420e917256SMaciej Szwed }
1430e917256SMaciej Szwed 
1440e917256SMaciej Szwed void
145c4659139SJim Harris spdk_bs_sequence_read_dev(spdk_bs_sequence_t *seq, void *payload,
1460e917256SMaciej Szwed 			  uint64_t lba, uint32_t lba_count,
1470e917256SMaciej Szwed 			  spdk_bs_sequence_cpl cb_fn, void *cb_arg)
1480e917256SMaciej Szwed {
1490e917256SMaciej Szwed 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
1500e917256SMaciej Szwed 	struct spdk_bs_channel       *channel = set->channel;
1510e917256SMaciej Szwed 
1520e917256SMaciej Szwed 	spdk_bs_sequence_read_bs_dev(seq, channel->dev, payload, lba, lba_count, cb_fn, cb_arg);
153d89352a9SBen Walker }
154d89352a9SBen Walker 
155d89352a9SBen Walker void
156c4659139SJim Harris spdk_bs_sequence_write_dev(spdk_bs_sequence_t *seq, void *payload,
157d89352a9SBen Walker 			   uint64_t lba, uint32_t lba_count,
158d89352a9SBen Walker 			   spdk_bs_sequence_cpl cb_fn, void *cb_arg)
159d89352a9SBen Walker {
160d89352a9SBen Walker 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
161d89352a9SBen Walker 	struct spdk_bs_channel       *channel = set->channel;
162d89352a9SBen Walker 
163ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Writing %u blocks to LBA %lu\n", lba_count, lba);
164d89352a9SBen Walker 
165d89352a9SBen Walker 	set->u.sequence.cb_fn = cb_fn;
166d89352a9SBen Walker 	set->u.sequence.cb_arg = cb_arg;
167d89352a9SBen Walker 
168d89352a9SBen Walker 	channel->dev->write(channel->dev, channel->dev_channel, payload, lba, lba_count,
169d89352a9SBen Walker 			    &set->cb_args);
170d89352a9SBen Walker }
171d89352a9SBen Walker 
172d89352a9SBen Walker void
1730e917256SMaciej Szwed spdk_bs_sequence_readv_bs_dev(spdk_bs_sequence_t *seq, struct spdk_bs_dev *bs_dev,
1740e917256SMaciej Szwed 			      struct iovec *iov, int iovcnt, uint64_t lba, uint32_t lba_count,
175179ed697SJim Harris 			      spdk_bs_sequence_cpl cb_fn, void *cb_arg)
176179ed697SJim Harris {
177179ed697SJim Harris 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
178179ed697SJim Harris 	struct spdk_bs_channel       *channel = set->channel;
179179ed697SJim Harris 
180ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Reading %u blocks from LBA %lu\n", lba_count, lba);
181179ed697SJim Harris 
182179ed697SJim Harris 	set->u.sequence.cb_fn = cb_fn;
183179ed697SJim Harris 	set->u.sequence.cb_arg = cb_arg;
184179ed697SJim Harris 
1850e917256SMaciej Szwed 	bs_dev->readv(bs_dev, channel->dev_channel, iov, iovcnt, lba, lba_count,
186179ed697SJim Harris 		      &set->cb_args);
187179ed697SJim Harris }
188179ed697SJim Harris 
189179ed697SJim Harris void
190c4659139SJim Harris spdk_bs_sequence_readv_dev(spdk_bs_sequence_t *seq, struct iovec *iov, int iovcnt,
1910e917256SMaciej Szwed 			   uint64_t lba, uint32_t lba_count, spdk_bs_sequence_cpl cb_fn, void *cb_arg)
1920e917256SMaciej Szwed {
1930e917256SMaciej Szwed 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
1940e917256SMaciej Szwed 	struct spdk_bs_channel       *channel = set->channel;
1950e917256SMaciej Szwed 
1960e917256SMaciej Szwed 	spdk_bs_sequence_readv_bs_dev(seq, channel->dev, iov, iovcnt, lba, lba_count, cb_fn, cb_arg);
1970e917256SMaciej Szwed }
1980e917256SMaciej Szwed 
1990e917256SMaciej Szwed void
200c4659139SJim Harris spdk_bs_sequence_writev_dev(spdk_bs_sequence_t *seq, struct iovec *iov, int iovcnt,
201179ed697SJim Harris 			    uint64_t lba, uint32_t lba_count,
202179ed697SJim Harris 			    spdk_bs_sequence_cpl cb_fn, void *cb_arg)
203179ed697SJim Harris {
204179ed697SJim Harris 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
205179ed697SJim Harris 	struct spdk_bs_channel       *channel = set->channel;
206179ed697SJim Harris 
207ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Writing %u blocks to LBA %lu\n", lba_count, lba);
208179ed697SJim Harris 
209179ed697SJim Harris 	set->u.sequence.cb_fn = cb_fn;
210179ed697SJim Harris 	set->u.sequence.cb_arg = cb_arg;
211179ed697SJim Harris 
212179ed697SJim Harris 	channel->dev->writev(channel->dev, channel->dev_channel, iov, iovcnt, lba, lba_count,
213179ed697SJim Harris 			     &set->cb_args);
214179ed697SJim Harris }
215179ed697SJim Harris 
216179ed697SJim Harris void
217c4659139SJim Harris spdk_bs_sequence_unmap_dev(spdk_bs_sequence_t *seq,
218d89352a9SBen Walker 			   uint64_t lba, uint32_t lba_count,
219d89352a9SBen Walker 			   spdk_bs_sequence_cpl cb_fn, void *cb_arg)
220d89352a9SBen Walker {
221d89352a9SBen Walker 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
222d89352a9SBen Walker 	struct spdk_bs_channel       *channel = set->channel;
223d89352a9SBen Walker 
224ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Unmapping %u blocks at LBA %lu\n", lba_count, lba);
225d89352a9SBen Walker 
226d89352a9SBen Walker 	set->u.sequence.cb_fn = cb_fn;
227d89352a9SBen Walker 	set->u.sequence.cb_arg = cb_arg;
228d89352a9SBen Walker 
229d89352a9SBen Walker 	channel->dev->unmap(channel->dev, channel->dev_channel, lba, lba_count,
230d89352a9SBen Walker 			    &set->cb_args);
231d89352a9SBen Walker }
232d89352a9SBen Walker 
233d89352a9SBen Walker void
234c4659139SJim Harris spdk_bs_sequence_write_zeroes_dev(spdk_bs_sequence_t *seq,
2353f9cbe51SSeth Howell 				  uint64_t lba, uint32_t lba_count,
2363f9cbe51SSeth Howell 				  spdk_bs_sequence_cpl cb_fn, void *cb_arg)
2373f9cbe51SSeth Howell {
2383f9cbe51SSeth Howell 	struct spdk_bs_request_set      *set = (struct spdk_bs_request_set *)seq;
2393f9cbe51SSeth Howell 	struct spdk_bs_channel       *channel = set->channel;
2403f9cbe51SSeth Howell 
241ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "writing zeroes to %u blocks at LBA %lu\n", lba_count, lba);
2423f9cbe51SSeth Howell 
2433f9cbe51SSeth Howell 	set->u.sequence.cb_fn = cb_fn;
2443f9cbe51SSeth Howell 	set->u.sequence.cb_arg = cb_arg;
2453f9cbe51SSeth Howell 
2463f9cbe51SSeth Howell 	channel->dev->write_zeroes(channel->dev, channel->dev_channel, lba, lba_count,
2473f9cbe51SSeth Howell 				   &set->cb_args);
2483f9cbe51SSeth Howell }
2493f9cbe51SSeth Howell 
2503f9cbe51SSeth Howell void
251d89352a9SBen Walker spdk_bs_sequence_finish(spdk_bs_sequence_t *seq, int bserrno)
252d89352a9SBen Walker {
253d89352a9SBen Walker 	if (bserrno != 0) {
254d89352a9SBen Walker 		seq->bserrno = bserrno;
255d89352a9SBen Walker 	}
256d89352a9SBen Walker 	spdk_bs_request_set_complete((struct spdk_bs_request_set *)seq);
257d89352a9SBen Walker }
258d89352a9SBen Walker 
259d89352a9SBen Walker static void
260d89352a9SBen Walker spdk_bs_batch_completion(struct spdk_io_channel *_channel,
261d89352a9SBen Walker 			 void *cb_arg, int bserrno)
262d89352a9SBen Walker {
263d89352a9SBen Walker 	struct spdk_bs_request_set	*set = cb_arg;
264d89352a9SBen Walker 
265d89352a9SBen Walker 	set->u.batch.outstanding_ops--;
266d89352a9SBen Walker 	if (bserrno != 0) {
267d89352a9SBen Walker 		set->bserrno = bserrno;
268d89352a9SBen Walker 	}
269d89352a9SBen Walker 
270d89352a9SBen Walker 	if (set->u.batch.outstanding_ops == 0 && set->u.batch.batch_closed) {
271d89352a9SBen Walker 		if (set->u.batch.cb_fn) {
272d89352a9SBen Walker 			set->cb_args.cb_fn = spdk_bs_sequence_completion;
273d89352a9SBen Walker 			set->u.batch.cb_fn((spdk_bs_sequence_t *)set, set->u.batch.cb_arg, bserrno);
274d89352a9SBen Walker 		} else {
275d89352a9SBen Walker 			spdk_bs_request_set_complete(set);
276d89352a9SBen Walker 		}
277d89352a9SBen Walker 	}
278d89352a9SBen Walker }
279d89352a9SBen Walker 
280d89352a9SBen Walker spdk_bs_batch_t *
281d89352a9SBen Walker spdk_bs_batch_open(struct spdk_io_channel *_channel,
282d89352a9SBen Walker 		   struct spdk_bs_cpl *cpl)
283d89352a9SBen Walker {
284d89352a9SBen Walker 	struct spdk_bs_channel		*channel;
285d89352a9SBen Walker 	struct spdk_bs_request_set	*set;
286d89352a9SBen Walker 
287d89352a9SBen Walker 	channel = spdk_io_channel_get_ctx(_channel);
288d89352a9SBen Walker 
289d89352a9SBen Walker 	set = TAILQ_FIRST(&channel->reqs);
290d89352a9SBen Walker 	if (!set) {
291d89352a9SBen Walker 		return NULL;
292d89352a9SBen Walker 	}
293d89352a9SBen Walker 	TAILQ_REMOVE(&channel->reqs, set, link);
294d89352a9SBen Walker 
295d89352a9SBen Walker 	set->cpl = *cpl;
296d89352a9SBen Walker 	set->bserrno = 0;
297d89352a9SBen Walker 	set->channel = channel;
298d89352a9SBen Walker 
299d89352a9SBen Walker 	set->u.batch.cb_fn = NULL;
300d89352a9SBen Walker 	set->u.batch.cb_arg = NULL;
301d89352a9SBen Walker 	set->u.batch.outstanding_ops = 0;
302d89352a9SBen Walker 	set->u.batch.batch_closed = 0;
303d89352a9SBen Walker 
304d89352a9SBen Walker 	set->cb_args.cb_fn = spdk_bs_batch_completion;
305d89352a9SBen Walker 	set->cb_args.cb_arg = set;
306d89352a9SBen Walker 	set->cb_args.channel = channel->dev_channel;
307d89352a9SBen Walker 
308d89352a9SBen Walker 	return (spdk_bs_batch_t *)set;
309d89352a9SBen Walker }
310d89352a9SBen Walker 
311d89352a9SBen Walker void
3120e917256SMaciej Szwed spdk_bs_batch_read_bs_dev(spdk_bs_batch_t *batch, struct spdk_bs_dev *bs_dev,
3130e917256SMaciej Szwed 			  void *payload, uint64_t lba, uint32_t lba_count)
314d89352a9SBen Walker {
315d89352a9SBen Walker 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
316d89352a9SBen Walker 	struct spdk_bs_channel		*channel = set->channel;
317d89352a9SBen Walker 
318ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Reading %u blocks from LBA %lu\n", lba_count, lba);
319d89352a9SBen Walker 
320d89352a9SBen Walker 	set->u.batch.outstanding_ops++;
3210e917256SMaciej Szwed 	bs_dev->read(bs_dev, channel->dev_channel, payload, lba, lba_count, &set->cb_args);
3220e917256SMaciej Szwed }
3230e917256SMaciej Szwed 
3240e917256SMaciej Szwed void
325c4659139SJim Harris spdk_bs_batch_read_dev(spdk_bs_batch_t *batch, void *payload,
3260e917256SMaciej Szwed 		       uint64_t lba, uint32_t lba_count)
3270e917256SMaciej Szwed {
3280e917256SMaciej Szwed 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
3290e917256SMaciej Szwed 	struct spdk_bs_channel		*channel = set->channel;
3300e917256SMaciej Szwed 
3310e917256SMaciej Szwed 	spdk_bs_batch_read_bs_dev(batch, channel->dev, payload, lba, lba_count);
332d89352a9SBen Walker }
333d89352a9SBen Walker 
334d89352a9SBen Walker void
335c4659139SJim Harris spdk_bs_batch_write_dev(spdk_bs_batch_t *batch, void *payload,
336d89352a9SBen Walker 			uint64_t lba, uint32_t lba_count)
337d89352a9SBen Walker {
338d89352a9SBen Walker 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
339d89352a9SBen Walker 	struct spdk_bs_channel		*channel = set->channel;
340d89352a9SBen Walker 
341ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Writing %u blocks to LBA %lu\n", lba_count, lba);
342d89352a9SBen Walker 
343d89352a9SBen Walker 	set->u.batch.outstanding_ops++;
344d89352a9SBen Walker 	channel->dev->write(channel->dev, channel->dev_channel, payload, lba, lba_count,
345d89352a9SBen Walker 			    &set->cb_args);
346d89352a9SBen Walker }
347d89352a9SBen Walker 
348d89352a9SBen Walker void
349c4659139SJim Harris spdk_bs_batch_unmap_dev(spdk_bs_batch_t *batch,
350d89352a9SBen Walker 			uint64_t lba, uint32_t lba_count)
351d89352a9SBen Walker {
352d89352a9SBen Walker 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
353d89352a9SBen Walker 	struct spdk_bs_channel		*channel = set->channel;
354d89352a9SBen Walker 
355ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Unmapping %u blocks at LBA %lu\n", lba_count, lba);
356d89352a9SBen Walker 
357d89352a9SBen Walker 	set->u.batch.outstanding_ops++;
358d89352a9SBen Walker 	channel->dev->unmap(channel->dev, channel->dev_channel, lba, lba_count,
359d89352a9SBen Walker 			    &set->cb_args);
360d89352a9SBen Walker }
361d89352a9SBen Walker 
362d89352a9SBen Walker void
363c4659139SJim Harris spdk_bs_batch_write_zeroes_dev(spdk_bs_batch_t *batch,
3643f9cbe51SSeth Howell 			       uint64_t lba, uint32_t lba_count)
3653f9cbe51SSeth Howell {
3663f9cbe51SSeth Howell 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
3673f9cbe51SSeth Howell 	struct spdk_bs_channel		*channel = set->channel;
3683f9cbe51SSeth Howell 
369ea1c1579SDaniel Verkamp 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Zeroing %u blocks at LBA %lu\n", lba_count, lba);
3703f9cbe51SSeth Howell 
3713f9cbe51SSeth Howell 	set->u.batch.outstanding_ops++;
3723f9cbe51SSeth Howell 	channel->dev->write_zeroes(channel->dev, channel->dev_channel, lba, lba_count,
3733f9cbe51SSeth Howell 				   &set->cb_args);
3743f9cbe51SSeth Howell }
3753f9cbe51SSeth Howell 
376*a5ecbadbSJim Harris static void
377*a5ecbadbSJim Harris spdk_bs_batch_blob_op_complete(void *arg, int bserrno)
378*a5ecbadbSJim Harris {
379*a5ecbadbSJim Harris 	/* TODO: spdk_bs_batch_completion does not actually use the channel parameter -
380*a5ecbadbSJim Harris 	 *  just pass NULL here instead of getting the channel from the set cb_arg.
381*a5ecbadbSJim Harris 	 */
382*a5ecbadbSJim Harris 	spdk_bs_batch_completion(NULL, arg, bserrno);
383*a5ecbadbSJim Harris }
384*a5ecbadbSJim Harris 
385*a5ecbadbSJim Harris void
386*a5ecbadbSJim Harris spdk_bs_batch_read_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob,
387*a5ecbadbSJim Harris 			void *payload, uint64_t offset, uint64_t length)
388*a5ecbadbSJim Harris {
389*a5ecbadbSJim Harris 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
390*a5ecbadbSJim Harris 	struct spdk_bs_channel		*channel = set->channel;
391*a5ecbadbSJim Harris 
392*a5ecbadbSJim Harris 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Reading %lu pages from offset %lu\n", length, offset);
393*a5ecbadbSJim Harris 
394*a5ecbadbSJim Harris 	set->u.batch.outstanding_ops++;
395*a5ecbadbSJim Harris 	spdk_bs_io_read_blob(blob, spdk_io_channel_from_ctx(channel), payload, offset,
396*a5ecbadbSJim Harris 			     length, spdk_bs_batch_blob_op_complete, set);
397*a5ecbadbSJim Harris }
398*a5ecbadbSJim Harris 
399*a5ecbadbSJim Harris void
400*a5ecbadbSJim Harris spdk_bs_batch_write_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob,
401*a5ecbadbSJim Harris 			 void *payload, uint64_t offset, uint64_t length)
402*a5ecbadbSJim Harris {
403*a5ecbadbSJim Harris 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
404*a5ecbadbSJim Harris 	struct spdk_bs_channel		*channel = set->channel;
405*a5ecbadbSJim Harris 
406*a5ecbadbSJim Harris 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Writing %lu pages from offset %lu\n", length, offset);
407*a5ecbadbSJim Harris 
408*a5ecbadbSJim Harris 	set->u.batch.outstanding_ops++;
409*a5ecbadbSJim Harris 	spdk_bs_io_write_blob(blob, spdk_io_channel_from_ctx(channel), payload, offset,
410*a5ecbadbSJim Harris 			      length, spdk_bs_batch_blob_op_complete, set);
411*a5ecbadbSJim Harris }
412*a5ecbadbSJim Harris 
413*a5ecbadbSJim Harris void
414*a5ecbadbSJim Harris spdk_bs_batch_unmap_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob,
415*a5ecbadbSJim Harris 			 uint64_t offset, uint64_t length)
416*a5ecbadbSJim Harris {
417*a5ecbadbSJim Harris 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
418*a5ecbadbSJim Harris 	struct spdk_bs_channel		*channel = set->channel;
419*a5ecbadbSJim Harris 
420*a5ecbadbSJim Harris 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Unmapping %lu pages from offset %lu\n", length, offset);
421*a5ecbadbSJim Harris 
422*a5ecbadbSJim Harris 	set->u.batch.outstanding_ops++;
423*a5ecbadbSJim Harris 	spdk_bs_io_unmap_blob(blob, spdk_io_channel_from_ctx(channel), offset, length,
424*a5ecbadbSJim Harris 			      spdk_bs_batch_blob_op_complete, set);
425*a5ecbadbSJim Harris }
426*a5ecbadbSJim Harris 
427*a5ecbadbSJim Harris void
428*a5ecbadbSJim Harris spdk_bs_batch_write_zeroes_blob(spdk_bs_batch_t *batch, struct spdk_blob *blob,
429*a5ecbadbSJim Harris 				uint64_t offset, uint64_t length)
430*a5ecbadbSJim Harris {
431*a5ecbadbSJim Harris 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
432*a5ecbadbSJim Harris 	struct spdk_bs_channel		*channel = set->channel;
433*a5ecbadbSJim Harris 
434*a5ecbadbSJim Harris 	SPDK_DEBUGLOG(SPDK_LOG_BLOB_RW, "Zeroing %lu pages from offset %lu\n", length, offset);
435*a5ecbadbSJim Harris 
436*a5ecbadbSJim Harris 	set->u.batch.outstanding_ops++;
437*a5ecbadbSJim Harris 	spdk_bs_io_write_zeroes_blob(blob, spdk_io_channel_from_ctx(channel), offset, length,
438*a5ecbadbSJim Harris 				     spdk_bs_batch_blob_op_complete, set);
439*a5ecbadbSJim Harris }
440*a5ecbadbSJim Harris 
4413f9cbe51SSeth Howell void
442d89352a9SBen Walker spdk_bs_batch_close(spdk_bs_batch_t *batch)
443d89352a9SBen Walker {
444d89352a9SBen Walker 	struct spdk_bs_request_set	*set = (struct spdk_bs_request_set *)batch;
445d89352a9SBen Walker 
446d89352a9SBen Walker 	set->u.batch.batch_closed = 1;
447d89352a9SBen Walker 
448d89352a9SBen Walker 	if (set->u.batch.outstanding_ops == 0) {
449d89352a9SBen Walker 		if (set->u.batch.cb_fn) {
450d89352a9SBen Walker 			set->cb_args.cb_fn = spdk_bs_sequence_completion;
451d89352a9SBen Walker 			set->u.batch.cb_fn((spdk_bs_sequence_t *)set, set->u.batch.cb_arg, set->bserrno);
452d89352a9SBen Walker 		} else {
453d89352a9SBen Walker 			spdk_bs_request_set_complete(set);
454d89352a9SBen Walker 		}
455d89352a9SBen Walker 	}
456d89352a9SBen Walker }
457d89352a9SBen Walker 
458d89352a9SBen Walker spdk_bs_batch_t *
459d89352a9SBen Walker spdk_bs_sequence_to_batch(spdk_bs_sequence_t *seq, spdk_bs_sequence_cpl cb_fn, void *cb_arg)
460d89352a9SBen Walker {
461d89352a9SBen Walker 	struct spdk_bs_request_set *set = (struct spdk_bs_request_set *)seq;
462d89352a9SBen Walker 
463d89352a9SBen Walker 	set->u.batch.cb_fn = cb_fn;
464d89352a9SBen Walker 	set->u.batch.cb_arg = cb_arg;
465d89352a9SBen Walker 	set->u.batch.outstanding_ops = 0;
466d89352a9SBen Walker 	set->u.batch.batch_closed = 0;
467d89352a9SBen Walker 
468d89352a9SBen Walker 	set->cb_args.cb_fn = spdk_bs_batch_completion;
469d89352a9SBen Walker 
470d89352a9SBen Walker 	return set;
471d89352a9SBen Walker }
472d89352a9SBen Walker 
473ea1c1579SDaniel Verkamp SPDK_LOG_REGISTER_COMPONENT("blob_rw", SPDK_LOG_BLOB_RW)
474