From 557fe55a1c0c6f913cfa41c0b42b7d2fbb70c55a Mon Sep 17 00:00:00 2001 From: Michal Privoznik <mprivozn@redhat.com> Date: Tue, 13 Apr 2021 10:45:24 +0200 Subject: [PATCH 060/108] nodedev: Mark device initialization complete even in case of an error To speed up nodedev driver initialization, the device enumeration is done in a separate thread. Once finished, the thread sets a boolean variable that allows public APIs to be called (instead of waiting for the thread to finish). However, if there's an error in the device enumeration thread then the control jumps over at the 'error' label and the boolean is never set. This means, that any virNodeDev*() API is stuck forever. Mark the initialization as complete (the thread is quitting anyway) and let the APIs proceed. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Erik Skultety <eskultet@redhat.com> (cherry picked from commit 54d97f020b6349b9e3e1cb966078625dcdd964a8) --- src/node_device/node_device_udev.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index 000494f9e3..e65979c1b6 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1747,6 +1747,7 @@ nodeStateInitializeEnumerate(void *opaque) if (udevEnumerateDevices(udev) != 0) goto error; + cleanup: nodeDeviceLock(); driver->initialized = true; virCondBroadcast(&driver->initCond); @@ -1761,6 +1762,8 @@ nodeStateInitializeEnumerate(void *opaque) priv->threadQuit = true; virCondSignal(&priv->threadCond); virObjectUnlock(priv); + + goto cleanup; } -- 2.33.0