From 7e14835a46a6c9e66087d6502d23df53c2a9954f Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Sun, 12 Feb 2023 23:44:43 +0100 Subject: 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. --- libdm/ioctl/libdm-iface.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'libdm') diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c index dfa91b866..2e2da8b99 100644 --- a/libdm/ioctl/libdm-iface.c +++ b/libdm/ioctl/libdm-iface.c @@ -311,8 +311,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); -- cgit v1.2.1