@@ -773,66 +773,57 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
773773 int max_retries )
774774{
775775 nvme_root_t r = c -> s && c -> s -> h ? c -> s -> h -> r : NULL ;
776- struct nvmf_discovery_log * log ;
777- int hdr , ret , retries = 0 ;
776+ struct nvmf_discovery_log * log = NULL ;
777+ int ret , retries = 0 ;
778778 const char * name = nvme_ctrl_get_name (c );
779779 uint64_t genctr , numrec ;
780780 unsigned int size ;
781781
782- hdr = sizeof (struct nvmf_discovery_log );
783- log = malloc (hdr );
784- if (!log ) {
785- nvme_msg (r , LOG_ERR ,
786- "could not allocate memory for discovery log header\n" );
787- errno = ENOMEM ;
788- return -1 ;
789- }
790- memset (log , 0 , hdr );
791-
792- nvme_msg (r , LOG_DEBUG , "%s: discover length %d\n" , name , 0x100 );
793- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), 0x100 , log , true);
794- if (ret ) {
795- nvme_msg (r , LOG_INFO , "%s: discover failed, error %d\n" ,
796- name , errno );
797- goto out_free_log ;
798- }
799-
800782 do {
801- numrec = le64_to_cpu (log -> numrec );
802- genctr = le64_to_cpu (log -> genctr );
803-
804- if (numrec == 0 ) {
805- * logp = log ;
806- return 0 ;
807- }
808-
809- size = sizeof (struct nvmf_discovery_log ) +
810- sizeof (struct nvmf_disc_log_entry ) * (numrec );
783+ size = sizeof (struct nvmf_discovery_log );
811784
812785 free (log );
813- log = malloc ( size );
786+ log = calloc ( 1 , size );
814787 if (!log ) {
815788 nvme_msg (r , LOG_ERR ,
816- "could not alloc memory for discovery log page \n" );
789+ "could not allocate memory for discovery log header \n" );
817790 errno = ENOMEM ;
818791 return -1 ;
819792 }
820- memset (log , 0 , size );
821793
822- nvme_msg (r , LOG_DEBUG , "%s: discover length %d\n" , name , size );
823- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , false);
794+ nvme_msg (r , LOG_DEBUG , "%s: get header (try %d/%d)\n" ,
795+ name , retries , max_retries );
796+ ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , true);
824797 if (ret ) {
825798 nvme_msg (r , LOG_INFO ,
826799 "%s: discover try %d/%d failed, error %d\n" ,
827800 name , retries , max_retries , errno );
828801 goto out_free_log ;
829802 }
830803
804+ numrec = le64_to_cpu (log -> numrec );
831805 genctr = le64_to_cpu (log -> genctr );
806+
807+ if (numrec == 0 )
808+ break ;
809+
810+ size = sizeof (struct nvmf_discovery_log ) +
811+ sizeof (struct nvmf_disc_log_entry ) * numrec ;
812+
813+ free (log );
814+ log = calloc (1 , size );
815+ if (!log ) {
816+ nvme_msg (r , LOG_ERR ,
817+ "could not alloc memory for discovery log page\n" );
818+ errno = ENOMEM ;
819+ return -1 ;
820+ }
821+
832822 nvme_msg (r , LOG_DEBUG ,
833- "%s: discover genctr %" PRIu64 ", retry\n" ,
834- name , genctr );
835- ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), hdr , log , true);
823+ "%s: get header and %" PRIu64
824+ " records (length %d genctr %" PRIu64 ")\n" ,
825+ name , numrec , size , genctr );
826+ ret = nvme_discovery_log (nvme_ctrl_get_fd (c ), size , log , false);
836827 if (ret ) {
837828 nvme_msg (r , LOG_INFO ,
838829 "%s: discover try %d/%d failed, error %d\n" ,
0 commit comments