[PATCH] nvme: disable namespaces with unsupported metadata

Keith Busch kbusch at kernel.org
Tue Nov 23 09:45:54 PST 2021


The only fabrics target that supports metadata is RDMA and usable only
if it is 8B per block, and formatted for protection information. If an
rdma target were to export a namespace with a different format (ex:
4k+64B), the driver will not be able to submit a valid command for that
format.

Suppress exporting these namespaces as read/writeable to the block
stack.

Cc: Max Gurtovoy <mgurtovoy at nvidia.com>
Cc: Sagi Grimberg <sagi at grimberg.me>
Signed-off-by: Keith Busch <kbusch at kernel.org>
---
 drivers/nvme/host/core.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 4b5de8f5435a..3afbf73639c3 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1740,7 +1740,16 @@ static int nvme_configure_metadata(struct nvme_ns *ns, struct nvme_id_ns *id)
 		 */
 		if (WARN_ON_ONCE(!(id->flbas & NVME_NS_FLBAS_META_EXT)))
 			return -EINVAL;
-		if (ctrl->max_integrity_segments)
+
+		/*
+		 * Currently rdma is the only fabrics nvme host that supports
+		 * metadata integrity segments, but will not use the metadata
+		 * payload if it doesn't satisfy 'nvme_ns_has_pi()'. Since the
+		 * initiator is not able to form requests that satisify the
+		 * format, do not support the namespace if the metadata does
+		 * not satisfy that requirement.
+		 */
+		if (ctrl->max_integrity_segments && nvme_ns_has_pi(ns))
 			ns->features |=
 				(NVME_NS_METADATA_SUPPORTED | NVME_NS_EXT_LBAS);
 	} else {
-- 
2.25.4




More information about the Linux-nvme mailing list