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;
}
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;
}
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);
}
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;
}
trsvcid = e->trsvcid;
break;
default:
+ if (cfg->verbose)
+ fprintf(stderr, "skipping discovery entry, "
+ "invalid address family %d\n",
+ e->trtype);
errno = EINVAL;
return NULL;
}
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;
}
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;
}
{
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;
}
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);
}
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 {