@@ -780,37 +780,19 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
780780 return NULL ;
781781}
782782
783- static int nvme_discovery_log (int fd , __u32 len , struct nvmf_discovery_log * log , bool rae )
784- {
785- struct nvme_get_log_args args = {
786- .args_size = sizeof (args ),
787- .fd = fd ,
788- .nsid = NVME_NSID_NONE ,
789- .lsp = NVME_LOG_LSP_NONE ,
790- .lsi = NVME_LOG_LSI_NONE ,
791- .uuidx = NVME_UUID_NONE ,
792- .timeout = NVME_DEFAULT_IOCTL_TIMEOUT ,
793- .result = NULL ,
794- .lid = NVME_LOG_LID_DISCOVER ,
795- .log = log ,
796- .len = len ,
797- .csi = NVME_CSI_NVM ,
798- .rae = rae ,
799- .ot = false,
800- };
801-
802- return nvme_get_log_page (fd , 4096 , & args );
803- }
804-
805- int nvmf_get_discovery_log (nvme_ctrl_t c , struct nvmf_discovery_log * * logp ,
806- int max_retries )
783+ static struct nvmf_discovery_log * nvme_discovery_log (nvme_ctrl_t c ,
784+ struct nvme_get_log_args * args ,
785+ int max_retries )
807786{
808787 nvme_root_t r = c -> s && c -> s -> h ? c -> s -> h -> r : NULL ;
809788 struct nvmf_discovery_log * log = NULL ;
810789 int ret , retries = 0 ;
811790 const char * name = nvme_ctrl_get_name (c );
812791 uint64_t genctr , numrec ;
813792 unsigned int size ;
793+ int fd = nvme_ctrl_get_fd (c );
794+
795+ args -> fd = fd ;
814796
815797 do {
816798 size = sizeof (struct nvmf_discovery_log );
@@ -821,12 +803,15 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
821803 nvme_msg (r , LOG_ERR ,
822804 "could not allocate memory for discovery log header\n" );
823805 errno = ENOMEM ;
824- return -1 ;
806+ return NULL ;
825807 }
826808
827809 nvme_msg (r , LOG_DEBUG , "%s: get header (try %d/%d)\n" ,
828810 name , retries , max_retries );
829- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , true);
811+ args -> rae = true;
812+ args -> len = size ;
813+ args -> log = log ;
814+ ret = nvme_get_log_page (fd , 4096 , args );
830815 if (ret ) {
831816 nvme_msg (r , LOG_INFO ,
832817 "%s: discover try %d/%d failed, error %d\n" ,
@@ -849,14 +834,19 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
849834 nvme_msg (r , LOG_ERR ,
850835 "could not alloc memory for discovery log page\n" );
851836 errno = ENOMEM ;
852- return -1 ;
837+ return NULL ;
853838 }
854839
855840 nvme_msg (r , LOG_DEBUG ,
856841 "%s: get header and %" PRIu64
857842 " records (length %d genctr %" PRIu64 ")\n" ,
858843 name , numrec , size , genctr );
859- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , false);
844+
845+ args -> rae = false;
846+ args -> len = size ;
847+ args -> log = log ;
848+ ret = nvme_get_log_page (fd , 4096 , args );
849+
860850 if (ret ) {
861851 nvme_msg (r , LOG_INFO ,
862852 "%s: discover try %d/%d failed, error %d\n" ,
@@ -869,21 +859,63 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
869859 if (genctr != le64_to_cpu (log -> genctr )) {
870860 nvme_msg (r , LOG_INFO , "%s: discover genctr mismatch\n" , name );
871861 errno = EAGAIN ;
872- ret = -1 ;
873862 } else if (numrec != le64_to_cpu (log -> numrec )) {
874863 nvme_msg (r , LOG_INFO ,
875864 "%s: could only fetch %" PRIu64 " of %" PRIu64 " records\n" ,
876865 name , numrec , le64_to_cpu (log -> numrec ));
877866 errno = EBADSLT ;
878- ret = -1 ;
879867 } else {
880- * logp = log ;
881- return 0 ;
868+ return log ;
882869 }
883870
884871out_free_log :
885872 free (log );
886- return ret ;
873+ return NULL ;
874+ }
875+
876+ int nvmf_get_discovery_log (nvme_ctrl_t c , struct nvmf_discovery_log * * logp ,
877+ int max_retries )
878+ {
879+ struct nvme_get_log_args args = {
880+ .args_size = sizeof (args ),
881+ .fd = nvme_ctrl_get_fd (c ),
882+ .nsid = NVME_NSID_NONE ,
883+ .lsp = NVMF_LOG_DISC_LSP_NONE ,
884+ .lsi = NVME_LOG_LSI_NONE ,
885+ .uuidx = NVME_UUID_NONE ,
886+ .timeout = NVME_DEFAULT_IOCTL_TIMEOUT ,
887+ .result = NULL ,
888+ .lid = NVME_LOG_LID_DISCOVER ,
889+ .log = NULL ,
890+ .len = 0 ,
891+ .csi = NVME_CSI_NVM ,
892+ .rae = false,
893+ .ot = false,
894+ };
895+ * logp = nvme_discovery_log (c , & args , max_retries );
896+ return logp ? 0 : -1 ;
897+ }
898+
899+ struct nvmf_discovery_log * nvmf_get_discovery_wargs (struct nvme_get_discovery_args * args )
900+ {
901+ struct nvme_get_log_args _args = {
902+ .args_size = sizeof (_args ),
903+ .fd = nvme_ctrl_get_fd (args -> c ),
904+ .nsid = NVME_NSID_NONE ,
905+ .lsp = args -> lsp ,
906+ .lsi = NVME_LOG_LSI_NONE ,
907+ .uuidx = NVME_UUID_NONE ,
908+ .timeout = args -> timeout ,
909+ .result = args -> result ,
910+ .lid = NVME_LOG_LID_DISCOVER ,
911+ .log = NULL ,
912+ .len = 0 ,
913+ .csi = NVME_CSI_NVM ,
914+ .rae = false,
915+ .ot = false,
916+ };
917+
918+ return nvme_discovery_log (args -> c , & _args , args -> max_retries );
887919}
888920
889921#define PATH_UUID_IBM "/proc/device-tree/ibm,partition-uuid"
0 commit comments