]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
fabrics: Create persistent controller using unique subsystem NQN
authorDaniel Wagner <dwagner@suse.de>
Fri, 8 Apr 2022 15:21:07 +0000 (17:21 +0200)
committerDaniel Wagner <dwagner@suse.de>
Fri, 8 Apr 2022 15:43:20 +0000 (17:43 +0200)
Prefer unique subsystem NQN discovery controllers over well-known
subsystem NQN when a persistent controller is created.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
fabrics.c

index 6fe3f1441f861516c72cae6e0536c351a5144205..92c5312f3c94227ef1182f6f96c1c9c197d18cbd 100644 (file)
--- a/fabrics.c
+++ b/fabrics.c
@@ -138,9 +138,9 @@ static int set_discovery_kato(struct nvme_fabrics_config *cfg)
        return tmo;
 }
 
-static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
-                                       struct nvme_fabrics_config *cfg,
-                                       struct tr_config *trcfg)
+static nvme_ctrl_t __create_discover_ctrl(nvme_root_t r, nvme_host_t h,
+                                         struct nvme_fabrics_config *cfg,
+                                         struct tr_config *trcfg)
 {
        nvme_ctrl_t c;
        int tmo, ret;
@@ -167,6 +167,40 @@ static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
        return c;
 }
 
+static nvme_ctrl_t create_discover_ctrl(nvme_root_t r, nvme_host_t h,
+                                       struct nvme_fabrics_config *cfg,
+                                       struct tr_config *trcfg)
+{
+       nvme_ctrl_t c;
+
+       c = __create_discover_ctrl(r, h, cfg, trcfg);
+       if (!persistent)
+               return c;
+
+       /* Find out the name of discovery controller */
+       struct nvme_id_ctrl id = { 0 };
+       if (nvme_ctrl_identify(c, &id)) {
+               fprintf(stderr, "failed to identify controller, error %s\n",
+                       nvme_strerror(errno));
+               nvme_disconnect_ctrl(c);
+               nvme_free_ctrl(c);
+               return NULL;
+       }
+
+       if (!strcmp(id.subnqn, NVME_DISC_SUBSYS_NAME))
+               return c;
+
+       /*
+        * The subsysnqn is not the well-known name. Prefer the unique
+        * subsysnqn over the well-known one.
+        */
+       nvme_disconnect_ctrl(c);
+       nvme_free_ctrl(c);
+
+       trcfg->subsysnqn = id.subnqn;
+       return __create_discover_ctrl(r, h, cfg, trcfg);
+}
+
 static void print_discovery_log(struct nvmf_discovery_log *log, int numrec)
 {
        int i;