diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index de83a7f46..9e08ec7b7 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -1039,7 +1039,7 @@ ftl_alloc_io_nv_cache(struct ftl_io *parent, size_t num_lbks) .parent = parent, .data = ftl_io_iovec_addr(parent), .lbk_cnt = num_lbks, - .flags = FTL_IO_CACHE, + .flags = parent->flags | FTL_IO_CACHE, }; return ftl_io_init_internal(&opts); diff --git a/lib/ftl/ftl_io.c b/lib/ftl/ftl_io.c index 8caec1f8f..aea0d93ec 100644 --- a/lib/ftl/ftl_io.c +++ b/lib/ftl/ftl_io.c @@ -272,6 +272,7 @@ struct ftl_io * ftl_io_init_internal(const struct ftl_io_init_opts *opts) { struct ftl_io *io = opts->io; + struct ftl_io *parent = opts->parent; struct spdk_ftl_dev *dev = opts->dev; struct iovec iov = { .iov_base = opts->data, @@ -279,8 +280,8 @@ ftl_io_init_internal(const struct ftl_io_init_opts *opts) }; if (!io) { - if (opts->parent) { - io = ftl_io_alloc_child(opts->parent); + if (parent) { + io = ftl_io_alloc_child(parent); } else { io = ftl_io_alloc(dev->ioch); } @@ -297,6 +298,14 @@ ftl_io_init_internal(const struct ftl_io_init_opts *opts) io->band = opts->band; io->md = opts->md; + if (parent) { + if (parent->flags & FTL_IO_VECTOR_LBA) { + io->lba.vector = parent->lba.vector + parent->pos; + } else { + io->lba.single = parent->lba.single + parent->pos; + } + } + if (ftl_io_init_iovec(io, &iov, 1, opts->lbk_cnt)) { if (!opts->io) { ftl_io_free(io);