From: David Allan Date: Wed, 3 Feb 2010 15:56:33 +0000 (+0100) Subject: Fix locking for udev device add/remove X-Git-Tag: v0.7.6~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d42b9b4e8f15581bd611ee6aa0cc37c201ff6e7;p=thirdparty%2Flibvirt.git Fix locking for udev device add/remove The original udev node device backend neglected to lock the driverState struct containing the device list when adding and removing devices * src/node_device/node_device_udev.c: add necessary locks in udevRemoveOneDevice() and udevAddOneDevice() --- diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index 2bc2d32a35..be765c416d 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1190,7 +1190,9 @@ static int udevRemoveOneDevice(struct udev_device *device) int ret = 0; name = udev_device_get_syspath(device); + nodeDeviceLock(driverState); dev = virNodeDeviceFindBySysfsPath(&driverState->devs, name); + if (dev != NULL) { VIR_DEBUG("Removing device '%s' with sysfs path '%s'", dev->def->name, name); @@ -1200,6 +1202,7 @@ static int udevRemoveOneDevice(struct udev_device *device) name); ret = -1; } + nodeDeviceUnlock(driverState); return ret; } @@ -1288,7 +1291,10 @@ static int udevAddOneDevice(struct udev_device *device) goto out; } + nodeDeviceLock(driverState); dev = virNodeDeviceAssignDef(NULL, &driverState->devs, def); + nodeDeviceUnlock(driverState); + if (dev == NULL) { VIR_ERROR("Failed to create device for '%s'", def->name); virNodeDeviceDefFree(def);