Skip to content

Commit 19fe4dd

Browse files
authored
Merge pull request #378 from igaw/fix-nvmf_get_discovery_log
fabrics: restructrure nvmf_get_discovery_log
2 parents 4e38073 + ed79826 commit 19fe4dd

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
@@ -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

Comments
 (0)