Commit 5bced736 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Jim Harris
Browse files

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: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I88fe1b250289f2bab7b541523e8be931eeb8150c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/17899


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent c9f3613f
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -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;
	}
}