diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index ec30240eeb..9b504528d9 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -1629,12 +1629,11 @@ spdk_ftl_write(struct spdk_ftl_dev *dev, struct spdk_io_channel *ch, uint64_t lb return -EBUSY; } - io = ftl_io_alloc(ch); + io = ftl_io_user_init(ch, lba, lba_cnt, iov, iov_cnt, cb_fn, cb_arg, FTL_IO_WRITE); if (!io) { return -ENOMEM; } - ftl_io_user_init(dev, io, lba, lba_cnt, iov, iov_cnt, cb_fn, cb_arg, FTL_IO_WRITE); ftl_io_write(io); return 0; @@ -1682,12 +1681,11 @@ spdk_ftl_read(struct spdk_ftl_dev *dev, struct spdk_io_channel *ch, uint64_t lba return -EBUSY; } - io = ftl_io_alloc(ch); + io = ftl_io_user_init(ch, lba, lba_cnt, iov, iov_cnt, cb_fn, cb_arg, FTL_IO_READ); if (!io) { return -ENOMEM; } - ftl_io_user_init(dev, io, lba, lba_cnt, iov, iov_cnt, cb_fn, cb_arg, FTL_IO_READ); ftl_io_read(io); return 0; } diff --git a/lib/ftl/ftl_io.c b/lib/ftl/ftl_io.c index 570f6ea9d4..cff86b8304 100644 --- a/lib/ftl/ftl_io.c +++ b/lib/ftl/ftl_io.c @@ -273,13 +273,17 @@ ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb) return io; } -void -ftl_io_user_init(struct spdk_ftl_dev *dev, struct ftl_io *io, uint64_t lba, size_t lbk_cnt, - struct iovec *iov, size_t iov_cnt, - spdk_ftl_fn cb_fn, void *cb_arg, int type) +struct ftl_io * +ftl_io_user_init(struct spdk_io_channel *_ioch, uint64_t lba, size_t lbk_cnt, struct iovec *iov, + size_t iov_cnt, spdk_ftl_fn cb_fn, void *cb_arg, int type) { - if (io->flags & FTL_IO_INITIALIZED) { - return; + struct ftl_io_channel *ioch = spdk_io_channel_get_ctx(_ioch); + struct spdk_ftl_dev *dev = ioch->dev; + struct ftl_io *io; + + io = ftl_io_alloc(_ioch); + if (spdk_unlikely(!io)) { + return NULL; } ftl_io_init(io, dev, cb_fn, cb_arg, 0, type); @@ -295,6 +299,8 @@ ftl_io_user_init(struct spdk_ftl_dev *dev, struct ftl_io *io, uint64_t lba, size } ftl_trace_lba_io_init(io->dev, io); + + return io; } static void diff --git a/lib/ftl/ftl_io.h b/lib/ftl/ftl_io.h index 4e4490957d..c9c2451a63 100644 --- a/lib/ftl/ftl_io.h +++ b/lib/ftl/ftl_io.h @@ -275,13 +275,12 @@ void ftl_io_advance(struct ftl_io *io, size_t lbk_cnt); size_t ftl_iovec_num_lbks(struct iovec *iov, size_t iov_cnt); void *ftl_io_iovec_addr(struct ftl_io *io); size_t ftl_io_iovec_len_left(struct ftl_io *io); -struct ftl_io *ftl_io_init_internal(const struct ftl_io_init_opts *opts); struct ftl_io *ftl_io_rwb_init(struct spdk_ftl_dev *dev, struct ftl_band *band, struct ftl_rwb_batch *entry, spdk_ftl_fn cb); struct ftl_io *ftl_io_erase_init(struct ftl_band *band, size_t lbk_cnt, spdk_ftl_fn cb); -void ftl_io_user_init(struct spdk_ftl_dev *dev, struct ftl_io *io, uint64_t lba, size_t lbk_cnt, - struct iovec *iov, size_t iov_cnt, - spdk_ftl_fn fn, void *cb_arg, int type); +struct ftl_io *ftl_io_user_init(struct spdk_io_channel *ioch, uint64_t lba, size_t lbk_cnt, + struct iovec *iov, size_t iov_cnt, spdk_ftl_fn cb_fn, + void *cb_arg, int type); void *ftl_io_get_md(const struct ftl_io *io); void ftl_io_complete(struct ftl_io *io); void ftl_io_shrink_iovec(struct ftl_io *io, size_t lbk_cnt);