diff --git a/lib/ftl/ftl_core.c b/lib/ftl/ftl_core.c index d3a53f9ca..b7308d792 100644 --- a/lib/ftl/ftl_core.c +++ b/lib/ftl/ftl_core.c @@ -790,9 +790,10 @@ ftl_lba_read_next_ppa(struct ftl_io *io, struct ftl_ppa *ppa, size_t lbk) struct ftl_ppa next_ppa; size_t i; - *ppa = ftl_l2p_get(dev, io->lba.single + lbk); + *ppa = ftl_l2p_get(dev, ftl_io_current_lba(io)); - SPDK_DEBUGLOG(SPDK_LOG_FTL_CORE, "Read ppa:%lx, lba:%lu\n", ppa->ppa, io->lba.single); + SPDK_DEBUGLOG(SPDK_LOG_FTL_CORE, "Read ppa:%lx, lba:%lu\n", + ppa->ppa, ftl_io_current_lba(io)); /* If the PPA is invalid, skip it (the buffer should already be zero'ed) */ if (ftl_ppa_invalid(*ppa)) { @@ -800,7 +801,7 @@ ftl_lba_read_next_ppa(struct ftl_io *io, struct ftl_ppa *ppa, size_t lbk) } if (ftl_ppa_cached(*ppa)) { - if (!ftl_ppa_cache_read(io, io->lba.single + lbk, *ppa, ftl_io_iovec_addr(io))) { + if (!ftl_ppa_cache_read(io, ftl_io_current_lba(io), *ppa, ftl_io_iovec_addr(io))) { return 0; } @@ -809,7 +810,7 @@ ftl_lba_read_next_ppa(struct ftl_io *io, struct ftl_ppa *ppa, size_t lbk) } for (i = 1; i < ftl_io_iovec_len_left(io); ++i) { - next_ppa = ftl_l2p_get(dev, io->lba.single + lbk + i); + next_ppa = ftl_l2p_get(dev, ftl_io_get_lba(io, io->pos + i)); if (ftl_ppa_invalid(next_ppa) || ftl_ppa_cached(next_ppa)) { break; diff --git a/lib/ftl/ftl_io.c b/lib/ftl/ftl_io.c index 9bda906ed..9023880b4 100644 --- a/lib/ftl/ftl_io.c +++ b/lib/ftl/ftl_io.c @@ -83,15 +83,23 @@ ftl_io_iovec(struct ftl_io *io) } uint64_t -ftl_io_current_lba(struct ftl_io *io) +ftl_io_get_lba(const struct ftl_io *io, size_t offset) { + assert(offset < io->lbk_cnt); + if (io->flags & FTL_IO_VECTOR_LBA) { - return io->lba.vector[io->pos]; + return io->lba.vector[offset]; } else { - return io->lba.single + io->pos; + return io->lba.single + offset; } } +uint64_t +ftl_io_current_lba(const struct ftl_io *io) +{ + return ftl_io_get_lba(io, io->pos); +} + void ftl_io_advance(struct ftl_io *io, size_t lbk_cnt) { diff --git a/lib/ftl/ftl_io.h b/lib/ftl/ftl_io.h index b6624dd21..61b7ea7b7 100644 --- a/lib/ftl/ftl_io.h +++ b/lib/ftl/ftl_io.h @@ -267,7 +267,8 @@ void ftl_io_clear(struct ftl_io *io); void ftl_io_inc_req(struct ftl_io *io); void ftl_io_dec_req(struct ftl_io *io); struct iovec *ftl_io_iovec(struct ftl_io *io); -uint64_t ftl_io_current_lba(struct ftl_io *io); +uint64_t ftl_io_current_lba(const struct ftl_io *io); +uint64_t ftl_io_get_lba(const struct ftl_io *io, size_t offset); 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); diff --git a/lib/ftl/ftl_trace.c b/lib/ftl/ftl_trace.c index c4cf47334..db88e96b9 100644 --- a/lib/ftl/ftl_trace.c +++ b/lib/ftl/ftl_trace.c @@ -224,7 +224,7 @@ ftl_trace_lba_io_init(struct spdk_ftl_dev *dev, const struct ftl_io *io) } } - spdk_trace_record(tpoint_id, io->trace, io->lbk_cnt, 0, io->lba.single); + spdk_trace_record(tpoint_id, io->trace, io->lbk_cnt, 0, ftl_io_get_lba(io, 0)); } void @@ -233,7 +233,7 @@ ftl_trace_rwb_fill(struct spdk_ftl_dev *dev, const struct ftl_io *io) assert(io->trace != FTL_TRACE_INVALID_ID); spdk_trace_record(FTL_TRACE_WRITE_RWB_FILL(ftl_trace_io_source(io)), io->trace, - 0, 0, io->lba.single + io->pos); + 0, 0, ftl_io_current_lba(io)); } void @@ -298,7 +298,7 @@ ftl_trace_completion(struct spdk_ftl_dev *dev, const struct ftl_io *io, } } - spdk_trace_record(tpoint_id, io->trace, 0, 0, io->lba.single); + spdk_trace_record(tpoint_id, io->trace, 0, 0, ftl_io_get_lba(io, 0)); } void