Skip to content

Commit 4e38073

Browse files
authored
Merge pull request #418 from CodeConstruct/mi-retvals
MI: return value + errno unification
2 parents ea95233 + 4473661 commit 4e38073

3 files changed

Lines changed: 222 additions & 89 deletions

File tree

src/nvme/mi-mctp.c

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -210,17 +210,21 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
210210
struct iovec req_iov[3], resp_iov[3];
211211
struct msghdr req_msg, resp_msg;
212212
struct sockaddr_mctp addr;
213+
int i, rc, errno_save;
213214
ssize_t len;
214215
__le32 mic;
215-
int i, rc;
216216
__u8 tag;
217217

218-
if (ep->transport != &nvme_mi_transport_mctp)
219-
return -EINVAL;
218+
if (ep->transport != &nvme_mi_transport_mctp) {
219+
errno = EINVAL;
220+
return -1;
221+
}
220222

221223
/* we need enough space for at least a generic (/error) response */
222-
if (resp->hdr_len < sizeof(struct nvme_mi_msg_resp))
223-
return -EINVAL;
224+
if (resp->hdr_len < sizeof(struct nvme_mi_msg_resp)) {
225+
errno = EINVAL;
226+
return -1;
227+
}
224228

225229
mctp = ep->transport_data;
226230
tag = nvme_mi_mctp_tag_alloc(ep);
@@ -256,9 +260,11 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
256260

257261
len = ops.sendmsg(mctp->sd, &req_msg, 0);
258262
if (len < 0) {
263+
errno_save = errno;
259264
nvme_msg(ep->root, LOG_ERR,
260265
"Failure sending MCTP message: %m\n");
261-
rc = len;
266+
errno = errno_save;
267+
rc = -1;
262268
goto out;
263269
}
264270

@@ -282,14 +288,17 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
282288
len = ops.recvmsg(mctp->sd, &resp_msg, 0);
283289

284290
if (len < 0) {
291+
errno_save = errno;
285292
nvme_msg(ep->root, LOG_ERR,
286293
"Failure receiving MCTP message: %m\n");
294+
errno = errno_save;
287295
goto out;
288296
}
289297

290298

291299
if (len == 0) {
292300
nvme_msg(ep->root, LOG_WARNING, "No data from MCTP endpoint\n");
301+
errno = EIO;
293302
goto out;
294303
}
295304

@@ -304,6 +313,7 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
304313
nvme_msg(ep->root, LOG_ERR,
305314
"Invalid MCTP response: too short (%zd bytes, needed %zd)\n",
306315
len, 8 + sizeof(mic));
316+
errno = EPROTO;
307317
goto out;
308318
}
309319

@@ -312,6 +322,7 @@ static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
312322
nvme_msg(ep->root, LOG_WARNING,
313323
"Response message has unaligned length (%zd)!\n",
314324
len);
325+
errno = EPROTO;
315326
goto out;
316327
}
317328

@@ -379,8 +390,10 @@ static int nvme_mi_mctp_desc_ep(struct nvme_mi_ep *ep, char *buf, size_t len)
379390
{
380391
struct nvme_mi_transport_mctp *mctp;
381392

382-
if (ep->transport != &nvme_mi_transport_mctp)
393+
if (ep->transport != &nvme_mi_transport_mctp) {
394+
errno = EINVAL;
383395
return -1;
396+
}
384397

385398
mctp = ep->transport_data;
386399

@@ -401,6 +414,7 @@ nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, __u8 eid)
401414
{
402415
struct nvme_mi_transport_mctp *mctp;
403416
struct nvme_mi_ep *ep;
417+
int errno_save;
404418

405419
ep = nvme_mi_init_ep(root);
406420
if (!ep)
@@ -423,39 +437,44 @@ nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, __u8 eid)
423437
return ep;
424438

425439
err_free_ep:
440+
errno_save = errno;
426441
free(ep);
442+
errno = errno_save;
427443
return NULL;
428444
}
429445

430446
#ifdef CONFIG_LIBSYSTEMD
431447

432-
static void _dbus_err(nvme_root_t root, int rc, int line) {
448+
/* helper for handling dbus errors: D-Bus API returns a negtive errno on
449+
* failure; set errno and log.
450+
*/
451+
static void _dbus_err(nvme_root_t root, int rc, int line)
452+
{
433453
nvme_msg(root, LOG_ERR, "MCTP D-Bus failed line %d: %s %d\n",
434454
line, strerror(-rc), rc);
455+
errno = -rc;
435456
}
436457

437458
#define dbus_err(r, rc) _dbus_err(r, rc, __LINE__)
438459

439-
/* Returns -EEXISTS on duplicate */
440460
static int nvme_mi_mctp_add(nvme_root_t root, unsigned int netid, __u8 eid)
441461
{
442462
nvme_mi_ep_t ep = NULL;
443463

444-
/* ensure we don't already have an endpoint with the same net/eid */
464+
/* ensure we don't already have an endpoint with the same net/eid. if
465+
* we do, just skip, no need to re-add. */
445466
list_for_each(&root->endpoints, ep, root_entry) {
446467
if (ep->transport != &nvme_mi_transport_mctp) {
447468
continue;
448469
}
449470
const struct nvme_mi_transport_mctp *t = ep->transport_data;
450-
if (t->eid == eid && t->net == netid) {
451-
return -EEXIST;
452-
}
471+
if (t->eid == eid && t->net == netid)
472+
return 0;
453473
}
454474

455475
ep = nvme_mi_open_mctp(root, netid, eid);
456-
if (!ep) {
457-
return -ENOMEM;
458-
}
476+
if (!ep)
477+
return -1;
459478

460479
return 0;
461480
}
@@ -481,7 +500,7 @@ static int handle_mctp_endpoint(nvme_root_t root, const char* objpath,
481500
rc = sd_bus_message_enter_container(m, 'a', "{sv}");
482501
if (rc < 0) {
483502
dbus_err(root, rc);
484-
return rc;
503+
return -1;
485504
}
486505

487506
while (!container_end(m)) {
@@ -492,13 +511,13 @@ static int handle_mctp_endpoint(nvme_root_t root, const char* objpath,
492511
rc = sd_bus_message_enter_container(m, 'e', "sv");
493512
if (rc < 0) {
494513
dbus_err(root, rc);
495-
return rc;
514+
return -1;
496515
}
497516

498517
rc = sd_bus_message_read(m, "s", &propname);
499518
if (rc < 0) {
500519
dbus_err(root, rc);
501-
return rc;
520+
return -1;
502521
}
503522

504523
if (strcmp(propname, "EID") == 0) {
@@ -521,36 +540,38 @@ static int handle_mctp_endpoint(nvme_root_t root, const char* objpath,
521540

522541
if (rc < 0) {
523542
dbus_err(root, rc);
524-
return rc;
543+
return -1;
525544
}
526545

527546
/* Exit prop item */
528547
rc = sd_bus_message_exit_container(m);
529548
if (rc < 0) {
530549
dbus_err(root, rc);
531-
return rc;
550+
return -1;
532551
}
533552
}
534553

535554
/* Exit property dict */
536555
rc = sd_bus_message_exit_container(m);
537556
if (rc < 0) {
538557
dbus_err(root, rc);
539-
return rc;
558+
return -1;
540559
}
541560
}
542561

543562
if (have_nvmemi) {
544563
if (!(have_eid && have_net)) {
545564
nvme_msg(root, LOG_ERR,
546565
"Missing property for %s\n", objpath);
547-
return -ENOENT;
566+
errno = ENOENT;
567+
return -1;
548568
}
549569
rc = nvme_mi_mctp_add(root, net, eid);
550570
if (rc < 0) {
571+
int errno_save = errno;
551572
nvme_msg(root, LOG_ERR,
552-
"Error adding net %d eid %d: %s\n",
553-
net, eid, strerror(-rc));
573+
"Error adding net %d eid %d: %m\n", net, eid);
574+
errno = errno_save;
554575
}
555576
} else {
556577
/* Ignore other endpoints */
@@ -568,15 +589,15 @@ static int handle_mctp_obj(nvme_root_t root, sd_bus_message *m)
568589
rc = sd_bus_message_read(m, "o", &objpath);
569590
if (rc < 0) {
570591
dbus_err(root, rc);
571-
return rc;
592+
return -1;
572593
}
573594

574595
/* Enter response object: our array of (string, property dict)
575596
* values */
576597
rc = sd_bus_message_enter_container(m, 'a', "{sa{sv}}");
577598
if (rc < 0) {
578599
dbus_err(root, rc);
579-
return rc;
600+
return -1;
580601
}
581602

582603

@@ -586,13 +607,13 @@ static int handle_mctp_obj(nvme_root_t root, sd_bus_message *m)
586607
rc = sd_bus_message_enter_container(m, 'e', "sa{sv}");
587608
if (rc < 0) {
588609
dbus_err(root, rc);
589-
return rc;
610+
return -1;
590611
}
591612

592613
rc = sd_bus_message_read(m, "s", &ifname);
593614
if (rc < 0) {
594615
dbus_err(root, rc);
595-
return rc;
616+
return -1;
596617
}
597618

598619
if (!strcmp(ifname, MCTP_DBUS_IFACE_ENDPOINT)) {
@@ -606,23 +627,23 @@ static int handle_mctp_obj(nvme_root_t root, sd_bus_message *m)
606627
rc = sd_bus_message_skip(m, "a{sv}");
607628
if (rc < 0) {
608629
dbus_err(root, rc);
609-
return rc;
630+
return -1;
610631
}
611632
}
612633

613634
/* Exit interface item */
614635
rc = sd_bus_message_exit_container(m);
615636
if (rc < 0) {
616637
dbus_err(root, rc);
617-
return rc;
638+
return -1;
618639
}
619640
}
620641

621642
/* Exit response object */
622643
rc = sd_bus_message_exit_container(m);
623644
if (rc < 0) {
624645
dbus_err(root, rc);
625-
return rc;
646+
return -1;
626647
}
627648

628649
return 0;
@@ -633,19 +654,22 @@ nvme_root_t nvme_mi_scan_mctp(void)
633654
sd_bus *bus = NULL;
634655
sd_bus_message *resp = NULL;
635656
sd_bus_error berr = SD_BUS_ERROR_NULL;
657+
int rc, errno_save;
636658
nvme_root_t root;
637-
int rc;
638659

639660
root = nvme_mi_create_root(NULL, DEFAULT_LOGLEVEL);
640661
if (!root) {
641-
rc = -ENOMEM;
662+
errno = ENOMEM;
663+
rc = -1;
642664
goto out;
643665
}
644666

645667
rc = sd_bus_default_system(&bus);
646668
if (rc < 0) {
647669
nvme_msg(root, LOG_ERR, "Failed opening D-Bus: %s\n",
648670
strerror(-rc));
671+
errno = -rc;
672+
rc = -1;
649673
goto out;
650674
}
651675

@@ -660,14 +684,17 @@ nvme_root_t nvme_mi_scan_mctp(void)
660684
if (rc < 0) {
661685
nvme_msg(root, LOG_ERR, "Failed querying MCTP D-Bus: %s (%s)\n",
662686
berr.message, berr.name);
687+
errno = -rc;
688+
rc = -1;
663689
goto out;
664690
}
665691

666692
rc = sd_bus_message_enter_container(resp, 'a', "{oa{sa{sv}}}");
667693
if (rc != 1) {
668694
dbus_err(root, rc);
669695
if (rc == 0)
670-
rc = -EPROTO;
696+
errno = EPROTO;
697+
rc = -1;
671698
goto out;
672699
}
673700

@@ -676,6 +703,7 @@ nvme_root_t nvme_mi_scan_mctp(void)
676703
rc = sd_bus_message_enter_container(resp, 'e', "oa{sa{sv}}");
677704
if (rc < 0) {
678705
dbus_err(root, rc);
706+
rc = -1;
679707
goto out;
680708
}
681709

@@ -684,18 +712,21 @@ nvme_root_t nvme_mi_scan_mctp(void)
684712
rc = sd_bus_message_exit_container(resp);
685713
if (rc < 0) {
686714
dbus_err(root, rc);
715+
rc = -1;
687716
goto out;
688717
}
689718
}
690719

691720
rc = sd_bus_message_exit_container(resp);
692721
if (rc < 0) {
693722
dbus_err(root, rc);
723+
rc = -1;
694724
goto out;
695725
}
696726
rc = 0;
697727

698728
out:
729+
errno_save = errno;
699730
sd_bus_error_free(&berr);
700731
sd_bus_message_unref(resp);
701732
sd_bus_unref(bus);
@@ -704,6 +735,7 @@ nvme_root_t nvme_mi_scan_mctp(void)
704735
if (root) {
705736
nvme_mi_free_root(root);
706737
}
738+
errno = errno_save;
707739
root = NULL;
708740
}
709741
return root;

0 commit comments

Comments
 (0)