From 14ba72b640576c52b4120dc03a67ce4cc380f27f Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 3 May 2013 12:00:15 +0100 Subject: [PATCH] Fix release of resources with lockd plugin 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 | 36 +++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c index 4b72a05ab2..a53812830f 100644 --- a/src/locking/lock_driver_lockd.c +++ b/src/locking/lock_driver_lockd.c @@ -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; + for (i = 0 ; i < priv->nresources ; i++) { + virLockSpaceProtocolReleaseResourceArgs args; - 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; + 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;