@@ -301,127 +301,21 @@ static void save_discovery_log(char *raw, struct nvmf_discovery_log *log)
301301 close (fd );
302302}
303303
304- static int __discover (nvme_ctrl_t c , struct nvme_fabrics_config * defcfg ,
305- char * raw , bool connect , bool persistent ,
306- nvme_print_flags_t flags )
307- {
308- struct nvmf_discovery_log * log = NULL ;
309- nvme_subsystem_t s = nvme_ctrl_get_subsystem (c );
310- nvme_host_t h = nvme_subsystem_get_host (s );
311- uint64_t numrec ;
312- int err ;
313-
314- struct nvme_get_discovery_args args = {
315- .c = c ,
316- .args_size = sizeof (args ),
317- .max_retries = MAX_DISC_RETRIES ,
318- .result = 0 ,
319- .timeout = NVME_DEFAULT_IOCTL_TIMEOUT ,
320- .lsp = 0 ,
321- };
322-
323- err = nvmf_get_discovery_wargs (& args , & log );
324- if (err ) {
325- fprintf (stderr , "failed to get discovery log: %s\n" ,
326- nvme_strerror (err ));
327- return err ;
328- }
329-
330- numrec = le64_to_cpu (log -> numrec );
331- if (raw )
332- save_discovery_log (raw , log );
333- else if (!connect ) {
334- nvme_show_discovery_log (log , numrec , flags );
335- } else if (connect ) {
336- int i ;
337-
338- for (i = 0 ; i < numrec ; i ++ ) {
339- struct nvmf_disc_log_entry * e = & log -> entries [i ];
340- nvme_ctrl_t cl ;
341- bool discover = false;
342- bool disconnect ;
343- nvme_ctrl_t child ;
344- int tmo = defcfg -> keep_alive_tmo ;
345-
346- struct tr_config trcfg = {
347- .subsysnqn = e -> subnqn ,
348- .transport = nvmf_trtype_str (e -> trtype ),
349- .traddr = e -> traddr ,
350- .host_traddr = defcfg -> host_traddr ,
351- .host_iface = defcfg -> host_iface ,
352- .trsvcid = e -> trsvcid ,
353- };
354-
355- /* Already connected ? */
356- cl = lookup_ctrl (h , & trcfg );
357- if (cl && nvme_ctrl_get_name (cl ))
358- continue ;
359-
360- /* Skip connect if the transport types don't match */
361- if (strcmp (nvme_ctrl_get_transport (c ),
362- nvmf_trtype_str (e -> trtype )))
363- continue ;
364-
365- if (e -> subtype == NVME_NQN_DISC ||
366- e -> subtype == NVME_NQN_CURR ) {
367- __u16 eflags = le16_to_cpu (e -> eflags );
368- /*
369- * Does this discovery controller return the
370- * same information?
371- */
372- if (eflags & NVMF_DISC_EFLAGS_DUPRETINFO )
373- continue ;
374-
375- /* Are we supposed to keep the discovery controller around? */
376- disconnect = !persistent ;
377-
378- if (strcmp (e -> subnqn , NVME_DISC_SUBSYS_NAME )) {
379- /*
380- * Does this discovery controller doesn't
381- * support explicit persistent connection?
382- */
383- if (!(eflags & NVMF_DISC_EFLAGS_EPCSD ))
384- disconnect = true;
385- else
386- disconnect = false;
387- }
388-
389- set_discovery_kato (defcfg );
390- } else {
391- /* NVME_NQN_NVME */
392- disconnect = false;
393- }
394-
395- err = nvmf_connect_disc_entry (h , e , defcfg ,
396- & discover , & child );
397-
398- defcfg -> keep_alive_tmo = tmo ;
399-
400- if (!child ) {
401- if (discover )
402- __discover (child , defcfg , raw ,
403- true, persistent , flags );
404-
405- if (disconnect ) {
406- nvme_disconnect_ctrl (child );
407- nvme_free_ctrl (child );
408- }
409- } else if (err == - ENVME_CONNECT_ALREADY && !quiet ) {
410- const char * subnqn = log -> entries [i ].subnqn ;
411- const char * trtype = nvmf_trtype_str (log -> entries [i ].trtype );
412- const char * traddr = log -> entries [i ].traddr ;
413- const char * trsvcid = log -> entries [i ].trsvcid ;
304+ struct cb_discovery_log_data {
305+ nvme_print_flags_t flags ;
306+ char * raw ;
307+ };
414308
415- fprintf (stderr ,
416- "already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n" ,
417- nvme_host_get_hostnqn (h ), subnqn ,
418- trtype , traddr , trsvcid );
419- }
420- }
421- }
309+ static void cb_discovery_log (struct nvmf_discovery_ctx * dctx ,
310+ bool connect , struct nvmf_discovery_log * log ,
311+ uint64_t numrec , void * user_data )
312+ {
313+ struct cb_discovery_log_data * dld = user_data ;
422314
423- free (log );
424- return 0 ;
315+ if (dld -> raw )
316+ save_discovery_log (dld -> raw , log );
317+ else if (!connect )
318+ nvme_show_discovery_log (log , numrec , dld -> flags );
425319}
426320
427321char * nvmf_get_default_trsvcid (const char * transport , bool discovery_ctrl )
@@ -442,13 +336,70 @@ char * nvmf_get_default_trsvcid(const char *transport, bool discovery_ctrl)
442336 return NULL ;
443337}
444338
339+ static void already_connected (struct nvme_host * host ,
340+ struct nvmf_disc_log_entry * entry ,
341+ void * user_data )
342+ {
343+ if (quiet )
344+ return ;
345+
346+ fprintf (stderr , "already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n" ,
347+ nvme_host_get_hostnqn (host ), entry -> subnqn ,
348+ nvmf_trtype_str (entry -> trtype ), entry -> traddr , entry -> trsvcid );
349+ }
350+
351+ static int create_discovery_log_ctx (struct nvme_global_ctx * ctx ,
352+ bool persistent ,
353+ struct nvme_fabrics_config * defcfg ,
354+ void * user_data , struct nvmf_discovery_ctx * * dctxp )
355+ {
356+ struct nvmf_discovery_ctx * dctx ;
357+ int err ;
358+
359+ err = nvmf_discovery_ctx_create (ctx , user_data , & dctx );
360+ if (err )
361+ return err ;
362+
363+ err = nvmf_discovery_ctx_max_retries (dctx , MAX_DISC_RETRIES );
364+ if (err )
365+ goto err ;
366+
367+ err = nvmf_discovery_ctx_keep_alive_timeout (dctx , NVMF_DEF_DISC_TMO );
368+ if (err )
369+ goto err ;
370+
371+ err = nvmf_discovery_ctx_discovery_log_set (dctx , cb_discovery_log );
372+ if (err )
373+ goto err ;
374+
375+ err = nvmf_discovery_ctx_already_connected_set (dctx , already_connected );
376+ if (err )
377+ goto err ;
378+
379+ err = nvmf_discovery_ctx_persistent_set (dctx , persistent );
380+ if (err )
381+ goto err ;
382+
383+ err = nvmf_discovery_ctx_default_fabrics_config_set (dctx , defcfg );
384+ if (err )
385+ goto err ;
386+
387+ * dctxp = dctx ;
388+ return 0 ;
389+
390+ err :
391+ free (dctx );
392+ return err ;
393+ }
394+
445395static int discover_from_conf_file (struct nvme_global_ctx * ctx , nvme_host_t h ,
446396 const char * desc , bool connect ,
447397 const struct nvme_fabrics_config * defcfg )
448398{
449399 char * transport = NULL , * traddr = NULL , * trsvcid = NULL ;
450400 char * hostnqn = NULL , * hostid = NULL , * hostkey = NULL ;
451401 char * subsysnqn = NULL , * keyring = NULL , * tls_key = NULL ;
402+ _cleanup_free_ struct nvmf_discovery_ctx * dctx = NULL ;
452403 char * tls_key_identity = NULL ;
453404 char * ptr , * * argv , * p , line [4096 ];
454405 int argc , ret = 0 ;
@@ -458,7 +409,6 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
458409 char * format = "normal" ;
459410 struct nvme_fabrics_config cfg ;
460411 bool force = false;
461-
462412 NVMF_ARGS (opts , cfg ,
463413 OPT_FMT ("output-format" , 'o' , & format , output_format ),
464414 OPT_FILE ("raw" , 'r' , & raw , "save raw output to file" ),
@@ -519,11 +469,18 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
519469 .trsvcid = trsvcid ,
520470 };
521471
472+ struct cb_discovery_log_data dld = {
473+ .flags = flags ,
474+ .raw = raw ,
475+ };
476+ ret = create_discovery_log_ctx (ctx , true, & cfg , & dld , & dctx );
477+ if (ret )
478+ return ret ;
479+
522480 if (!force ) {
523481 c = lookup_ctrl (h , & trcfg );
524482 if (c ) {
525- __discover (c , & cfg , raw , connect ,
526- true, flags );
483+ nvmf_discovery (ctx , dctx , connect , c );
527484 goto next ;
528485 }
529486 }
@@ -532,7 +489,8 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
532489 if (ret )
533490 goto next ;
534491
535- __discover (c , & cfg , raw , connect , persistent , flags );
492+ nvmf_discovery_ctx_persistent_set (dctx , persistent );
493+ nvmf_discovery (ctx , dctx , connect , c );
536494 if (!(persistent || is_persistent_discovery_ctrl (h , c )))
537495 ret = nvme_disconnect_ctrl (c );
538496 nvme_free_ctrl (c );
@@ -551,6 +509,7 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
551509 const struct nvme_fabrics_config * defcfg ,
552510 nvme_print_flags_t flags , bool force )
553511{
512+ _cleanup_free_ struct nvmf_discovery_ctx * dctx = NULL ;
554513 const char * transport , * traddr , * host_traddr ;
555514 const char * host_iface , * trsvcid , * subsysnqn ;
556515 struct nvme_fabrics_config cfg ;
@@ -611,10 +570,16 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
611570 .trsvcid = trsvcid ,
612571 };
613572
573+ struct cb_discovery_log_data dld = {
574+ .flags = flags ,
575+ .raw = raw ,
576+ };
577+ ret = create_discovery_log_ctx (ctx , true, & cfg , & dld , & dctx );
578+
614579 if (!force ) {
615580 cn = lookup_ctrl (h , & trcfg );
616581 if (cn ) {
617- __discover ( cn , & cfg , raw , connect , true, flags );
582+ nvmf_discovery ( ctx , dctx , connect , cn );
618583 return 0 ;
619584 }
620585 }
@@ -623,7 +588,8 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
623588 if (ret )
624589 return 0 ;
625590
626- __discover (cn , & cfg , raw , connect , persistent , flags );
591+ nvmf_discovery_ctx_persistent_set (dctx , persistent );
592+ nvmf_discovery (ctx , dctx , connect , cn );
627593 if (!(persistent || is_persistent_discovery_ctrl (h , cn )))
628594 ret = nvme_disconnect_ctrl (cn );
629595 nvme_free_ctrl (cn );
@@ -732,6 +698,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
732698 char * context = NULL ;
733699 nvme_print_flags_t flags ;
734700 _cleanup_nvme_global_ctx_ struct nvme_global_ctx * ctx = NULL ;
701+ _cleanup_free_ struct nvmf_discovery_ctx * dctx = NULL ;
735702 nvme_host_t h ;
736703 nvme_ctrl_t c = NULL ;
737704 unsigned int verbose = 0 ;
@@ -917,7 +884,15 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
917884 }
918885 }
919886
920- ret = __discover (c , & cfg , raw , connect , persistent , flags );
887+ struct cb_discovery_log_data dld = {
888+ .flags = flags ,
889+ .raw = raw ,
890+ };
891+ ret = create_discovery_log_ctx (ctx , persistent , & cfg , & dld , & dctx );
892+ if (ret )
893+ return ret ;
894+
895+ ret = nvmf_discovery (ctx , dctx , connect , c );
921896 if (!(persistent || is_persistent_discovery_ctrl (h , c )))
922897 nvme_disconnect_ctrl (c );
923898 nvme_free_ctrl (c );
0 commit comments