From 9a42d7fc307645b267f68eec87432e887ce87e32 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Wed, 5 Jun 2019 13:59:17 +0200 Subject: [PATCH] lib/ftl: initialize LBA when allocating internal IOs Initialize children IOs with the appropriate LBA of its parent when allocating internal IOs. Change-Id: I191ad741b9d88d7f18cae05982e0a06a8f371f78 Signed-off-by: Konrad Sztyber Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/458099 Tested-by: SPDK CI Jenkins Reviewed-by: Paul Luse Reviewed-by: Darek Stojaczyk Reviewed-by: Ben Walker Reviewed-by: Mateusz Kozlowski Reviewed-by: Wojciech Malikowski --- lib/ftl/ftl_core.c | 2 +- lib/ftl/ftl_io.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) 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);