diff --git a/src/locking/domain_lock.c b/src/locking/domain_lock.c
index d7b681e74e..705b132457 100644
--- a/src/locking/domain_lock.c
+++ b/src/locking/domain_lock.c
@@ -104,7 +104,8 @@ static int virDomainLockManagerAddImage(virLockManagerPtr lock,
static virLockManagerPtr virDomainLockManagerNew(virLockManagerPluginPtr plugin,
const char *uri,
virDomainObjPtr dom,
- bool withResources)
+ bool withResources,
+ unsigned int flags)
{
virLockManagerPtr lock;
size_t i;
@@ -138,7 +139,7 @@ static virLockManagerPtr virDomainLockManagerNew(virLockManagerPluginPtr plugin,
VIR_LOCK_MANAGER_OBJECT_TYPE_DOMAIN,
ARRAY_CARDINALITY(params),
params,
- 0)))
+ flags)))
goto error;
if (withResources) {
@@ -177,7 +178,8 @@ int virDomainLockProcessStart(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p paused=%d fd=%p",
plugin, dom, paused, fd);
- if (!(lock = virDomainLockManagerNew(plugin, uri, dom, true)))
+ if (!(lock = virDomainLockManagerNew(plugin, uri, dom, true,
+ VIR_LOCK_MANAGER_NEW_STARTED)))
return -1;
if (paused)
@@ -201,7 +203,7 @@ int virDomainLockProcessPause(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p state=%p",
plugin, dom, state);
- if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, true)))
+ if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, true, 0)))
return -1;
ret = virLockManagerRelease(lock, state, 0);
@@ -221,7 +223,7 @@ int virDomainLockProcessResume(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p state=%s",
plugin, dom, NULLSTR(state));
- if (!(lock = virDomainLockManagerNew(plugin, uri, dom, true)))
+ if (!(lock = virDomainLockManagerNew(plugin, uri, dom, true, 0)))
return -1;
ret = virLockManagerAcquire(lock, state, 0, dom->def->onLockFailure, NULL);
@@ -240,7 +242,7 @@ int virDomainLockProcessInquire(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p state=%p",
plugin, dom, state);
- if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, true)))
+ if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, true, 0)))
return -1;
ret = virLockManagerInquire(lock, state, 0);
@@ -260,7 +262,7 @@ int virDomainLockImageAttach(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p src=%p", plugin, dom, src);
- if (!(lock = virDomainLockManagerNew(plugin, uri, dom, false)))
+ if (!(lock = virDomainLockManagerNew(plugin, uri, dom, false, 0)))
return -1;
if (virDomainLockManagerAddImage(lock, src) < 0)
@@ -297,7 +299,7 @@ int virDomainLockImageDetach(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p src=%p", plugin, dom, src);
- if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, false)))
+ if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, false, 0)))
return -1;
if (virDomainLockManagerAddImage(lock, src) < 0)
@@ -334,7 +336,7 @@ int virDomainLockLeaseAttach(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p lease=%p",
plugin, dom, lease);
- if (!(lock = virDomainLockManagerNew(plugin, uri, dom, false)))
+ if (!(lock = virDomainLockManagerNew(plugin, uri, dom, false, 0)))
return -1;
if (virDomainLockManagerAddLease(lock, lease) < 0)
@@ -362,7 +364,7 @@ int virDomainLockLeaseDetach(virLockManagerPluginPtr plugin,
VIR_DEBUG("plugin=%p dom=%p lease=%p",
plugin, dom, lease);
- if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, false)))
+ if (!(lock = virDomainLockManagerNew(plugin, NULL, dom, false, 0)))
return -1;
if (virDomainLockManagerAddLease(lock, lease) < 0)
diff --git a/src/locking/lock_driver.h b/src/locking/lock_driver.h
index a7d97820ec..f8fd38edee 100644
--- a/src/locking/lock_driver.h
+++ b/src/locking/lock_driver.h
@@ -65,6 +65,11 @@ typedef enum {
VIR_LOCK_MANAGER_ACQUIRE_RESTRICT = (1 << 1),
} virLockManagerAcquireFlags;
+typedef enum {
+ /* virLockManagerNew called for a freshly started domain */
+ VIR_LOCK_MANAGER_NEW_STARTED = (1 << 0),
+} virLockManagerNewFlags;
+
enum {
VIR_LOCK_MANAGER_PARAM_TYPE_STRING,
VIR_LOCK_MANAGER_PARAM_TYPE_CSTRING,
@@ -142,13 +147,18 @@ typedef int (*virLockDriverDeinit)(void);
* @type: the type of process to be supervised
* @nparams: number of metadata parameters
* @params: extra metadata parameters
- * @flags: optional flags, currently unused
+ * @flags: bitwise-OR of virLockManagerNewFlags
*
* Initialize a new context to supervise a process, usually
* a virtual machine. The lock driver implementation can use
* the privateData
field of man
* to store a pointer to any driver specific state.
*
+ * If @flags contains VIR_LOCK_MANAGER_NEW_STARTED, this API is called for
+ * a domain that has just been started and may therefore skip some actions.
+ * Specifically, checking whether the domain is registered with a lock
+ * daemon is useless in this case.
+ *
* A process of VIR_LOCK_MANAGER_START_DOMAIN will be
* given the following parameters
*
diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
index 2fa4923048..72a4a0c98e 100644
--- a/src/locking/lock_driver_lockd.c
+++ b/src/locking/lock_driver_lockd.c
@@ -439,7 +439,7 @@ static int virLockManagerLockDaemonNew(virLockManagerPtr lock,
virLockManagerLockDaemonPrivatePtr priv;
size_t i;
- virCheckFlags(0, -1);
+ virCheckFlags(VIR_LOCK_MANAGER_NEW_STARTED, -1);
if (VIR_ALLOC(priv) < 0)
return -1;
diff --git a/src/locking/lock_driver_sanlock.c b/src/locking/lock_driver_sanlock.c
index 60f305c43b..dbe79bcb66 100644
--- a/src/locking/lock_driver_sanlock.c
+++ b/src/locking/lock_driver_sanlock.c
@@ -455,7 +455,7 @@ static int virLockManagerSanlockNew(virLockManagerPtr lock,
size_t i;
int resCount = 0;
- virCheckFlags(0, -1);
+ virCheckFlags(VIR_LOCK_MANAGER_NEW_STARTED, -1);
if (!driver) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@@ -497,8 +497,11 @@ static int virLockManagerSanlockNew(virLockManagerPtr lock,
* if it returns any other error (rv < 0), then we cannot fail due
* to back-compat. So this whole call is non-fatal, because it's
* called from all over the place (it will usually fail). It merely
- * updates privateData. */
- if (sanlock_inquire(-1, priv->vm_pid, 0, &resCount, NULL) >= 0)
+ * updates privateData.
+ * If the process has just been started, we are pretty sure it is not
+ * registered. */
+ if (!(flags & VIR_LOCK_MANAGER_NEW_STARTED) &&
+ sanlock_inquire(-1, priv->vm_pid, 0, &resCount, NULL) >= 0)
priv->registered = true;
lock->privateData = priv;
diff --git a/src/locking/lock_manager.c b/src/locking/lock_manager.c
index f277f22cba..a002ea836e 100644
--- a/src/locking/lock_manager.c
+++ b/src/locking/lock_manager.c
@@ -287,7 +287,7 @@ virLockDriverPtr virLockManagerPluginGetDriver(virLockManagerPluginPtr plugin)
* virLockManagerNew:
* @driver: the lock manager implementation to use
* @type: the type of process to be supervised
- * @flags: optional flags, currently unused
+ * @flags: bitwise-OR of virLockManagerNewFlags
*
* Create a new context to supervise a process, usually
* a virtual machine.