@@ -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,71 @@ 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 ,
347+ "already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n" ,
348+ nvme_host_get_hostnqn (host ), entry -> subnqn ,
349+ nvmf_trtype_str (entry -> trtype ), entry -> traddr , entry -> trsvcid );
350+ }
351+
352+ static int create_discovery_log_ctx (struct nvme_global_ctx * ctx ,
353+ bool persistent ,
354+ struct nvme_fabrics_config * defcfg ,
355+ void * user_data , struct nvmf_discovery_ctx * * dctxp )
356+ {
357+ struct nvmf_discovery_ctx * dctx ;
358+ int err ;
359+
360+ err = nvmf_discovery_ctx_create (ctx , user_data , & dctx );
361+ if (err )
362+ return err ;
363+
364+ err = nvmf_discovery_ctx_max_retries (dctx , MAX_DISC_RETRIES );
365+ if (err )
366+ goto err ;
367+
368+ err = nvmf_discovery_ctx_keep_alive_timeout (dctx , NVMF_DEF_DISC_TMO );
369+ if (err )
370+ goto err ;
371+
372+ err = nvmf_discovery_ctx_discovery_log_set (dctx , cb_discovery_log );
373+ if (err )
374+ goto err ;
375+
376+ err = nvmf_discovery_ctx_already_connected_set (dctx , already_connected );
377+ if (err )
378+ goto err ;
379+
380+ err = nvmf_discovery_ctx_persistent_set (dctx , persistent );
381+ if (err )
382+ goto err ;
383+
384+ err = nvmf_discovery_ctx_default_fabrics_config_set (dctx , defcfg );
385+ if (err )
386+ goto err ;
387+
388+ * dctxp = dctx ;
389+ return 0 ;
390+
391+ err :
392+ free (dctx );
393+ return err ;
394+ }
395+
445396static int discover_from_conf_file (struct nvme_global_ctx * ctx , nvme_host_t h ,
446397 const char * desc , bool connect ,
447398 const struct nvme_fabrics_config * defcfg )
448399{
449400 char * transport = NULL , * traddr = NULL , * trsvcid = NULL ;
450401 char * hostnqn = NULL , * hostid = NULL , * hostkey = NULL ;
451402 char * subsysnqn = NULL , * keyring = NULL , * tls_key = NULL ;
403+ _cleanup_free_ struct nvmf_discovery_ctx * dctx = NULL ;
452404 char * tls_key_identity = NULL ;
453405 char * ptr , * * argv , * p , line [4096 ];
454406 int argc , ret = 0 ;
@@ -458,7 +410,6 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
458410 char * format = "normal" ;
459411 struct nvme_fabrics_config cfg ;
460412 bool force = false;
461-
462413 NVMF_ARGS (opts , cfg ,
463414 OPT_FMT ("output-format" , 'o' , & format , output_format ),
464415 OPT_FILE ("raw" , 'r' , & raw , "save raw output to file" ),
@@ -519,11 +470,18 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
519470 .trsvcid = trsvcid ,
520471 };
521472
473+ struct cb_discovery_log_data dld = {
474+ .flags = flags ,
475+ .raw = raw ,
476+ };
477+ ret = create_discovery_log_ctx (ctx , true, & cfg , & dld , & dctx );
478+ if (ret )
479+ return ret ;
480+
522481 if (!force ) {
523482 c = lookup_ctrl (h , & trcfg );
524483 if (c ) {
525- __discover (c , & cfg , raw , connect ,
526- true, flags );
484+ nvmf_discovery (ctx , dctx , connect , c );
527485 goto next ;
528486 }
529487 }
@@ -532,7 +490,8 @@ static int discover_from_conf_file(struct nvme_global_ctx *ctx, nvme_host_t h,
532490 if (ret )
533491 goto next ;
534492
535- __discover (c , & cfg , raw , connect , persistent , flags );
493+ nvmf_discovery_ctx_persistent_set (dctx , persistent );
494+ nvmf_discovery (ctx , dctx , connect , c );
536495 if (!(persistent || is_persistent_discovery_ctrl (h , c )))
537496 ret = nvme_disconnect_ctrl (c );
538497 nvme_free_ctrl (c );
@@ -551,6 +510,7 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
551510 const struct nvme_fabrics_config * defcfg ,
552511 nvme_print_flags_t flags , bool force )
553512{
513+ _cleanup_free_ struct nvmf_discovery_ctx * dctx = NULL ;
554514 const char * transport , * traddr , * host_traddr ;
555515 const char * host_iface , * trsvcid , * subsysnqn ;
556516 struct nvme_fabrics_config cfg ;
@@ -611,10 +571,16 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
611571 .trsvcid = trsvcid ,
612572 };
613573
574+ struct cb_discovery_log_data dld = {
575+ .flags = flags ,
576+ .raw = raw ,
577+ };
578+ ret = create_discovery_log_ctx (ctx , true, & cfg , & dld , & dctx );
579+
614580 if (!force ) {
615581 cn = lookup_ctrl (h , & trcfg );
616582 if (cn ) {
617- __discover ( cn , & cfg , raw , connect , true, flags );
583+ nvmf_discovery ( ctx , dctx , connect , cn );
618584 return 0 ;
619585 }
620586 }
@@ -623,7 +589,8 @@ static int _discover_from_json_config_file(struct nvme_global_ctx *ctx,
623589 if (ret )
624590 return 0 ;
625591
626- __discover (cn , & cfg , raw , connect , persistent , flags );
592+ nvmf_discovery_ctx_persistent_set (dctx , persistent );
593+ nvmf_discovery (ctx , dctx , connect , cn );
627594 if (!(persistent || is_persistent_discovery_ctrl (h , cn )))
628595 ret = nvme_disconnect_ctrl (cn );
629596 nvme_free_ctrl (cn );
@@ -732,6 +699,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
732699 char * context = NULL ;
733700 nvme_print_flags_t flags ;
734701 _cleanup_nvme_global_ctx_ struct nvme_global_ctx * ctx = NULL ;
702+ _cleanup_free_ struct nvmf_discovery_ctx * dctx = NULL ;
735703 nvme_host_t h ;
736704 nvme_ctrl_t c = NULL ;
737705 unsigned int verbose = 0 ;
@@ -917,7 +885,15 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
917885 }
918886 }
919887
920- ret = __discover (c , & cfg , raw , connect , persistent , flags );
888+ struct cb_discovery_log_data dld = {
889+ .flags = flags ,
890+ .raw = raw ,
891+ };
892+ ret = create_discovery_log_ctx (ctx , persistent , & cfg , & dld , & dctx );
893+ if (ret )
894+ return ret ;
895+
896+ ret = nvmf_discovery (ctx , dctx , connect , c );
921897 if (!(persistent || is_persistent_discovery_ctrl (h , c )))
922898 nvme_disconnect_ctrl (c );
923899 nvme_free_ctrl (c );
0 commit comments