Skip to content

Commit 24ac082

Browse files
committed
Add 'nvme_root_t' argument to nvme_msg()
Add a 'nvme_root_t' argument to nvme_msg() to allow for error messages to be redirected to a different filedescriptor than 'stderr'. Signed-off-by: Hannes Reinecke <[email protected]>
1 parent 519e0f5 commit 24ac082

13 files changed

Lines changed: 188 additions & 157 deletions

File tree

examples/discover-loop.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ int main()
6363
fprintf(stderr, "Failed to allocated memory\n");
6464
return ENOMEM;
6565
}
66-
c = nvme_create_ctrl(NVME_DISC_SUBSYS_NAME, "loop",
66+
c = nvme_create_ctrl(r, NVME_DISC_SUBSYS_NAME, "loop",
6767
NULL, NULL, NULL, NULL);
6868
if (!c) {
6969
fprintf(stderr, "Failed to allocate memory\n");

libnvme/nvme.i

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,10 +508,10 @@ struct nvme_ns {
508508
}
509509

510510
%extend nvme_ctrl {
511-
nvme_ctrl(const char *subsysnqn, const char *transport,
511+
nvme_ctrl(nvme_root_t r, const char *subsysnqn, const char *transport,
512512
const char *traddr = NULL, const char *host_traddr = NULL,
513513
const char *host_iface = NULL, const char *trsvcid = NULL) {
514-
return nvme_create_ctrl(subsysnqn, transport, traddr,
514+
return nvme_create_ctrl(r, subsysnqn, transport, traddr,
515515
host_traddr, host_iface, trsvcid);
516516
}
517517
~nvme_ctrl() {

src/nvme/fabrics.c

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ static int inet4_pton(const char *src, uint16_t port,
273273
return 0;
274274
}
275275

276-
static int inet6_pton(const char *src, uint16_t port,
276+
static int inet6_pton(nvme_root_t r, const char *src, uint16_t port,
277277
struct sockaddr_storage *addr)
278278
{
279279
int ret = -EINVAL;
@@ -284,7 +284,7 @@ static int inet6_pton(const char *src, uint16_t port,
284284

285285
char *tmp = strdup(src);
286286
if (!tmp)
287-
nvme_msg(LOG_ERR, "cannot copy: %s\n", src);
287+
nvme_msg(r, LOG_ERR, "cannot copy: %s\n", src);
288288

289289
const char *scope = NULL;
290290
char *p = strchr(tmp, SCOPE_DELIMITER);
@@ -299,7 +299,7 @@ static int inet6_pton(const char *src, uint16_t port,
299299
if (IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr) && scope) {
300300
addr6->sin6_scope_id = if_nametoindex(scope);
301301
if (addr6->sin6_scope_id == 0) {
302-
nvme_msg(LOG_ERR,
302+
nvme_msg(r, LOG_ERR,
303303
"can't find iface index for: %s (%m)\n", scope);
304304
goto free_tmp;
305305
}
@@ -322,7 +322,8 @@ static int inet6_pton(const char *src, uint16_t port,
322322
*
323323
* Return 0 on success, errno otherwise.
324324
*/
325-
static int inet_pton_with_scope(int af, const char *src, const char * trsvcid,
325+
static int inet_pton_with_scope(nvme_root_t r, int af,
326+
const char *src, const char * trsvcid,
326327
struct sockaddr_storage *addr)
327328
{
328329
int ret = -EINVAL;
@@ -332,7 +333,8 @@ static int inet_pton_with_scope(int af, const char *src, const char * trsvcid,
332333
unsigned long long tmp = strtoull(trsvcid, NULL, 0);
333334
port = (uint16_t)tmp;
334335
if (tmp != port) {
335-
nvme_msg(LOG_ERR, "trsvcid out of range: %s\n", trsvcid);
336+
nvme_msg(r, LOG_ERR, "trsvcid out of range: %s\n",
337+
trsvcid);
336338
return -ERANGE;
337339
}
338340
} else {
@@ -344,29 +346,29 @@ static int inet_pton_with_scope(int af, const char *src, const char * trsvcid,
344346
ret = inet4_pton(src, port, addr);
345347
break;
346348
case AF_INET6:
347-
ret = inet6_pton(src, port, addr);
349+
ret = inet6_pton(r, src, port, addr);
348350
break;
349351
case AF_UNSPEC:
350352
ret = inet4_pton(src, port, addr);
351353
if (ret)
352-
ret = inet6_pton(src, port, addr);
354+
ret = inet6_pton(r, src, port, addr);
353355
break;
354356
default:
355-
nvme_msg(LOG_ERR, "unexpected address family %d\n", af);
357+
nvme_msg(r, LOG_ERR, "unexpected address family %d\n", af);
356358
}
357359

358360
return ret;
359361
}
360362

361-
static bool traddr_is_hostname(nvme_ctrl_t c)
363+
static bool traddr_is_hostname(nvme_root_t r, nvme_ctrl_t c)
362364
{
363365
struct sockaddr_storage addr;
364366

365367
if (!c->traddr)
366368
return false;
367369
if (strcmp(c->transport, "tcp") && strcmp(c->transport, "rdma"))
368370
return false;
369-
if (inet_pton_with_scope(AF_UNSPEC, c->traddr, c->trsvcid, &addr) == 0)
371+
if (inet_pton_with_scope(r, AF_UNSPEC, c->traddr, c->trsvcid, &addr) == 0)
370372
return false;
371373
return true;
372374
}
@@ -379,13 +381,13 @@ static int build_options(nvme_host_t h, nvme_ctrl_t c, char **argstr)
379381
bool discover = false, discovery_nqn = false;
380382

381383
if (!transport) {
382-
nvme_msg(LOG_ERR, "need a transport (-t) argument\n");
384+
nvme_msg(h->r, LOG_ERR, "need a transport (-t) argument\n");
383385
return -ENVME_CONNECT_TARG;
384386
}
385387

386388
if (strncmp(transport, "loop", 4)) {
387389
if (!nvme_ctrl_get_traddr(c)) {
388-
nvme_msg(LOG_ERR, "need a address (-a) argument\n");
390+
nvme_msg(h->r, LOG_ERR, "need a address (-a) argument\n");
389391
return -ENVME_CONNECT_AARG;
390392
}
391393
}
@@ -463,36 +465,36 @@ static int build_options(nvme_host_t h, nvme_ctrl_t c, char **argstr)
463465
return 0;
464466
}
465467

466-
static int __nvmf_add_ctrl(const char *argstr)
468+
static int __nvmf_add_ctrl(nvme_root_t r, const char *argstr)
467469
{
468470
int ret, fd, len = strlen(argstr);
469471
char buf[0x1000], *options, *p;
470472

471473
fd = open(nvmf_dev, O_RDWR);
472474
if (fd < 0) {
473-
nvme_msg(LOG_ERR, "Failed to open %s: %s\n",
475+
nvme_msg(r, LOG_ERR, "Failed to open %s: %s\n",
474476
nvmf_dev, strerror(errno));
475477
return -ENVME_CONNECT_OPEN;
476478
}
477479

478-
nvme_msg(LOG_DEBUG, "connect ctrl, '%.*s'\n",
480+
nvme_msg(r, LOG_DEBUG, "connect ctrl, '%.*s'\n",
479481
(int)strcspn(argstr,"\n"), argstr);
480482
ret = write(fd, argstr, len);
481483
if (ret != len) {
482-
nvme_msg(LOG_NOTICE, "Failed to write to %s: %s\n",
484+
nvme_msg(r, LOG_NOTICE, "Failed to write to %s: %s\n",
483485
nvmf_dev, strerror(errno));
484486
ret = -ENVME_CONNECT_WRITE;
485487
goto out_close;
486488
}
487489

488490
len = read(fd, buf, sizeof(buf));
489491
if (len < 0) {
490-
nvme_msg(LOG_ERR, "Failed to read from %s: %s\n",
492+
nvme_msg(r, LOG_ERR, "Failed to read from %s: %s\n",
491493
nvmf_dev, strerror(errno));
492494
ret = -ENVME_CONNECT_READ;
493495
goto out_close;
494496
}
495-
nvme_msg(LOG_DEBUG, "connect ctrl, response '%.*s'\n",
497+
nvme_msg(r, LOG_DEBUG, "connect ctrl, response '%.*s'\n",
496498
(int)strcspn(buf, "\n"), buf);
497499
buf[len] = '\0';
498500
options = buf;
@@ -503,7 +505,7 @@ static int __nvmf_add_ctrl(const char *argstr)
503505
goto out_close;
504506
}
505507

506-
nvme_msg(LOG_ERR, "Failed to parse ctrl info for \"%s\"\n", argstr);
508+
nvme_msg(r, LOG_ERR, "Failed to parse ctrl info for \"%s\"\n", argstr);
507509
ret = -ENVME_CONNECT_PARSE;
508510
out_close:
509511
close(fd);
@@ -518,10 +520,10 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
518520

519521
cfg = merge_config(c, cfg);
520522
nvme_ctrl_set_discovered(c, true);
521-
if (traddr_is_hostname(c)) {
523+
if (traddr_is_hostname(h->r, c)) {
522524
const char *traddr = c->traddr;
523525

524-
c->traddr = hostname2traddr(traddr);
526+
c->traddr = hostname2traddr(h->r, traddr);
525527
if (!c->traddr) {
526528
c->traddr = (char *)traddr;
527529
errno = ENVME_CONNECT_TRADDR;
@@ -534,14 +536,14 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
534536
if (ret)
535537
return ret;
536538

537-
ret = __nvmf_add_ctrl(argstr);
539+
ret = __nvmf_add_ctrl(h->r, argstr);
538540
free(argstr);
539541
if (ret < 0) {
540542
errno = -ret;
541543
return -1;
542544
}
543545

544-
nvme_msg(LOG_INFO, "nvme%d: ctrl connected\n", ret);
546+
nvme_msg(h->r, LOG_INFO, "nvme%d: ctrl connected\n", ret);
545547
return nvme_init_ctrl(h, c, ret);
546548
}
547549

@@ -567,7 +569,8 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
567569
trsvcid = e->trsvcid;
568570
break;
569571
default:
570-
nvme_msg(LOG_ERR, "skipping unsupported adrfam %d\n",
572+
nvme_msg(h->r, LOG_ERR,
573+
"skipping unsupported adrfam %d\n",
571574
e->adrfam);
572575
errno = EINVAL;
573576
return NULL;
@@ -581,29 +584,30 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
581584
trsvcid = NULL;
582585
break;
583586
default:
584-
nvme_msg(LOG_ERR, "skipping unsupported adrfam %d\n",
587+
nvme_msg(h->r, LOG_ERR,
588+
"skipping unsupported adrfam %d\n",
585589
e->adrfam);
586590
errno = EINVAL;
587591
return NULL;
588592
}
589593
case NVMF_TRTYPE_LOOP:
590594
break;
591595
default:
592-
nvme_msg(LOG_ERR, "skipping unsupported transport %d\n",
596+
nvme_msg(h->r, LOG_ERR, "skipping unsupported transport %d\n",
593597
e->trtype);
594598
errno = EINVAL;
595599
return NULL;
596600
}
597601

598602
transport = nvmf_trtype_str(e->trtype);
599603

600-
nvme_msg(LOG_DEBUG, "lookup ctrl "
604+
nvme_msg(h->r, LOG_DEBUG, "lookup ctrl "
601605
"(transport: %s, traddr: %s, trsvcid %s)\n",
602606
transport, traddr, trsvcid);
603-
c = nvme_create_ctrl(e->subnqn, transport, traddr,
607+
c = nvme_create_ctrl(h->r, e->subnqn, transport, traddr,
604608
cfg->host_traddr, cfg->host_iface, trsvcid);
605609
if (!c) {
606-
nvme_msg(LOG_DEBUG, "skipping discovery entry, "
610+
nvme_msg(h->r, LOG_DEBUG, "skipping discovery entry, "
607611
"failed to allocate %s controller with traddr %s\n",
608612
transport, traddr);
609613
errno = ENOMEM;
@@ -620,7 +624,7 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
620624
nvme_ctrl_set_discovery_ctrl(c, true);
621625
break;
622626
default:
623-
nvme_msg(LOG_ERR, "unsupported subtype %d\n",
627+
nvme_msg(h->r, LOG_ERR, "unsupported subtype %d\n",
624628
e->subtype);
625629
/* fallthrough */
626630
case NVME_NQN_NVME:
@@ -648,14 +652,15 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
648652
if (errno == EINVAL && c->cfg.disable_sqflow) {
649653
errno = 0;
650654
/* disable_sqflow is unrecognized option on older kernels */
651-
nvme_msg(LOG_INFO, "failed to connect controller, "
655+
nvme_msg(h->r, LOG_INFO, "failed to connect controller, "
652656
"retry with disabling SQ flow control\n");
653657
c->cfg.disable_sqflow = false;
654658
ret = nvmf_add_ctrl(h, c, cfg);
655659
if (!ret)
656660
return c;
657661
}
658-
nvme_msg(LOG_ERR, "failed to connect controller, error %d\n", errno);
662+
nvme_msg(h->r, LOG_ERR, "failed to connect controller, error %d\n",
663+
errno);
659664
nvme_free_ctrl(c);
660665
return NULL;
661666
}
@@ -669,6 +674,7 @@ static int nvme_discovery_log(int fd, __u32 len, struct nvmf_discovery_log *log,
669674
int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
670675
int max_retries)
671676
{
677+
nvme_root_t r = c->s && c->s->h ? c->s->h->r : NULL;
672678
struct nvmf_discovery_log *log;
673679
int hdr, ret, retries = 0;
674680
const char *name = nvme_ctrl_get_name(c);
@@ -678,17 +684,17 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
678684
hdr = sizeof(struct nvmf_discovery_log);
679685
log = malloc(hdr);
680686
if (!log) {
681-
nvme_msg(LOG_ERR,
687+
nvme_msg(r, LOG_ERR,
682688
"could not allocate memory for discovery log header\n");
683689
errno = ENOMEM;
684690
return -1;
685691
}
686692
memset(log, 0, hdr);
687693

688-
nvme_msg(LOG_DEBUG, "%s: discover length %d\n", name, 0x100);
694+
nvme_msg(r, LOG_DEBUG, "%s: discover length %d\n", name, 0x100);
689695
ret = nvme_discovery_log(nvme_ctrl_get_fd(c), 0x100, log, true);
690696
if (ret) {
691-
nvme_msg(LOG_INFO, "%s: discover failed, error %d\n",
697+
nvme_msg(r, LOG_INFO, "%s: discover failed, error %d\n",
692698
name, errno);
693699
goto out_free_log;
694700
}
@@ -708,28 +714,29 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
708714
free(log);
709715
log = malloc(size);
710716
if (!log) {
711-
nvme_msg(LOG_ERR,
717+
nvme_msg(r, LOG_ERR,
712718
"could not alloc memory for discovery log page\n");
713719
errno = ENOMEM;
714720
return -1;
715721
}
716722
memset(log, 0, size);
717723

718-
nvme_msg(LOG_DEBUG, "%s: discover length %d\n", name, size);
724+
nvme_msg(r, LOG_DEBUG, "%s: discover length %d\n", name, size);
719725
ret = nvme_discovery_log(nvme_ctrl_get_fd(c), size, log, false);
720726
if (ret) {
721-
nvme_msg(LOG_INFO,
727+
nvme_msg(r, LOG_INFO,
722728
"%s: discover try %d/%d failed, error %d\n",
723729
name, retries, max_retries, errno);
724730
goto out_free_log;
725731
}
726732

727733
genctr = le64_to_cpu(log->genctr);
728-
nvme_msg(LOG_DEBUG, "%s: discover genctr %" PRIu64 ", retry\n",
734+
nvme_msg(r, LOG_DEBUG,
735+
"%s: discover genctr %" PRIu64 ", retry\n",
729736
name, genctr);
730737
ret = nvme_discovery_log(nvme_ctrl_get_fd(c), hdr, log, true);
731738
if (ret) {
732-
nvme_msg(LOG_INFO,
739+
nvme_msg(r, LOG_INFO,
733740
"%s: discover try %d/%d failed, error %d\n",
734741
name, retries, max_retries, errno);
735742
goto out_free_log;
@@ -738,11 +745,12 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
738745
++retries < max_retries);
739746

740747
if (genctr != le64_to_cpu(log->genctr)) {
741-
nvme_msg(LOG_INFO, "%s: discover genctr mismatch\n", name);
748+
nvme_msg(r, LOG_INFO, "%s: discover genctr mismatch\n", name);
742749
errno = EAGAIN;
743750
ret = -1;
744751
} else if (numrec != le64_to_cpu(log->numrec)) {
745-
nvme_msg(LOG_INFO, "%s: could only fetch %" PRIu64 " of %" PRIu64 " records\n",
752+
nvme_msg(r, LOG_INFO,
753+
"%s: could only fetch %" PRIu64 " of %" PRIu64 " records\n",
746754
name, numrec, le64_to_cpu(log->numrec));
747755
errno = EBADSLT;
748756
ret = -1;

src/nvme/json.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ void json_read_config(nvme_root_t r, const char *config_file)
163163

164164
json_root = json_object_from_file(config_file);
165165
if (!json_root) {
166-
nvme_msg(LOG_DEBUG, "Failed to read %s, %s\n",
166+
nvme_msg(r, LOG_DEBUG, "Failed to read %s, %s\n",
167167
config_file, json_util_get_last_err());
168168
return;
169169
}
@@ -295,7 +295,7 @@ int json_update_config(nvme_root_t r, const char *config_file)
295295
ret = json_object_to_file_ext(config_file, json_root,
296296
JSON_C_TO_STRING_PRETTY);
297297
if (ret < 0) {
298-
nvme_msg(LOG_ERR, "Failed to write to %s, %s\n",
298+
nvme_msg(r, LOG_ERR, "Failed to write to %s, %s\n",
299299
config_file ? "stdout" : config_file,
300300
json_util_get_last_err());
301301
ret = -1;

0 commit comments

Comments
 (0)