]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Fix release of resources with lockd plugin
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 3 May 2013 11:00:15 +0000 (12:00 +0100)
committerEric Blake <eblake@redhat.com>
Mon, 6 May 2013 20:19:47 +0000 (14:19 -0600)
The lockd plugin for the lock manager was not correctly
handling the release of resource locks. This meant that
during migration, or when pausing a VM, the locks would
not get released. This in turn made it impossible to
resume the domain, or finish migration
(cherry picked from commit 8dc93ffadcca0cc9813ba04036b7139922c55400)

src/locking/lock_driver_lockd.c

index 4b72a05ab2762822ed1012ece0d1284fa81c3b8a..a53812830f1db1141c1e41ef52ea55185927dc58 100644 (file)
@@ -774,10 +774,11 @@ static int virLockManagerLockDaemonRelease(virLockManagerPtr lock,
     virNetClientPtr client = NULL;
     virNetClientProgramPtr program = NULL;
     int counter = 0;
-    virLockSpaceProtocolReleaseResourceArgs args;
     int rv = -1;
+    size_t i;
+    virLockManagerLockDaemonPrivatePtr priv = lock->privateData;
 
-    memset(&args, 0, sizeof(args));
+    virCheckFlags(0, -1);
 
     if (state)
         *state = NULL;
@@ -785,16 +786,29 @@ static int virLockManagerLockDaemonRelease(virLockManagerPtr lock,
     if (!(client = virLockManagerLockDaemonConnect(lock, &program, &counter)))
         goto cleanup;
 
-    args.flags = flags;
-
-    if (virNetClientProgramCall(program,
-                                client,
-                                counter++,
-                                VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE,
-                                0, NULL, NULL, NULL,
-                                (xdrproc_t)xdr_virLockSpaceProtocolReleaseResourceArgs, &args,
-                                (xdrproc_t)xdr_void, NULL) < 0)
-        goto cleanup;
+    for (i = 0 ; i < priv->nresources ; i++) {
+        virLockSpaceProtocolReleaseResourceArgs args;
+
+        memset(&args, 0, sizeof(args));
+
+        if (priv->resources[i].lockspace)
+            args.path = priv->resources[i].lockspace;
+        args.name = priv->resources[i].name;
+        args.flags = priv->resources[i].flags;
+
+        args.flags &=
+            ~(VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED |
+              VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE);
+
+        if (virNetClientProgramCall(program,
+                                    client,
+                                    counter++,
+                                    VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE,
+                                    0, NULL, NULL, NULL,
+                                    (xdrproc_t)xdr_virLockSpaceProtocolReleaseResourceArgs, &args,
+                                    (xdrproc_t)xdr_void, NULL) < 0)
+            goto cleanup;
+    }
 
     rv = 0;