From 0b88dd3eafb643f397d7cd86d4ca41ea64bd0486 Mon Sep 17 00:00:00 2001 From: yanshuai01 Date: Wed, 10 Apr 2024 09:59:55 +0800 Subject: [PATCH] libdm: improve parallel create of control node --- ...rove-parallel-create-of-control-node.patch | 62 +++++++++++++++++++ lvm2.spec | 6 +- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 0034-improve-parallel-create-of-control-node.patch diff --git a/0034-improve-parallel-create-of-control-node.patch b/0034-improve-parallel-create-of-control-node.patch new file mode 100644 index 0000000..1338391 --- /dev/null +++ b/0034-improve-parallel-create-of-control-node.patch @@ -0,0 +1,62 @@ +From 7e14835a46a6c9e66087d6502d23df53c2a9954f Mon Sep 17 00:00:00 2001 +From: Zdenek Kabelac +Date: Sun, 12 Feb 2023 23:44:43 +0100 +Subject: [PATCH] libdm: improve parallel create of control node + +When two parallel commands would have tried to create our +/dev/mapper/control node at the same time, one of them could +actually fail even if the 2nd. command actually mknod() +this control node correctly. + +So for EEXIST case add detection if the control node is ok. + +This may possibly help with some race case in early boot. + +--- + device_mapper/ioctl/libdm-iface.c | 9 +++++++-- + libdm/ioctl/libdm-iface.c | 9 +++++++-- + 2 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/device_mapper/ioctl/libdm-iface.c b/device_mapper/ioctl/libdm-iface.c +index 533bb9e..2f8c872 100644 +--- a/device_mapper/ioctl/libdm-iface.c ++++ b/device_mapper/ioctl/libdm-iface.c +@@ -310,8 +310,13 @@ static int _create_control(const char *control, uint32_t major, uint32_t minor) + old_umask = umask(DM_CONTROL_NODE_UMASK); + if (mknod(control, S_IFCHR | S_IRUSR | S_IWUSR, + MKDEV(major, minor)) < 0) { +- log_sys_error("mknod", control); +- ret = 0; ++ if (errno != EEXIST) { ++ log_sys_error("mknod", control); ++ ret = 0; ++ } else if (_control_exists(control, major, minor) != 1) { ++ stack; /* Invalid control node created by parallel command ? */ ++ ret = 0; ++ } + } + umask(old_umask); + (void) dm_prepare_selinux_context(NULL, 0); +diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c +index 28589a1..7c99277 100644 +--- a/libdm/ioctl/libdm-iface.c ++++ b/libdm/ioctl/libdm-iface.c +@@ -309,8 +309,13 @@ static int _create_control(const char *control, uint32_t major, uint32_t minor) + old_umask = umask(DM_CONTROL_NODE_UMASK); + if (mknod(control, S_IFCHR | S_IRUSR | S_IWUSR, + MKDEV(major, minor)) < 0) { +- log_sys_error("mknod", control); +- ret = 0; ++ if (errno != EEXIST) { ++ log_sys_error("mknod", control); ++ ret = 0; ++ } else if (_control_exists(control, major, minor) != 1) { ++ stack; /* Invalid control node created by parallel command ? */ ++ ret = 0; ++ } + } + umask(old_umask); + (void) dm_prepare_selinux_context(NULL, 0); +-- +2.27.0 + diff --git a/lvm2.spec b/lvm2.spec index 1bb995c..c9353f5 100644 --- a/lvm2.spec +++ b/lvm2.spec @@ -43,7 +43,7 @@ Name: lvm2 Version: 2.03.14 -Release: 14 +Release: 15 Epoch: 8 Summary: Tools for logical volume management License: GPLv2+ and LGPLv2.1 and BSD @@ -82,6 +82,7 @@ Patch30: 0030-udev-create-symlinks-and-watch-even-in-suspended-sta.patch Patch31: 0031-udev-import-previous-results-of-blkid-when-in-suspen.patch Patch32: 0032-clean-up-group-struct-in-_stats_create_group-error-path.patch Patch33: 0033-dm-event-release-buffer-on-dm_event_get_version.patch +Patch34: 0034-improve-parallel-create-of-control-node.patch BuildRequires: gcc BuildRequires: gcc-c++ @@ -508,6 +509,9 @@ fi %changelog +* Wed Apr 10 2024 yanshuai - 8:2.03.14-15 +- libdm: improve parallel create of control node + * Fri Feb 2 2024 peng.zou - 8:2.03.14-14 - lvm2-lockd: add suport for ppc64le -- Gitee