]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Use proper block job name when reconnecting to VM
authorPeter Krempa <pkrempa@redhat.com>
Tue, 11 Jun 2019 14:42:53 +0000 (16:42 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 12 Jun 2019 07:40:02 +0000 (09:40 +0200)
The hash table returned by qemuMonitorGetAllBlockJobInfo is organized by
the frontend name (which skipps the 'drive-' prefix). While our code
properly matches the jobs to the disk, qemu needs the full job name
including the 'drive-' prefix to be able to identify jobs.

Fix this by adding an argument to qemuMonitorGetAllBlockJobInfo which
does not modify the job name before filling the hash.

This fixes a regression where users would not be able to cancel/pivot
block jobs after restarting libvirtd while a blockjob is running.

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

index a62cb668feb6b4baad4810c5ebe47665f6337272..83035df5b0ad20f26d8e49cb6eb640c43fe4825b 100644 (file)
@@ -5550,7 +5550,7 @@ qemuMigrationSrcFetchMirrorStats(virQEMUDriverPtr driver,
     if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
         return -1;
 
-    blockinfo = qemuMonitorGetAllBlockJobInfo(priv->mon);
+    blockinfo = qemuMonitorGetAllBlockJobInfo(priv->mon, false);
 
     if (qemuDomainObjExitMonitor(driver, vm) < 0 || !blockinfo)
         return -1;
index 39df201eca41a082c2de6d9cd82e6542d713cfc3..d9d076633d27ad658d86de1317050310f99bdb59 100644 (file)
@@ -3442,10 +3442,11 @@ qemuMonitorBlockJobSetSpeed(qemuMonitorPtr mon,
 
 
 virHashTablePtr
-qemuMonitorGetAllBlockJobInfo(qemuMonitorPtr mon)
+qemuMonitorGetAllBlockJobInfo(qemuMonitorPtr mon,
+                              bool rawjobname)
 {
     QEMU_CHECK_MONITOR_NULL(mon);
-    return qemuMonitorJSONGetAllBlockJobInfo(mon);
+    return qemuMonitorJSONGetAllBlockJobInfo(mon, rawjobname);
 }
 
 
@@ -3465,7 +3466,7 @@ qemuMonitorGetBlockJobInfo(qemuMonitorPtr mon,
 
     VIR_DEBUG("alias=%s, info=%p", alias, info);
 
-    if (!(all = qemuMonitorGetAllBlockJobInfo(mon)))
+    if (!(all = qemuMonitorGetAllBlockJobInfo(mon, false)))
         return -1;
 
     if ((data = virHashLookup(all, alias))) {
index 482d51c41d2e87e8c03c0f19baab7968fdc2d073..a19d6069c6242c729479b34c6897c386f89d78fc 100644 (file)
@@ -975,7 +975,8 @@ struct _qemuMonitorBlockJobInfo {
     int ready; /* -1 if unknown, 0 if not ready, 1 if ready */
 };
 
-virHashTablePtr qemuMonitorGetAllBlockJobInfo(qemuMonitorPtr mon);
+virHashTablePtr qemuMonitorGetAllBlockJobInfo(qemuMonitorPtr mon,
+                                              bool rawjobname);
 int qemuMonitorGetBlockJobInfo(qemuMonitorPtr mon,
                                const char *device,
                                qemuMonitorBlockJobInfoPtr info)
index 6b66f6ef55119cd7dac71d3ecda8a26bf5402eb2..2dcd65d86f48d83c02d1ba17652ce3c1abdfd891 100644 (file)
@@ -4662,7 +4662,8 @@ int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
 
 static int
 qemuMonitorJSONParseBlockJobInfo(virHashTablePtr blockJobs,
-                                 virJSONValuePtr entry)
+                                 virJSONValuePtr entry,
+                                 bool rawjobname)
 {
     qemuMonitorBlockJobInfoPtr info = NULL;
     const char *device;
@@ -4674,7 +4675,9 @@ qemuMonitorJSONParseBlockJobInfo(virHashTablePtr blockJobs,
                        _("entry was missing 'device'"));
         return -1;
     }
-    device = qemuAliasDiskDriveSkipPrefix(device);
+
+    if (!rawjobname)
+        device = qemuAliasDiskDriveSkipPrefix(device);
 
     if (VIR_ALLOC(info) < 0 ||
         virHashAddEntry(blockJobs, device, info) < 0) {
@@ -4724,7 +4727,8 @@ qemuMonitorJSONParseBlockJobInfo(virHashTablePtr blockJobs,
 }
 
 virHashTablePtr
-qemuMonitorJSONGetAllBlockJobInfo(qemuMonitorPtr mon)
+qemuMonitorJSONGetAllBlockJobInfo(qemuMonitorPtr mon,
+                                  bool rawjobname)
 {
     virJSONValuePtr cmd = NULL;
     virJSONValuePtr reply = NULL;
@@ -4756,7 +4760,7 @@ qemuMonitorJSONGetAllBlockJobInfo(qemuMonitorPtr mon)
                            _("missing array element"));
             goto error;
         }
-        if (qemuMonitorJSONParseBlockJobInfo(blockJobs, entry) < 0)
+        if (qemuMonitorJSONParseBlockJobInfo(blockJobs, entry, rawjobname) < 0)
             goto error;
     }
 
index 85d8f00fc04fc1ce3305615dc497459f90ee9256..2a881fbdddbfd589751f469fcc0d9eab18a56f4e 100644 (file)
@@ -317,7 +317,8 @@ int qemuMonitorJSONBlockJobSetSpeed(qemuMonitorPtr mon,
                                     unsigned long long speed)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
-virHashTablePtr qemuMonitorJSONGetAllBlockJobInfo(qemuMonitorPtr mon)
+virHashTablePtr qemuMonitorJSONGetAllBlockJobInfo(qemuMonitorPtr mon,
+                                                  bool rawjobname)
     ATTRIBUTE_NONNULL(1);
 
 int qemuMonitorJSONSetLink(qemuMonitorPtr mon,
index 50a76aa0ed2971900cc81d263736cd43803210ca..f114611e02c474f17538c76e4024ae3cdc881daf 100644 (file)
@@ -8011,7 +8011,7 @@ qemuProcessRefreshLegacyBlockjobs(virQEMUDriverPtr driver,
     int ret = -1;
 
     qemuDomainObjEnterMonitor(driver, vm);
-    blockJobs = qemuMonitorGetAllBlockJobInfo(qemuDomainGetMonitor(vm));
+    blockJobs = qemuMonitorGetAllBlockJobInfo(qemuDomainGetMonitor(vm), true);
     if (qemuDomainObjExitMonitor(driver, vm) < 0 || !blockJobs)
         goto cleanup;