From 4d37b13cf7972c78d1d6ab50643a34cfafd11974 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 28 Apr 2023 20:37:04 +0900 Subject: [PATCH] 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 Change-Id: I88fe1b250289f2bab7b541523e8be931eeb8150c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17899 Reviewed-by: Jim Harris Reviewed-by: Aleksey Marchuk Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins --- lib/bdev/bdev.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index ce4971138..50c08fffa 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -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; } }