@@ -273,7 +273,7 @@ static int inet4_pton(const char *src, uint16_t port,
273273 return 0 ;
274274}
275275
276- static int inet6_pton (const char * src , uint16_t port ,
276+ static int inet6_pton (nvme_root_t r , const char * src , uint16_t port ,
277277 struct sockaddr_storage * addr )
278278{
279279 int ret = - EINVAL ;
@@ -284,7 +284,7 @@ static int inet6_pton(const char *src, uint16_t port,
284284
285285 char * tmp = strdup (src );
286286 if (!tmp )
287- nvme_msg (LOG_ERR , "cannot copy: %s\n" , src );
287+ nvme_msg (r , LOG_ERR , "cannot copy: %s\n" , src );
288288
289289 const char * scope = NULL ;
290290 char * p = strchr (tmp , SCOPE_DELIMITER );
@@ -299,7 +299,7 @@ static int inet6_pton(const char *src, uint16_t port,
299299 if (IN6_IS_ADDR_LINKLOCAL (& addr6 -> sin6_addr ) && scope ) {
300300 addr6 -> sin6_scope_id = if_nametoindex (scope );
301301 if (addr6 -> sin6_scope_id == 0 ) {
302- nvme_msg (LOG_ERR ,
302+ nvme_msg (r , LOG_ERR ,
303303 "can't find iface index for: %s (%m)\n" , scope );
304304 goto free_tmp ;
305305 }
@@ -322,7 +322,8 @@ static int inet6_pton(const char *src, uint16_t port,
322322 *
323323 * Return 0 on success, errno otherwise.
324324 */
325- static int inet_pton_with_scope (int af , const char * src , const char * trsvcid ,
325+ static int inet_pton_with_scope (nvme_root_t r , int af ,
326+ const char * src , const char * trsvcid ,
326327 struct sockaddr_storage * addr )
327328{
328329 int ret = - EINVAL ;
@@ -332,7 +333,8 @@ static int inet_pton_with_scope(int af, const char *src, const char * trsvcid,
332333 unsigned long long tmp = strtoull (trsvcid , NULL , 0 );
333334 port = (uint16_t )tmp ;
334335 if (tmp != port ) {
335- nvme_msg (LOG_ERR , "trsvcid out of range: %s\n" , trsvcid );
336+ nvme_msg (r , LOG_ERR , "trsvcid out of range: %s\n" ,
337+ trsvcid );
336338 return - ERANGE ;
337339 }
338340 } else {
@@ -344,29 +346,29 @@ static int inet_pton_with_scope(int af, const char *src, const char * trsvcid,
344346 ret = inet4_pton (src , port , addr );
345347 break ;
346348 case AF_INET6 :
347- ret = inet6_pton (src , port , addr );
349+ ret = inet6_pton (r , src , port , addr );
348350 break ;
349351 case AF_UNSPEC :
350352 ret = inet4_pton (src , port , addr );
351353 if (ret )
352- ret = inet6_pton (src , port , addr );
354+ ret = inet6_pton (r , src , port , addr );
353355 break ;
354356 default :
355- nvme_msg (LOG_ERR , "unexpected address family %d\n" , af );
357+ nvme_msg (r , LOG_ERR , "unexpected address family %d\n" , af );
356358 }
357359
358360 return ret ;
359361}
360362
361- static bool traddr_is_hostname (nvme_ctrl_t c )
363+ static bool traddr_is_hostname (nvme_root_t r , nvme_ctrl_t c )
362364{
363365 struct sockaddr_storage addr ;
364366
365367 if (!c -> traddr )
366368 return false;
367369 if (strcmp (c -> transport , "tcp" ) && strcmp (c -> transport , "rdma" ))
368370 return false;
369- if (inet_pton_with_scope (AF_UNSPEC , c -> traddr , c -> trsvcid , & addr ) == 0 )
371+ if (inet_pton_with_scope (r , AF_UNSPEC , c -> traddr , c -> trsvcid , & addr ) == 0 )
370372 return false;
371373 return true;
372374}
@@ -379,13 +381,13 @@ static int build_options(nvme_host_t h, nvme_ctrl_t c, char **argstr)
379381 bool discover = false, discovery_nqn = false;
380382
381383 if (!transport ) {
382- nvme_msg (LOG_ERR , "need a transport (-t) argument\n" );
384+ nvme_msg (h -> r , LOG_ERR , "need a transport (-t) argument\n" );
383385 return - ENVME_CONNECT_TARG ;
384386 }
385387
386388 if (strncmp (transport , "loop" , 4 )) {
387389 if (!nvme_ctrl_get_traddr (c )) {
388- nvme_msg (LOG_ERR , "need a address (-a) argument\n" );
390+ nvme_msg (h -> r , LOG_ERR , "need a address (-a) argument\n" );
389391 return - ENVME_CONNECT_AARG ;
390392 }
391393 }
@@ -463,36 +465,36 @@ static int build_options(nvme_host_t h, nvme_ctrl_t c, char **argstr)
463465 return 0 ;
464466}
465467
466- static int __nvmf_add_ctrl (const char * argstr )
468+ static int __nvmf_add_ctrl (nvme_root_t r , const char * argstr )
467469{
468470 int ret , fd , len = strlen (argstr );
469471 char buf [0x1000 ], * options , * p ;
470472
471473 fd = open (nvmf_dev , O_RDWR );
472474 if (fd < 0 ) {
473- nvme_msg (LOG_ERR , "Failed to open %s: %s\n" ,
475+ nvme_msg (r , LOG_ERR , "Failed to open %s: %s\n" ,
474476 nvmf_dev , strerror (errno ));
475477 return - ENVME_CONNECT_OPEN ;
476478 }
477479
478- nvme_msg (LOG_DEBUG , "connect ctrl, '%.*s'\n" ,
480+ nvme_msg (r , LOG_DEBUG , "connect ctrl, '%.*s'\n" ,
479481 (int )strcspn (argstr ,"\n" ), argstr );
480482 ret = write (fd , argstr , len );
481483 if (ret != len ) {
482- nvme_msg (LOG_NOTICE , "Failed to write to %s: %s\n" ,
484+ nvme_msg (r , LOG_NOTICE , "Failed to write to %s: %s\n" ,
483485 nvmf_dev , strerror (errno ));
484486 ret = - ENVME_CONNECT_WRITE ;
485487 goto out_close ;
486488 }
487489
488490 len = read (fd , buf , sizeof (buf ));
489491 if (len < 0 ) {
490- nvme_msg (LOG_ERR , "Failed to read from %s: %s\n" ,
492+ nvme_msg (r , LOG_ERR , "Failed to read from %s: %s\n" ,
491493 nvmf_dev , strerror (errno ));
492494 ret = - ENVME_CONNECT_READ ;
493495 goto out_close ;
494496 }
495- nvme_msg (LOG_DEBUG , "connect ctrl, response '%.*s'\n" ,
497+ nvme_msg (r , LOG_DEBUG , "connect ctrl, response '%.*s'\n" ,
496498 (int )strcspn (buf , "\n" ), buf );
497499 buf [len ] = '\0' ;
498500 options = buf ;
@@ -503,7 +505,7 @@ static int __nvmf_add_ctrl(const char *argstr)
503505 goto out_close ;
504506 }
505507
506- nvme_msg (LOG_ERR , "Failed to parse ctrl info for \"%s\"\n" , argstr );
508+ nvme_msg (r , LOG_ERR , "Failed to parse ctrl info for \"%s\"\n" , argstr );
507509 ret = - ENVME_CONNECT_PARSE ;
508510out_close :
509511 close (fd );
@@ -518,10 +520,10 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
518520
519521 cfg = merge_config (c , cfg );
520522 nvme_ctrl_set_discovered (c , true);
521- if (traddr_is_hostname (c )) {
523+ if (traddr_is_hostname (h -> r , c )) {
522524 const char * traddr = c -> traddr ;
523525
524- c -> traddr = hostname2traddr (traddr );
526+ c -> traddr = hostname2traddr (h -> r , traddr );
525527 if (!c -> traddr ) {
526528 c -> traddr = (char * )traddr ;
527529 errno = ENVME_CONNECT_TRADDR ;
@@ -534,14 +536,14 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
534536 if (ret )
535537 return ret ;
536538
537- ret = __nvmf_add_ctrl (argstr );
539+ ret = __nvmf_add_ctrl (h -> r , argstr );
538540 free (argstr );
539541 if (ret < 0 ) {
540542 errno = - ret ;
541543 return -1 ;
542544 }
543545
544- nvme_msg (LOG_INFO , "nvme%d: ctrl connected\n" , ret );
546+ nvme_msg (h -> r , LOG_INFO , "nvme%d: ctrl connected\n" , ret );
545547 return nvme_init_ctrl (h , c , ret );
546548}
547549
@@ -567,7 +569,8 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
567569 trsvcid = e -> trsvcid ;
568570 break ;
569571 default :
570- nvme_msg (LOG_ERR , "skipping unsupported adrfam %d\n" ,
572+ nvme_msg (h -> r , LOG_ERR ,
573+ "skipping unsupported adrfam %d\n" ,
571574 e -> adrfam );
572575 errno = EINVAL ;
573576 return NULL ;
@@ -581,29 +584,30 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
581584 trsvcid = NULL ;
582585 break ;
583586 default :
584- nvme_msg (LOG_ERR , "skipping unsupported adrfam %d\n" ,
587+ nvme_msg (h -> r , LOG_ERR ,
588+ "skipping unsupported adrfam %d\n" ,
585589 e -> adrfam );
586590 errno = EINVAL ;
587591 return NULL ;
588592 }
589593 case NVMF_TRTYPE_LOOP :
590594 break ;
591595 default :
592- nvme_msg (LOG_ERR , "skipping unsupported transport %d\n" ,
596+ nvme_msg (h -> r , LOG_ERR , "skipping unsupported transport %d\n" ,
593597 e -> trtype );
594598 errno = EINVAL ;
595599 return NULL ;
596600 }
597601
598602 transport = nvmf_trtype_str (e -> trtype );
599603
600- nvme_msg (LOG_DEBUG , "lookup ctrl "
604+ nvme_msg (h -> r , LOG_DEBUG , "lookup ctrl "
601605 "(transport: %s, traddr: %s, trsvcid %s)\n" ,
602606 transport , traddr , trsvcid );
603- c = nvme_create_ctrl (e -> subnqn , transport , traddr ,
607+ c = nvme_create_ctrl (h -> r , e -> subnqn , transport , traddr ,
604608 cfg -> host_traddr , cfg -> host_iface , trsvcid );
605609 if (!c ) {
606- nvme_msg (LOG_DEBUG , "skipping discovery entry, "
610+ nvme_msg (h -> r , LOG_DEBUG , "skipping discovery entry, "
607611 "failed to allocate %s controller with traddr %s\n" ,
608612 transport , traddr );
609613 errno = ENOMEM ;
@@ -620,7 +624,7 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
620624 nvme_ctrl_set_discovery_ctrl (c , true);
621625 break ;
622626 default :
623- nvme_msg (LOG_ERR , "unsupported subtype %d\n" ,
627+ nvme_msg (h -> r , LOG_ERR , "unsupported subtype %d\n" ,
624628 e -> subtype );
625629 /* fallthrough */
626630 case NVME_NQN_NVME :
@@ -648,14 +652,15 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
648652 if (errno == EINVAL && c -> cfg .disable_sqflow ) {
649653 errno = 0 ;
650654 /* disable_sqflow is unrecognized option on older kernels */
651- nvme_msg (LOG_INFO , "failed to connect controller, "
655+ nvme_msg (h -> r , LOG_INFO , "failed to connect controller, "
652656 "retry with disabling SQ flow control\n" );
653657 c -> cfg .disable_sqflow = false;
654658 ret = nvmf_add_ctrl (h , c , cfg );
655659 if (!ret )
656660 return c ;
657661 }
658- nvme_msg (LOG_ERR , "failed to connect controller, error %d\n" , errno );
662+ nvme_msg (h -> r , LOG_ERR , "failed to connect controller, error %d\n" ,
663+ errno );
659664 nvme_free_ctrl (c );
660665 return NULL ;
661666}
@@ -669,6 +674,7 @@ static int nvme_discovery_log(int fd, __u32 len, struct nvmf_discovery_log *log,
669674int nvmf_get_discovery_log (nvme_ctrl_t c , struct nvmf_discovery_log * * logp ,
670675 int max_retries )
671676{
677+ nvme_root_t r = c -> s && c -> s -> h ? c -> s -> h -> r : NULL ;
672678 struct nvmf_discovery_log * log ;
673679 int hdr , ret , retries = 0 ;
674680 const char * name = nvme_ctrl_get_name (c );
@@ -678,17 +684,17 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
678684 hdr = sizeof (struct nvmf_discovery_log );
679685 log = malloc (hdr );
680686 if (!log ) {
681- nvme_msg (LOG_ERR ,
687+ nvme_msg (r , LOG_ERR ,
682688 "could not allocate memory for discovery log header\n" );
683689 errno = ENOMEM ;
684690 return -1 ;
685691 }
686692 memset (log , 0 , hdr );
687693
688- nvme_msg (LOG_DEBUG , "%s: discover length %d\n" , name , 0x100 );
694+ nvme_msg (r , LOG_DEBUG , "%s: discover length %d\n" , name , 0x100 );
689695 ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), 0x100 , log , true);
690696 if (ret ) {
691- nvme_msg (LOG_INFO , "%s: discover failed, error %d\n" ,
697+ nvme_msg (r , LOG_INFO , "%s: discover failed, error %d\n" ,
692698 name , errno );
693699 goto out_free_log ;
694700 }
@@ -708,28 +714,29 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
708714 free (log );
709715 log = malloc (size );
710716 if (!log ) {
711- nvme_msg (LOG_ERR ,
717+ nvme_msg (r , LOG_ERR ,
712718 "could not alloc memory for discovery log page\n" );
713719 errno = ENOMEM ;
714720 return -1 ;
715721 }
716722 memset (log , 0 , size );
717723
718- nvme_msg (LOG_DEBUG , "%s: discover length %d\n" , name , size );
724+ nvme_msg (r , LOG_DEBUG , "%s: discover length %d\n" , name , size );
719725 ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , false);
720726 if (ret ) {
721- nvme_msg (LOG_INFO ,
727+ nvme_msg (r , LOG_INFO ,
722728 "%s: discover try %d/%d failed, error %d\n" ,
723729 name , retries , max_retries , errno );
724730 goto out_free_log ;
725731 }
726732
727733 genctr = le64_to_cpu (log -> genctr );
728- nvme_msg (LOG_DEBUG , "%s: discover genctr %" PRIu64 ", retry\n" ,
734+ nvme_msg (r , LOG_DEBUG ,
735+ "%s: discover genctr %" PRIu64 ", retry\n" ,
729736 name , genctr );
730737 ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), hdr , log , true);
731738 if (ret ) {
732- nvme_msg (LOG_INFO ,
739+ nvme_msg (r , LOG_INFO ,
733740 "%s: discover try %d/%d failed, error %d\n" ,
734741 name , retries , max_retries , errno );
735742 goto out_free_log ;
@@ -738,11 +745,12 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
738745 ++ retries < max_retries );
739746
740747 if (genctr != le64_to_cpu (log -> genctr )) {
741- nvme_msg (LOG_INFO , "%s: discover genctr mismatch\n" , name );
748+ nvme_msg (r , LOG_INFO , "%s: discover genctr mismatch\n" , name );
742749 errno = EAGAIN ;
743750 ret = -1 ;
744751 } else if (numrec != le64_to_cpu (log -> numrec )) {
745- nvme_msg (LOG_INFO , "%s: could only fetch %" PRIu64 " of %" PRIu64 " records\n" ,
752+ nvme_msg (r , LOG_INFO ,
753+ "%s: could only fetch %" PRIu64 " of %" PRIu64 " records\n" ,
746754 name , numrec , le64_to_cpu (log -> numrec ));
747755 errno = EBADSLT ;
748756 ret = -1 ;
0 commit comments