]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix locking for udev device add/remove
authorDavid Allan <dallan@redhat.com>
Wed, 3 Feb 2010 15:56:33 +0000 (16:56 +0100)
committerDaniel Veillard <veillard@redhat.com>
Wed, 3 Feb 2010 15:56:33 +0000 (16:56 +0100)
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()

src/node_device/node_device_udev.c

index 2bc2d32a35abffeff480d1fe53b14e4c4d4cf497..be765c416dc8b5c7c6c76392b4750882b62afbe2 100644 (file)
@@ -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);