]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
skip display of missing controller fields
authorTomasz Zawadzki <tomasz.zawadzki@intel.com>
Tue, 14 Jul 2020 08:18:46 +0000 (04:18 -0400)
committerKeith Busch <kbusch@kernel.org>
Thu, 14 Jan 2021 21:50:08 +0000 (14:50 -0700)
'Transport' and 'address' fields are determined from sysfs
in legacy_get_pci_bdf(). Meanwhile 'state' field is only set
in scan_ctrl(), rather than legacy_list() path.

This patch fixes display of the fields to be empty.
Then resolves assumption that transport is set,
preventing a segfault.

Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
fabrics.c
nvme-print.c

index 87e6b57e30e6265c321f20b5016df073b8ac03d8..17711cfa4129e352052bab3e25738bb3b69597b4 100644 (file)
--- a/fabrics.c
+++ b/fabrics.c
@@ -1699,7 +1699,7 @@ int fabrics_disconnect_all(const char *desc, int argc, char **argv)
                for (j = 0; j < s->nr_ctrls; j++) {
                        struct nvme_ctrl *c = &s->ctrls[j];
 
-                       if (!strcmp(c->transport, "pcie"))
+                       if (!c->transport || !strcmp(c->transport, "pcie"))
                                continue;
                        err = disconnect_by_device(c->name);
                        if (err)
index ccb2f5a4f837bbe949dbb13408ce10279b7ace2b..09ada7550a5164dd1c002af3b81d4dc284e6a5ee 100644 (file)
@@ -1580,9 +1580,9 @@ static void nvme_show_subsystem(struct nvme_subsystem *s)
 
        for (i = 0; i < s->nr_ctrls; i++) {
                printf(" +- %s %s %s %s %s\n", s->ctrls[i].name,
-                               s->ctrls[i].transport,
-                               s->ctrls[i].address,
-                               s->ctrls[i].state,
+                               s->ctrls[i].transport ? : "",
+                               s->ctrls[i].address ? : "",
+                               s->ctrls[i].state ? : "",
                                s->ctrls[i].ana_state ? : "");
        }
 }
@@ -1615,12 +1615,15 @@ static void json_print_nvme_subsystem_list(struct nvme_topology *t)
                        path_attrs = json_create_object();
                        json_object_add_value_string(path_attrs, "Name",
                                        c->name);
-                       json_object_add_value_string(path_attrs, "Transport",
-                                       c->transport);
-                       json_object_add_value_string(path_attrs, "Address",
-                                       c->address);
-                       json_object_add_value_string(path_attrs, "State",
-                                       c->state);
+                       if (c->transport)
+                               json_object_add_value_string(path_attrs,
+                                               "Transport", c->transport);
+                       if (c->address)
+                               json_object_add_value_string(path_attrs,
+                                               "Address", c->address);
+                       if (c->state)
+                               json_object_add_value_string(path_attrs,
+                                               "State", c->state);
                        if (c->ana_state)
                                json_object_add_value_string(path_attrs,
                                                "ANAState", c->ana_state);
@@ -5524,7 +5527,7 @@ static void nvme_show_detailed_list(struct nvme_topology *t)
 
                        printf("%-8s %-.20s %-.40s %-.8s %-6s %-14s %-12s ",
                                c->name, c->id.sn, c->id.mn, c->id.fr,
-                               c->transport, c->address, s->name);
+                               c->transport ? : "", c->address ? : "", s->name);
 
                        for (k = 0; k < c->nr_namespaces; k++) {
                                struct nvme_namespace *n = &c->namespaces[k];
@@ -5607,9 +5610,12 @@ static void json_detail_list(struct nvme_topology *t)
                        struct json_array *namespaces;
 
                        json_object_add_value_string(ctrl_attrs, "Controller", c->name);
-                       json_object_add_value_string(ctrl_attrs, "Transport", c->transport);
-                       json_object_add_value_string(ctrl_attrs, "Address", c->address);
-                       json_object_add_value_string(ctrl_attrs, "State", c->state);
+                       if (c->transport)
+                               json_object_add_value_string(ctrl_attrs, "Transport", c->transport);
+                       if (c->address)
+                               json_object_add_value_string(ctrl_attrs, "Address", c->address);
+                       if (c->state)
+                               json_object_add_value_string(ctrl_attrs, "State", c->state);
                        if (c->hostnqn)
                                json_object_add_value_string(ctrl_attrs, "HostNQN", c->hostnqn);
                        if (c->hostid)
@@ -5696,7 +5702,7 @@ static void json_simple_ns(struct nvme_namespace *n, struct json_array *devices)
 
        json_object_add_value_string(device_attrs, "ModelNumber", formatter);
 
-       if (index >= 0 && !strcmp(n->ctrl->transport, "pcie")) {
+       if (index >= 0 && n->ctrl->transport && !strcmp(n->ctrl->transport, "pcie")) {
                char *product = nvme_product_name(index);
 
                json_object_add_value_string(device_attrs, "ProductName", product);