]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
fabrics: only look for matching ctrl on same host
authorCaleb Sander <csander@purestorage.com>
Wed, 28 Jun 2023 20:35:24 +0000 (14:35 -0600)
committerDaniel Wagner <wagi@monom.org>
Tue, 18 Jul 2023 07:00:47 +0000 (09:00 +0200)
With the lookup_ctrl() check to prevent duplicate connections,
identical connections from different hosts are no longer possible.
Fix lookup_ctrl() to only look for matching controllers
on the same host that is being connected.
This restores the ability for multiple hosts on the same machine
to connect to the same transport addresses on the same subsystem.

Fixes: 07d6b91 ("fabrics: Do not attempt to reconnect to already
connected ctrls")
Signed-off-by: Caleb Sander <csander@purestorage.com>
fabrics.c
fabrics.h
nbft.c

index ac240cad030fcd1e4c2b314654288150c79d98a6..14a91cc6b8c4b503468c59d2f2fa7796cd04511b 100644 (file)
--- a/fabrics.c
+++ b/fabrics.c
@@ -149,6 +149,8 @@ static bool is_persistent_discovery_ctrl(nvme_host_t h, nvme_ctrl_t c)
        return false;
 }
 
+typedef bool (*ctrl_match_fn_t)(nvme_ctrl_t, struct tr_config *);
+
 static bool disc_ctrl_config_match(nvme_ctrl_t c, struct tr_config *trcfg)
 {
        if (nvme_ctrl_is_discovery_ctrl(c) &&
@@ -175,34 +177,45 @@ static bool ctrl_config_match(nvme_ctrl_t c, struct tr_config *trcfg)
        return false;
 }
 
-static nvme_ctrl_t __lookup_ctrl(nvme_root_t r, struct tr_config *trcfg,
-                            bool (*filter)(nvme_ctrl_t, struct tr_config *))
+static nvme_ctrl_t __lookup_host_ctrl(nvme_host_t h, struct tr_config *trcfg,
+                                     ctrl_match_fn_t filter)
 {
-       nvme_host_t h;
        nvme_subsystem_t s;
        nvme_ctrl_t c;
 
-       nvme_for_each_host(r, h) {
-               nvme_for_each_subsystem(h, s) {
-                       nvme_subsystem_for_each_ctrl(s, c) {
-                               if (!(filter(c, trcfg)))
-                                       continue;
+       nvme_for_each_subsystem(h, s) {
+               nvme_subsystem_for_each_ctrl(s, c) {
+                       if (filter(c, trcfg))
                                return c;
-                       }
                }
        }
 
        return NULL;
 }
 
+static nvme_ctrl_t __lookup_ctrl(nvme_root_t r, struct tr_config *trcfg,
+                                ctrl_match_fn_t filter)
+{
+       nvme_host_t h;
+       nvme_ctrl_t c;
+
+       nvme_for_each_host(r, h) {
+               c = __lookup_host_ctrl(h, trcfg, filter);
+               if (c)
+                       return c;
+       }
+
+       return NULL;
+}
+
 static nvme_ctrl_t lookup_discovery_ctrl(nvme_root_t r, struct tr_config *trcfg)
 {
        return __lookup_ctrl(r, trcfg, disc_ctrl_config_match);
 }
 
-nvme_ctrl_t lookup_ctrl(nvme_root_t r, struct tr_config *trcfg)
+nvme_ctrl_t lookup_ctrl(nvme_host_t h, struct tr_config *trcfg)
 {
-       return __lookup_ctrl(r, trcfg, ctrl_config_match);
+       return __lookup_host_ctrl(h, trcfg, ctrl_config_match);
 }
 
 static int set_discovery_kato(struct nvme_fabrics_config *cfg)
@@ -317,7 +330,6 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg,
        struct nvmf_discovery_log *log = NULL;
        nvme_subsystem_t s = nvme_ctrl_get_subsystem(c);
        nvme_host_t h = nvme_subsystem_get_host(s);
-       nvme_root_t r = nvme_host_get_root(h);
        uint64_t numrec;
 
        struct nvme_get_discovery_args args = {
@@ -362,7 +374,7 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg,
                        };
 
                        /* Already connected ? */
-                       cl = lookup_ctrl(r, &trcfg);
+                       cl = lookup_ctrl(h, &trcfg);
                        if (cl && nvme_ctrl_get_name(cl))
                                continue;
 
@@ -989,7 +1001,7 @@ int nvmf_connect(const char *desc, int argc, char **argv)
                .trsvcid        = trsvcid,
        };
 
-       c = lookup_ctrl(r, &trcfg);
+       c = lookup_ctrl(h, &trcfg);
        if (c && nvme_ctrl_get_name(c)) {
                fprintf(stderr, "already connected\n");
                errno = EALREADY;
index 02cebf5da1a1dd5b84f88447f291c3a395d16c87..c16df6047250e561bfe7e7f189e48f150698be45 100644 (file)
--- a/fabrics.h
+++ b/fabrics.h
@@ -11,7 +11,7 @@ struct tr_config {
        const char *trsvcid;
 };
 
-extern nvme_ctrl_t lookup_ctrl(nvme_root_t r, struct tr_config *trcfg);
+extern nvme_ctrl_t lookup_ctrl(nvme_host_t h, struct tr_config *trcfg);
 extern int nvmf_discover(const char *desc, int argc, char **argv, bool connect);
 extern int nvmf_connect(const char *desc, int argc, char **argv);
 extern int nvmf_disconnect(const char *desc, int argc, char **argv);
diff --git a/nbft.c b/nbft.c
index c73413f532e3a784d0d05ee9db76750c40dea6cb..e46e9d3dc95abf41b7b9823b84e46ddb72560858 100644 (file)
--- a/nbft.c
+++ b/nbft.c
@@ -144,7 +144,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
                                };
 
                                /* Already connected ? */
-                               cl = lookup_ctrl(r, &trcfg);
+                               cl = lookup_ctrl(h, &trcfg);
                                if (cl && nvme_ctrl_get_name(cl))
                                        continue;
 
@@ -170,7 +170,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
                                        nvme_free_ctrl(c);
 
                                        trcfg.host_traddr = NULL;
-                                       cl = lookup_ctrl(r, &trcfg);
+                                       cl = lookup_ctrl(h, &trcfg);
                                        if (cl && nvme_ctrl_get_name(cl))
                                                continue;