From 37b825ec804049192c833b9dcc24e2d3ba580be1 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Mon, 20 May 2024 17:43:01 +0200 Subject: [PATCH] nbft: Reuse existing discovery controller Attempt to look up and use existing (persistent) discovery controller. Signed-off-by: Tomas Bzatek --- nbft.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/nbft.c b/nbft.c index 9d1834d0d..8c03a1f53 100644 --- a/nbft.c +++ b/nbft.c @@ -393,6 +393,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, for (dd = entry->nbft->discovery_list; dd && *dd; dd++) { nvme_ctrl_t c; bool linked = false; + bool persistent = false; _cleanup_uri_ struct nvme_fabrics_uri *uri = NULL; _cleanup_free_ char *trsvcid = NULL; @@ -437,12 +438,19 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, .trsvcid = trsvcid, }; - c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg); - if (!c && errno == ENVME_CONNECT_ADDRNOTAVAIL && - !strcmp(trcfg.transport, "tcp") && - strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { - trcfg.host_traddr = NULL; + /* Lookup existing discovery controller */ + c = lookup_ctrl(h, &trcfg); + if (c && nvme_ctrl_get_name(c)) + persistent = true; + + if (!c) { c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg); + if (!c && errno == ENVME_CONNECT_ADDRNOTAVAIL && + !strcmp(trcfg.transport, "tcp") && + strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { + trcfg.host_traddr = NULL; + c = nvmf_create_discover_ctrl(r, h, cfg, &trcfg); + } } if (!c) { @@ -457,7 +465,8 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, ret = do_discover(*dd, r, h, c, cfg, &trcfg, flags, verbose); - nvme_disconnect_ctrl(c); + if (!persistent) + nvme_disconnect_ctrl(c); nvme_free_ctrl(c); if (ret == -ENOMEM) goto out_free;