[PATCH] nvme: enable generic interface (/dev/ngX) for unknown command sets

Kanchan Joshi joshi.k at samsung.com
Fri Mar 25 04:14:44 PDT 2022


block and char interface do not show up for any command set other than
NVM and ZNS.
Allow namespace setup to take place, and char interface to come up for
unknown command sets. Hide the block-interface for such command sets.

Suggested-by: Christoph Hellwig <hch at lst.de>
Signed-off-by: Kanchan Joshi <joshi.k at samsung.com>
---
This is prepared against linux-block/for-next.
On top of commit e529e21f317 ("Merge branch 'for-5.18/io_uring' into for-next")


 drivers/nvme/host/core.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 677fa4bf76d3..3e5d9a3f4167 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1875,7 +1875,7 @@ static void nvme_set_chunk_sectors(struct nvme_ns *ns, struct nvme_id_ns *id)
 static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_id_ns *id)
 {
 	unsigned lbaf = nvme_lbaf_index(id->flbas);
-	int ret;
+	int ret = 0;
 
 	blk_mq_freeze_queue(ns->disk->queue);
 	ns->lba_shift = id->lbaf[lbaf].ds;
@@ -1885,11 +1885,13 @@ static int nvme_update_ns_info(struct nvme_ns *ns, struct nvme_id_ns *id)
 	nvme_set_chunk_sectors(ns, id);
 	nvme_update_disk_info(ns->disk, ns, id);
 
-	if (ns->head->ids.csi == NVME_CSI_ZNS) {
+	if (ns->head->ids.csi == NVME_CSI_ZNS)
 		ret = nvme_update_zone_info(ns, lbaf);
-		if (ret)
-			goto out_unfreeze;
-	}
+	else if (ns->head->ids.csi != NVME_CSI_NVM)
+		/* suppress block-interface for unknown command-sets */
+		ret = -ENODEV;
+	if (ret)
+		goto out_unfreeze;
 
 	set_bit(NVME_NS_READY, &ns->flags);
 	blk_mq_unfreeze_queue(ns->disk->queue);
@@ -4098,6 +4100,14 @@ static void nvme_validate_or_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)
 	default:
 		dev_warn(ctrl->device, "unknown csi %u for nsid %u\n",
 			ids.csi, nsid);
+		if (!nvme_multi_css(ctrl)) {
+			dev_warn(ctrl->device,
+				"command set not reported for nsid: %d\n",
+				nsid);
+			break;
+		}
+		/* required to enable char-interface for unknown command sets*/
+		nvme_alloc_ns(ctrl, nsid, &ids);
 		break;
 	}
 }
-- 
2.25.1




More information about the Linux-nvme mailing list