From 1b5a65a73daead889df40a08f48bd6e75cdaff91 Mon Sep 17 00:00:00 2001 From: Jin Yu Date: Fri, 23 Oct 2020 17:22:51 +0800 Subject: [PATCH] bdev: fix md_buf split issue For each child IO, when md is separate. data_buf_addr = parent_data_base + offset * data_block_size; md_buf_addr = parent_md_base + offset * md_size; Change-Id: I92f9a04baa4d90ba55338591007b148e2bae545c Signed-off-by: Jin Yu Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4844 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/bdev/bdev.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index cdcb44a4a..6f169ccdf 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -1898,7 +1898,7 @@ static void _bdev_io_split(void *_bdev_io) { struct spdk_bdev_io *bdev_io = _bdev_io; - uint64_t current_offset, remaining; + uint64_t parent_offset, current_offset, remaining; uint32_t blocklen, to_next_boundary, to_next_boundary_bytes, to_last_block_bytes; struct iovec *parent_iov, *iov; uint64_t parent_iov_offset, iov_len; @@ -1908,8 +1908,9 @@ _bdev_io_split(void *_bdev_io) remaining = bdev_io->u.bdev.split_remaining_num_blocks; current_offset = bdev_io->u.bdev.split_current_offset_blocks; + parent_offset = bdev_io->u.bdev.offset_blocks; blocklen = bdev_io->bdev->blocklen; - parent_iov_offset = (current_offset - bdev_io->u.bdev.offset_blocks) * blocklen; + parent_iov_offset = (current_offset - parent_offset) * blocklen; parent_iovcnt = bdev_io->u.bdev.iovcnt; for (parent_iovpos = 0; parent_iovpos < parent_iovcnt; parent_iovpos++) { @@ -1929,9 +1930,8 @@ _bdev_io_split(void *_bdev_io) iovcnt = 0; if (bdev_io->u.bdev.md_buf) { - assert((parent_iov_offset % blocklen) > 0); - md_buf = (char *)bdev_io->u.bdev.md_buf + (parent_iov_offset / blocklen) * - spdk_bdev_get_md_size(bdev_io->bdev); + md_buf = (char *)bdev_io->u.bdev.md_buf + + (current_offset - parent_offset) * spdk_bdev_get_md_size(bdev_io->bdev); } while (to_next_boundary_bytes > 0 && parent_iovpos < parent_iovcnt &&