]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
fabrics: add 'verbose' option
authorHannes Reinecke <hare@suse.de>
Wed, 14 Apr 2021 06:10:26 +0000 (08:10 +0200)
committerHannes Reinecke <hare@suse.de>
Fri, 11 Jun 2021 10:13:26 +0000 (12:13 +0200)
Add a 'verbose' option to print out logging messages during
discovery.

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

index 7adbc5f52e582cc3184d3d4698639c2eef62f024..ead59d110dba73323352f8b42fce4b227723bc4d 100644 (file)
@@ -156,6 +156,7 @@ static struct nvme_fabrics_config *merge_config(nvme_ctrl_t c,
        UPDATE_CFG_OPTION(ctrl_cfg, cfg, disable_sqflow, false);
        UPDATE_CFG_OPTION(ctrl_cfg, cfg, hdr_digest, false);
        UPDATE_CFG_OPTION(ctrl_cfg, cfg, data_digest, false);
+       UPDATE_CFG_OPTION(ctrl_cfg, cfg, verbose, false);
 
        return ctrl_cfg;
 }
@@ -311,8 +312,16 @@ int nvmf_add_ctrl_opts(nvme_ctrl_t c, struct nvme_fabrics_config *cfg)
        if (ret)
                return ret;
 
+       if (cfg->verbose)
+               fprintf(stderr, "nvmf connect %s\n", argstr);
        ret = __nvmf_add_ctrl(argstr);
        free(argstr);
+       if (cfg->verbose) {
+               if (ret < 0)
+                       fprintf(stderr, "failed to add ctrl, error %d\n", errno);
+               else
+                       fprintf(stderr, "nvme%d: added ctrl\n", ret);
+       }
        return ret;
 }
 
@@ -331,11 +340,17 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
        if (ret)
                return ret;
 
+       if (cfg->verbose)
+               fprintf(stderr, "nvmf connect %s\n", argstr);
        ret = __nvmf_add_ctrl(argstr);
        free(argstr);
-       if (ret < 0)
+       if (ret < 0) {
+               if (cfg->verbose)
+                       fprintf(stderr, "failed to add ctrl, error %d\n", ret);
                return ret;
-
+       }
+       if (cfg->verbose)
+               fprintf(stderr, "nvme%d: ctrl connected\n", ret);
        return nvme_init_ctrl(h, c, ret);
 }
 
@@ -358,6 +373,10 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
        case NVME_NQN_NVME:
                break;
        default:
+               if (cfg->verbose)
+                       fprintf(stderr, "skipping discovery entry, "
+                              "invalid subsystem type %d\n",
+                              e->subtype);
                errno = EINVAL;
                return NULL;
        }
@@ -374,6 +393,10 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
                        trsvcid = e->trsvcid;
                        break;
                default:
+                       if (cfg->verbose)
+                               fprintf(stderr, "skipping discovery entry, "
+                                      "invalid address family %d\n",
+                                      e->trtype);
                        errno = EINVAL;
                        return NULL;
                }
@@ -389,13 +412,25 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
        case NVMF_TRTYPE_LOOP:
                break;
        default:
+               if (cfg->verbose)
+                       fprintf(stderr, "skipping discovery entry, "
+                               "invalid transport type %d\n",
+                               e->trtype);
                errno = EINVAL;
                return NULL;
        }
 
        transport = nvmf_trtype_str(e->trtype);
+       if (cfg->verbose)
+               fprintf(stderr, "lookup ctrl %s %s %s\n",
+                       transport, traddr, trsvcid);
+
        c = nvme_create_ctrl(e->subnqn, transport, traddr, NULL, trsvcid);
        if (!c) {
+               if (cfg->verbose)
+                       fprintf(stderr, "skipping discovery entry, "
+                               "failed to allocate controller on %s port %s\n",
+                               transport, traddr);
                errno = ENOMEM;
                return NULL;
        }
@@ -414,11 +449,17 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
        if (errno == EINVAL && disable_sqflow) {
                errno = 0;
                /* disable_sqflow is unrecognized option on older kernels */
+               if (cfg->verbose)
+                       fprintf(stderr, "failed to connect controller, "
+                               "retry with disabling SQ flow control\n");
                disable_sqflow = false;
                ret = nvmf_add_ctrl(h, c, cfg, disable_sqflow);
                if (!ret)
                        return c;
        }
+       if (cfg->verbose)
+               fprintf(stderr, "failed to connect controller, "
+                       "error %d\n", errno);
        nvme_free_ctrl(c);
        return NULL;
 }
@@ -434,6 +475,7 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
 {
        struct nvmf_discovery_log *log;
        int hdr, ret, retries = 0;
+       const char *name = nvme_ctrl_get_name(c);
        uint64_t genctr, numrec;
        unsigned int size;
 
@@ -445,9 +487,15 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
        }
        memset(log, 0, hdr);
 
+       if (nvme_ctrl_is_verbose(c))
+               fprintf(stderr, "%s: discover length %d\n", name, 0x100);
        ret = nvme_discovery_log(nvme_ctrl_get_fd(c), 0x100, log);
-       if (ret)
+       if (ret) {
+               if (nvme_ctrl_is_verbose(c))
+                       fprintf(stderr, "%s: discover failed, error %d\n",
+                              name, errno);
                goto out_free_log;
+       }
 
        do {
                numrec = le64_to_cpu(log->numrec);
@@ -469,21 +517,43 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
                }
                memset(log, 0, size);
 
+               if (nvme_ctrl_is_verbose(c))
+                       fprintf(stderr, "%s: discover length %d\n", name, size);
+
                ret = nvme_discovery_log(nvme_ctrl_get_fd(c), size, log);
-               if (ret)
+               if (ret) {
+                       if (nvme_ctrl_is_verbose(c))
+                               fprintf(stderr, "%s: discover "
+                                       "try %d/%d failed, error %d\n",
+                                       name, retries, max_retries, errno);
                        goto out_free_log;
+               }
 
                genctr = le64_to_cpu(log->genctr);
+               if (nvme_ctrl_is_verbose(c))
+                       fprintf(stderr, "%s: discover genctr %lu, retry\n",
+                               name, genctr);
                ret = nvme_discovery_log(nvme_ctrl_get_fd(c), hdr, log);
-               if (ret)
+               if (ret) {
+                       if (nvme_ctrl_is_verbose(c))
+                               fprintf(stderr, "%s: discover "
+                                       "try %d/%d failed, error %d\n",
+                                       name, retries, max_retries, errno);
                        goto out_free_log;
+               }
        } while (genctr != le64_to_cpu(log->genctr) &&
                 ++retries < max_retries);
 
        if (genctr != le64_to_cpu(log->genctr)) {
+               if (nvme_ctrl_is_verbose(c))
+                       fprintf(stderr, "%s: discover genctr mismatch\n", name);
                errno = EAGAIN;
                ret = -1;
        } else if (numrec != le64_to_cpu(log->numrec)) {
+               if (nvme_ctrl_is_verbose(c))
+                       fprintf(stderr,
+                               "%s: could only fetch %lu of %lu records\n",
+                               name, numrec, le64_to_cpu(log->numrec));
                errno = EBADSLT;
                ret = -1;
        } else {
index c130339b15a9b2727ccbdab2878f81ceaeebe131..077e47311d13bc8fd2b8b25ba617200b6f86f927 100644 (file)
@@ -30,6 +30,7 @@
  * @disable_sqflow:    Disable controller sq flow control
  * @hdr_digest:                Generate/verify header digest (TCP)
  * @data_digest:       Generate/verify data digest (TCP)
+ * @verbose:            Verbose output
  */
 struct nvme_fabrics_config {
        int queue_size;
@@ -45,6 +46,7 @@ struct nvme_fabrics_config {
        bool disable_sqflow;
        bool hdr_digest;
        bool data_digest;
+       bool verbose;
 };
 
 /**
index 663d7af90f567fd7e4c33ee531f6d066793f7ed0..ebb073a75fe3d6d5a978ab7a792cf0fab21d5762 100644 (file)
@@ -703,6 +703,16 @@ bool nvme_ctrl_is_discovered(nvme_ctrl_t c)
        return c->discovered;
 }
 
+void nvme_ctrl_set_verbosity(nvme_ctrl_t c, bool verbose)
+{
+       c->cfg.verbose = verbose;
+}
+
+bool nvme_ctrl_is_verbose(nvme_ctrl_t c)
+{
+       return c->cfg.verbose;
+}
+
 int nvme_ctrl_identify(nvme_ctrl_t c, struct nvme_id_ctrl *id)
 {
        return nvme_identify_ctrl(nvme_ctrl_get_fd(c), id);
@@ -734,11 +744,16 @@ int nvme_ctrl_disconnect(nvme_ctrl_t c)
 {
        int ret;
 
+       if (c->cfg.verbose)
+               fprintf(stderr, "%s: disconnect\n", c->name);
        ret = nvme_set_attr(nvme_ctrl_get_sysfs_dir(c),
                            "delete_controller", "1");
-       if (ret < 0)
+       if (ret < 0) {
+               if (c->cfg.verbose)
+                       fprintf(stderr, "%s: failed to disconnect, error %d\n",
+                               c->name, errno);
                return ret;
-
+       }
        if (c->fd >= 0) {
                close(c->fd);
                c->fd = -1;
index 3555c768c43ce97266415fe68d18b92e7cd47a78..018838d9bbff1c77767614d1f20f80a68696198f 100644 (file)
@@ -817,6 +817,23 @@ bool nvme_ctrl_is_discovered(nvme_ctrl_t c);
  */
 void nvme_ctrl_disable_sqflow(nvme_ctrl_t c, bool disable_sqflow);
 
+/**
+ * nvme_ctrl_set_verbosity() -
+ * @c:
+ * @verbose:
+ *
+ * Return:
+ */
+void nvme_ctrl_set_verbosity(nvme_ctrl_t c, bool verbose);
+
+/**
+ * nvme_ctrl_is_verbose() -
+ * @c:
+ *
+ * Return:
+ */
+bool nvme_ctrl_is_verbose(nvme_ctrl_t c);
+
 /**
  * nvme_ctrl_identify() -
  * @c: