Commit 465dbb04 authored by Klaus Jensen's avatar Klaus Jensen Committed by Tomasz Zawadzki
Browse files

test/nvme: fix e2edp tests when md_size > 8 bytes



The e2edp test `dp_with_pract_test` includes code to modify the data
length if the size of metadata is 8 bytes, but fails to set
req->use_extended_lba if we actually need to pass an extended LBA
(md_size > 8).

Similarly, the `dp_guard_check_extended_lba_test` miscalculates the CRC
when md_size is > 8. The CRC must be calculated over both data AND the
first md_size - 8 bytes of metadata.

Signed-off-by: default avatarKlaus Jensen <k.jensen@samsung.com>
Change-Id: I5252c1fe02908745d6aa68799859ed85f32e87ec
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6891


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 38fa9d82
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -131,7 +131,7 @@ static uint32_t dp_guard_check_extended_lba_test(struct spdk_nvme_ns *ns, struct
		uint32_t *io_flags)
{
	struct spdk_nvme_protection_info *pi;
	uint32_t md_size, sector_size;
	uint32_t md_size, sector_size, chksum_size;

	req->lba_count = 2;

@@ -142,6 +142,7 @@ static uint32_t dp_guard_check_extended_lba_test(struct spdk_nvme_ns *ns, struct

	sector_size = spdk_nvme_ns_get_sector_size(ns);
	md_size = spdk_nvme_ns_get_md_size(ns);
	chksum_size = sector_size + md_size - 8;
	req->contig = spdk_zmalloc((sector_size + md_size) * req->lba_count, 0x1000, NULL,
				   SPDK_ENV_LCORE_ID_ANY, SPDK_MALLOC_DMA);
	assert(req->contig);
@@ -152,12 +153,12 @@ static uint32_t dp_guard_check_extended_lba_test(struct spdk_nvme_ns *ns, struct
	req->buf_size = (sector_size + md_size) * req->lba_count;
	req->metadata = NULL;
	ns_data_buffer_reset(ns, req, DATA_PATTERN);
	pi = (struct spdk_nvme_protection_info *)(req->contig + sector_size + md_size - 8);
	pi = (struct spdk_nvme_protection_info *)(req->contig + chksum_size);
	/* big-endian for guard */
	to_be16(&pi->guard, spdk_crc16_t10dif(0, req->contig, sector_size));
	to_be16(&pi->guard, spdk_crc16_t10dif(0, req->contig, chksum_size));

	pi = (struct spdk_nvme_protection_info *)(req->contig + (sector_size + md_size) * 2 - 8);
	to_be16(&pi->guard, spdk_crc16_t10dif(0, req->contig + sector_size + md_size, sector_size));
	to_be16(&pi->guard, spdk_crc16_t10dif(0, req->contig + sector_size + md_size, chksum_size));

	*io_flags = SPDK_NVME_IO_FLAGS_PRCHK_GUARD;

@@ -175,12 +176,14 @@ static uint32_t dp_with_pract_test(struct spdk_nvme_ns *ns, struct io_request *r
	uint32_t md_size, sector_size, data_len;

	req->lba_count = 8;
	req->use_extended_lba = spdk_nvme_ns_supports_extended_lba(ns) ? true : false;

	sector_size = spdk_nvme_ns_get_sector_size(ns);
	md_size = spdk_nvme_ns_get_md_size(ns);
	if (md_size == 8) {
		/* No additional metadata buffer provided */
		data_len = sector_size * req->lba_count;
		req->use_extended_lba = false;
	} else {
		data_len = (sector_size + md_size) * req->lba_count;
	}
@@ -207,7 +210,6 @@ static uint32_t dp_with_pract_test(struct spdk_nvme_ns *ns, struct io_request *r
	}

	req->lba = 0;
	req->use_extended_lba = false;

	return req->lba_count;
}