Skip to content
Open
92 changes: 37 additions & 55 deletions libnvme/src/nvme/fabrics.c
Original file line number Diff line number Diff line change
Expand Up @@ -968,13 +968,15 @@ static const char *lookup_context(struct nvme_global_ctx *ctx, nvme_ctrl_t c)

nvme_for_each_host(ctx, h) {
nvme_for_each_subsystem(h, s) {
if (__nvme_lookup_ctrl(s, nvme_ctrl_get_transport(c),
nvme_ctrl_get_traddr(c),
NULL,
NULL,
nvme_ctrl_get_trsvcid(c),
NULL,
NULL))
struct nvmf_context fctx = {
.transport = nvme_ctrl_get_transport(c),
.traddr = nvme_ctrl_get_traddr(c),
.host_traddr = NULL,
.host_iface = NULL,
.trsvcid = nvme_ctrl_get_trsvcid(c),
.subsysnqn = NULL,
};
if (nvme_ctrl_find(s, &fctx))
return nvme_subsystem_get_application(s);
}
}
Expand All @@ -997,14 +999,16 @@ __public int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
s = nvme_lookup_subsystem(h, NULL, nvme_ctrl_get_subsysnqn(c));
if (s) {
nvme_ctrl_t fc;

fc = __nvme_lookup_ctrl(s, nvme_ctrl_get_transport(c),
nvme_ctrl_get_traddr(c),
nvme_ctrl_get_host_traddr(c),
nvme_ctrl_get_host_iface(c),
nvme_ctrl_get_trsvcid(c),
NULL,
NULL);
struct nvmf_context fctx = {
.transport = nvme_ctrl_get_transport(c),
.traddr = nvme_ctrl_get_traddr(c),
.host_traddr = nvme_ctrl_get_host_traddr(c),
.host_iface = nvme_ctrl_get_trsvcid(c),
.trsvcid = nvme_ctrl_get_trsvcid(c),
.subsysnqn = NULL,
};

fc = nvme_ctrl_find(s, &fctx);
if (fc) {
const char *key;

Expand Down Expand Up @@ -1094,12 +1098,10 @@ __public int nvmf_connect_ctrl(nvme_ctrl_t c)

static int nvmf_connect_disc_entry(nvme_host_t h,
struct nvmf_disc_log_entry *e,
const char *host_traddr, const char *host_iface,
struct nvmf_context *fctx,
const struct nvme_fabrics_config *cfg,
bool *discover, nvme_ctrl_t *cp)
{
char *traddr = NULL, *trsvcid = NULL;
const char *transport;
nvme_ctrl_t c;
int ret;

Expand All @@ -1109,8 +1111,8 @@ static int nvmf_connect_disc_entry(nvme_host_t h,
switch (e->adrfam) {
case NVMF_ADDR_FAMILY_IP4:
case NVMF_ADDR_FAMILY_IP6:
traddr = e->traddr;
trsvcid = e->trsvcid;
fctx->traddr = e->traddr;
fctx->trsvcid = e->trsvcid;
break;
default:
nvme_msg(h->ctx, LOG_ERR,
Expand All @@ -1122,7 +1124,7 @@ static int nvmf_connect_disc_entry(nvme_host_t h,
case NVMF_TRTYPE_FC:
switch (e->adrfam) {
case NVMF_ADDR_FAMILY_FC:
traddr = e->traddr;
fctx->traddr = e->traddr;
break;
default:
nvme_msg(h->ctx, LOG_ERR,
Expand All @@ -1132,26 +1134,26 @@ static int nvmf_connect_disc_entry(nvme_host_t h,
}
break;
case NVMF_TRTYPE_LOOP:
traddr = strlen(e->traddr) ? e->traddr : NULL;
fctx->traddr = strlen(e->traddr) ? e->traddr : NULL;
break;
default:
nvme_msg(h->ctx, LOG_ERR, "skipping unsupported transport %d\n",
e->trtype);
return -EINVAL;
}

transport = nvmf_trtype_str(e->trtype);
fctx->transport = nvmf_trtype_str(e->trtype);
fctx->subsysnqn = e->subnqn;

nvme_msg(h->ctx, LOG_DEBUG, "lookup ctrl "
"(transport: %s, traddr: %s, trsvcid %s)\n",
transport, traddr, trsvcid);
fctx->transport, fctx->traddr, fctx->trsvcid);

ret = nvme_create_ctrl(h->ctx, e->subnqn, transport, traddr,
host_traddr, host_iface, trsvcid, &c);
ret = _nvme_create_ctrl(h->ctx, fctx, &c);
if (ret) {
nvme_msg(h->ctx, LOG_DEBUG, "skipping discovery entry, "
"failed to allocate %s controller with traddr %s\n",
transport, traddr);
fctx->transport, fctx->traddr);
return ret;
}

Expand Down Expand Up @@ -1812,13 +1814,7 @@ static nvme_ctrl_t lookup_ctrl(nvme_host_t h, struct nvmf_context *fctx)
nvme_ctrl_t c;

nvme_for_each_subsystem(h, s) {
c = nvme_ctrl_find(s,
fctx->transport,
fctx->traddr,
fctx->trsvcid,
fctx->subsysnqn,
fctx->host_traddr,
fctx->host_iface);
c = nvme_ctrl_find(s, fctx);
if (c)
return c;
}
Expand Down Expand Up @@ -1996,8 +1992,7 @@ static int _nvmf_discovery(struct nvme_global_ctx *ctx,
disconnect = false;
}

err = nvmf_connect_disc_entry(h, e, nfctx.host_traddr,
nfctx.host_iface, nfctx.cfg,
err = nvmf_connect_disc_entry(h, e, &nfctx, nfctx.cfg,
&discover, &child);

nfctx.cfg->keep_alive_tmo = tmo;
Expand Down Expand Up @@ -2072,9 +2067,7 @@ static int __create_discovery_ctrl(struct nvme_global_ctx *ctx,
nvme_ctrl_t c;
int tmo, ret;

ret = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport,
fctx->traddr, fctx->host_traddr,
fctx->host_iface, fctx->trsvcid, &c);
ret = _nvme_create_ctrl(ctx, fctx, &c);
if (ret)
return ret;

Expand Down Expand Up @@ -2432,14 +2425,11 @@ __public int nvmf_config_modify(struct nvme_global_ctx *ctx,
return -ENODEV;
}

c = nvme_lookup_ctrl(s, fctx->transport, fctx->traddr,
fctx->host_traddr, fctx->host_iface,
fctx->trsvcid, NULL);
c = nvme_lookup_ctrl(s, fctx, NULL);
if (!c) {
nvme_msg(ctx, LOG_ERR, "Failed to lookup controller\n");
return -ENODEV;
}

if (fctx->ctrlkey)
nvme_ctrl_set_dhchap_ctrl_key(c, fctx->ctrlkey);

Expand Down Expand Up @@ -2554,9 +2544,7 @@ static int nbft_connect(struct nvme_global_ctx *ctx,
if (c && nvme_ctrl_get_name(c))
return 0;

ret = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport,
fctx->traddr, fctx->host_traddr,
fctx->host_iface, fctx->trsvcid, &c);
ret = _nvme_create_ctrl(ctx, fctx, &c);
if (ret)
return ret;

Expand Down Expand Up @@ -2653,8 +2641,7 @@ static int nbft_discovery(struct nvme_global_ctx *ctx,
if (e->subtype == NVME_NQN_DISC) {
nvme_ctrl_t child;

ret = nvmf_connect_disc_entry(h, e,
nfctx.host_traddr, nfctx.host_iface,
ret = nvmf_connect_disc_entry(h, e, &nfctx,
defcfg, NULL, &child);
if (ret)
continue;
Expand Down Expand Up @@ -2936,10 +2923,7 @@ __public int nvmf_discovery(struct nvme_global_ctx *ctx, struct nvmf_context *fc
ret = nvme_scan_ctrl(ctx, fctx->device, &c);
if (!ret) {
/* Check if device matches command-line options */
if (!nvme_ctrl_match_config(c, fctx->transport,
fctx->traddr, fctx->trsvcid,
fctx->subsysnqn, fctx->host_traddr,
fctx->host_iface)) {
if (!_nvme_ctrl_match_config(c, fctx)) {
nvme_msg(ctx, LOG_ERR,
"ctrl device %s found, ignoring non matching command-line options\n",
fctx->device);
Expand Down Expand Up @@ -3037,9 +3021,7 @@ __public int nvmf_connect(struct nvme_global_ctx *ctx, struct nvmf_context *fctx
return -EALREADY;
}

err = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport,
fctx->traddr, fctx->host_traddr, fctx->host_iface,
fctx->trsvcid, &c);
err = _nvme_create_ctrl(ctx, fctx, &c);
if (err)
return err;

Expand Down
16 changes: 7 additions & 9 deletions libnvme/src/nvme/json.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,27 +83,25 @@ static void json_parse_port(nvme_subsystem_t s, struct json_object *port_obj)
{
nvme_ctrl_t c;
struct json_object *attr_obj;
const char *transport, *traddr = NULL;
const char *host_traddr = NULL, *host_iface = NULL, *trsvcid = NULL;
struct nvmf_context fctx = {};

attr_obj = json_object_object_get(port_obj, "transport");
if (!attr_obj)
return;
transport = json_object_get_string(attr_obj);
fctx.transport = json_object_get_string(attr_obj);
attr_obj = json_object_object_get(port_obj, "traddr");
if (attr_obj)
traddr = json_object_get_string(attr_obj);
fctx.traddr = json_object_get_string(attr_obj);
attr_obj = json_object_object_get(port_obj, "host_traddr");
if (attr_obj)
host_traddr = json_object_get_string(attr_obj);
fctx.host_traddr = json_object_get_string(attr_obj);
attr_obj = json_object_object_get(port_obj, "host_iface");
if (attr_obj)
host_iface = json_object_get_string(attr_obj);
fctx.host_iface = json_object_get_string(attr_obj);
attr_obj = json_object_object_get(port_obj, "trsvcid");
if (attr_obj)
trsvcid = json_object_get_string(attr_obj);
c = nvme_lookup_ctrl(s, transport, traddr, host_traddr,
host_iface, trsvcid, NULL);
fctx.trsvcid = json_object_get_string(attr_obj);
c = nvme_lookup_ctrl(s, &fctx, NULL);
if (!c)
return;
json_update_attributes(c, port_obj);
Expand Down
18 changes: 7 additions & 11 deletions libnvme/src/nvme/private.h
Original file line number Diff line number Diff line change
Expand Up @@ -381,10 +381,10 @@ int __nvme_transport_handle_open_mi(struct nvme_transport_handle *hdl, const cha
int __nvme_transport_handle_init_mi(struct nvme_transport_handle *hdl);
void __nvme_transport_handle_close_mi(struct nvme_transport_handle *hdl);

nvme_ctrl_t __nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport,
const char *traddr, const char *host_traddr,
const char *host_iface, const char *trsvcid,
const char *subsysnqn, nvme_ctrl_t p);
int _nvme_create_ctrl(struct nvme_global_ctx *ctx,
struct nvmf_context *fctx,
nvme_ctrl_t *cp);
bool _nvme_ctrl_match_config(struct nvme_ctrl *c, struct nvmf_context *fctx);

void *__nvme_alloc(size_t len);

Expand All @@ -395,14 +395,10 @@ nvme_host_t nvme_lookup_host(struct nvme_global_ctx *ctx, const char *hostnqn,
nvme_subsystem_t nvme_lookup_subsystem(struct nvme_host *h,
const char *name,
const char *subsysnqn);
nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport,
const char *traddr, const char *host_traddr,
const char *host_iface, const char *trsvcid,
nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s,
struct nvmf_context *fctx,
nvme_ctrl_t p);
nvme_ctrl_t nvme_ctrl_find(nvme_subsystem_t s, const char *transport,
const char *traddr, const char *trsvcid,
const char *subsysnqn, const char *host_traddr,
const char *host_iface);
nvme_ctrl_t nvme_ctrl_find(nvme_subsystem_t s, struct nvmf_context *fctx);

void __nvme_free_host(nvme_host_t h);

Expand Down
Loading
Loading