@@ -393,6 +393,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
393
393
for (dd = entry -> nbft -> discovery_list ; dd && * dd ; dd ++ ) {
394
394
nvme_ctrl_t c ;
395
395
bool linked = false;
396
+ bool persistent = false;
396
397
_cleanup_uri_ struct nvme_fabrics_uri * uri = NULL ;
397
398
_cleanup_free_ char * trsvcid = NULL ;
398
399
@@ -437,12 +438,19 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
437
438
.trsvcid = trsvcid ,
438
439
};
439
440
440
- c = nvmf_create_discover_ctrl (r , h , cfg , & trcfg );
441
- if (!c && errno == ENVME_CONNECT_ADDRNOTAVAIL &&
442
- !strcmp (trcfg .transport , "tcp" ) &&
443
- strlen (hfi -> tcp_info .dhcp_server_ipaddr ) > 0 ) {
444
- trcfg .host_traddr = NULL ;
441
+ /* Lookup existing discovery controller */
442
+ c = lookup_ctrl (h , & trcfg );
443
+ if (c && nvme_ctrl_get_name (c ))
444
+ persistent = true;
445
+
446
+ if (!c ) {
445
447
c = nvmf_create_discover_ctrl (r , h , cfg , & trcfg );
448
+ if (!c && errno == ENVME_CONNECT_ADDRNOTAVAIL &&
449
+ !strcmp (trcfg .transport , "tcp" ) &&
450
+ strlen (hfi -> tcp_info .dhcp_server_ipaddr ) > 0 ) {
451
+ trcfg .host_traddr = NULL ;
452
+ c = nvmf_create_discover_ctrl (r , h , cfg , & trcfg );
453
+ }
446
454
}
447
455
448
456
if (!c ) {
@@ -457,7 +465,8 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
457
465
458
466
ret = do_discover (* dd , r , h , c , cfg , & trcfg ,
459
467
flags , verbose );
460
- nvme_disconnect_ctrl (c );
468
+ if (!persistent )
469
+ nvme_disconnect_ctrl (c );
461
470
nvme_free_ctrl (c );
462
471
if (ret == - ENOMEM )
463
472
goto out_free ;
0 commit comments