bdev: Fix spdk_bdev_get_max_copy() for fallback case

As we recently fixed bdev_io_get_max_buf_len(), to get aligned length,
spdk_bdev_get_buf_align() - 1 is correct.

_bdev_get_block_size_with_md() considers both interleaved metadata and
separate metadata cases. It is simpler to use
_bdev_get_block_size_with_md().

The copy command fallback uses write command. As the write zeroes
fallback does, bdev->write_unit_size should be considered.

Fix all in this patch.

Signed-off-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I88fe1b250289f2bab7b541523e8be931eeb8150c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17899
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Shuhei Matsumoto 2023-04-28 20:37:04 +09:00 committed by Jim Harris
parent c9f3613fcd
commit 5bced73616

View File

@ -4707,20 +4707,18 @@ spdk_bdev_is_dif_check_enabled(const struct spdk_bdev *bdev,
uint32_t
spdk_bdev_get_max_copy(const struct spdk_bdev *bdev)
{
uint64_t alighed_length;
uint64_t aligned_length;
uint64_t max_copy_blocks;
uint64_t temp_max_copy_blocks;
struct spdk_iobuf_opts opts;
if (spdk_bdev_io_type_supported((struct spdk_bdev *)bdev, SPDK_BDEV_IO_TYPE_COPY)) {
return bdev->max_copy;
} else {
spdk_iobuf_get_opts(&opts);
alighed_length = opts.large_bufsize - spdk_bdev_get_buf_align(bdev);
temp_max_copy_blocks = spdk_bdev_is_md_separate(bdev) ?
alighed_length / (bdev->blocklen + bdev->md_len) :
alighed_length / bdev->blocklen;
max_copy_blocks = 1 << spdk_u64log2(temp_max_copy_blocks);
aligned_length = opts.large_bufsize - (spdk_bdev_get_buf_align(bdev) - 1);
max_copy_blocks = aligned_length / _bdev_get_block_size_with_md(bdev);
max_copy_blocks -= max_copy_blocks % bdev->write_unit_size;
return max_copy_blocks;
}
}