[PATCH 1/3] qemu: add a 'chain' parameter to nbdkit start/stop

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

 



This will allow us to start or stop nbdkit for just a single disk source
or for every source in the backing chain. This will be used in following
patches.

Signed-off-by: Jonathon Jongsma <jjongsma@xxxxxxxxxx>
---
 src/qemu/qemu_extdevice.c |  8 +++---
 src/qemu/qemu_hotplug.c   |  6 ++---
 src/qemu/qemu_nbdkit.c    | 51 ++++++++++++++++++++++++++++++---------
 src/qemu/qemu_nbdkit.h    |  6 +++--
 4 files changed, 51 insertions(+), 20 deletions(-)

diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c
index 3cf3867056..ed5976d1f7 100644
--- a/src/qemu/qemu_extdevice.c
+++ b/src/qemu/qemu_extdevice.c
@@ -234,12 +234,12 @@ qemuExtDevicesStart(virQEMUDriver *driver,
 
     for (i = 0; i < def->ndisks; i++) {
         virDomainDiskDef *disk = def->disks[i];
-        if (qemuNbdkitStartStorageSource(driver, vm, disk->src) < 0)
+        if (qemuNbdkitStartStorageSource(driver, vm, disk->src, true) < 0)
             return -1;
     }
 
     if (def->os.loader && def->os.loader->nvram) {
-        if (qemuNbdkitStartStorageSource(driver, vm, def->os.loader->nvram) < 0)
+        if (qemuNbdkitStartStorageSource(driver, vm, def->os.loader->nvram, true) < 0)
             return -1;
     }
 
@@ -297,11 +297,11 @@ qemuExtDevicesStop(virQEMUDriver *driver,
 
     for (i = 0; i < def->ndisks; i++) {
         virDomainDiskDef *disk = def->disks[i];
-        qemuNbdkitStopStorageSource(disk->src, vm);
+        qemuNbdkitStopStorageSource(disk->src, vm, true);
     }
 
     if (def->os.loader && def->os.loader->nvram)
-        qemuNbdkitStopStorageSource(def->os.loader->nvram, vm);
+        qemuNbdkitStopStorageSource(def->os.loader->nvram, vm, true);
 }
 
 
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 31b00e05ca..e67673b762 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1018,7 +1018,7 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver,
         if (qemuHotplugAttachManagedPR(vm, disk->src, VIR_ASYNC_JOB_NONE) < 0)
             goto cleanup;
 
-        if (qemuNbdkitStartStorageSource(driver, vm, disk->src) < 0)
+        if (qemuNbdkitStartStorageSource(driver, vm, disk->src, true) < 0)
             goto cleanup;
     }
 
@@ -1045,7 +1045,7 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver *driver,
         if (virStorageSourceChainHasManagedPR(disk->src))
             ignore_value(qemuHotplugRemoveManagedPR(vm, VIR_ASYNC_JOB_NONE));
 
-        qemuNbdkitStopStorageSource(disk->src, vm);
+        qemuNbdkitStopStorageSource(disk->src, vm, true);
     }
     qemuDomainSecretDiskDestroy(disk);
     qemuDomainCleanupStorageSourceFD(disk->src);
@@ -4562,7 +4562,7 @@ qemuDomainRemoveDiskDevice(virQEMUDriver *driver,
         qemuHotplugRemoveManagedPR(vm, VIR_ASYNC_JOB_NONE) < 0)
         goto cleanup;
 
-    qemuNbdkitStopStorageSource(disk->src, vm);
+    qemuNbdkitStopStorageSource(disk->src, vm, true);
 
     if (disk->transient) {
         VIR_DEBUG("Removing transient overlay '%s' of disk '%s'",
diff --git a/src/qemu/qemu_nbdkit.c b/src/qemu/qemu_nbdkit.c
index 1c72b6fe6a..39f9c58a48 100644
--- a/src/qemu/qemu_nbdkit.c
+++ b/src/qemu/qemu_nbdkit.c
@@ -893,18 +893,34 @@ qemuNbdkitInitStorageSource(qemuNbdkitCaps *caps WITHOUT_NBDKIT_UNUSED,
 }
 
 
+static int
+qemuNbdkitStartStorageSourceOne(virQEMUDriver *driver,
+                                virDomainObj *vm,
+                                virStorageSource *src)
+{
+    qemuDomainStorageSourcePrivate *priv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src);
+
+    if (priv && priv->nbdkitProcess &&
+        qemuNbdkitProcessStart(priv->nbdkitProcess, vm, driver) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 int
 qemuNbdkitStartStorageSource(virQEMUDriver *driver,
                              virDomainObj *vm,
-                             virStorageSource *src)
+                             virStorageSource *src,
+                             bool chain)
 {
     virStorageSource *backing;
 
-    for (backing = src; backing != NULL; backing = backing->backingStore) {
-        qemuDomainStorageSourcePrivate *priv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(backing);
+    if (!chain)
+        return qemuNbdkitStartStorageSourceOne(driver, vm, src);
 
-        if (priv && priv->nbdkitProcess &&
-            qemuNbdkitProcessStart(priv->nbdkitProcess, vm, driver) < 0)
+    for (backing = src; backing != NULL; backing = backing->backingStore) {
+        if (qemuNbdkitStartStorageSourceOne(driver, vm, backing) < 0)
             return -1;
     }
 
@@ -912,18 +928,31 @@ qemuNbdkitStartStorageSource(virQEMUDriver *driver,
 }
 
 
+static void
+qemuNbdkitStopStorageSourceOne(virStorageSource *src,
+                               virDomainObj *vm)
+{
+    qemuDomainStorageSourcePrivate *priv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src);
+
+    if (priv && priv->nbdkitProcess &&
+        qemuNbdkitProcessStop(priv->nbdkitProcess, vm) < 0)
+        VIR_WARN("Unable to stop nbdkit for storage source '%s'",
+                 qemuBlockStorageSourceGetStorageNodename(src));
+}
+
+
 void
 qemuNbdkitStopStorageSource(virStorageSource *src,
-                            virDomainObj *vm)
+                            virDomainObj *vm,
+                            bool chain)
 {
     virStorageSource *backing;
 
-    for (backing = src; backing != NULL; backing = backing->backingStore) {
-        qemuDomainStorageSourcePrivate *priv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(backing);
+    if (! chain)
+        return qemuNbdkitStopStorageSourceOne(src, vm);
 
-        if (priv && priv->nbdkitProcess &&
-            qemuNbdkitProcessStop(priv->nbdkitProcess, vm) < 0)
-            VIR_WARN("Unable to stop nbdkit for storage source '%s'", qemuBlockStorageSourceGetStorageNodename(src));
+    for (backing = src; backing != NULL; backing = backing->backingStore) {
+        qemuNbdkitStopStorageSourceOne(backing, vm);
     }
 }
 
diff --git a/src/qemu/qemu_nbdkit.h b/src/qemu/qemu_nbdkit.h
index 853b2cca6f..637bf962a7 100644
--- a/src/qemu/qemu_nbdkit.h
+++ b/src/qemu/qemu_nbdkit.h
@@ -63,11 +63,13 @@ qemuNbdkitReconnectStorageSource(virStorageSource *source,
 int
 qemuNbdkitStartStorageSource(virQEMUDriver *driver,
                              virDomainObj *vm,
-                             virStorageSource *src);
+                             virStorageSource *src,
+                             bool chain);
 
 void
 qemuNbdkitStopStorageSource(virStorageSource *src,
-                            virDomainObj *vm);
+                            virDomainObj *vm,
+                            bool chain);
 
 int
 qemuNbdkitStorageSourceManageProcess(virStorageSource *src,
-- 
2.43.0
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux