From fe20df682a9ea2520815a95e4fc2bad3825f8427 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 18 Mar 2026 16:03:59 +0100 Subject: [PATCH 1/4] libnvme/fabrics; Use nvmf_context as argument to lookup_ctrl() First step towards removal of fabric_args. Signed-off-by: Hannes Reinecke --- libnvme/src/nvme/fabrics.c | 231 +++++++++++++++++++++---------------- 1 file changed, 130 insertions(+), 101 deletions(-) diff --git a/libnvme/src/nvme/fabrics.c b/libnvme/src/nvme/fabrics.c index c659b23ff6..64256b6136 100644 --- a/libnvme/src/nvme/fabrics.c +++ b/libnvme/src/nvme/fabrics.c @@ -1810,19 +1810,19 @@ void nvmf_free_uri(struct nvme_fabrics_uri *uri) free(uri); } -static nvme_ctrl_t lookup_ctrl(nvme_host_t h, struct fabric_args *trcfg) +static nvme_ctrl_t lookup_ctrl(nvme_host_t h, struct nvmf_context *fctx) { nvme_subsystem_t s; nvme_ctrl_t c; nvme_for_each_subsystem(h, s) { c = nvme_ctrl_find(s, - trcfg->transport, - trcfg->traddr, - trcfg->trsvcid, - trcfg->subsysnqn, - trcfg->host_traddr, - trcfg->host_iface); + fctx->transport, + fctx->traddr, + fctx->trsvcid, + fctx->subsysnqn, + fctx->host_traddr, + fctx->host_iface); if (c) return c; } @@ -1949,24 +1949,22 @@ static int _nvmf_discovery(struct nvme_global_ctx *ctx, bool disconnect; nvme_ctrl_t child = { 0 }; int tmo = fctx->cfg->keep_alive_tmo; + struct nvmf_context nfctx = *fctx; - struct fabric_args trcfg = { - .subsysnqn = e->subnqn, - .transport = nvmf_trtype_str(e->trtype), - .traddr = e->traddr, - .trsvcid = e->trsvcid, - .host_traddr = fctx->host_traddr, - .host_iface = fctx->host_iface, - }; + nfctx.subsysnqn = e->subnqn; + nfctx.transport = nvmf_trtype_str(e->trtype); + nfctx.traddr = e->traddr; + nfctx.trsvcid = e->trsvcid; + nfctx.cfg = fctx->cfg; /* Already connected ? */ - cl = lookup_ctrl(h, &trcfg); + cl = lookup_ctrl(h, &nfctx); if (cl && nvme_ctrl_get_name(cl)) continue; /* Skip connect if the transport types don't match */ if (strcmp(nvme_ctrl_get_transport(c), - nvmf_trtype_str(e->trtype))) + nfctx.transport)) continue; if (e->subtype == NVME_NQN_DISC || @@ -1983,7 +1981,7 @@ static int _nvmf_discovery(struct nvme_global_ctx *ctx, * Are we supposed to keep the discovery * controller around? */ - disconnect = !fctx->persistent; + disconnect = !nfctx.persistent; if (strcmp(e->subnqn, NVME_DISC_SUBSYS_NAME)) { /* @@ -1996,21 +1994,21 @@ static int _nvmf_discovery(struct nvme_global_ctx *ctx, disconnect = false; } - set_discovery_kato(fctx, fctx->cfg); + set_discovery_kato(&nfctx, fctx->cfg); } else { /* NVME_NQN_NVME */ disconnect = false; } - err = nvmf_connect_disc_entry(h, e, fctx->host_traddr, - fctx->host_iface, fctx->cfg, + err = nvmf_connect_disc_entry(h, e, nfctx.host_traddr, + nfctx.host_iface, nfctx.cfg, &discover, &child); - fctx->cfg->keep_alive_tmo = tmo; + nfctx.cfg->keep_alive_tmo = tmo; if (!child) { if (discover) - _nvmf_discovery(ctx, fctx, true, child); + _nvmf_discovery(ctx, &nfctx, true, child); if (child && disconnect) { nvme_disconnect_ctrl(child); @@ -2019,9 +2017,9 @@ static int _nvmf_discovery(struct nvme_global_ctx *ctx, } else if (err == -ENVME_CONNECT_ALREADY) { struct nvmf_disc_log_entry *e = &log->entries[i]; - fctx->already_connected(fctx, h, e->subnqn, + nfctx.already_connected(&nfctx, h, e->subnqn, nvmf_trtype_str(e->trtype), e->traddr, - e->trsvcid, fctx->user_data); + e->trsvcid, nfctx.user_data); } } @@ -2174,80 +2172,82 @@ int _discovery_config_json(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, nvme_host_t h, nvme_ctrl_t c, bool connect, bool force) { - const char *transport, *traddr, *host_traddr; - const char *host_iface, *trsvcid, *subsysnqn; + struct nvmf_context nfctx = *fctx; struct nvme_fabrics_config cfg; nvme_ctrl_t cn; int ret = 0; - 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_host_iface(c); + nfctx.transport = nvme_ctrl_get_transport(c); + nfctx.traddr = nvme_ctrl_get_traddr(c); + nfctx.host_traddr = nvme_ctrl_get_host_traddr(c); + nfctx.host_iface = nvme_ctrl_get_host_iface(c); - if (!transport && !traddr) + if (!nfctx.transport && !nfctx.traddr) return 0; /* ignore none fabric transports */ - if (strcmp(transport, "tcp") && - strcmp(transport, "rdma") && - strcmp(transport, "fc")) + if (strcmp(nfctx.transport, "tcp") && + strcmp(nfctx.transport, "rdma") && + strcmp(nfctx.transport, "fc")) return 0; /* ignore if no host_traddr for fc */ - if (!strcmp(transport, "fc")) { - if (!host_traddr) { - nvme_msg(ctx, LOG_ERR, "host_traddr required for fc\n"); + if (!strcmp(nfctx.transport, "fc")) { + if (!nfctx.host_traddr) { + nvme_msg(ctx, LOG_ERR, + "host_traddr required for fc\n"); return 0; } } /* ignore if host_iface set for any transport other than tcp */ - if (!strcmp(transport, "rdma") || !strcmp(transport, "fc")) { - if (host_iface) { + if (!strcmp(nfctx.transport, "rdma") || + !strcmp(nfctx.transport, "fc")) { + if (nfctx.host_iface) { nvme_msg(ctx, LOG_ERR, "host_iface not permitted for rdma or fc\n"); return 0; } } - trsvcid = nvme_ctrl_get_trsvcid(c); - if (!trsvcid || !strcmp(trsvcid, "")) - trsvcid = nvmf_get_default_trsvcid(transport, true); + nfctx.trsvcid = nvme_ctrl_get_trsvcid(c); + if (!nfctx.trsvcid || !strcmp(nfctx.trsvcid, "")) + nfctx.trsvcid = + nvmf_get_default_trsvcid(nfctx.transport, true); if (force) - subsysnqn = nvme_ctrl_get_subsysnqn(c); + nfctx.subsysnqn = nvme_ctrl_get_subsysnqn(c); else - subsysnqn = NVME_DISC_SUBSYS_NAME; + nfctx.subsysnqn = NVME_DISC_SUBSYS_NAME; if (nvme_ctrl_get_persistent(c)) - fctx->persistent = true; + nfctx.persistent = true; memcpy(&cfg, fctx->cfg, sizeof(cfg)); struct fabric_args trcfg = { - .subsysnqn = subsysnqn, - .transport = transport, - .traddr = traddr, - .trsvcid = trsvcid, - .host_traddr = host_traddr, - .host_iface = host_iface, + .subsysnqn = nfctx.subsysnqn, + .transport = nfctx.transport, + .traddr = nfctx.traddr, + .trsvcid = nfctx.trsvcid, + .host_traddr = nfctx.host_traddr, + .host_iface = nfctx.host_iface, }; if (!force) { - cn = lookup_ctrl(h, &trcfg); + cn = lookup_ctrl(h, &nfctx); if (cn) { - fctx->persistent = true; - _nvmf_discovery(ctx, fctx, connect, cn); + nfctx.persistent = true; + _nvmf_discovery(ctx, &nfctx, connect, cn); return 0; } } - ret = nvmf_create_discovery_ctrl(ctx, fctx, h, &cfg, &trcfg, &cn); + ret = nvmf_create_discovery_ctrl(ctx, &nfctx, h, &cfg, &trcfg, &cn); if (ret) return 0; - _nvmf_discovery(ctx, fctx, connect, cn); + _nvmf_discovery(ctx, &nfctx, connect, cn); if (!(fctx->persistent || is_persistent_discovery_ctrl(h, cn))) ret = nvme_disconnect_ctrl(cn); nvme_free_ctrl(cn); @@ -2386,6 +2386,7 @@ int nvmf_discovery_config_file(struct nvme_global_ctx *ctx, if (err) break; + struct nvmf_context nfctx = *fctx; struct fabric_args trcfg = { .subsysnqn = fctx->subsysnqn, .transport = fctx->transport, @@ -2396,20 +2397,21 @@ int nvmf_discovery_config_file(struct nvme_global_ctx *ctx, }; if (!force) { - c = lookup_ctrl(h, &trcfg); + c = lookup_ctrl(h, &nfctx); if (c) { - _nvmf_discovery(ctx, fctx, connect, c); + _nvmf_discovery(ctx, &nfctx, connect, c); continue; } } - err = nvmf_create_discovery_ctrl(ctx, fctx, h, fctx->cfg, + err = nvmf_create_discovery_ctrl(ctx, &nfctx, h, fctx->cfg, &trcfg, &c); if (err) continue; - _nvmf_discovery(ctx, fctx, connect, c); - if (!(fctx->persistent || is_persistent_discovery_ctrl(h, c))) + _nvmf_discovery(ctx, &nfctx, connect, c); + if (!(nfctx.persistent || + is_persistent_discovery_ctrl(h, c))) err = nvme_disconnect_ctrl(c); nvme_free_ctrl(c); } while (!err); @@ -2563,6 +2565,7 @@ static int nbft_connect(struct nvme_global_ctx *ctx, struct nvme_fabrics_config *cfg) { nvme_ctrl_t c; + struct nvmf_context nfctx = *fctx; int saved_log_level; bool saved_log_tstamp; bool saved_log_pid; @@ -2572,13 +2575,20 @@ static int nbft_connect(struct nvme_global_ctx *ctx, &saved_log_pid); /* Already connected ? */ - c = lookup_ctrl(h, trcfg); + nfctx.subsysnqn = trcfg->subsysnqn; + nfctx.transport = trcfg->transport; + nfctx.traddr = trcfg->traddr; + nfctx.trsvcid = trcfg->trsvcid; + nfctx.host_traddr = trcfg->host_traddr; + nfctx.host_iface = trcfg->host_iface; + + c = lookup_ctrl(h, &nfctx); if (c && nvme_ctrl_get_name(c)) return 0; - ret = nvme_create_ctrl(ctx, trcfg->subsysnqn, trcfg->transport, - trcfg->traddr, trcfg->host_traddr, - trcfg->host_iface, trcfg->trsvcid, &c); + ret = nvme_create_ctrl(ctx, nfctx.subsysnqn, nfctx.transport, + nfctx.traddr, nfctx.host_traddr, + nfctx.host_iface, nfctx.trsvcid, &c); if (ret) return ret; @@ -2616,8 +2626,8 @@ static int nbft_connect(struct nvme_global_ctx *ctx, return ret; } - if (fctx->connected) - fctx->connected(fctx, c, fctx->user_data); + if (nfctx.connected) + nfctx.connected(&nfctx, c, nfctx.user_data); return 0; } @@ -2650,9 +2660,15 @@ static int nbft_discovery(struct nvme_global_ctx *ctx, for (i = 0; i < le64_to_cpu(log->numrec); i++) { struct nvmf_disc_log_entry *e = &log->entries[i]; + struct nvmf_context nfctx = *fctx; nvme_ctrl_t cl; int tmo = defcfg->keep_alive_tmo; + nfctx.subsysnqn = e->subnqn; + nfctx.transport = nvmf_trtype_str(e->trtype); + nfctx.traddr = e->traddr; + nfctx.trsvcid = e->trsvcid; + struct fabric_args trcfg = { .subsysnqn = e->subnqn, .transport = nvmf_trtype_str(e->trtype), @@ -2666,27 +2682,29 @@ static int nbft_discovery(struct nvme_global_ctx *ctx, continue; /* Already connected ? */ - cl = lookup_ctrl(h, &trcfg); + cl = lookup_ctrl(h, &nfctx); if (cl && nvme_ctrl_get_name(cl)) continue; /* Skip connect if the transport types don't match */ if (strcmp(nvme_ctrl_get_transport(c), - nvmf_trtype_str(e->trtype))) + nfctx.transport)) continue; if (e->subtype == NVME_NQN_DISC) { nvme_ctrl_t child; - ret = nvmf_connect_disc_entry(h, e, fctx->host_traddr, - fctx->host_iface, defcfg, NULL, &child); + ret = nvmf_connect_disc_entry(h, e, + nfctx.host_traddr, nfctx.host_iface, + defcfg, NULL, &child); if (ret) continue; - nbft_discovery(ctx, fctx, dd, h, child, defcfg, &trcfg); + nbft_discovery(ctx, &nfctx, dd, h, child, + defcfg, &trcfg); nvme_disconnect_ctrl(child); nvme_free_ctrl(child); } else { - ret = nbft_connect(ctx, fctx, h, e, NULL, + ret = nbft_connect(ctx, &nfctx, h, e, NULL, &trcfg, defcfg); /* @@ -2700,7 +2718,7 @@ static int nbft_discovery(struct nvme_global_ctx *ctx, const char *htradr = trcfg.host_traddr; trcfg.host_traddr = NULL; - ret = nbft_connect(ctx, fctx, h, e, NULL, + ret = nbft_connect(ctx, &nfctx, h, e, NULL, &trcfg, defcfg); if (ret == 0) @@ -2787,6 +2805,8 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, /* Subsystem Namespace Descriptor List */ for (ss = entry->nbft->subsystem_ns_list; ss && *ss; ss++) for (i = 0; i < (*ss)->num_hfis; i++) { + struct nvmf_context nfctx = *fctx; + hfi = (*ss)->hfis[i]; /* Skip discovery NQN records */ @@ -2798,10 +2818,17 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, continue; } - host_traddr = NULL; + nfctx.host_traddr = NULL; if (!fctx->host_traddr && !strncmp((*ss)->transport, "tcp", 3)) - host_traddr = hfi->tcp_info.ipaddr; + nfctx.host_traddr = + hfi->tcp_info.ipaddr; + + nfctx.subsysnqn = (*ss)->subsys_nqn; + nfctx.transport = (*ss)->transport; + nfctx.traddr = (*ss)->traddr; + nfctx.trsvcid = (*ss)->trsvcid; + nfctx.host_iface = NULL; struct fabric_args trcfg = { .subsysnqn = (*ss)->subsys_nqn, @@ -2812,7 +2839,7 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, .host_iface = NULL, }; - rr = nbft_connect(ctx, fctx, h, NULL, + rr = nbft_connect(ctx, &nfctx, h, NULL, *ss, &trcfg, fctx->cfg); /* @@ -2821,11 +2848,12 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, * firmware had. Retry without host_traddr. */ if (rr == -ENVME_CONNECT_ADDRNOTAVAIL && - !strcmp(trcfg.transport, "tcp") && + !strcmp(nfctx.transport, "tcp") && strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { trcfg.host_traddr = NULL; + nfctx.host_traddr = NULL; - rr = nbft_connect(ctx, fctx, h, NULL, + rr = nbft_connect(ctx, &nfctx, h, NULL, *ss, &trcfg, fctx->cfg); if (rr == 0) @@ -2851,6 +2879,7 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, for (dd = entry->nbft->discovery_list; dd && *dd; dd++) { _cleanup_uri_ struct nvme_fabrics_uri *uri = NULL; _cleanup_free_ char *trsvcid = NULL; + struct nvmf_context nfctx = *fctx; bool persistent = false; bool linked = false; nvme_ctrl_t c; @@ -2902,20 +2931,29 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, .host_iface = NULL, }; + nfctx.subsysnqn = NVME_DISC_SUBSYS_NAME; + nfctx.transport = uri->protocol; + nfctx.traddr = uri->host; + nfctx.trsvcid = trsvcid; + nfctx.host_traddr = host_traddr; + nfctx.host_iface = NULL; + /* Lookup existing discovery controller */ - c = lookup_ctrl(h, &trcfg); + c = lookup_ctrl(h, &nfctx); if (c && nvme_ctrl_get_name(c)) persistent = true; if (!c) { - ret = nvmf_create_discovery_ctrl(ctx, fctx, h, - fctx->cfg, &trcfg, &c); + ret = nvmf_create_discovery_ctrl(ctx, &nfctx, + h, fctx->cfg, &trcfg, &c); if (ret == -ENVME_CONNECT_ADDRNOTAVAIL && - !strcmp(trcfg.transport, "tcp") && + !strcmp(nfctx.transport, "tcp") && strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { trcfg.host_traddr = NULL; + nfctx.traddr = NULL; ret = nvmf_create_discovery_ctrl(ctx, - fctx, h, fctx->cfg, &trcfg, &c); + &nfctx, h, fctx->cfg, + &trcfg, &c); } } else ret = 0; @@ -2927,7 +2965,7 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, goto out_free; } - rr = nbft_discovery(ctx, fctx, *dd, h, c, fctx->cfg, + rr = nbft_discovery(ctx, &nfctx, *dd, h, c, fctx->cfg, &trcfg); if (!persistent) nvme_disconnect_ctrl(c); @@ -3026,7 +3064,7 @@ int nvmf_discovery(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, }; if (!c && !force) { - c = lookup_ctrl(h, &trcfg); + c = lookup_ctrl(h, fctx); if (c) fctx->persistent = true; } @@ -3065,16 +3103,7 @@ int nvmf_connect(struct nvme_global_ctx *ctx, struct nvmf_context *fctx) if (err) return err; - struct fabric_args trcfg = { - .subsysnqn = fctx->subsysnqn, - .transport = fctx->transport, - .traddr = fctx->traddr, - .trsvcid = fctx->trsvcid, - .host_traddr = fctx->host_traddr, - .host_iface = fctx->host_iface, - }; - - c = lookup_ctrl(h, &trcfg); + c = lookup_ctrl(h, fctx); if (c && nvme_ctrl_get_name(c) && !fctx->cfg->duplicate_connect) { fctx->already_connected(fctx, h, nvme_ctrl_get_subsysnqn(c), nvme_ctrl_get_transport(c), nvme_ctrl_get_traddr(c), @@ -3082,9 +3111,9 @@ int nvmf_connect(struct nvme_global_ctx *ctx, struct nvmf_context *fctx) return -EALREADY; } - err = nvme_create_ctrl(ctx, trcfg.subsysnqn, trcfg.transport, - trcfg.traddr, trcfg.host_traddr, trcfg.host_iface, - trcfg.trsvcid, &c); + err = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport, + fctx->traddr, fctx->host_traddr, fctx->host_iface, + fctx->trsvcid, &c); if (err) return err; @@ -3101,7 +3130,7 @@ int nvmf_connect(struct nvme_global_ctx *ctx, struct nvmf_context *fctx) * We are connecting to a discovery controller, so let's treat * this as a persistent connection and specify a KATO. */ - if (!strcmp(trcfg.subsysnqn, NVME_DISC_SUBSYS_NAME)) { + if (!strcmp(fctx->subsysnqn, NVME_DISC_SUBSYS_NAME)) { fctx->persistent = true; set_discovery_kato(fctx, fctx->cfg); From 23c85f52e6953f128d12490a1bcdfca36823d19a Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 18 Mar 2026 16:09:45 +0100 Subject: [PATCH 2/4] libnvme/fabrics: drop fabric_args from __create_discovery_ctrl() All information is stored in nvmf_context, so use that instead. Signed-off-by: Hannes Reinecke --- libnvme/src/nvme/fabrics.c | 56 +++++++++----------------------------- 1 file changed, 13 insertions(+), 43 deletions(-) diff --git a/libnvme/src/nvme/fabrics.c b/libnvme/src/nvme/fabrics.c index 64256b6136..379ffcae3f 100644 --- a/libnvme/src/nvme/fabrics.c +++ b/libnvme/src/nvme/fabrics.c @@ -2071,21 +2071,20 @@ static int nvme_add_ctrl(struct nvmf_context *fctx, static int __create_discovery_ctrl(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, nvme_host_t h, - struct nvme_fabrics_config *cfg, struct fabric_args *trcfg, - struct nvme_ctrl **ctrl) + struct nvme_fabrics_config *cfg, struct nvme_ctrl **ctrl) { nvme_ctrl_t c; int tmo, ret; - ret = nvme_create_ctrl(ctx, trcfg->subsysnqn, trcfg->transport, - trcfg->traddr, trcfg->host_traddr, - trcfg->host_iface, trcfg->trsvcid, &c); + ret = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport, + fctx->traddr, fctx->host_traddr, + fctx->host_iface, fctx->trsvcid, &c); if (ret) return ret; nvme_ctrl_set_discovery_ctrl(c, true); nvme_ctrl_set_unique_discovery_ctrl(c, - strcmp(trcfg->subsysnqn, NVME_DISC_SUBSYS_NAME)); + strcmp(fctx->subsysnqn, NVME_DISC_SUBSYS_NAME)); tmo = set_discovery_kato(fctx, cfg); if (nvme_ctrl_get_unique_discovery_ctrl(c) && fctx->hostkey) { @@ -2108,14 +2107,13 @@ static int __create_discovery_ctrl(struct nvme_global_ctx *ctx, static int nvmf_create_discovery_ctrl(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, nvme_host_t h, struct nvme_fabrics_config *cfg, - struct fabric_args *trcfg, struct nvme_ctrl **ctrl) { _cleanup_free_ struct nvme_id_ctrl *id = NULL; struct nvme_ctrl *c; int ret; - ret = __create_discovery_ctrl(ctx, fctx, h, cfg, trcfg, &c); + ret = __create_discovery_ctrl(ctx, fctx, h, cfg, &c); if (ret) return ret; @@ -2159,8 +2157,8 @@ static int nvmf_create_discovery_ctrl(struct nvme_global_ctx *ctx, nvme_disconnect_ctrl(c); nvme_free_ctrl(c); - trcfg->subsysnqn = id->subnqn; - ret = __create_discovery_ctrl(ctx, fctx, h, cfg, trcfg, &c); + fctx->subsysnqn = id->subnqn; + ret = __create_discovery_ctrl(ctx, fctx, h, cfg, &c); if (ret) return ret; @@ -2225,15 +2223,6 @@ int _discovery_config_json(struct nvme_global_ctx *ctx, memcpy(&cfg, fctx->cfg, sizeof(cfg)); - struct fabric_args trcfg = { - .subsysnqn = nfctx.subsysnqn, - .transport = nfctx.transport, - .traddr = nfctx.traddr, - .trsvcid = nfctx.trsvcid, - .host_traddr = nfctx.host_traddr, - .host_iface = nfctx.host_iface, - }; - if (!force) { cn = lookup_ctrl(h, &nfctx); if (cn) { @@ -2243,7 +2232,7 @@ int _discovery_config_json(struct nvme_global_ctx *ctx, } } - ret = nvmf_create_discovery_ctrl(ctx, &nfctx, h, &cfg, &trcfg, &cn); + ret = nvmf_create_discovery_ctrl(ctx, &nfctx, h, &cfg, &cn); if (ret) return 0; @@ -2387,14 +2376,6 @@ int nvmf_discovery_config_file(struct nvme_global_ctx *ctx, break; struct nvmf_context nfctx = *fctx; - struct fabric_args trcfg = { - .subsysnqn = fctx->subsysnqn, - .transport = fctx->transport, - .traddr = fctx->traddr, - .trsvcid = fctx->trsvcid, - .host_traddr = fctx->host_traddr, - .host_iface = fctx->host_iface, - }; if (!force) { c = lookup_ctrl(h, &nfctx); @@ -2405,7 +2386,7 @@ int nvmf_discovery_config_file(struct nvme_global_ctx *ctx, } err = nvmf_create_discovery_ctrl(ctx, &nfctx, h, fctx->cfg, - &trcfg, &c); + &c); if (err) continue; @@ -2945,15 +2926,14 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, if (!c) { ret = nvmf_create_discovery_ctrl(ctx, &nfctx, - h, fctx->cfg, &trcfg, &c); + h, fctx->cfg, &c); if (ret == -ENVME_CONNECT_ADDRNOTAVAIL && !strcmp(nfctx.transport, "tcp") && strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { trcfg.host_traddr = NULL; nfctx.traddr = NULL; ret = nvmf_create_discovery_ctrl(ctx, - &nfctx, h, fctx->cfg, - &trcfg, &c); + &nfctx, h, fctx->cfg, &c); } } else ret = 0; @@ -3054,15 +3034,6 @@ int nvmf_discovery(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, } } - struct fabric_args trcfg = { - .subsysnqn = fctx->subsysnqn, - .transport = fctx->transport, - .traddr = fctx->traddr, - .trsvcid = fctx->trsvcid, - .host_traddr = fctx->host_traddr, - .host_iface = fctx->host_iface, - }; - if (!c && !force) { c = lookup_ctrl(h, fctx); if (c) @@ -3070,8 +3041,7 @@ int nvmf_discovery(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, } if (!c) { /* No device or non-matching device, create a new controller */ - ret = nvmf_create_discovery_ctrl(ctx, fctx, h, fctx->cfg, - &trcfg, &c); + ret = nvmf_create_discovery_ctrl(ctx, fctx, h, fctx->cfg, &c); if (ret) { if (ret != -ENVME_CONNECT_IGNORED) nvme_msg(ctx, LOG_ERR, From 003176aa0b1ff4d4fd9ba57925bc629ba507fe31 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 18 Mar 2026 16:21:32 +0100 Subject: [PATCH 3/4] libnvme: drop fabric_args Remove the final references to 'fabric_args' and remove the structure. Signed-off-by: Hannes Reinecke --- libnvme/src/nvme/fabrics.c | 74 +++++++++----------------------------- libnvme/src/nvme/private.h | 9 ----- 2 files changed, 17 insertions(+), 66 deletions(-) diff --git a/libnvme/src/nvme/fabrics.c b/libnvme/src/nvme/fabrics.c index 379ffcae3f..ae033fade6 100644 --- a/libnvme/src/nvme/fabrics.c +++ b/libnvme/src/nvme/fabrics.c @@ -2542,11 +2542,10 @@ static bool validate_uri(struct nvme_global_ctx *ctx, static int nbft_connect(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, struct nvme_host *h, struct nvmf_disc_log_entry *e, - struct nbft_info_subsystem_ns *ss, struct fabric_args *trcfg, + struct nbft_info_subsystem_ns *ss, struct nvme_fabrics_config *cfg) { nvme_ctrl_t c; - struct nvmf_context nfctx = *fctx; int saved_log_level; bool saved_log_tstamp; bool saved_log_pid; @@ -2555,21 +2554,13 @@ static int nbft_connect(struct nvme_global_ctx *ctx, saved_log_level = nvme_get_logging_level(ctx, &saved_log_tstamp, &saved_log_pid); - /* Already connected ? */ - nfctx.subsysnqn = trcfg->subsysnqn; - nfctx.transport = trcfg->transport; - nfctx.traddr = trcfg->traddr; - nfctx.trsvcid = trcfg->trsvcid; - nfctx.host_traddr = trcfg->host_traddr; - nfctx.host_iface = trcfg->host_iface; - - c = lookup_ctrl(h, &nfctx); + c = lookup_ctrl(h, fctx); if (c && nvme_ctrl_get_name(c)) return 0; - ret = nvme_create_ctrl(ctx, nfctx.subsysnqn, nfctx.transport, - nfctx.traddr, nfctx.host_traddr, - nfctx.host_iface, nfctx.trsvcid, &c); + ret = nvme_create_ctrl(ctx, fctx->subsysnqn, fctx->transport, + fctx->traddr, fctx->host_traddr, + fctx->host_iface, fctx->trsvcid, &c); if (ret) return ret; @@ -2607,8 +2598,8 @@ static int nbft_connect(struct nvme_global_ctx *ctx, return ret; } - if (nfctx.connected) - nfctx.connected(&nfctx, c, nfctx.user_data); + if (fctx->connected) + fctx->connected(fctx, c, fctx->user_data); return 0; } @@ -2616,7 +2607,7 @@ static int nbft_connect(struct nvme_global_ctx *ctx, static int nbft_discovery(struct nvme_global_ctx *ctx, struct nvmf_context *fctx, struct nbft_info_discovery *dd, struct nvme_host *h, struct nvme_ctrl *c, - struct nvme_fabrics_config *defcfg, struct fabric_args *deftrcfg) + struct nvme_fabrics_config *defcfg) { struct nvmf_discovery_log *log = NULL; int ret; @@ -2650,15 +2641,6 @@ static int nbft_discovery(struct nvme_global_ctx *ctx, nfctx.traddr = e->traddr; nfctx.trsvcid = e->trsvcid; - struct fabric_args trcfg = { - .subsysnqn = e->subnqn, - .transport = nvmf_trtype_str(e->trtype), - .traddr = e->traddr, - .host_traddr = fctx->host_traddr, - .host_iface = fctx->host_iface, - .trsvcid = e->trsvcid, - }; - if (e->subtype == NVME_NQN_CURR) continue; @@ -2680,13 +2662,12 @@ static int nbft_discovery(struct nvme_global_ctx *ctx, defcfg, NULL, &child); if (ret) continue; - nbft_discovery(ctx, &nfctx, dd, h, child, - defcfg, &trcfg); + nbft_discovery(ctx, &nfctx, dd, h, child, defcfg); nvme_disconnect_ctrl(child); nvme_free_ctrl(child); } else { ret = nbft_connect(ctx, &nfctx, h, e, NULL, - &trcfg, defcfg); + defcfg); /* * With TCP/DHCP, it can happen that the OS @@ -2694,13 +2675,13 @@ static int nbft_discovery(struct nvme_global_ctx *ctx, * firmware had. Retry without host_traddr. */ if (ret == -ENVME_CONNECT_ADDRNOTAVAIL && - !strcmp(trcfg.transport, "tcp") && + !strcmp(nfctx.transport, "tcp") && strlen(dd->hfi->tcp_info.dhcp_server_ipaddr) > 0) { - const char *htradr = trcfg.host_traddr; + const char *htradr = nfctx.host_traddr; - trcfg.host_traddr = NULL; + nfctx.host_traddr = NULL; ret = nbft_connect(ctx, &nfctx, h, e, NULL, - &trcfg, defcfg); + defcfg); if (ret == 0) nvme_msg(ctx, LOG_INFO, @@ -2811,17 +2792,8 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, nfctx.trsvcid = (*ss)->trsvcid; nfctx.host_iface = NULL; - struct fabric_args trcfg = { - .subsysnqn = (*ss)->subsys_nqn, - .transport = (*ss)->transport, - .traddr = (*ss)->traddr, - .trsvcid = (*ss)->trsvcid, - .host_traddr = host_traddr, - .host_iface = NULL, - }; - rr = nbft_connect(ctx, &nfctx, h, NULL, - *ss, &trcfg, fctx->cfg); + *ss, fctx->cfg); /* * With TCP/DHCP, it can happen that the OS @@ -2831,11 +2803,10 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, if (rr == -ENVME_CONNECT_ADDRNOTAVAIL && !strcmp(nfctx.transport, "tcp") && strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { - trcfg.host_traddr = NULL; nfctx.host_traddr = NULL; rr = nbft_connect(ctx, &nfctx, h, NULL, - *ss, &trcfg, fctx->cfg); + *ss, fctx->cfg); if (rr == 0) nvme_msg(ctx, LOG_INFO, @@ -2903,15 +2874,6 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, strdup(nvmf_get_default_trsvcid( uri->protocol, true)); - struct fabric_args trcfg = { - .subsysnqn = NVME_DISC_SUBSYS_NAME, - .transport = uri->protocol, - .traddr = uri->host, - .trsvcid = trsvcid, - .host_traddr = host_traddr, - .host_iface = NULL, - }; - nfctx.subsysnqn = NVME_DISC_SUBSYS_NAME; nfctx.transport = uri->protocol; nfctx.traddr = uri->host; @@ -2930,7 +2892,6 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, if (ret == -ENVME_CONNECT_ADDRNOTAVAIL && !strcmp(nfctx.transport, "tcp") && strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { - trcfg.host_traddr = NULL; nfctx.traddr = NULL; ret = nvmf_create_discovery_ctrl(ctx, &nfctx, h, fctx->cfg, &c); @@ -2945,8 +2906,7 @@ int nvmf_discovery_nbft(struct nvme_global_ctx *ctx, goto out_free; } - rr = nbft_discovery(ctx, &nfctx, *dd, h, c, fctx->cfg, - &trcfg); + rr = nbft_discovery(ctx, &nfctx, *dd, h, c, fctx->cfg); if (!persistent) nvme_disconnect_ctrl(c); nvme_free_ctrl(c); diff --git a/libnvme/src/nvme/private.h b/libnvme/src/nvme/private.h index 749c6c616b..b2a872996b 100644 --- a/libnvme/src/nvme/private.h +++ b/libnvme/src/nvme/private.h @@ -405,15 +405,6 @@ struct nvmf_context { void *user_data; }; -struct fabric_args { - const char *subsysnqn; - const char *transport; - const char *traddr; - const char *trsvcid; - const char *host_traddr; - const char *host_iface; -}; - int nvme_set_attr(const char *dir, const char *attr, const char *value); int json_read_config(struct nvme_global_ctx *ctx, const char *config_file); From cc6af5307478e4d097c03fb45b075aaad7f64878 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Thu, 19 Mar 2026 08:16:15 +0100 Subject: [PATCH 4/4] libnvme: drop 'struct nvmf_discovery_ctx' Unused. Signed-off-by: Hannes Reinecke --- libnvme/src/nvme/private.h | 45 -------------------------------------- 1 file changed, 45 deletions(-) diff --git a/libnvme/src/nvme/private.h b/libnvme/src/nvme/private.h index b2a872996b..79b809b370 100644 --- a/libnvme/src/nvme/private.h +++ b/libnvme/src/nvme/private.h @@ -306,51 +306,6 @@ struct nvme_global_ctx { #endif }; -struct nvmf_discovery_ctx { - /* defaults */ - int default_max_discovery_retries; - int default_keep_alive_timeout; - - void (*discovery_log)(struct nvmf_discovery_ctx *dctx, - bool connect, - struct nvmf_discovery_log *log, - uint64_t numrec, void *user_data); - void (*already_connected)(struct nvme_host *host, - struct nvmf_disc_log_entry *entry, - void *user_data); - bool (*decide_retry)(struct nvmf_discovery_ctx *dctx, int err, - void *user_data); - void (*connected)(struct nvmf_discovery_ctx *dctx, struct nvme_ctrl *c, - void *user_data); - int (*parser_init)(struct nvmf_discovery_ctx *dctx, - void *user_data); - void (*parser_cleanup)(struct nvmf_discovery_ctx *dctx, - void *user_data); - int (*parser_next_line)(struct nvmf_discovery_ctx *dctx, - void *user_data); - - /* connfiguration */ - bool persistent; - const char *device; - const char *subsysnqn; - const char *transport; - const char *traddr; - const char *host_traddr; - const char *host_iface; - const char *trsvcid; - const char *hostnqn; - const char *hostid; - const char *hostkey; - const char *ctrlkey; - const char *keyring; - const char *tls_key; - const char *tls_key_identity; - struct nvme_fabrics_config *cfg; - struct nvme_fabrics_config *defcfg; - - void *user_data; -}; - struct nvmf_context { /* common callbacks */ bool (*decide_retry)(struct nvmf_context *fctx, int err,