]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: monitor: Handle BLOCK_IO_ERROR event properly with -blockdev
authorPeter Krempa <pkrempa@redhat.com>
Mon, 13 Aug 2018 15:02:38 +0000 (17:02 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 21 Aug 2018 13:46:06 +0000 (15:46 +0200)
Use the 'node-name' provided in the event if 'device' is empty to look
up the disk.

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

index cdfcbcea0b75bac1552c9bc511640f0ddc540800..49dc478f5b6f642c44edbbf5b3419dda3c73d63c 100644 (file)
@@ -1421,6 +1421,7 @@ qemuMonitorEmitWatchdog(qemuMonitorPtr mon, int action)
 int
 qemuMonitorEmitIOError(qemuMonitorPtr mon,
                        const char *diskAlias,
+                       const char *nodename,
                        int action,
                        const char *reason)
 {
@@ -1428,7 +1429,7 @@ qemuMonitorEmitIOError(qemuMonitorPtr mon,
     VIR_DEBUG("mon=%p", mon);
 
     QEMU_MONITOR_CALLBACK(mon, ret, domainIOError, mon->vm,
-                          diskAlias, action, reason);
+                          diskAlias, nodename, action, reason);
     return ret;
 }
 
index 1c66459e69768de913b7f86dff56a7eb6bf4a3e5..70854497b2b8542c58fe741f5809189c23113b0f 100644 (file)
@@ -155,6 +155,7 @@ typedef int (*qemuMonitorDomainWatchdogCallback)(qemuMonitorPtr mon,
 typedef int (*qemuMonitorDomainIOErrorCallback)(qemuMonitorPtr mon,
                                                 virDomainObjPtr vm,
                                                 const char *diskAlias,
+                                                const char *nodename,
                                                 int action,
                                                 const char *reason,
                                                 void *opaque);
@@ -383,6 +384,7 @@ int qemuMonitorEmitRTCChange(qemuMonitorPtr mon, long long offset);
 int qemuMonitorEmitWatchdog(qemuMonitorPtr mon, int action);
 int qemuMonitorEmitIOError(qemuMonitorPtr mon,
                            const char *diskAlias,
+                           const char *nodename,
                            int action,
                            const char *reason);
 int qemuMonitorEmitGraphics(qemuMonitorPtr mon,
index 64a662ba16b6f30210c1a2e183dea11c14e889dc..2cbe85f290e9ecd4dbb9080cc1864db40ccae784 100644 (file)
@@ -765,6 +765,7 @@ static void
 qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
 {
     const char *device;
+    const char *nodename;
     const char *action;
     const char *reason = "";
     bool nospc = false;
@@ -782,6 +783,8 @@ qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
     if ((device = virJSONValueObjectGetString(data, "device")) == NULL)
         VIR_WARN("missing device in disk io error event");
 
+    nodename = virJSONValueObjectGetString(data, "node-name");
+
     if (virJSONValueObjectGetBoolean(data, "nospace", &nospc) == 0 && nospc)
         reason = "enospc";
 
@@ -790,7 +793,7 @@ qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
         actionID = VIR_DOMAIN_EVENT_IO_ERROR_NONE;
     }
 
-    qemuMonitorEmitIOError(mon, device, actionID, reason);
+    qemuMonitorEmitIOError(mon, device, nodename, actionID, reason);
 }
 
 
index a1e619ef969d821ffa8086cbd307773184cfb0aa..b2dddb64752e5fc4745dbdd2ed2b726e315c33d2 100644 (file)
@@ -855,6 +855,7 @@ static int
 qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
                          virDomainObjPtr vm,
                          const char *diskAlias,
+                         const char *nodename,
                          int action,
                          const char *reason,
                          void *opaque)
@@ -869,7 +870,16 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
 
     virObjectLock(vm);
-    disk = qemuProcessFindDomainDiskByAliasOrQOM(vm, diskAlias, NULL);
+
+    if (*diskAlias == '\0')
+        diskAlias = NULL;
+
+    if (diskAlias)
+        disk = qemuProcessFindDomainDiskByAliasOrQOM(vm, diskAlias, NULL);
+    else if (nodename)
+        disk = qemuDomainDiskLookupByNodename(vm->def, nodename, NULL, NULL);
+    else
+        disk = NULL;
 
     if (disk) {
         srcPath = virDomainDiskGetSource(disk);