From 6215b036e72c2833feee0694a27ac4985868346a Mon Sep 17 00:00:00 2001 From: Erik Skultety Date: Wed, 18 Oct 2017 14:58:51 +0200 Subject: [PATCH] nodedev: udev: Unlock the private data before setting up 'system' node udevSetupSystemDev only needs the udev data lock to be locked because of calling udevGetDMIData which accesses some protected structure members, but it can do that on its own just fine, no need to hold the lock the whole time. Signed-off-by: Erik Skultety --- src/node_device/node_device_udev.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index e0e5ba7999..c5ff6a0887 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1719,6 +1719,7 @@ udevGetDMIData(virNodeDevCapSystemPtr syscap) virNodeDevCapSystemHardwarePtr hardware = &syscap->hardware; virNodeDevCapSystemFirmwarePtr firmware = &syscap->firmware; + virObjectLock(priv); udev = udev_monitor_get_udev(priv->udev_monitor); device = udev_device_new_from_syspath(udev, DMI_DEVPATH); @@ -1728,9 +1729,11 @@ udevGetDMIData(virNodeDevCapSystemPtr syscap) virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to get udev device for syspath '%s' or '%s'"), DMI_DEVPATH, DMI_DEVPATH_FALLBACK); + virObjectUnlock(priv); return; } } + virObjectUnlock(priv); if (udevGetStringSysfsAttr(device, "product_name", &syscap->product_name) < 0) @@ -1898,11 +1901,11 @@ nodeStateInitialize(bool privileged, if (priv->watch == -1) goto unlock; + virObjectUnlock(priv); + /* Create a fictional 'computer' device to root the device tree. */ if (udevSetupSystemDev() != 0) - goto unlock; - - virObjectUnlock(priv); + goto cleanup; /* Populate with known devices */ if (udevEnumerateDevices(udev) != 0)