diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index c97126d60..a83ab3808 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -168,7 +168,6 @@ enum spdk_bdev_reset_type { typedef void (*spdk_bdev_io_completion_cb)(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status, void *cb_arg); -typedef void (*spdk_bdev_io_get_rbuf_cb)(struct spdk_bdev_io *bdev_io); struct spdk_bdev *spdk_bdev_get_by_name(const char *bdev_name); void spdk_bdev_unregister(struct spdk_bdev *bdev); diff --git a/include/spdk_internal/bdev.h b/include/spdk_internal/bdev.h index 3501cf8c0..87755d3ec 100644 --- a/include/spdk_internal/bdev.h +++ b/include/spdk_internal/bdev.h @@ -127,7 +127,7 @@ struct spdk_bdev_fn_table { int (*destruct)(void *ctx); /** Process the IO. */ - void (*submit_request)(struct spdk_bdev_io *); + void (*submit_request)(struct spdk_io_channel *ch, struct spdk_bdev_io *); /** Check if the block device supports a specific I/O type. */ bool (*io_type_supported)(void *ctx, enum spdk_bdev_io_type); @@ -145,6 +145,8 @@ struct spdk_bdev_fn_table { int (*dump_config_json)(void *ctx, struct spdk_json_write_ctx *w); }; +typedef void (*spdk_bdev_io_get_rbuf_cb)(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io); + struct spdk_bdev_io { /** Pointer to scratch area reserved for use by the driver consuming this spdk_bdev_io. */ void *ctx; @@ -152,8 +154,8 @@ struct spdk_bdev_io { /** The block device that this I/O belongs to. */ struct spdk_bdev *bdev; - /** The I/O channel to submit this I/O on. */ - struct spdk_io_channel *ch; + /** The bdev I/O channel that this was submitted on. */ + struct spdk_bdev_channel *ch; /** Generation value for each I/O. */ uint32_t gencnt; diff --git a/lib/bdev/aio/blockdev_aio.c b/lib/bdev/aio/blockdev_aio.c index 7d2b11b27..19e150c4a 100644 --- a/lib/bdev/aio/blockdev_aio.c +++ b/lib/bdev/aio/blockdev_aio.c @@ -224,10 +224,10 @@ blockdev_aio_reset(struct file_disk *fdisk, struct blockdev_aio_task *aio_task) spdk_bdev_io_complete(spdk_bdev_io_from_ctx(aio_task), SPDK_BDEV_IO_STATUS_SUCCESS); } -static void blockdev_aio_get_rbuf_cb(struct spdk_bdev_io *bdev_io) +static void blockdev_aio_get_rbuf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { blockdev_aio_readv((struct file_disk *)bdev_io->ctx, - bdev_io->ch, + ch, (struct blockdev_aio_task *)bdev_io->driver_ctx, bdev_io->u.read.iovs, bdev_io->u.read.iovcnt, @@ -235,7 +235,7 @@ static void blockdev_aio_get_rbuf_cb(struct spdk_bdev_io *bdev_io) bdev_io->u.read.offset); } -static int _blockdev_aio_submit_request(struct spdk_bdev_io *bdev_io) +static int _blockdev_aio_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: @@ -244,7 +244,7 @@ static int _blockdev_aio_submit_request(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_WRITE: blockdev_aio_writev((struct file_disk *)bdev_io->ctx, - bdev_io->ch, + ch, (struct blockdev_aio_task *)bdev_io->driver_ctx, bdev_io->u.write.iovs, bdev_io->u.write.iovcnt, @@ -267,9 +267,9 @@ static int _blockdev_aio_submit_request(struct spdk_bdev_io *bdev_io) } } -static void blockdev_aio_submit_request(struct spdk_bdev_io *bdev_io) +static void blockdev_aio_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { - if (_blockdev_aio_submit_request(bdev_io) < 0) { + if (_blockdev_aio_submit_request(ch, bdev_io) < 0) { spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); } } diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index 86a75c981..e5d0f7c9a 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -126,7 +126,7 @@ spdk_bdev_io_set_rbuf(struct spdk_bdev_io *bdev_io, void *buf) bdev_io->u.read.iovs[0].iov_base = (void *)((unsigned long)((char *)buf + 512) & ~511UL); bdev_io->u.read.iovs[0].iov_len = bdev_io->u.read.len; bdev_io->u.read.put_rbuf = true; - bdev_io->get_rbuf_cb(bdev_io); + bdev_io->get_rbuf_cb(bdev_io->ch->channel, bdev_io); } static void @@ -419,12 +419,19 @@ spdk_bdev_cleanup_pending_rbuf_io(struct spdk_bdev *bdev) static void __submit_request(struct spdk_bdev *bdev, struct spdk_bdev_io *bdev_io) { + struct spdk_io_channel *ch; + assert(bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING); + if (bdev_io->type == SPDK_BDEV_IO_TYPE_RESET) { spdk_bdev_cleanup_pending_rbuf_io(bdev); + ch = NULL; + } else { + ch = bdev_io->ch->channel; } + bdev_io->in_submit_request = true; - bdev->fn_table->submit_request(bdev_io); + bdev->fn_table->submit_request(ch, bdev_io); bdev_io->in_submit_request = false; } @@ -586,7 +593,7 @@ spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch, return NULL; } - bdev_io->ch = channel->channel; + bdev_io->ch = channel; bdev_io->type = SPDK_BDEV_IO_TYPE_READ; bdev_io->u.read.iov.iov_base = buf; bdev_io->u.read.iov.iov_len = nbytes; @@ -627,7 +634,7 @@ spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch, return NULL; } - bdev_io->ch = channel->channel; + bdev_io->ch = channel; bdev_io->type = SPDK_BDEV_IO_TYPE_READ; bdev_io->u.read.iovs = iov; bdev_io->u.read.iovcnt = iovcnt; @@ -665,7 +672,7 @@ spdk_bdev_write(struct spdk_bdev *bdev, struct spdk_io_channel *ch, return NULL; } - bdev_io->ch = channel->channel; + bdev_io->ch = channel; bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE; bdev_io->u.write.iov.iov_base = buf; bdev_io->u.write.iov.iov_len = nbytes; @@ -705,7 +712,7 @@ spdk_bdev_writev(struct spdk_bdev *bdev, struct spdk_io_channel *ch, return NULL; } - bdev_io->ch = channel->channel; + bdev_io->ch = channel; bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE; bdev_io->u.write.iovs = iov; bdev_io->u.write.iovcnt = iovcnt; @@ -750,7 +757,7 @@ spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_channel *ch, return NULL; } - bdev_io->ch = channel->channel; + bdev_io->ch = channel; bdev_io->type = SPDK_BDEV_IO_TYPE_UNMAP; bdev_io->u.unmap.unmap_bdesc = unmap_d; bdev_io->u.unmap.bdesc_count = bdesc_count; @@ -781,7 +788,7 @@ spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_channel *ch, return NULL; } - bdev_io->ch = channel->channel; + bdev_io->ch = channel; bdev_io->type = SPDK_BDEV_IO_TYPE_FLUSH; bdev_io->u.flush.offset = offset; bdev_io->u.flush.length = length; @@ -1098,7 +1105,7 @@ spdk_bdev_io_get_rbuf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_rbuf_cb cb) bdev_io->get_rbuf_cb = cb; _spdk_bdev_io_get_rbuf(bdev_io); } else { - cb(bdev_io); + cb(bdev_io->ch->channel, bdev_io); } } diff --git a/lib/bdev/malloc/blockdev_malloc.c b/lib/bdev/malloc/blockdev_malloc.c index 82fb56c8a..a45ffe511 100644 --- a/lib/bdev/malloc/blockdev_malloc.c +++ b/lib/bdev/malloc/blockdev_malloc.c @@ -270,7 +270,7 @@ blockdev_malloc_reset(struct malloc_disk *mdisk, struct malloc_task *task) return 0; } -static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io) +static int _blockdev_malloc_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: @@ -287,7 +287,7 @@ static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io) } blockdev_malloc_readv((struct malloc_disk *)bdev_io->ctx, - bdev_io->ch, + ch, (struct malloc_task *)bdev_io->driver_ctx, bdev_io->u.read.iovs, bdev_io->u.read.iovcnt, @@ -297,7 +297,7 @@ static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_WRITE: blockdev_malloc_writev((struct malloc_disk *)bdev_io->ctx, - bdev_io->ch, + ch, (struct malloc_task *)bdev_io->driver_ctx, bdev_io->u.write.iovs, bdev_io->u.write.iovcnt, @@ -317,7 +317,7 @@ static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_UNMAP: return blockdev_malloc_unmap((struct malloc_disk *)bdev_io->ctx, - bdev_io->ch, + ch, (struct malloc_task *)bdev_io->driver_ctx, bdev_io->u.unmap.unmap_bdesc, bdev_io->u.unmap.bdesc_count); @@ -327,9 +327,9 @@ static int _blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io) return 0; } -static void blockdev_malloc_submit_request(struct spdk_bdev_io *bdev_io) +static void blockdev_malloc_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { - if (_blockdev_malloc_submit_request(bdev_io) < 0) { + if (_blockdev_malloc_submit_request(ch, bdev_io) < 0) { spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); } } diff --git a/lib/bdev/nvme/blockdev_nvme.c b/lib/bdev/nvme/blockdev_nvme.c index a17bbf811..132d81e04 100644 --- a/lib/bdev/nvme/blockdev_nvme.c +++ b/lib/bdev/nvme/blockdev_nvme.c @@ -255,12 +255,12 @@ bdev_nvme_unmap(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, uint16_t bdesc_count); static void -bdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) +bdev_nvme_get_rbuf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { int ret; ret = bdev_nvme_readv((struct nvme_bdev *)bdev_io->ctx, - bdev_io->ch, + ch, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.read.iovs, bdev_io->u.read.iovcnt, @@ -273,7 +273,7 @@ bdev_nvme_get_rbuf_cb(struct spdk_bdev_io *bdev_io) } static int -_bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) +_bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: @@ -282,7 +282,7 @@ _bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_WRITE: return bdev_nvme_writev((struct nvme_bdev *)bdev_io->ctx, - bdev_io->ch, + ch, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.write.iovs, bdev_io->u.write.iovcnt, @@ -291,7 +291,7 @@ _bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_UNMAP: return bdev_nvme_unmap((struct nvme_bdev *)bdev_io->ctx, - bdev_io->ch, + ch, (struct nvme_bdev_io *)bdev_io->driver_ctx, bdev_io->u.unmap.unmap_bdesc, bdev_io->u.unmap.bdesc_count); @@ -313,9 +313,9 @@ _bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) } static void -bdev_nvme_submit_request(struct spdk_bdev_io *bdev_io) +bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { - if (_bdev_nvme_submit_request(bdev_io) < 0) { + if (_bdev_nvme_submit_request(ch, bdev_io) < 0) { spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); } } diff --git a/lib/bdev/rbd/blockdev_rbd.c b/lib/bdev/rbd/blockdev_rbd.c index 4fdbb2377..13416696d 100644 --- a/lib/bdev/rbd/blockdev_rbd.c +++ b/lib/bdev/rbd/blockdev_rbd.c @@ -252,12 +252,12 @@ blockdev_rbd_destruct(void *ctx) return 0; } -static void blockdev_rbd_get_rbuf_cb(struct spdk_bdev_io *bdev_io) +static void blockdev_rbd_get_rbuf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { int ret; ret = blockdev_rbd_readv(bdev_io->ctx, - bdev_io->ch, + ch, (struct blockdev_rbd_io *)bdev_io->driver_ctx, bdev_io->u.read.iovs, bdev_io->u.read.iovcnt, @@ -269,7 +269,7 @@ static void blockdev_rbd_get_rbuf_cb(struct spdk_bdev_io *bdev_io) } } -static int _blockdev_rbd_submit_request(struct spdk_bdev_io *bdev_io) +static int _blockdev_rbd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { switch (bdev_io->type) { case SPDK_BDEV_IO_TYPE_READ: @@ -278,7 +278,7 @@ static int _blockdev_rbd_submit_request(struct spdk_bdev_io *bdev_io) case SPDK_BDEV_IO_TYPE_WRITE: return blockdev_rbd_writev((struct blockdev_rbd *)bdev_io->ctx, - bdev_io->ch, + ch, (struct blockdev_rbd_io *)bdev_io->driver_ctx, bdev_io->u.write.iovs, bdev_io->u.write.iovcnt, @@ -286,7 +286,7 @@ static int _blockdev_rbd_submit_request(struct spdk_bdev_io *bdev_io) bdev_io->u.write.offset); case SPDK_BDEV_IO_TYPE_FLUSH: return blockdev_rbd_flush((struct blockdev_rbd *)bdev_io->ctx, - bdev_io->ch, + ch, (struct blockdev_rbd_io *)bdev_io->driver_ctx, bdev_io->u.flush.offset, bdev_io->u.flush.length); @@ -296,9 +296,9 @@ static int _blockdev_rbd_submit_request(struct spdk_bdev_io *bdev_io) return 0; } -static void blockdev_rbd_submit_request(struct spdk_bdev_io *bdev_io) +static void blockdev_rbd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { - if (_blockdev_rbd_submit_request(bdev_io) < 0) { + if (_blockdev_rbd_submit_request(ch, bdev_io) < 0) { spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED); } } diff --git a/lib/bdev/split/vbdev_split.c b/lib/bdev/split/vbdev_split.c index 46e270283..e28b5c59a 100644 --- a/lib/bdev/split/vbdev_split.c +++ b/lib/bdev/split/vbdev_split.c @@ -110,7 +110,7 @@ split_reset(struct split_disk *split_disk, struct spdk_bdev_io *bdev_io) } static void -vbdev_split_submit_request(struct spdk_bdev_io *bdev_io) +vbdev_split_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io) { struct split_disk *split_disk = bdev_io->ctx;