diff --git a/0001-spdk-fix-the-deference-between-dpdk-19.11-and-dpdk-20.11.patch b/0001-lib-env_dpdk-fix-the-enum-rte_kernel_driver-definiti.patch similarity index 59% rename from 0001-spdk-fix-the-deference-between-dpdk-19.11-and-dpdk-20.11.patch rename to 0001-lib-env_dpdk-fix-the-enum-rte_kernel_driver-definiti.patch index cca48e156e76649ebeb8b4701445fcead4974103..45094be44fd99663f4b5dfd4d708f8d66e96a5fe 100644 --- a/0001-spdk-fix-the-deference-between-dpdk-19.11-and-dpdk-20.11.patch +++ b/0001-lib-env_dpdk-fix-the-enum-rte_kernel_driver-definiti.patch @@ -1,16 +1,24 @@ -From ca3cf79c6a8037166f28c70f3c4f85d6573abccd Mon Sep 17 00:00:00 2001 -From: sunshihao -Date: Thu, 4 Feb 2021 15:42:44 +0800 -Subject: [PATCH] spdk: fix the deference between dpdk 19.11 and dpdk 20.11 - -In dpdk 19.11, we use the old kdrv definiton, the new kdrv name was added in -dpdk-20.11, this patch is to solve this problem. +From 5932cd76b357acbfcd9bfa56f4e7f5b3225815e9 Mon Sep 17 00:00:00 2001 +From: sunshihao520 +Date: Thu, 4 Feb 2021 14:52:43 +0800 +Subject: [PATCH 01/15] lib:env_dpdk fix the enum rte_kernel_driver definition + deference between dpdk 19.11 and 20.11 +In dpdk 19.11, rte_kernel_driver is the old version, add version check before use the members. Signed-off-by: sunshihao +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6252 (master) + +(cherry picked from commit b1687cd45680d1573be9f66e748014fd9c5e9e4e) +Change-Id: Ic1db37cc0760c7d03692fd2cdcbb6ff1e41f872d +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6321 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: sunshihao +Reviewed-by: Aleksey Marchuk --- - lib/env_dpdk/memory.c | 12 ++++++++++++ - lib/vhost/rte_vhost_compat.c | 2 +- - 2 files changed, 13 insertions(+), 1 deletion(-) + lib/env_dpdk/memory.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) diff --git a/lib/env_dpdk/memory.c b/lib/env_dpdk/memory.c index f49dcf4..c923483 100644 @@ -52,19 +60,6 @@ index f49dcf4..c923483 100644 /* This is a PCI device using vfio */ g_vfio.device_ref++; } -diff --git a/lib/vhost/rte_vhost_compat.c b/lib/vhost/rte_vhost_compat.c -index 85cce3d..e1747cc 100644 ---- a/lib/vhost/rte_vhost_compat.c -+++ b/lib/vhost/rte_vhost_compat.c -@@ -331,7 +331,7 @@ vhost_register_unix_socket(const char *path, const char *ctrl_name, - } - } - -- if (rte_vhost_driver_register(path, RTE_VHOST_USER_ASYNC_COPY) != 0) { -+ if (rte_vhost_driver_register(path, 0) != 0) { - SPDK_ERRLOG("Could not register controller %s with vhost library\n", ctrl_name); - SPDK_ERRLOG("Check if domain socket %s already exists\n", path); - return -EIO; -- 1.8.3.1 diff --git a/0002-env_dpdk-add-rte_ethdev-dependency.patch b/0002-env_dpdk-add-rte_ethdev-dependency.patch new file mode 100644 index 0000000000000000000000000000000000000000..759ddbebd257ca731e92f96884b970e7dc1e1463 --- /dev/null +++ b/0002-env_dpdk-add-rte_ethdev-dependency.patch @@ -0,0 +1,40 @@ +From bf8f81bc254642110b009e802e479be1ea149423 Mon Sep 17 00:00:00 2001 +From: Jim Harris +Date: Mon, 1 Feb 2021 14:28:30 +0000 +Subject: [PATCH 02/15] env_dpdk: add rte_ethdev dependency + +As of DPDK main commit 682a6454 ("power: add ethdev +power management"), rte_power depends on rte_ethdev. +So add rte_ethdev library, but only on Linux since +that is the only place where we use rte_power. + +Signed-off-by: Jim Harris +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6210 (master) + +(cherry picked from commit 710838103bb8ba6e9938dd6aa66c72c6ecb3e928) +Change-Id: Ibc3473d6ec75c14a8c0c5517616950017cb2ea96 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6320 +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +Tested-by: SPDK CI Jenkins +--- + lib/env_dpdk/env.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/env_dpdk/env.mk b/lib/env_dpdk/env.mk +index 6dae04e..f44f515 100644 +--- a/lib/env_dpdk/env.mk ++++ b/lib/env_dpdk/env.mk +@@ -51,7 +51,7 @@ DPDK_INC := -I$(DPDK_INC_DIR) + DPDK_LIB_LIST = rte_eal rte_mempool rte_ring rte_mbuf rte_pci rte_bus_pci rte_mempool_ring + + ifeq ($(OS),Linux) +-DPDK_LIB_LIST += rte_power ++DPDK_LIB_LIST += rte_power rte_ethdev + endif + + # DPDK 20.05 eal dependency +-- +1.8.3.1 + diff --git a/0003-pkg-spdk.spec-Add-ncurses-devel-to-BuildRequires.patch b/0003-pkg-spdk.spec-Add-ncurses-devel-to-BuildRequires.patch new file mode 100644 index 0000000000000000000000000000000000000000..0bc6efbb9a4cf1e110ef3ff1081efbc18b0352ad --- /dev/null +++ b/0003-pkg-spdk.spec-Add-ncurses-devel-to-BuildRequires.patch @@ -0,0 +1,38 @@ +From fa2ceb127060000d26758db36e5e13c4c7d97f77 Mon Sep 17 00:00:00 2001 +From: sunshihao520 +Date: Thu, 4 Feb 2021 19:49:03 +0800 +Subject: [PATCH 03/15] pkg:spdk.spec Add ncurses-devel to BuildRequires + +ncurses.h is needed in spdk_top, add ncurses-devel to BuildRequires. + +Signed-off-by: sunshihao +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6258 (master) + +(cherry picked from commit ccbdd1750f3da9be85b2018896fab5c88cb7f686) +Change-Id: I22754838788fe237a29ab74a675a94ab7007bd33 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6388 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: sunshihao +Reviewed-by: Aleksey Marchuk +--- + pkg/spdk.spec | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pkg/spdk.spec b/pkg/spdk.spec +index 2237635..23de4f8 100644 +--- a/pkg/spdk.spec ++++ b/pkg/spdk.spec +@@ -22,7 +22,7 @@ License: BSD + ExclusiveArch: x86_64 + + BuildRequires: gcc gcc-c++ make +-BuildRequires: dpdk-devel, numactl-devel ++BuildRequires: dpdk-devel, numactl-devel, ncurses-devel + BuildRequires: libiscsi-devel, libaio-devel, openssl-devel, libuuid-devel + BuildRequires: libibverbs-devel, librdmacm-devel + %if %{with doc} +-- +1.8.3.1 + diff --git a/0004-lib-vhost-Add-version-check-when-use-RTE_VHOST_USER_.patch b/0004-lib-vhost-Add-version-check-when-use-RTE_VHOST_USER_.patch new file mode 100644 index 0000000000000000000000000000000000000000..25706e68e51d6e39a555638a0b57a35dac7d424b --- /dev/null +++ b/0004-lib-vhost-Add-version-check-when-use-RTE_VHOST_USER_.patch @@ -0,0 +1,51 @@ +From 0c08337dd060fd42390c6fab26f5a08d0d6269bf Mon Sep 17 00:00:00 2001 +From: sunshihao520 +Date: Tue, 9 Feb 2021 15:17:24 +0800 +Subject: [PATCH 04/15] lib:vhost Add version check when use + RTE_VHOST_USER_ASYNC_COPY in 21.01 + +In dpdk 19.11 version, RTE_VHOST_USER_ASYNC_COPY is not define. +After dpdk 20.08, we can use RTE_VHOST_USER_ASYNC_COPY. +Use version check to avoid this problem. + +Signed-off-by: sunshihao +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6274 (master) + +(cherry picked from commit 9529803fe0f32d69752cf01eeed590056bd43637) +Change-Id: Iaf9914e8380f3d54cded1e2f16af6a7dc3504f95 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6255 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Aleksey Marchuk +--- + lib/vhost/rte_vhost_compat.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/lib/vhost/rte_vhost_compat.c b/lib/vhost/rte_vhost_compat.c +index 85cce3d..3c9f691 100644 +--- a/lib/vhost/rte_vhost_compat.c ++++ b/lib/vhost/rte_vhost_compat.c +@@ -46,6 +46,7 @@ + #include "spdk/barrier.h" + #include "spdk/vhost.h" + #include "vhost_internal.h" ++#include + + #include "spdk_internal/vhost_user.h" + +@@ -331,7 +332,11 @@ vhost_register_unix_socket(const char *path, const char *ctrl_name, + } + } + ++#if RTE_VERSION < RTE_VERSION_NUM(20, 8, 0, 0) ++ if (rte_vhost_driver_register(path, 0) != 0) { ++#else + if (rte_vhost_driver_register(path, RTE_VHOST_USER_ASYNC_COPY) != 0) { ++#endif + SPDK_ERRLOG("Could not register controller %s with vhost library\n", ctrl_name); + SPDK_ERRLOG("Check if domain socket %s already exists\n", path); + return -EIO; +-- +1.8.3.1 + diff --git a/0005-lib-nvme-Remove-qpair-from-all-lists-before-freeing-.patch b/0005-lib-nvme-Remove-qpair-from-all-lists-before-freeing-.patch new file mode 100644 index 0000000000000000000000000000000000000000..58f34b7f7d2997660bc5c3bce8fa5371c4901131 --- /dev/null +++ b/0005-lib-nvme-Remove-qpair-from-all-lists-before-freeing-.patch @@ -0,0 +1,89 @@ +From d889786d0044daff1344ed919bc7bab7d88da6ab Mon Sep 17 00:00:00 2001 +From: Vasuki Manikarnike +Date: Thu, 4 Feb 2021 15:54:37 +0000 +Subject: [PATCH 05/15] lib/nvme: Remove qpair from all lists before freeing + it. + +Fixes #1777. + +When a qpair cannot be allocated because the transport connection fails, +the qpair was freed without unlinking it from the other structures. +This was leading to a segfault when attempting to create and free other +qpairs. +Also added a unit test to cover this case. + +Signed-off-by: Vasuki Manikarnike +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6272 (master) + +(cherry picked from commit d92c2f118aa9ccbd242538a01b2ce0e2cf0c6b04) +Change-Id: I74b78d1847f90117248b07203b43a11ff5cfa5d6 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6393 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Aleksey Marchuk +--- + lib/nvme/nvme_ctrlr.c | 4 ++++ + test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c | 22 ++++++++++++++++++++++ + 2 files changed, 26 insertions(+) + +diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c +index 1960b0a..ff27771 100644 +--- a/lib/nvme/nvme_ctrlr.c ++++ b/lib/nvme/nvme_ctrlr.c +@@ -418,8 +418,12 @@ spdk_nvme_ctrlr_alloc_io_qpair(struct spdk_nvme_ctrlr *ctrlr, + rc = spdk_nvme_ctrlr_connect_io_qpair(ctrlr, qpair); + if (rc != 0) { + SPDK_ERRLOG("nvme_transport_ctrlr_connect_io_qpair() failed\n"); ++ nvme_robust_mutex_lock(&ctrlr->ctrlr_lock); ++ nvme_ctrlr_proc_remove_io_qpair(qpair); + TAILQ_REMOVE(&ctrlr->active_io_qpairs, qpair, tailq); ++ spdk_bit_array_set(ctrlr->free_io_qids, qpair->id); + nvme_transport_ctrlr_delete_io_qpair(ctrlr, qpair); ++ nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock); + return NULL; + } + +diff --git a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c +index 3e2321d..16a4c1b 100644 +--- a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c ++++ b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c +@@ -2162,6 +2162,27 @@ test_nvme_ctrlr_init_set_keep_alive_timeout(void) + nvme_ctrlr_destruct(&ctrlr); + } + ++static void ++test_alloc_io_qpair_fail(void) ++{ ++ struct spdk_nvme_ctrlr ctrlr = {}; ++ struct spdk_nvme_qpair *q0; ++ ++ setup_qpairs(&ctrlr, 1); ++ ++ /* Modify the connect_qpair return code to inject a failure */ ++ g_connect_qpair_return_code = 1; ++ ++ /* Attempt to allocate a qpair, this should fail */ ++ q0 = spdk_nvme_ctrlr_alloc_io_qpair(&ctrlr, NULL, 0); ++ SPDK_CU_ASSERT_FATAL(q0 == NULL); ++ ++ /* Verify that the qpair is removed from the lists */ ++ SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&ctrlr.active_io_qpairs)); ++ ++ cleanup_qpairs(&ctrlr); ++} ++ + int main(int argc, char **argv) + { + CU_pSuite suite = NULL; +@@ -2200,6 +2221,7 @@ int main(int argc, char **argv) + CU_ADD_TEST(suite, test_nvme_ctrlr_init_set_nvmf_ioccsz); + CU_ADD_TEST(suite, test_nvme_ctrlr_init_set_num_queues); + CU_ADD_TEST(suite, test_nvme_ctrlr_init_set_keep_alive_timeout); ++ CU_ADD_TEST(suite, test_alloc_io_qpair_fail); + + CU_basic_set_mode(CU_BRM_VERBOSE); + CU_basic_run_tests(); +-- +1.8.3.1 + diff --git a/0006-lib-env_dpdk-add-rte_net-dependency.patch b/0006-lib-env_dpdk-add-rte_net-dependency.patch new file mode 100644 index 0000000000000000000000000000000000000000..a042ca9633698aade32f6bdadd1cdcc96d5995ea --- /dev/null +++ b/0006-lib-env_dpdk-add-rte_net-dependency.patch @@ -0,0 +1,50 @@ +From f8acbbb0ac154fa812e6297e86fad58381d4a163 Mon Sep 17 00:00:00 2001 +From: Tomasz Zawadzki +Date: Fri, 12 Feb 2021 03:45:16 -0500 +Subject: [PATCH 06/15] lib/env_dpdk: add rte_net dependency + +Vhost is enabled by default, so rte_net was always included. +When disabled, rte_power failed as it depends on rte_ethdev and rte_net. + +rte_vhost was only possible to enable on Linux, so there +is no conflict with adding it next to rte_power under this condition. + +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6398 (master) + +(cherry picked from commit 232f34d754e08b9673fd3585786ca8cd55653b85) +Change-Id: I2e183004d6457e404471740a0540dcb08aa738d8 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6430 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +--- + lib/env_dpdk/env.mk | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/env_dpdk/env.mk b/lib/env_dpdk/env.mk +index f44f515..292dd91 100644 +--- a/lib/env_dpdk/env.mk ++++ b/lib/env_dpdk/env.mk +@@ -51,7 +51,7 @@ DPDK_INC := -I$(DPDK_INC_DIR) + DPDK_LIB_LIST = rte_eal rte_mempool rte_ring rte_mbuf rte_pci rte_bus_pci rte_mempool_ring + + ifeq ($(OS),Linux) +-DPDK_LIB_LIST += rte_power rte_ethdev ++DPDK_LIB_LIST += rte_power rte_ethdev rte_net + endif + + # DPDK 20.05 eal dependency +@@ -101,7 +101,7 @@ endif + LINK_HASH=n + + ifeq ($(CONFIG_VHOST),y) +-DPDK_LIB_LIST += rte_vhost rte_net ++DPDK_LIB_LIST += rte_vhost + LINK_HASH=y + ifneq ($(DPDK_FRAMEWORK),y) + DPDK_LIB_LIST += rte_cryptodev +-- +1.8.3.1 + diff --git a/0007-pkg-add-python3-requires-in-spdk.spec.patch b/0007-pkg-add-python3-requires-in-spdk.spec.patch new file mode 100644 index 0000000000000000000000000000000000000000..71b7681033fa577936e9d319cc3175d89190f0bd --- /dev/null +++ b/0007-pkg-add-python3-requires-in-spdk.spec.patch @@ -0,0 +1,38 @@ +From 4eca99edc2e23b4d6250907b62e8feda66414fd9 Mon Sep 17 00:00:00 2001 +From: sunshihao520 +Date: Tue, 9 Feb 2021 15:45:30 +0800 +Subject: [PATCH 07/15] pkg: add python3 requires in spdk.spec + +When use rpm -i to install spdk-tools, it requires python3-configshell +and python3-pexpect. Add this requires to spec to avoid install failure. + +Signed-off-by: sunshihao +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6336 (master) + +(cherry picked from commit a4ee18886d728de55070fd8c08f947be4004c207) +Change-Id: I7fc7e9aab35c3fd730401282b72b1604f765a73f +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6431 +Tested-by: SPDK CI Jenkins +Reviewed-by: sunshihao +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +--- + pkg/spdk.spec | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/pkg/spdk.spec b/pkg/spdk.spec +index 23de4f8..0fc46e7 100644 +--- a/pkg/spdk.spec ++++ b/pkg/spdk.spec +@@ -32,6 +32,7 @@ BuildRequires: doxygen mscgen graphviz + # Install dependencies + Requires: dpdk >= 19.11, numactl-libs, openssl-libs + Requires: libiscsi, libaio, libuuid ++Requires: python3-configshell, python3-pexpect + # NVMe over Fabrics + Requires: librdmacm, librdmacm + Requires(post): /sbin/ldconfig +-- +1.8.3.1 + diff --git a/0008-sock-add-enable_quickack-and-enable_placement_id-whe.patch b/0008-sock-add-enable_quickack-and-enable_placement_id-whe.patch new file mode 100644 index 0000000000000000000000000000000000000000..334ff8cf1db190cf1faa6cad2b8bc498173e9a0f --- /dev/null +++ b/0008-sock-add-enable_quickack-and-enable_placement_id-whe.patch @@ -0,0 +1,36 @@ +From 830f0bab074f397bd13eec39fbef63b550a302b2 Mon Sep 17 00:00:00 2001 +From: Richael Zhuang +Date: Thu, 28 Jan 2021 17:19:15 +0800 +Subject: [PATCH 08/15] sock: add enable_quickack and enable_placement_id when + writing json config + +Signed-off-by: Richael Zhuang +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6144 (master) + +(cherry picked from commit c0a3cf7b88851cf51dff8145546dd3c7e2741c9d) +Change-Id: If67dcb6bf7b9742d2c96481057b472e31e87e87d +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6392 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +--- + lib/sock/sock.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/sock/sock.c b/lib/sock/sock.c +index ef4678f..8aa2817 100644 +--- a/lib/sock/sock.c ++++ b/lib/sock/sock.c +@@ -832,6 +832,8 @@ spdk_sock_write_config_json(struct spdk_json_write_ctx *w) + spdk_json_write_named_uint32(w, "send_buf_size", opts.send_buf_size); + spdk_json_write_named_bool(w, "enable_recv_pipe", opts.enable_recv_pipe); + spdk_json_write_named_bool(w, "enable_zerocopy_send", opts.enable_zerocopy_send); ++ spdk_json_write_named_bool(w, "enable_quickack", opts.enable_quickack); ++ spdk_json_write_named_bool(w, "enable_placement_id", opts.enable_placement_id); + spdk_json_write_object_end(w); + spdk_json_write_object_end(w); + } else { +-- +1.8.3.1 + diff --git a/0009-bdev-ocssd-Fix-the-bug-that-no-media-event-is-pushed.patch b/0009-bdev-ocssd-Fix-the-bug-that-no-media-event-is-pushed.patch new file mode 100644 index 0000000000000000000000000000000000000000..426d38feb364ef29b3bace75610c8db1a128f786 --- /dev/null +++ b/0009-bdev-ocssd-Fix-the-bug-that-no-media-event-is-pushed.patch @@ -0,0 +1,41 @@ +From 66ce3d8005f9a37f55c36146bb73476c6f6f1d22 Mon Sep 17 00:00:00 2001 +From: Shuhei Matsumoto +Date: Wed, 17 Feb 2021 20:57:38 +0900 +Subject: [PATCH 09/15] bdev/ocssd: Fix the bug that no media event is pushed + to the target bdev + +Recent refactoring added a critical bug that no media event is pushed +to the target bdev. + +Fix the bug by changing return to break. + +Signed-off-by: Shuhei Matsumoto +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6455 (master) + +(cherry picked from commit bd8de45801cc0b45dedddef6534cd35493163b29) +Change-Id: Ia674ea2c9c21d08dd23b50a0f726da55011d4be4 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6616 +Tested-by: SPDK CI Jenkins +Reviewed-by: Shuhei Matsumoto +Reviewed-by: Jim Harris +--- + module/bdev/nvme/bdev_ocssd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/module/bdev/nvme/bdev_ocssd.c b/module/bdev/nvme/bdev_ocssd.c +index 1cf1705..748b454 100644 +--- a/module/bdev/nvme/bdev_ocssd.c ++++ b/module/bdev/nvme/bdev_ocssd.c +@@ -967,7 +967,7 @@ bdev_ocssd_push_media_events(struct nvme_bdev_ns *nvme_ns, + TAILQ_FOREACH(nvme_bdev, &nvme_ns->bdevs, tailq) { + ocssd_bdev = SPDK_CONTAINEROF(nvme_bdev, struct ocssd_bdev, nvme_bdev); + if (bdev_ocssd_lba_in_range(ocssd_bdev, ocssd_ns, chunk_entry->lba)) { +- return; ++ break; + } + } + +-- +1.8.3.1 + diff --git a/0010-lib-iscsi-return-immediately-from-iscsi_parse_params.patch b/0010-lib-iscsi-return-immediately-from-iscsi_parse_params.patch new file mode 100644 index 0000000000000000000000000000000000000000..ba68b241786d297cee399ab4f850e4c61e924b97 --- /dev/null +++ b/0010-lib-iscsi-return-immediately-from-iscsi_parse_params.patch @@ -0,0 +1,128 @@ +From c2c8b7d986c86ff2ec031873d3b08e7e5eae22ea Mon Sep 17 00:00:00 2001 +From: Tomasz Zawadzki +Date: Mon, 8 Feb 2021 10:28:44 -0500 +Subject: [PATCH 10/15] lib/iscsi: return immediately from iscsi_parse_params + if len is 0 + +The spec does not disallow TEXT PDUs with no data. In that +case, just return immediately from iscsi_parse_params. + +This avoids a NULL pointer dereference with a TEXT PDU that has +no data, but CONTINUE flag is set. + +Signed-off-by: Tomasz Zawadzki +Signed-off-by: Jim Harris +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6319 (master) + +(cherry picked from commit f3fd56fc3c73ee7595bbe7c69cf8048fe2577e1a) +Change-Id: I2605293daf171633a45132d7b5532fdfc9128aff +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6601 +Tested-by: SPDK CI Jenkins +Reviewed-by: Shuhei Matsumoto +Reviewed-by: Jim Harris +--- + lib/iscsi/param.c | 10 +++++++++ + test/unit/lib/iscsi/iscsi.c/iscsi_ut.c | 38 ++++++++++++++++++++++++++++++++++ + test/unit/lib/iscsi/param.c/param_ut.c | 8 +++++++ + 3 files changed, 56 insertions(+) + +diff --git a/lib/iscsi/param.c b/lib/iscsi/param.c +index 1a353c4..ab2c9cd 100644 +--- a/lib/iscsi/param.c ++++ b/lib/iscsi/param.c +@@ -315,6 +315,16 @@ iscsi_parse_params(struct iscsi_param **params, const uint8_t *data, + char *p; + int i; + ++ /* Spec does not disallow TEXT PDUs with zero length, just return ++ * immediately in that case, since there is no param data to parse ++ * and any existing partial parameter would remain as-is. ++ */ ++ if (len == 0) { ++ return 0; ++ } ++ ++ assert(data != NULL); ++ + /* strip the partial text parameters if previous PDU have C enabled */ + if (partial_parameter && *partial_parameter) { + for (i = 0; i < len && data[i] != '\0'; i++) { +diff --git a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c +index c901e9e..56082a0 100644 +--- a/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c ++++ b/test/unit/lib/iscsi/iscsi.c/iscsi_ut.c +@@ -1993,6 +1993,43 @@ pdu_hdr_op_data_test(void) + g_task_pool_is_empty = false; + } + ++/* Test an ISCSI_OP_TEXT PDU with CONTINUE bit set but ++ * no data. ++ */ ++static void ++empty_text_with_cbit_test(void) ++{ ++ struct spdk_iscsi_sess sess = {}; ++ struct spdk_iscsi_conn conn = {}; ++ struct spdk_scsi_dev dev = {}; ++ struct spdk_iscsi_pdu *req_pdu; ++ int rc; ++ ++ req_pdu = iscsi_get_pdu(&conn); ++ ++ sess.ExpCmdSN = 0; ++ sess.MaxCmdSN = 64; ++ sess.session_type = SESSION_TYPE_NORMAL; ++ sess.MaxBurstLength = 1024; ++ ++ conn.full_feature = 1; ++ conn.sess = &sess; ++ conn.dev = &dev; ++ conn.state = ISCSI_CONN_STATE_RUNNING; ++ ++ memset(&req_pdu->bhs, 0, sizeof(req_pdu->bhs)); ++ req_pdu->bhs.opcode = ISCSI_OP_TEXT; ++ req_pdu->bhs.flags = ISCSI_TEXT_CONTINUE; ++ ++ rc = iscsi_pdu_hdr_handle(&conn, req_pdu); ++ CU_ASSERT(rc == 0); ++ CU_ASSERT(!req_pdu->is_rejected); ++ rc = iscsi_pdu_payload_handle(&conn, req_pdu); ++ CU_ASSERT(rc == 0); ++ ++ iscsi_put_pdu(req_pdu); ++} ++ + int + main(int argc, char **argv) + { +@@ -2024,6 +2061,7 @@ main(int argc, char **argv) + CU_ADD_TEST(suite, pdu_hdr_op_task_mgmt_test); + CU_ADD_TEST(suite, pdu_hdr_op_nopout_test); + CU_ADD_TEST(suite, pdu_hdr_op_data_test); ++ CU_ADD_TEST(suite, empty_text_with_cbit_test); + + CU_basic_set_mode(CU_BRM_VERBOSE); + CU_basic_run_tests(); +diff --git a/test/unit/lib/iscsi/param.c/param_ut.c b/test/unit/lib/iscsi/param.c/param_ut.c +index ccf6264..9b3e820 100644 +--- a/test/unit/lib/iscsi/param.c/param_ut.c ++++ b/test/unit/lib/iscsi/param.c/param_ut.c +@@ -264,6 +264,14 @@ parse_valid_test(void) + EXPECT_VAL("F", "IIII"); + CU_ASSERT_PTR_NULL(partial_parameter); + ++ /* partial parameter: NULL data */ ++ /* It is technically allowed to have a TEXT PDU with no data, yet ++ * CONTINUE bit is enabled - make sure we handle that case correctly. ++ */ ++ rc = iscsi_parse_params(¶ms, NULL, 0, true, &partial_parameter); ++ CU_ASSERT(rc == 0); ++ CU_ASSERT_PTR_NULL(partial_parameter); ++ + /* Second partial parameter is the only parameter */ + PARSE("OOOO", true, &partial_parameter); + CU_ASSERT_STRING_EQUAL(partial_parameter, "OOOO"); +-- +1.8.3.1 + diff --git a/0011-nbd-set-io-timeout.patch b/0011-nbd-set-io-timeout.patch new file mode 100644 index 0000000000000000000000000000000000000000..dba93722701e5669412dfae4b3ef22227b54e908 --- /dev/null +++ b/0011-nbd-set-io-timeout.patch @@ -0,0 +1,57 @@ +From b7a8bc02e3530adc92f5287285330d926f999b5a Mon Sep 17 00:00:00 2001 +From: Liu Xiaodong +Date: Mon, 1 Feb 2021 08:19:14 -0500 +Subject: [PATCH 11/15] nbd: set io timeout + +After setting io timeout, host can avoid nbd io +stuck or kernel hang occasionally caused by nbd +stop or underlying bdev removal. + +Signed-off-by: Liu Xiaodong +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6191 (master) + +(cherry picked from commit b7c33b5e610fd8894a0d4a67894f71c750f357d1) +Change-Id: I4ba2a0af7ff7bed369cdaf86121f082136dc1a0b +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6394 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +Reviewed-by: +--- + lib/nbd/nbd.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/lib/nbd/nbd.c b/lib/nbd/nbd.c +index 2da9066..3a9299d 100644 +--- a/lib/nbd/nbd.c ++++ b/lib/nbd/nbd.c +@@ -50,6 +50,7 @@ + #define GET_IO_LOOP_COUNT 16 + #define NBD_BUSY_WAITING_MS 1000 + #define NBD_BUSY_POLLING_INTERVAL_US 20000 ++#define NBD_IO_TIMEOUT_S 60 + + enum nbd_io_state_t { + /* Receiving or ready to receive nbd request header */ +@@ -922,6 +923,17 @@ nbd_start_complete(struct spdk_nbd_start_ctx *ctx) + goto err; + } + ++#ifdef NBD_SET_TIMEOUT ++ rc = ioctl(ctx->nbd->dev_fd, NBD_SET_TIMEOUT, NBD_IO_TIMEOUT_S); ++ if (rc == -1) { ++ SPDK_ERRLOG("ioctl(NBD_SET_TIMEOUT) failed: %s\n", spdk_strerror(errno)); ++ rc = -errno; ++ goto err; ++ } ++#else ++ SPDK_NOTICELOG("ioctl(NBD_SET_TIMEOUT) is not supported.\n"); ++#endif ++ + #ifdef NBD_FLAG_SEND_TRIM + rc = ioctl(ctx->nbd->dev_fd, NBD_SET_FLAGS, NBD_FLAG_SEND_TRIM); + if (rc == -1) { +-- +1.8.3.1 + diff --git a/0012-lib-util-Fix-valgrind-error-reported-on-ARM-platform.patch b/0012-lib-util-Fix-valgrind-error-reported-on-ARM-platform.patch new file mode 100644 index 0000000000000000000000000000000000000000..965e3d1a41a72124b14adada7ab34377b56a73da --- /dev/null +++ b/0012-lib-util-Fix-valgrind-error-reported-on-ARM-platform.patch @@ -0,0 +1,39 @@ +From 0765bbc3fbfa06a511eaf931468e813dfd787697 Mon Sep 17 00:00:00 2001 +From: Rui Chang +Date: Tue, 2 Feb 2021 10:18:47 +0800 +Subject: [PATCH 12/15] lib/util: Fix valgrind error reported on ARM platform + +Signed-off-by: Rui Chang +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6214 (master) + +(cherry picked from commit 1293377629ad9ae95373178c919dcbe7d0fc2a95) +Change-Id: I244a1b0350b4426666e390781b500de65d250c09 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6391 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +Reviewed-by: Aleksey Marchuk +Reviewed-by: Rui Chang +--- + lib/util/fd_group.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/util/fd_group.c b/lib/util/fd_group.c +index d3f9104..217ca43 100644 +--- a/lib/util/fd_group.c ++++ b/lib/util/fd_group.c +@@ -85,8 +85,8 @@ int + spdk_fd_group_add(struct spdk_fd_group *fgrp, + int efd, spdk_fd_fn fn, void *arg) + { +- struct event_handler *ehdlr; +- struct epoll_event epevent; ++ struct event_handler *ehdlr = NULL; ++ struct epoll_event epevent = {0}; + int rc; + + /* parameter checking */ +-- +1.8.3.1 + diff --git a/0013-lib-vhost-force-cpumask-to-be-subset-of-application-.patch b/0013-lib-vhost-force-cpumask-to-be-subset-of-application-.patch new file mode 100644 index 0000000000000000000000000000000000000000..f859da4e65289db16410fa08d7b54c24d1b26792 --- /dev/null +++ b/0013-lib-vhost-force-cpumask-to-be-subset-of-application-.patch @@ -0,0 +1,104 @@ +From c5bf8a0423325b96d7ede271965c117cd3790cde Mon Sep 17 00:00:00 2001 +From: Tomasz Zawadzki +Date: Mon, 1 Feb 2021 07:32:46 -0500 +Subject: [PATCH 13/15] lib/vhost: force cpumask to be subset of application's + CPU mask + +Documentation for vhost target states that CPU mask must be a subset +of application CPU mask. This wasn't enforced right now and allowed +the cpumask on controller creation so long as at least single +CPU core overlapped with application's CPU mask. + +This might have been misleading and covered up user configuration errors. + +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6212 (master) + +(cherry picked from commit b74363bcdfb6c0925dd01a24574c4fc82b22e58f) +Change-Id: I03f959ec37efd0be9b98cff9c93c5f996b04af35 +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6390 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +--- + lib/vhost/vhost.c | 11 +++++++++++ + test/unit/lib/vhost/vhost.c/vhost_ut.c | 4 ++++ + test/vhost/other/negative.sh | 10 ++++++++++ + 3 files changed, 25 insertions(+) + +diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c +index b3aee72..18c17b3 100644 +--- a/lib/vhost/vhost.c ++++ b/lib/vhost/vhost.c +@@ -888,6 +888,7 @@ static int + vhost_parse_core_mask(const char *mask, struct spdk_cpuset *cpumask) + { + int rc; ++ struct spdk_cpuset negative_vhost_mask; + + if (cpumask == NULL) { + return -1; +@@ -904,6 +905,16 @@ vhost_parse_core_mask(const char *mask, struct spdk_cpuset *cpumask) + return -1; + } + ++ spdk_cpuset_copy(&negative_vhost_mask, &g_vhost_core_mask); ++ spdk_cpuset_negate(&negative_vhost_mask); ++ spdk_cpuset_and(&negative_vhost_mask, cpumask); ++ ++ if (spdk_cpuset_count(&negative_vhost_mask) != 0) { ++ SPDK_ERRLOG("one of selected cpu is outside of core mask(=%s)\n", ++ spdk_cpuset_fmt(&g_vhost_core_mask)); ++ return -1; ++ } ++ + spdk_cpuset_and(cpumask, &g_vhost_core_mask); + + if (spdk_cpuset_count(cpumask) == 0) { +diff --git a/test/unit/lib/vhost/vhost.c/vhost_ut.c b/test/unit/lib/vhost/vhost.c/vhost_ut.c +index 79a6d20..45ce0a4 100644 +--- a/test/unit/lib/vhost/vhost.c/vhost_ut.c ++++ b/test/unit/lib/vhost/vhost.c/vhost_ut.c +@@ -269,6 +269,10 @@ create_controller_test(void) + + spdk_cpuset_set_cpu(&g_vhost_core_mask, 0, true); + ++ /* Create device with incorrect cpumask partially outside of application cpumask */ ++ ret = alloc_vdev(&vdev, "vdev_name_0", "0xff"); ++ SPDK_CU_ASSERT_FATAL(ret != 0); ++ + /* Create device with no name */ + ret = alloc_vdev(&vdev, NULL, "0x1"); + CU_ASSERT(ret != 0); +diff --git a/test/vhost/other/negative.sh b/test/vhost/other/negative.sh +index ab7fa9d..2c219e7 100755 +--- a/test/vhost/other/negative.sh ++++ b/test/vhost/other/negative.sh +@@ -93,6 +93,11 @@ if $rpc_py vhost_create_scsi_controller vhost.invalid.cpumask --cpumask 0x2; the + error "Creating scsi controller with incorrect cpumask succeeded, but it shouldn't" + fi + ++notice "Trying to create scsi controller with incorrect cpumask partially outside of application cpumask" ++if $rpc_py vhost_create_scsi_controller vhost.invalid.cpumask --cpumask 0xff; then ++ error "Creating scsi controller with incorrect cpumask succeeded, but it shouldn't" ++fi ++ + notice "Trying to remove device from nonexistent scsi controller" + if $rpc_py vhost_scsi_controller_remove_target vhost.nonexistent.name 0; then + error "Removing device from nonexistent scsi controller succeeded, but it shouldn't" +@@ -172,6 +177,11 @@ if $rpc_py vhost_create_blk_controller vhost.invalid.cpumask Malloc0 --cpumask 0 + error "Creating block controller with incorrect cpumask succeeded, but it shouldn't" + fi + ++notice "Trying to create block controller with incorrect cpumask partially outside of application cpumask" ++if $rpc_py vhost_create_blk_controller vhost.invalid.cpumask Malloc0 --cpumask 0xff; then ++ error "Creating block controller with incorrect cpumask succeeded, but it shouldn't" ++fi ++ + notice "Trying to remove nonexistent block controller" + if $rpc_py vhost_delete_controller vhost.nonexistent.name; then + error "Removing nonexistent block controller succeeded, but it shouldn't" +-- +1.8.3.1 + diff --git a/0014-autorun-allow-pass-configuration-file-path.patch b/0014-autorun-allow-pass-configuration-file-path.patch new file mode 100644 index 0000000000000000000000000000000000000000..93f6e45d3859c542d31e41b1e3a685a1435c4854 --- /dev/null +++ b/0014-autorun-allow-pass-configuration-file-path.patch @@ -0,0 +1,42 @@ +From 7cbc04ea01fd56bac975bf4c1a1634ff7e1a75f1 Mon Sep 17 00:00:00 2001 +From: Pawel Piatek +Date: Wed, 10 Feb 2021 05:47:39 +0100 +Subject: [PATCH 14/15] autorun: allow pass configuration file path + +Allow to pass configuration file as first parameter with +fallback to previous behaviour where config file is read +from home directory. + +Signed-off-by: Pawel Piatek +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6361 (master) + +(cherry picked from commit 23c8f667a22e0a6a79099765bfdf8256497a5028) +Change-Id: I45972b04fe5fc978bf3b2bede45aae363be3069c +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6545 +Tested-by: SPDK CI Jenkins +Reviewed-by: Pawel Piatek +Reviewed-by: Jim Harris +Reviewed-by: +Reviewed-by: Ben Walker +--- + autorun.sh | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/autorun.sh b/autorun.sh +index cdc27a3..c85fdb2 100755 +--- a/autorun.sh ++++ b/autorun.sh +@@ -4,7 +4,8 @@ set -e + + rootdir=$(readlink -f $(dirname $0)) + +-conf=~/autorun-spdk.conf ++default_conf=~/autorun-spdk.conf ++conf=${1:-${default_conf}} + + # If the configuration of tests is not provided, no tests will be carried out. + if [[ ! -f $conf ]]; then +-- +1.8.3.1 + diff --git a/0015-spdk_top-fix-app-crashing-on-tab-selection-with-TAB-.patch b/0015-spdk_top-fix-app-crashing-on-tab-selection-with-TAB-.patch new file mode 100644 index 0000000000000000000000000000000000000000..fbb2a1ca3dac472f249f9a9287bef047d5f655e1 --- /dev/null +++ b/0015-spdk_top-fix-app-crashing-on-tab-selection-with-TAB-.patch @@ -0,0 +1,63 @@ +From d1bc0054cdebc60d469e570610590c13c2234591 Mon Sep 17 00:00:00 2001 +From: Krzysztof Karas +Date: Thu, 4 Feb 2021 10:30:00 +0100 +Subject: [PATCH 15/15] spdk_top: fix app crashing on tab selection with TAB + key + +Fixes spdk_top crashing problem upon selecting a row in one tab, +then switching with TAB key to a different tab with fewer rows +and calling pop-up details window with ENTER key. + +Signed-off-by: Krzysztof Karas +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6367 (master) + +(cherry picked from commit 6a343482193bf728d3e82bd5b1994bf767533aef) +Change-Id: I52c5729eca0ce0eaad88767ff3add471a780140a +Signed-off-by: Tomasz Zawadzki +Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6729 +Tested-by: SPDK CI Jenkins +Reviewed-by: Jim Harris +Reviewed-by: Ben Walker +--- + app/spdk_top/spdk_top.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/app/spdk_top/spdk_top.c b/app/spdk_top/spdk_top.c +index c996235..402c2a5 100644 +--- a/app/spdk_top/spdk_top.c ++++ b/app/spdk_top/spdk_top.c +@@ -2027,6 +2027,7 @@ show_thread(uint8_t current_page) + + get_data(); + ++ assert(thread_number < g_threads_stats.threads.threads_count); + for (i = 0; i < g_threads_stats.threads.threads_count; i++) { + thread_info[i] = &g_threads_stats.threads.thread_info[i]; + } +@@ -2067,6 +2068,7 @@ show_core(uint8_t current_page) + + get_data(); + ++ assert(core_number < g_cores_stats.cores.cores_count); + for (i = 0; i < g_cores_stats.cores.cores_count; i++) { + core_info[i] = &g_cores_stats.cores.core[i]; + } +@@ -2178,6 +2180,7 @@ show_poller(uint8_t current_page) + get_data(); + + prepare_poller_data(current_page, pollers, &count, current_page); ++ assert(poller_number < count); + + poller_win = newwin(POLLER_WIN_HEIGHT, POLLER_WIN_WIDTH, + (g_max_row - poller_counter) / 2, (g_max_col - POLLER_WIN_HOR_POS) / 2); +@@ -2300,6 +2303,7 @@ show_stats(void) + } else { + active_tab = THREADS_TAB; + } ++ g_selected_row = 0; + current_page = 0; + switch_tab(active_tab); + break; +-- +1.8.3.1 + diff --git a/spdk.spec b/spdk.spec index 2fd264989ab2a087aaa6d2ec8fd3ce0c6ecfbef3..6ba8cd09ce0d0a6400bc3e58301bf9ab8dd2760c 100644 --- a/spdk.spec +++ b/spdk.spec @@ -4,12 +4,26 @@ Name: spdk Version: 21.01 -Release: 3 +Release: 4 Summary: Set of libraries and utilities for high performance user-mode storage License: BSD and MIT URL: http://spdk.io Source0: https://github.com/spdk/spdk/archive/v%{version}.tar.gz -Patch0: 0001-spdk-fix-the-deference-between-dpdk-19.11-and-dpdk-20.11.patch +Patch1: 0001-lib-env_dpdk-fix-the-enum-rte_kernel_driver-definiti.patch +Patch2: 0002-env_dpdk-add-rte_ethdev-dependency.patch +Patch3: 0003-pkg-spdk.spec-Add-ncurses-devel-to-BuildRequires.patch +Patch4: 0004-lib-vhost-Add-version-check-when-use-RTE_VHOST_USER_.patch +Patch5: 0005-lib-nvme-Remove-qpair-from-all-lists-before-freeing-.patch +Patch6: 0006-lib-env_dpdk-add-rte_net-dependency.patch +Patch7: 0007-pkg-add-python3-requires-in-spdk.spec.patch +Patch8: 0008-sock-add-enable_quickack-and-enable_placement_id-whe.patch +Patch9: 0009-bdev-ocssd-Fix-the-bug-that-no-media-event-is-pushed.patch +Patch10: 0010-lib-iscsi-return-immediately-from-iscsi_parse_params.patch +Patch11: 0011-nbd-set-io-timeout.patch +Patch12: 0012-lib-util-Fix-valgrind-error-reported-on-ARM-platform.patch +Patch13: 0013-lib-vhost-force-cpumask-to-be-subset-of-application-.patch +Patch14: 0014-autorun-allow-pass-configuration-file-path.patch +Patch15: 0015-spdk_top-fix-app-crashing-on-tab-selection-with-TAB-.patch %define package_version %{version}-%{release} @@ -170,6 +184,9 @@ mv doc/output/html/ %{install_docdir} %changelog +* Thu Jul 13 2021 Xiaokeng Li - 21.01-4 +- backport bugfix from upstream + * Wed Mar 29 2021 jeffery.Gao - 21.01-3 - set __python use python3 to avoid rpm build failed.