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 <jin.yu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4844
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Jin Yu 2020-10-23 17:22:51 +08:00 committed by Tomasz Zawadzki
parent ae2a100fc8
commit 1b5a65a73d

View File

@ -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 &&