]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
tree: loop controllers can have transport addresses
authorHannes Reinecke <hare@suse.de>
Thu, 3 Feb 2022 10:05:49 +0000 (11:05 +0100)
committerHannes Reinecke <hare@suse.de>
Thu, 3 Feb 2022 10:05:49 +0000 (11:05 +0100)
Loop controllers may have transport addresses, so we need to parse
them to allocated correct objects.

Signed-off-by: Hannes Reinecke <hare@suse.de>
src/nvme/fabrics.c
src/nvme/tree.c

index d8f4be25fc93d32291ab3ac9c30b76298d60c92d..2c05788a7a9b7a74e5575cb1d9601a0c0e7cd0f9 100644 (file)
@@ -581,9 +581,8 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
         case NVMF_TRTYPE_FC:
                switch (e->adrfam) {
                case NVMF_ADDR_FAMILY_FC:
-                       nvme_chomp(e->traddr, NVMF_TRADDR_SIZE),
+                       nvme_chomp(e->traddr, NVMF_TRADDR_SIZE);
                        traddr = e->traddr;
-                       trsvcid = NULL;
                        break;
                default:
                        nvme_msg(h->r, LOG_ERR,
@@ -593,6 +592,8 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
                        return NULL;
                }
        case NVMF_TRTYPE_LOOP:
+               nvme_chomp(e->traddr, NVMF_TRADDR_SIZE);
+               traddr = strlen(e->traddr) ? e->traddr : NULL;
                break;
        default:
                nvme_msg(h->r, LOG_ERR, "skipping unsupported transport %d\n",
index 9f22b1550dde05fba12254036ce44e009b6e9e1d..32c19fb4d8b4373753ab8de35cc8e8c79300536e 100644 (file)
@@ -1122,13 +1122,11 @@ int nvme_init_ctrl(nvme_host_t h, nvme_ctrl_t c, int instance)
                goto out_free_name;
        }
 
-       if (strcmp(c->transport, "loop")) {
-               c->address = nvme_get_attr(path, "address");
-               if (!c->address) {
-                       errno = ENVME_CONNECT_INVAL_TR;
-                       ret = -1;
-                       goto out_free_name;
-               }
+       c->address = nvme_get_attr(path, "address");
+       if (!c->address && strcmp(c->transport, "loop")) {
+               errno = ENVME_CONNECT_INVAL_TR;
+               ret = -1;
+               goto out_free_name;
        }
 
        subsys_name = nvme_ctrl_lookup_subsystem_name(h->r, name);
@@ -1179,13 +1177,15 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_root_t r, nvme_subsystem_t s,
                errno = ENXIO;
                return NULL;
        }
-       if (!strcmp(transport, "loop"))
-               goto skip_address;
        /* Parse 'address' string into components */
        addr = nvme_get_attr(path, "address");
        if (!addr) {
                char *rpath = NULL, *p = NULL, *_a = NULL;
 
+               /* loop transport might not have an address */
+               if (!strcmp(transport, "loop"))
+                       goto skip_address;
+
                /* Older kernel don't support pcie transport addresses */
                if (strcmp(transport, "pcie")) {
                        free(transport);