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