[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 14/14] qemu_hotplug: Hotunplug of reservations



Just line in previous commit, if we are the last ones that are
using the pr-manager delete it and also kill the pr-helper
process.

Signed-off-by: Michal Privoznik <mprivozn redhat com>
---
 src/qemu/qemu_domain.c  | 18 ++++++++++++++++++
 src/qemu/qemu_domain.h  |  4 ++++
 src/qemu/qemu_hotplug.c | 13 +++++++++++++
 3 files changed, 35 insertions(+)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index c327dfc86..d15c29f4a 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -11263,6 +11263,24 @@ qemuDomainGetPRUsageCount(const virDomainDef *def,
 }
 
 
+bool
+qemuDomainDiskNeedRemovePR(virDomainObjPtr vm,
+                           virDomainDiskDefPtr disk)
+{
+    qemuDomainStorageSourcePrivatePtr srcPriv;
+
+    if (!disk->src)
+        return false;
+
+    srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(disk->src);
+    if (!srcPriv ||
+        !srcPriv->prAlias)
+        return false;
+
+    return qemuDomainGetPRUsageCount(vm->def, srcPriv->prAlias) == 1;
+}
+
+
 static int
 qemuDomainPrepareDiskPR(qemuDomainObjPrivatePtr priv,
                         virDomainDiskDefPtr disk)
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 231583256..6f33d3f36 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -1015,4 +1015,8 @@ size_t
 qemuDomainGetPRUsageCount(const virDomainDef *def,
                           const char *prAlias);
 
+bool
+qemuDomainDiskNeedRemovePR(virDomainObjPtr vm,
+                           virDomainDiskDefPtr disk);
+
 #endif /* __QEMU_DOMAIN_H__ */
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index ded666633..e2064648b 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3825,6 +3825,7 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
     char *drivestr;
     char *objAlias = NULL;
     char *encAlias = NULL;
+    const char *prAlias = NULL;
 
     VIR_DEBUG("Removing disk %s from domain %p %s",
               disk->info.alias, vm, vm->def->name);
@@ -3862,6 +3863,13 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
         }
     }
 
+    if (qemuDomainDiskNeedRemovePR(vm, disk)) {
+        qemuDomainStorageSourcePrivatePtr srcPriv;
+
+        srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(disk->src);
+        prAlias = srcPriv->prAlias;
+    }
+
     qemuDomainObjEnterMonitor(driver, vm);
 
     qemuMonitorDriveDel(priv->mon, drivestr);
@@ -3877,6 +3885,9 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
         ignore_value(qemuMonitorDelObject(priv->mon, encAlias));
     VIR_FREE(encAlias);
 
+    if (prAlias)
+        ignore_value(qemuMonitorDelObject(priv->mon, prAlias));
+
     if (disk->src->haveTLS)
         ignore_value(qemuMonitorDelObject(priv->mon, disk->src->tlsAlias));
 
@@ -3895,6 +3906,8 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
         }
     }
 
+    qemuDestroyPRDefObject(vm, disk);
+
     qemuDomainReleaseDeviceAddress(vm, &disk->info, src);
 
     if (qemuSecurityRestoreDiskLabel(driver, vm, disk) < 0)
-- 
2.13.6


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]