]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
network: acquire a pidfile in the driver root directory
authorDaniel P. Berrangé <berrange@redhat.com>
Thu, 23 May 2019 10:34:08 +0000 (11:34 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Thu, 11 Jul 2019 11:46:20 +0000 (12:46 +0100)
When we allow multiple instances of the driver for the same user
account, using a separate root directory, we need to ensure mutual
exclusion. Use a pidfile to guarantee this.

In privileged libvirtd this ends up locking

   /var/run/libvirt/network/driver.pid

In unprivileged libvirtd this ends up locking

  /run/user/$UID/libvirt/network/run/driver.pid

NB, the latter can vary depending on $XDG_RUNTIME_DIR

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/network/bridge_driver.c
src/network/bridge_driver_platform.h

index 19faf7d51482fa78ebce65172fa7d1de74ec7d1c..6292e3b90a9e01aad15cc034328e68d2114239fd 100644 (file)
@@ -597,6 +597,7 @@ networkStateInitialize(bool privileged,
     if (VIR_ALLOC(network_driver) < 0)
         goto error;
 
+    network_driver->lockFD = -1;
     if (virMutexInit(&network_driver->lock) < 0) {
         VIR_FREE(network_driver);
         goto error;
@@ -651,6 +652,11 @@ networkStateInitialize(bool privileged,
         goto error;
     }
 
+    if ((network_driver->lockFD =
+         virPidFileAcquire(network_driver->stateDir, "driver",
+                           true, getpid())) < 0)
+        goto error;
+
     /* if this fails now, it will be retried later with dnsmasqCapsRefresh() */
     network_driver->dnsmasqCaps = dnsmasqCapsNewFromBinary(DNSMASQ);
 
@@ -764,6 +770,10 @@ networkStateCleanup(void)
     /* free inactive networks */
     virObjectUnref(network_driver->networks);
 
+    if (network_driver->lockFD != -1)
+        virPidFileRelease(network_driver->stateDir, "driver",
+                          network_driver->lockFD);
+
     VIR_FREE(network_driver->networkConfigDir);
     VIR_FREE(network_driver->networkAutostartDir);
     VIR_FREE(network_driver->stateDir);
index 1efa0d2af41d0538936ce26489a9dad21522885f..95993c5e314fd74aa8065e64a61fa69723d6ae57 100644 (file)
@@ -34,6 +34,9 @@ struct _virNetworkDriverState {
     /* Read-only */
     bool privileged;
 
+    /* pid file FD, ensures two copies of the driver can't use the same root */
+    int lockFD;
+
     /* Immutable pointer, self-locking APIs */
     virNetworkObjListPtr networks;