Skip to content

Commit ed79826

Browse files
committed
fabrics: restructrure nvmf_get_discovery_log
Move the initial header read into the do while loop. This simplifies the loop flow into first read header if there are records fetch them too. With this we keep the genctr and numrec in sync for both get log invocation. Signed-off-by: Daniel Wagner <[email protected]>
1 parent db4aa1f commit ed79826

1 file changed

Lines changed: 29 additions & 38 deletions

File tree

src/nvme/fabrics.c

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)