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