]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Detect managed persistent reservations in block job orphan chains
authorPeter Krempa <pkrempa@redhat.com>
Thu, 21 Mar 2019 12:54:20 +0000 (13:54 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 18 Jul 2019 15:59:34 +0000 (17:59 +0200)
The PR manager is a property of the format layer in qemu so we need to
be able to track it also in the chains of orphaned block jobs.

Add a helper for qemu to look also into the blockjob state.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c
src/qemu/qemu_hotplug.c
src/qemu/qemu_process.c

index fc8deb70842befdfc4a20109ededff91aff4c162..e7f28aa2b87881718e7504a2b2ca8bece5f2fe93 100644 (file)
@@ -14780,3 +14780,44 @@ qemuDomainPausedReasonToSuspendedEvent(virDomainPausedReason reason)
 
     return VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
 }
+
+
+static int
+qemuDomainDefHasManagedPRBlockjobIterator(void *payload,
+                                          const void *name ATTRIBUTE_UNUSED,
+                                          void *opaque)
+{
+    qemuBlockJobDataPtr job = payload;
+    bool *hasPR = opaque;
+
+    if (job->disk)
+        return 0;
+
+    if ((job->chain && virStorageSourceChainHasManagedPR(job->chain)) ||
+        (job->mirrorChain && virStorageSourceChainHasManagedPR(job->mirrorChain)))
+        *hasPR = true;
+
+    return 0;
+}
+
+
+/**
+ * qemuDomainDefHasManagedPR:
+ * @vm: domain object
+ *
+ * @vm must be an active VM. Returns true if @vm has any storage source with
+ * managed persistent reservations.
+ */
+bool
+qemuDomainDefHasManagedPR(virDomainObjPtr vm)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    bool jobPR = false;
+
+    if (virDomainDefHasManagedPR(vm->def))
+        return true;
+
+    virHashForEach(priv->blockjobs, qemuDomainDefHasManagedPRBlockjobIterator, &jobPR);
+
+    return jobPR;
+}
index b0bff0b01decf5ee184c15207132cc8a80361ab4..b0c465cb225c173f6dd1995854b442b118f14f9a 100644 (file)
@@ -1146,6 +1146,8 @@ qemuDomainDiskCachemodeFlags(int cachemode,
 
 char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv);
 
+bool qemuDomainDefHasManagedPR(virDomainObjPtr vm);
+
 unsigned int qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv);
 void qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv);
 
index 44c7042d77ef455bbfba126ceefe7a5671ff69ba..329c166255ba70e140cc0d3bf0c0790b4766ac4f 100644 (file)
@@ -4792,7 +4792,7 @@ processPRDisconnectEvent(virDomainObjPtr vm)
         return;
 
     if (!priv->prDaemonRunning &&
-        virDomainDefHasManagedPR(vm->def))
+        qemuDomainDefHasManagedPR(vm))
         qemuProcessStartManagedPRDaemon(vm);
 }
 
index 7e9c1a164957ee8fe2f81f701f2d2002b4baa2d6..c50e41144e63da8ab68354f130778c976372cf0b 100644 (file)
@@ -397,7 +397,7 @@ qemuHotplugRemoveManagedPR(virQEMUDriverPtr driver,
     virErrorPtr orig_err;
     int ret = -1;
 
-    if (virDomainDefHasManagedPR(vm->def))
+    if (qemuDomainDefHasManagedPR(vm))
         return 0;
 
     virErrorPreserveLast(&orig_err);
index a2fe287f35fe326f35911f28a1fa010bd03440c0..f3ffd76259fe8446d7bd15770e5e04e3c78b6c73 100644 (file)
@@ -2309,7 +2309,7 @@ qemuRefreshPRManagerState(virQEMUDriverPtr driver,
     int ret = -1;
 
     if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_PR_MANAGER_HELPER) ||
-        !virDomainDefHasManagedPR(vm->def))
+        !qemuDomainDefHasManagedPR(vm))
         return 0;
 
     qemuDomainObjEnterMonitor(driver, vm);