From 5a3d0261805f71a46cbfa4e4b5b565395574b7d5 Mon Sep 17 00:00:00 2001 From: Maurizio Lombardi Date: Tue, 2 Apr 2024 15:10:12 +0200 Subject: [PATCH] libnvme: update to 1.8 Resolves: RHEL-30641 Signed-off-by: Maurizio Lombardi --- .gitignore | 1 + ...-alloc-helper-with-alignment-support.patch | 58 --------- ...llocate-aligned-payloads-for-ns-scan.patch | 65 ---------- ...ligned-payloads-for-id_ctrl-and-id_n.patch | 122 ------------------ ...-aligned-payloads-for-id_ctrl-and-di.patch | 80 ------------ libnvme.spec | 14 +- sources | 2 +- 7 files changed, 8 insertions(+), 334 deletions(-) delete mode 100644 0001-util-Introduce-alloc-helper-with-alignment-support.patch delete mode 100644 0002-tree-Allocate-aligned-payloads-for-ns-scan.patch delete mode 100644 0003-linux-Allocate-aligned-payloads-for-id_ctrl-and-id_n.patch delete mode 100644 0004-fabrics-Allocate-aligned-payloads-for-id_ctrl-and-di.patch diff --git a/.gitignore b/.gitignore index 87d0646..a1e0956 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /libnvme-1.2.tar.gz /libnvme-1.4.tar.gz /libnvme-1.6.tar.gz +/libnvme-1.8.tar.gz diff --git a/0001-util-Introduce-alloc-helper-with-alignment-support.patch b/0001-util-Introduce-alloc-helper-with-alignment-support.patch deleted file mode 100644 index 10b1d45..0000000 --- a/0001-util-Introduce-alloc-helper-with-alignment-support.patch +++ /dev/null @@ -1,58 +0,0 @@ -From a2b8e52e46cfd888ac5a48d8ce632bd70a5caa93 Mon Sep 17 00:00:00 2001 -From: Tomas Bzatek -Date: Tue, 10 Oct 2023 18:16:24 +0200 -Subject: [PATCH] util: Introduce alloc helper with alignment support - -Similar to nvme-cli an alloc helper is needed for a couple -of ioctls sent out during tree scan. - -Signed-off-by: Tomas Bzatek ---- - src/nvme/private.h | 2 ++ - src/nvme/util.c | 13 +++++++++++++ - 2 files changed, 15 insertions(+) - -diff --git a/src/nvme/private.h b/src/nvme/private.h -index 6fb9784a696d..ee9d738bd0af 100644 ---- a/src/nvme/private.h -+++ b/src/nvme/private.h -@@ -182,6 +182,8 @@ nvme_ctrl_t __nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport, - const char *host_iface, const char *trsvcid, - const char *subsysnqn, nvme_ctrl_t p); - -+void *__nvme_alloc(size_t len); -+ - #if (LOG_FUNCNAME == 1) - #define __nvme_log_func __func__ - #else -diff --git a/src/nvme/util.c b/src/nvme/util.c -index 8fe094d55ef8..20679685bc8b 100644 ---- a/src/nvme/util.c -+++ b/src/nvme/util.c -@@ -7,6 +7,7 @@ - * Chaitanya Kulkarni - */ - -+#include - #include - #include - #include -@@ -1058,3 +1059,15 @@ bool nvme_iface_primary_addr_matches(const struct ifaddrs *iface_list, const cha - } - - #endif /* HAVE_NETDB */ -+ -+void *__nvme_alloc(size_t len) -+{ -+ size_t _len = round_up(len, 0x1000); -+ void *p; -+ -+ if (posix_memalign((void *)&p, getpagesize(), _len)) -+ return NULL; -+ -+ memset(p, 0, _len); -+ return p; -+} --- -2.39.3 - diff --git a/0002-tree-Allocate-aligned-payloads-for-ns-scan.patch b/0002-tree-Allocate-aligned-payloads-for-ns-scan.patch deleted file mode 100644 index 280b894..0000000 --- a/0002-tree-Allocate-aligned-payloads-for-ns-scan.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 68c6ffb11d40a427fc1fd70ac2ac97fd01952913 Mon Sep 17 00:00:00 2001 -From: Tomas Bzatek -Date: Tue, 10 Oct 2023 18:18:38 +0200 -Subject: [PATCH] tree: Allocate aligned payloads for ns scan - -libnvme is actually doing some namespace identification -during tree scan, leading to stack smash on some systems. - -Signed-off-by: Tomas Bzatek ---- - src/nvme/tree.c | 29 ++++++++++++++++++----------- - 1 file changed, 18 insertions(+), 11 deletions(-) - -diff --git a/src/nvme/tree.c b/src/nvme/tree.c -index 00cf96f7b458..5636aa1809ec 100644 ---- a/src/nvme/tree.c -+++ b/src/nvme/tree.c -@@ -2404,26 +2404,33 @@ static void nvme_ns_parse_descriptors(struct nvme_ns *n, - - static int nvme_ns_init(struct nvme_ns *n) - { -- struct nvme_id_ns ns = { }; -- uint8_t buffer[NVME_IDENTIFY_DATA_SIZE] = { }; -- struct nvme_ns_id_desc *descs = (void *)buffer; -+ struct nvme_id_ns *ns; -+ struct nvme_ns_id_desc *descs; - uint8_t flbas; - int ret; - -- ret = nvme_ns_identify(n, &ns); -- if (ret) -+ ns = __nvme_alloc(sizeof(*ns)); -+ if (!ns) -+ return 0; -+ ret = nvme_ns_identify(n, ns); -+ if (ret) { -+ free(ns); - return ret; -+ } - -- nvme_id_ns_flbas_to_lbaf_inuse(ns.flbas, &flbas); -- n->lba_shift = ns.lbaf[flbas].ds; -+ nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &flbas); -+ n->lba_shift = ns->lbaf[flbas].ds; - n->lba_size = 1 << n->lba_shift; -- n->lba_count = le64_to_cpu(ns.nsze); -- n->lba_util = le64_to_cpu(ns.nuse); -- n->meta_size = le16_to_cpu(ns.lbaf[flbas].ms); -+ n->lba_count = le64_to_cpu(ns->nsze); -+ n->lba_util = le64_to_cpu(ns->nuse); -+ n->meta_size = le16_to_cpu(ns->lbaf[flbas].ms); - -- if (!nvme_ns_identify_descs(n, descs)) -+ descs = __nvme_alloc(NVME_IDENTIFY_DATA_SIZE); -+ if (descs && !nvme_ns_identify_descs(n, descs)) - nvme_ns_parse_descriptors(n, descs); - -+ free(ns); -+ free(descs); - return 0; - } - --- -2.39.3 - diff --git a/0003-linux-Allocate-aligned-payloads-for-id_ctrl-and-id_n.patch b/0003-linux-Allocate-aligned-payloads-for-id_ctrl-and-id_n.patch deleted file mode 100644 index 8181aeb..0000000 --- a/0003-linux-Allocate-aligned-payloads-for-id_ctrl-and-id_n.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 3bf6e153a1c02b1c684ac3f5949cd32dec5f46c9 Mon Sep 17 00:00:00 2001 -From: Tomas Bzatek -Date: Thu, 12 Oct 2023 18:42:34 +0200 -Subject: [PATCH] linux: Allocate aligned payloads for id_ctrl and id_ns calls - -Signed-off-by: Tomas Bzatek ---- - src/nvme/linux.c | 61 ++++++++++++++++++++++++++++++++++-------------- - 1 file changed, 43 insertions(+), 18 deletions(-) - -diff --git a/src/nvme/linux.c b/src/nvme/linux.c -index adbc4cdbd5f6..66be9eb81722 100644 ---- a/src/nvme/linux.c -+++ b/src/nvme/linux.c -@@ -124,28 +124,37 @@ int nvme_fw_download_seq(int fd, __u32 size, __u32 xfer, __u32 offset, - - int nvme_get_telemetry_max(int fd, enum nvme_telemetry_da *da, size_t *data_tx) - { -- struct nvme_id_ctrl id_ctrl; -- int err = nvme_identify_ctrl(fd, &id_ctrl); -+ struct nvme_id_ctrl *id_ctrl; -+ int err; - -- if (err) -+ id_ctrl = __nvme_alloc(sizeof(*id_ctrl)); -+ if (!id_ctrl) { -+ errno = ENOMEM; -+ return -1; -+ } -+ err = nvme_identify_ctrl(fd, id_ctrl); -+ if (err) { -+ free(id_ctrl); - return err; -+ } - - if (data_tx) { -- *data_tx = id_ctrl.mdts; -- if (id_ctrl.mdts) { -+ *data_tx = id_ctrl->mdts; -+ if (id_ctrl->mdts) { - /* assuming CAP.MPSMIN is zero minimum Memory Page Size is at least - * 4096 bytes - */ -- *data_tx = (1 << id_ctrl.mdts) * 4096; -+ *data_tx = (1 << id_ctrl->mdts) * 4096; - } - } - if (da) { -- if (id_ctrl.lpa & 0x8) -+ if (id_ctrl->lpa & 0x8) - *da = NVME_TELEMETRY_DA_3; -- if (id_ctrl.lpa & 0x40) -+ if (id_ctrl->lpa & 0x40) - *da = NVME_TELEMETRY_DA_4; - - } -+ free(id_ctrl); - return err; - } - -@@ -376,32 +385,48 @@ int nvme_namespace_detach_ctrls(int fd, __u32 nsid, __u16 num_ctrls, - - int nvme_get_ana_log_len(int fd, size_t *analen) - { -- struct nvme_id_ctrl ctrl; -+ struct nvme_id_ctrl *ctrl; - int ret; - -- ret = nvme_identify_ctrl(fd, &ctrl); -- if (ret) -+ ctrl = __nvme_alloc(sizeof(*ctrl)); -+ if (!ctrl) { -+ errno = ENOMEM; -+ return -1; -+ } -+ ret = nvme_identify_ctrl(fd, ctrl); -+ if (ret) { -+ free(ctrl); - return ret; -+ } - - *analen = sizeof(struct nvme_ana_log) + -- le32_to_cpu(ctrl.nanagrpid) * sizeof(struct nvme_ana_group_desc) + -- le32_to_cpu(ctrl.mnan) * sizeof(__le32); -+ le32_to_cpu(ctrl->nanagrpid) * sizeof(struct nvme_ana_group_desc) + -+ le32_to_cpu(ctrl->mnan) * sizeof(__le32); -+ free(ctrl); - return 0; - } - - int nvme_get_logical_block_size(int fd, __u32 nsid, int *blksize) - { -- struct nvme_id_ns ns; -+ struct nvme_id_ns *ns; - __u8 flbas; - int ret; - -- ret = nvme_identify_ns(fd, nsid, &ns); -- if (ret) -+ ns = __nvme_alloc(sizeof(*ns)); -+ if (!ns) { -+ errno = ENOMEM; -+ return -1; -+ } -+ ret = nvme_identify_ns(fd, nsid, ns); -+ if (ret) { -+ free(ns); - return ret; -+ } - -- nvme_id_ns_flbas_to_lbaf_inuse(ns.flbas, &flbas); -- *blksize = 1 << ns.lbaf[flbas].ds; -+ nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &flbas); -+ *blksize = 1 << ns->lbaf[flbas].ds; - -+ free(ns); - return 0; - } - --- -2.39.3 - diff --git a/0004-fabrics-Allocate-aligned-payloads-for-id_ctrl-and-di.patch b/0004-fabrics-Allocate-aligned-payloads-for-id_ctrl-and-di.patch deleted file mode 100644 index b5846e7..0000000 --- a/0004-fabrics-Allocate-aligned-payloads-for-id_ctrl-and-di.patch +++ /dev/null @@ -1,80 +0,0 @@ -From da8c28e5e220be4742442114252d136097056928 Mon Sep 17 00:00:00 2001 -From: Tomas Bzatek -Date: Thu, 12 Oct 2023 18:43:16 +0200 -Subject: [PATCH] fabrics: Allocate aligned payloads for id_ctrl and discovery - log calls - -Signed-off-by: Tomas Bzatek ---- - src/nvme/fabrics.c | 29 +++++++++++++++++++---------- - 1 file changed, 19 insertions(+), 10 deletions(-) - -diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c -index 21fb29200b4b..2e48ac869679 100644 ---- a/src/nvme/fabrics.c -+++ b/src/nvme/fabrics.c -@@ -1073,7 +1073,7 @@ static struct nvmf_discovery_log *nvme_discovery_log(nvme_ctrl_t c, - size = sizeof(struct nvmf_discovery_log); - - free(log); -- log = calloc(1, size); -+ log = __nvme_alloc(size); - if (!log) { - nvme_msg(r, LOG_ERR, - "could not allocate memory for discovery log header\n"); -@@ -1105,7 +1105,7 @@ static struct nvmf_discovery_log *nvme_discovery_log(nvme_ctrl_t c, - sizeof(struct nvmf_disc_log_entry) * numrec; - - free(log); -- log = calloc(1, size); -+ log = __nvme_alloc(size); - if (!log) { - nvme_msg(r, LOG_ERR, - "could not alloc memory for discovery log page\n"); -@@ -1709,26 +1709,35 @@ static const char *dctype_str[] = { - */ - static int nvme_fetch_cntrltype_dctype_from_id(nvme_ctrl_t c) - { -- struct nvme_id_ctrl id = { 0 }; -+ struct nvme_id_ctrl *id; - int ret; - -- ret = nvme_ctrl_identify(c, &id); -- if (ret) -+ id = __nvme_alloc(sizeof(*id)); -+ if (!id) { -+ errno = ENOMEM; -+ return -1; -+ } -+ -+ ret = nvme_ctrl_identify(c, id); -+ if (ret) { -+ free(id); - return ret; -+ } - - if (!c->cntrltype) { -- if (id.cntrltype > NVME_CTRL_CNTRLTYPE_ADMIN || !cntrltype_str[id.cntrltype]) -+ if (id->cntrltype > NVME_CTRL_CNTRLTYPE_ADMIN || !cntrltype_str[id->cntrltype]) - c->cntrltype = strdup("reserved"); - else -- c->cntrltype = strdup(cntrltype_str[id.cntrltype]); -+ c->cntrltype = strdup(cntrltype_str[id->cntrltype]); - } - -- if (!c->dctype) { -- if (id.dctype > NVME_CTRL_DCTYPE_CDC || !dctype_str[id.dctype]) -+ if (!c->dctype) { -+ if (id->dctype > NVME_CTRL_DCTYPE_CDC || !dctype_str[id->dctype]) - c->dctype = strdup("reserved"); - else -- c->dctype = strdup(dctype_str[id.dctype]); -+ c->dctype = strdup(dctype_str[id->dctype]); - } -+ free(id); - return 0; - } - --- -2.39.3 - diff --git a/libnvme.spec b/libnvme.spec index 590664a..8c3e82a 100644 --- a/libnvme.spec +++ b/libnvme.spec @@ -3,17 +3,12 @@ Name: libnvme Summary: Linux-native nvme device management library -Version: 1.6 +Version: 1.8 Release: 1%{?dist} License: LGPL-2.1-or-later URL: https://github.com/linux-nvme/libnvme Source0: %{url}/archive/v%{version_no_tilde}/%{name}-%{version_no_tilde}.tar.gz -Patch0: 0001-util-Introduce-alloc-helper-with-alignment-support.patch -Patch1: 0002-tree-Allocate-aligned-payloads-for-ns-scan.patch -Patch2: 0003-linux-Allocate-aligned-payloads-for-id_ctrl-and-id_n.patch -Patch3: 0004-fabrics-Allocate-aligned-payloads-for-id_ctrl-and-di.patch - BuildRequires: gcc gcc-c++ BuildRequires: swig BuildRequires: python3-devel @@ -76,9 +71,9 @@ mv %{buildroot}/usr/*.rst %{buildroot}%{_pkgdocdir}/ %files %license COPYING ccan/licenses/* %{_libdir}/libnvme.so.1 -%{_libdir}/libnvme.so.1.6.0 +%{_libdir}/libnvme.so.1.8.0 %{_libdir}/libnvme-mi.so.1 -%{_libdir}/libnvme-mi.so.1.6.0 +%{_libdir}/libnvme-mi.so.1.8.0 %files devel %{_libdir}/libnvme.so @@ -98,6 +93,9 @@ mv %{buildroot}/usr/*.rst %{buildroot}%{_pkgdocdir}/ %{python3_sitearch}/libnvme/* %changelog +* Tue Apr 02 2024 Maurizio Lombardi - 1.8-1 +- Update to version 1.8 + * Fri Nov 03 2023 Maurizio Lombardi - 1.6-1 - Update to version 1.6, including the stack-smashing fixes diff --git a/sources b/sources index 2cd68f6..5d4cc2b 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (libnvme-1.6.tar.gz) = ae6a95ed75bbdc6f8c5c5608eaad8bcaf60a08348ddff356bd47258da2bd2470bdaa45747cdb7ba24f10db093fc0ab95f8bda076a45cbb87e155e3158ef726f8 +SHA512 (libnvme-1.8.tar.gz) = ba0cec72fd6c9bb29b29c4342be7b25aec1f31157a094ad387a1105cbd1961ab600e1448a2462d8be2af91d5251b2970d6d06d4871ce96604c5be204d6096bcb