@@ -782,66 +782,57 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
782782 int max_retries )
783783{
784784 nvme_root_t r = c -> s && c -> s -> h ? c -> s -> h -> r : NULL ;
785- struct nvmf_discovery_log * log ;
786- int hdr , ret , retries = 0 ;
785+ struct nvmf_discovery_log * log = NULL ;
786+ int ret , retries = 0 ;
787787 const char * name = nvme_ctrl_get_name (c );
788788 uint64_t genctr , numrec ;
789789 unsigned int size ;
790790
791- hdr = sizeof (struct nvmf_discovery_log );
792- log = malloc (hdr );
793- if (!log ) {
794- nvme_msg (r , LOG_ERR ,
795- "could not allocate memory for discovery log header\n" );
796- errno = ENOMEM ;
797- return -1 ;
798- }
799- memset (log , 0 , hdr );
800-
801- nvme_msg (r , LOG_DEBUG , "%s: discover length %d\n" , name , 0x100 );
802- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), 0x100 , log , true);
803- if (ret ) {
804- nvme_msg (r , LOG_INFO , "%s: discover failed, error %d\n" ,
805- name , errno );
806- goto out_free_log ;
807- }
808-
809791 do {
810- numrec = le64_to_cpu (log -> numrec );
811- genctr = le64_to_cpu (log -> genctr );
812-
813- if (numrec == 0 ) {
814- * logp = log ;
815- return 0 ;
816- }
817-
818- size = sizeof (struct nvmf_discovery_log ) +
819- sizeof (struct nvmf_disc_log_entry ) * (numrec );
792+ size = sizeof (struct nvmf_discovery_log );
820793
821794 free (log );
822- log = malloc ( size );
795+ log = calloc ( 1 , size );
823796 if (!log ) {
824797 nvme_msg (r , LOG_ERR ,
825- "could not alloc memory for discovery log page \n" );
798+ "could not allocate memory for discovery log header \n" );
826799 errno = ENOMEM ;
827800 return -1 ;
828801 }
829- memset (log , 0 , size );
830802
831- nvme_msg (r , LOG_DEBUG , "%s: discover length %d\n" , name , size );
832- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , false);
803+ nvme_msg (r , LOG_DEBUG , "%s: get header (try %d/%d)\n" ,
804+ name , retries , max_retries );
805+ ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , true);
833806 if (ret ) {
834807 nvme_msg (r , LOG_INFO ,
835808 "%s: discover try %d/%d failed, error %d\n" ,
836809 name , retries , max_retries , errno );
837810 goto out_free_log ;
838811 }
839812
813+ numrec = le64_to_cpu (log -> numrec );
840814 genctr = le64_to_cpu (log -> genctr );
815+
816+ if (numrec == 0 )
817+ break ;
818+
819+ size = sizeof (struct nvmf_discovery_log ) +
820+ sizeof (struct nvmf_disc_log_entry ) * numrec ;
821+
822+ free (log );
823+ log = calloc (1 , size );
824+ if (!log ) {
825+ nvme_msg (r , LOG_ERR ,
826+ "could not alloc memory for discovery log page\n" );
827+ errno = ENOMEM ;
828+ return -1 ;
829+ }
830+
841831 nvme_msg (r , LOG_DEBUG ,
842- "%s: discover genctr %" PRIu64 ", retry\n" ,
843- name , genctr );
844- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), hdr , log , true);
832+ "%s: get header and %" PRIu64
833+ " records (length %d genctr %" PRIu64 ")\n" ,
834+ name , numrec , size , genctr );
835+ ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , false);
845836 if (ret ) {
846837 nvme_msg (r , LOG_INFO ,
847838 "%s: discover try %d/%d failed, error %d\n" ,
0 commit comments