From: Hannes Reinecke Date: Wed, 14 Apr 2021 06:10:26 +0000 (+0200) Subject: fabrics: add 'verbose' option X-Git-Tag: v1.0-rc0~129^2~5 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=e03ca78c0688a1bafc04d266670a52db3a0c9f44;p=users%2Fsagi%2Flibnvme.git fabrics: add 'verbose' option Add a 'verbose' option to print out logging messages during discovery. Signed-off-by: Hannes Reinecke --- diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c index 7adbc5f5..ead59d11 100644 --- a/src/nvme/fabrics.c +++ b/src/nvme/fabrics.c @@ -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 { diff --git a/src/nvme/fabrics.h b/src/nvme/fabrics.h index c130339b..077e4731 100644 --- a/src/nvme/fabrics.h +++ b/src/nvme/fabrics.h @@ -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; }; /** diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 663d7af9..ebb073a7 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -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; diff --git a/src/nvme/tree.h b/src/nvme/tree.h index 3555c768..018838d9 100644 --- a/src/nvme/tree.h +++ b/src/nvme/tree.h @@ -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: