Commit 3931e121 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

nvme: Get PI format for Extended LBA format



Get protection information format from extended LBA format data
structure and hold it in the spdk_nvme_ns structure.

We only have nsdata_nvm when elbas is 1 now. However, we may have
nsdata_nvm for other purposes in future. Hence, we check both of
nsdata_nvm and elbas == 1 when setting PI format.

Add a public API spdk_nvme_ns_get_pi_format() for the upper layer
to retrieve the PI format of the namespace.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: Ib7026e0008f4412905744faf961f2d3771a0fea0
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/23622


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
parent 4629dfb5
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -3001,6 +3001,18 @@ uint64_t spdk_nvme_ns_get_size(struct spdk_nvme_ns *ns);
 */
enum spdk_nvme_pi_type spdk_nvme_ns_get_pi_type(struct spdk_nvme_ns *ns);

/**
 * Get the end-to-end data protection information format of the given namespace.
 *
 * This function is thread safe and can be called at any point while the controller
 * is attached to the SPDK NVMe driver.
 *
 * \param ns Namespace to query.
 *
 * \return the end-to-end data protection information format.
 */
enum spdk_nvme_pi_format spdk_nvme_ns_get_pi_format(struct spdk_nvme_ns *ns);

/**
 * Get the metadata size, in bytes, of the given namespace.
 *
+1 −0
Original line number Diff line number Diff line
@@ -564,6 +564,7 @@ struct spdk_nvme_ns {

	uint32_t			md_size;
	uint32_t			pi_type;
	uint32_t			pi_format;
	uint32_t			sectors_per_max_io;
	uint32_t			sectors_per_max_io_no_md;
	uint32_t			sectors_per_stripe;
+15 −0
Original line number Diff line number Diff line
@@ -21,9 +21,11 @@ void
nvme_ns_set_identify_data(struct spdk_nvme_ns *ns)
{
	struct spdk_nvme_ns_data	*nsdata;
	struct spdk_nvme_nvm_ns_data	*nsdata_nvm;
	uint32_t			format_index;

	nsdata = _nvme_ns_get_data(ns);
	nsdata_nvm = ns->nsdata_nvm;

	ns->flags = 0x0000;
	format_index = spdk_nvme_ns_get_format_index(nsdata);
@@ -85,6 +87,14 @@ nvme_ns_set_identify_data(struct spdk_nvme_ns *ns)
	if (nsdata->lbaf[format_index].ms && nsdata->dps.pit) {
		ns->flags |= SPDK_NVME_NS_DPS_PI_SUPPORTED;
		ns->pi_type = nsdata->dps.pit;
		if (nsdata_nvm != NULL && ns->ctrlr->cdata.ctratt.bits.elbas) {
			/* We may have nsdata_nvm for other purposes but
			 * the elbaf array is only valid when elbas is 1.
			 */
			ns->pi_format = nsdata_nvm->elbaf[format_index].pif;
		} else {
			ns->pi_format = SPDK_NVME_16B_GUARD_PI;
		}
	}
}

@@ -362,6 +372,11 @@ spdk_nvme_ns_get_pi_type(struct spdk_nvme_ns *ns) {
	return ns->pi_type;
}

enum spdk_nvme_pi_format
spdk_nvme_ns_get_pi_format(struct spdk_nvme_ns *ns) {
	return ns->pi_format;
}

bool
spdk_nvme_ns_supports_extended_lba(struct spdk_nvme_ns *ns)
{
+1 −0
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@
	spdk_nvme_ns_get_num_sectors;
	spdk_nvme_ns_get_size;
	spdk_nvme_ns_get_pi_type;
	spdk_nvme_ns_get_pi_format;
	spdk_nvme_ns_get_md_size;
	spdk_nvme_ns_get_format_index;
	spdk_nvme_ns_supports_extended_lba;
+2 −0
Original line number Diff line number Diff line
@@ -283,6 +283,7 @@ test_nvme_ns_set_identify_data(void)
	CU_ASSERT(ns.sectors_per_max_io == 252);
	CU_ASSERT(ns.sectors_per_max_io_no_md == 256);
	CU_ASSERT(spdk_nvme_ns_get_pi_type(&ns) == SPDK_NVME_FMT_NVM_PROTECTION_TYPE1);
	CU_ASSERT(spdk_nvme_ns_get_pi_format(&ns) == SPDK_NVME_16B_GUARD_PI);

	CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_EXTENDED_LBA_SUPPORTED);
	CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_RESERVATION_SUPPORTED);
@@ -427,6 +428,7 @@ test_nvme_ns_has_supported_iocs_specific_data(void)
	ctrlr.cdata.ctratt.bits.elbas = true;
	CU_ASSERT(nvme_ns_has_supported_iocs_specific_data(&ns) == true);
	/* case 3: ns.csi == SPDK_NVME_CSI_ZNS. Expect: true */
	ctrlr.cdata.ctratt.bits.elbas = false;
	ns.csi = SPDK_NVME_CSI_ZNS;
	CU_ASSERT(nvme_ns_has_supported_iocs_specific_data(&ns) == true);
	/* case 4: default ns.csi == SPDK_NVME_CSI_KV. Expect: false */