return arg_str(cms, ARRAY_SIZE(cms), cm);
}
+#define UPDATE_CFG_OPTION(c, n, o, d) \
+ if ((c)->o == d) (c)->o = (n)->o
+static struct nvme_fabrics_config *merge_config(nvme_ctrl_t c,
+ const struct nvme_fabrics_config *cfg)
+{
+ struct nvme_fabrics_config *ctrl_cfg = nvme_ctrl_get_config(c);
+
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_io_queues, 0);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_write_queues, 0);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, nr_poll_queues, 0);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, queue_size, 0);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, keep_alive_tmo, 0);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, reconnect_delay, 0);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, ctrl_loss_tmo,
+ NVMF_DEF_CTRL_LOSS_TMO);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, tos, -1);
+ UPDATE_CFG_OPTION(ctrl_cfg, cfg, duplicate_connect, false);
+ 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);
+
+ return ctrl_cfg;
+}
+
static int add_bool_argument(char **argstr, char *tok, bool arg)
{
char *nstr;
return 0;
}
-static int build_options(nvme_ctrl_t c, char **argstr,
- const struct nvme_fabrics_config *cfg)
+static int build_options(nvme_ctrl_t c, char **argstr)
{
+ struct nvme_fabrics_config *cfg = nvme_ctrl_get_config(c);
const char *transport = nvme_ctrl_get_transport(c);
/* always specify nqn as first arg - this will init the string */
return ret;
}
-int nvmf_add_ctrl_opts(nvme_ctrl_t c, const struct nvme_fabrics_config *cfg)
+int nvmf_add_ctrl_opts(nvme_ctrl_t c, struct nvme_fabrics_config *cfg)
{
char *argstr;
int ret;
- ret = build_options(c, &argstr, cfg);
+ cfg = merge_config(c, cfg);
+
+ ret = build_options(c, &argstr);
if (ret)
return ret;
}
int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
- const struct nvme_fabrics_config *cfg)
+ const struct nvme_fabrics_config *cfg,
+ bool disable_sqflow)
{
char *argstr;
int ret;
- ret = build_options(c, &argstr, cfg);
+ cfg = merge_config(c, cfg);
+ nvme_ctrl_disable_sqflow(c, disable_sqflow);
+
+ ret = build_options(c, &argstr);
if (ret)
return ret;
nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
struct nvmf_disc_log_entry *e,
- const struct nvme_fabrics_config *defcfg,
+ const struct nvme_fabrics_config *cfg,
bool *discover)
{
- struct nvme_fabrics_config cfg = { 0 };
const char *transport;
char *traddr = NULL, *trsvcid = NULL;
nvme_ctrl_t c;
+ bool disable_sqflow = false;
int ret;
- memcpy(&cfg, defcfg, sizeof(cfg));
switch (e->subtype) {
case NVME_NQN_DISC:
if (discover)
}
transport = nvmf_trtype_str(e->trtype);
- c = nvme_create_ctrl(e->subnqn, transport, traddr,
- NULL, trsvcid);
+ c = nvme_create_ctrl(e->subnqn, transport, traddr, NULL, trsvcid);
if (!c) {
errno = ENOMEM;
return NULL;
}
if (e->treq & NVMF_TREQ_DISABLE_SQFLOW)
- cfg.disable_sqflow = true;
+ disable_sqflow = true;
- ret = nvmf_add_ctrl(h, c, &cfg);
+ ret = nvmf_add_ctrl(h, c, cfg, disable_sqflow);
if (!ret)
return c;
- if (errno == EINVAL && cfg.disable_sqflow) {
+ if (errno == EINVAL && disable_sqflow) {
errno = 0;
/* disable_sqflow is unrecognized option on older kernels */
- cfg.disable_sqflow = false;
- ret = nvmf_add_ctrl(h, c, &cfg);
+ disable_sqflow = false;
+ ret = nvmf_add_ctrl(h, c, cfg, disable_sqflow);
if (!ret)
return c;
}