]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuProcessHandleIOError: Populate I/O error reason to virStorageSource
authorPeter Krempa <pkrempa@redhat.com>
Mon, 27 Jan 2025 18:17:16 +0000 (19:17 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 4 Feb 2025 13:40:55 +0000 (14:40 +0100)
Record the last I/O error reason and timestamp which happened with the
corresponding virStorageSource struct.

This will later allow querying the last error e.g. via the
virDomainGetMessages() API.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_process.c

index 4497d089d085a6294d3418561fde3c173794b99d..d73c52542b1909f873d817885b8aa08a45ea5fd3 100644 (file)
@@ -840,6 +840,7 @@ qemuProcessHandleIOError(qemuMonitor *mon G_GNUC_UNUSED,
     const char *eventReason = "";
     virDomainDiskDef *disk = NULL;
     virStorageSource *src = NULL;
+    g_autofree char *timestamp = NULL;
 
     virObjectLock(vm);
     priv = QEMU_DOMAIN_PRIVATE(vm);
@@ -865,6 +866,15 @@ qemuProcessHandleIOError(qemuMonitor *mon G_GNUC_UNUSED,
     ioErrorEvent = virDomainEventIOErrorNewFromObj(vm, eventPath, eventAlias, action);
     ioErrorEvent2 = virDomainEventIOErrorReasonNewFromObj(vm, eventPath, eventAlias, action, eventReason);
 
+    if ((timestamp = virTimeStringNow()) != NULL) {
+        if (src) {
+            g_free(src->ioerror_timestamp);
+            g_free(src->ioerror_message);
+            src->ioerror_timestamp = g_steal_pointer(&timestamp);
+            src->ioerror_message = g_strdup(reason);
+        }
+    }
+
     if (action == VIR_DOMAIN_EVENT_IO_ERROR_PAUSE &&
         virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
         VIR_WARN("Transitioned guest %s to paused state due to IO error", vm->def->name);