]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Make checks in qemuDomainBlockPivot depend on data of the job
authorPeter Krempa <pkrempa@redhat.com>
Tue, 12 Feb 2019 12:29:46 +0000 (13:29 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 25 Jul 2019 11:21:32 +0000 (13:21 +0200)
Do decisions based on the configuration of the job rather than the data
stored with the disk.

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

index 49dd6f433e6ac38f3501562ea783f00c4fd53351..87a05b871875638e7f210679e06637509434328c 100644 (file)
@@ -16979,17 +16979,30 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
     int ret = -1;
     qemuDomainObjPrivatePtr priv = vm->privateData;
 
-    if (!disk->mirror) {
+    switch ((qemuBlockJobType) job->type) {
+    case QEMU_BLOCKJOB_TYPE_NONE:
+    case QEMU_BLOCKJOB_TYPE_LAST:
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("invalid job type '%d'"), job->type);
+        goto cleanup;
+
+    case QEMU_BLOCKJOB_TYPE_PULL:
+    case QEMU_BLOCKJOB_TYPE_COMMIT:
+    case QEMU_BLOCKJOB_TYPE_INTERNAL:
         virReportError(VIR_ERR_OPERATION_INVALID,
-                       _("pivot of disk '%s' requires an active copy job"),
-                       disk->dst);
+                       _("job type '%s' does not support pivot"),
+                       qemuBlockjobTypeToString(job->type));
         goto cleanup;
+
+    case QEMU_BLOCKJOB_TYPE_COPY:
+    case QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT:
+        break;
     }
 
-    if (disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_READY) {
+    if (job->state != QEMU_BLOCKJOB_STATE_READY) {
         virReportError(VIR_ERR_BLOCK_COPY_ACTIVE,
-                       _("disk '%s' not ready for pivot yet"),
-                       disk->dst);
+                       _("block job '%s' not ready for pivot yet"),
+                       job->name);
         goto cleanup;
     }
 
@@ -17014,7 +17027,8 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
     if (ret < 0)
         goto cleanup;
 
-    disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT;
+    if (disk && disk->mirror)
+        disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT;
 
  cleanup:
     return ret;