nvmet: make discovery NQN configurable
authorHannes Reinecke <hare@suse.de>
Wed, 22 Sep 2021 06:35:19 +0000 (08:35 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 20 Oct 2021 17:16:01 +0000 (19:16 +0200)
TPAR8013 allows for unique discovery NQNs, so make the discovery
controller NQN configurable by exposing a subsys attribute
'discovery_nqn'.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/configfs.c
drivers/nvme/target/core.c

index 496d775c677071ba97a2253c678da5fb972ace6b..091a0ca16361cfd5f3cc733aa50eea879f0d75e3 100644 (file)
@@ -1233,6 +1233,44 @@ static ssize_t nvmet_subsys_attr_model_store(struct config_item *item,
 }
 CONFIGFS_ATTR(nvmet_subsys_, attr_model);
 
+static ssize_t nvmet_subsys_attr_discovery_nqn_show(struct config_item *item,
+                       char *page)
+{
+       return snprintf(page, PAGE_SIZE, "%s\n",
+                       nvmet_disc_subsys->subsysnqn);
+}
+
+static ssize_t nvmet_subsys_attr_discovery_nqn_store(struct config_item *item,
+                       const char *page, size_t count)
+{
+       struct nvmet_subsys *subsys = to_subsys(item);
+       char *subsysnqn;
+       int len;
+
+       len = strcspn(page, "\n");
+       if (!len)
+               return -EINVAL;
+
+       subsysnqn = kmemdup_nul(page, len, GFP_KERNEL);
+       if (!subsysnqn)
+               return -ENOMEM;
+
+       /*
+        * The discovery NQN must be different from subsystem NQN.
+        */
+       if (!strcmp(subsysnqn, subsys->subsysnqn)) {
+               kfree(subsysnqn);
+               return -EBUSY;
+       }
+       down_write(&nvmet_config_sem);
+       kfree(nvmet_disc_subsys->subsysnqn);
+       nvmet_disc_subsys->subsysnqn = subsysnqn;
+       up_write(&nvmet_config_sem);
+
+       return count;
+}
+CONFIGFS_ATTR(nvmet_subsys_, attr_discovery_nqn);
+
 #ifdef CONFIG_BLK_DEV_INTEGRITY
 static ssize_t nvmet_subsys_attr_pi_enable_show(struct config_item *item,
                                                char *page)
@@ -1262,6 +1300,7 @@ static struct configfs_attribute *nvmet_subsys_attrs[] = {
        &nvmet_subsys_attr_attr_cntlid_min,
        &nvmet_subsys_attr_attr_cntlid_max,
        &nvmet_subsys_attr_attr_model,
+       &nvmet_subsys_attr_attr_discovery_nqn,
 #ifdef CONFIG_BLK_DEV_INTEGRITY
        &nvmet_subsys_attr_attr_pi_enable,
 #endif
index 93107af3310ddcb1e56c759e897f774b91435c6c..e1f41436ea2ca6afc75c2ceb62d831c1930c659b 100644 (file)
@@ -1493,7 +1493,8 @@ static struct nvmet_subsys *nvmet_find_get_subsys(struct nvmet_port *port,
        if (!port)
                return NULL;
 
-       if (!strcmp(NVME_DISC_SUBSYS_NAME, subsysnqn)) {
+       if (!strcmp(NVME_DISC_SUBSYS_NAME, subsysnqn) ||
+           !strcmp(nvmet_disc_subsys->subsysnqn, subsysnqn)) {
                if (!kref_get_unless_zero(&nvmet_disc_subsys->ref))
                        return NULL;
                return nvmet_disc_subsys;