From 6a59dd5c400d3a67f540330886c0701912dd2385 Mon Sep 17 00:00:00 2001 From: Clayton Craft Date: Mon, 15 Sep 2025 08:19:27 -0700 Subject: [PATCH] tree: support apple-nvme transport Apple silicon support on Linux uses a separate platform driver called 'apple-nvme', and libnvme doesn't know about this transport. This fixes a "No transport address for 'apple-nvme'" error when running on Apple silicon, where libnvme was unable to enumerate nvme storage attached to this platform. $ nvme list Node Generic SN Model Namespace Usage Format FW Rev --------------------- --------------------- -------------------- ---------------------------------------- ---------- -------------------------- ---------------- -------- /dev/nvme0n1 /dev/ng0n1 xxxxxxxxxxxxxxxx APPLE SSD AP2048Z 0x1 2.00 TB / 2.00 TB 4 KiB + 0 B 532.140. ... Signed-off-by: Clayton Craft squash --- src/nvme/tree.c | 9 +++-- test/sysfs/data/tree-apple-nvme.out | 49 +++++++++++++++++++++++++ test/sysfs/data/tree-apple-nvme.tar.xz | Bin 0 -> 8708 bytes test/sysfs/meson.build | 1 + 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 test/sysfs/data/tree-apple-nvme.out create mode 100644 test/sysfs/data/tree-apple-nvme.tar.xz diff --git a/src/nvme/tree.c b/src/nvme/tree.c index d79707439..4553fa2b3 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -1417,7 +1417,8 @@ struct nvme_ctrl *nvme_create_ctrl(nvme_root_t r, return NULL; } if (strncmp(transport, "loop", 4) && - strncmp(transport, "pcie", 4) && !traddr) { + strncmp(transport, "pcie", 4) && + strncmp(transport, "apple-nvme", 10) && !traddr) { nvme_msg(r, LOG_ERR, "No transport address for '%s'\n", transport); errno = EINVAL; @@ -2166,7 +2167,8 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_root_t r, nvme_subsystem_t s, goto skip_address; /* Older kernel don't support pcie transport addresses */ - if (strcmp(transport, "pcie")) { + if (strcmp(transport, "pcie") && + strcmp(transport, "apple-nvme")) { errno = ENXIO; return NULL; } @@ -2187,7 +2189,8 @@ static nvme_ctrl_t nvme_ctrl_alloc(nvme_root_t r, nvme_subsystem_t s, } if (p) addr = strdup(p); - } else if (!strcmp(transport, "pcie")) { + } else if (!strcmp(transport, "pcie") || + !strcmp(transport, "apple-nvme")) { /* The 'address' string is the transport address */ traddr = addr; } else { diff --git a/test/sysfs/data/tree-apple-nvme.out b/test/sysfs/data/tree-apple-nvme.out new file mode 100644 index 000000000..9207575ad --- /dev/null +++ b/test/sysfs/data/tree-apple-nvme.out @@ -0,0 +1,49 @@ +{ + "hosts":[ + { + "hostnqn":"nqn.2014-08.org.nvmexpress:uuid:ce4fee3e-c02c-11ee-8442-830d068a36c6", + "hostid":"ce4fee3e-c02c-11ee-8442-830d068a36c6", + "subsystems":[ + { + "name":"nvme-subsys0", + "nqn":"nqn.2014.08.org.nvmexpress:106b106b0ba01e49841cc620 APPLE SSD AP2048Z", + "namespaces":[ + { + "nsid":1, + "name":"nvme0n1", + "controller":[ + { + "name":"nvme0", + "transport":"apple-nvme", + "traddr":"27bcc0000.nvme" + } + ] + }, + { + "nsid":2, + "name":"nvme0n2", + "controller":[ + { + "name":"nvme0", + "transport":"apple-nvme", + "traddr":"27bcc0000.nvme" + } + ] + }, + { + "nsid":3, + "name":"nvme0n3", + "controller":[ + { + "name":"nvme0", + "transport":"apple-nvme", + "traddr":"27bcc0000.nvme" + } + ] + } + ] + } + ] + } + ] +} diff --git a/test/sysfs/data/tree-apple-nvme.tar.xz b/test/sysfs/data/tree-apple-nvme.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..a6fecde4d6aa73c9dadaf8a17ef876ecc0c4c089 GIT binary patch literal 8708 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