]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: domain: Allow overriding disk source in qemuDomainDetermineDiskChain
authorPeter Krempa <pkrempa@redhat.com>
Wed, 16 Jan 2019 14:33:07 +0000 (15:33 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 30 Jan 2019 16:20:38 +0000 (17:20 +0100)
When we need to detect a chain for a image which will become the new
source for a disk (e.g. after a disk media change or a blockjob) we'd
need to replace disk->src temporarily to do so.

Move the 'disksrc' temporary variable to an argument and adjust callers.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/qemu/qemu_blockjob.c
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 09a2975231a4b2b77c84333a680c9f4c67c0bd45..f19d44b04f3dfb7045b3d3970906b4cb5ceb52d6 100644 (file)
@@ -293,7 +293,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
     disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
     disk->src->id = 0;
     virStorageSourceBackingStoreClear(disk->src);
-    ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, true));
+    ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true));
     ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
     qemuBlockJobTerminate(job);
 }
index 1196f4eb19f94eac45e0d05df34f8514784a9deb..733a44de85564cefc7d95412bbf5cd96b3d11f95 100644 (file)
@@ -8991,14 +8991,27 @@ qemuDomainStorageAlias(const char *device, int depth)
 }
 
 
+/**
+ * qemuDomainDetermineDiskChain:
+ * @driver: qemu driver object
+ * @vm: domain object
+ * @disk: disk definition
+ * @disksrc: source to determine the chain for, may be NULL
+ * @report_broken: report broken chain verbosely
+ *
+ * Prepares and initializes the backing chain of disk @disk. In cases where
+ * a new source is to be associated with @disk the @disksrc parameter can be
+ * used to override the source. If @report_broken is true missing images
+ * in the backing chain are reported.
+ */
 int
 qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
                              virDomainDiskDefPtr disk,
+                             virStorageSourcePtr disksrc,
                              bool report_broken)
 {
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
-    virStorageSourcePtr disksrc = disk->src; /* disk source */
     virStorageSourcePtr src; /* iterator for the backing chain declared in XML */
     virStorageSourcePtr n; /* iterator for the backing chain detected from disk */
     qemuDomainObjPrivatePtr priv = vm->privateData;
@@ -9006,6 +9019,9 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
     uid_t uid;
     gid_t gid;
 
+    if (!disksrc)
+        disksrc = disk->src;
+
     if (virStorageSourceIsEmpty(disksrc)) {
         ret = 0;
         goto cleanup;
index defbffbf94ac33a87362d3de47fe1c83afc82fe1..e7c5a0a49ca2ff4a7111183e34ea97f0daef6125 100644 (file)
@@ -742,6 +742,7 @@ int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
 int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
                                  virDomainObjPtr vm,
                                  virDomainDiskDefPtr disk,
+                                 virStorageSourcePtr disksrc,
                                  bool report_broken);
 
 bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
index 46b2f758ca3b7b848dd23da020f61de1d3ae2f01..e14bd10c23de510cbe74791e9a3f2056214ac903 100644 (file)
@@ -17163,7 +17163,7 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
         oldsrc = disk->src;
         disk->src = disk->mirror;
 
-        if (qemuDomainDetermineDiskChain(driver, vm, disk, true) < 0)
+        if (qemuDomainDetermineDiskChain(driver, vm, disk, disk->mirror, true) < 0)
             goto cleanup;
 
         if (disk->mirror->format &&
index 6138ad8005574aa6617605e43c3625c30ea04ea3..ea46a01a87a7438a1f489bad30ee2221f9e0fb4a 100644 (file)
@@ -820,7 +820,7 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
 
     sharedAdded = true;
 
-    if (qemuDomainDetermineDiskChain(driver, vm, disk, true) < 0)
+    if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) < 0)
         goto cleanup;
 
     if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0)
@@ -1197,7 +1197,7 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriverPtr driver,
     if (qemuSetUnprivSGIO(dev) < 0)
         goto cleanup;
 
-    if (qemuDomainDetermineDiskChain(driver, vm, disk, true) < 0)
+    if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) < 0)
         goto cleanup;
 
     for (i = 0; i < vm->def->ndisks; i++) {
index 9ccc3601a256edc7bf3bc17f56d3421f98d45a31..fa83d9fc0e3ec63f1dd490b5c33f5982641615d2 100644 (file)
@@ -6210,7 +6210,7 @@ qemuProcessPrepareHostStorage(virQEMUDriverPtr driver,
         if (qemuDomainDiskIsMissingLocalOptional(disk) && cold_boot)
             VIR_INFO("optional disk '%s' source file is missing, "
                      "skip checking disk chain", disk->dst);
-        else if (qemuDomainDetermineDiskChain(driver, vm, disk, true) >= 0)
+        else if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) >= 0)
             continue;
 
         if (qemuDomainCheckDiskStartupPolicy(driver, vm, idx, cold_boot) >= 0)
@@ -8031,7 +8031,7 @@ qemuProcessReconnect(void *opaque)
              * qemuDomainDetermineDiskChain with @report_broken == false
              * to guarantee best-effort domain reconnect */
             virStorageSourceBackingStoreClear(disk->src);
-            if (qemuDomainDetermineDiskChain(driver, obj, disk, false) < 0)
+            if (qemuDomainDetermineDiskChain(driver, obj, disk, NULL, false) < 0)
                 goto error;
         } else {
             VIR_DEBUG("skipping backing chain detection for '%s'", disk->dst);