From: Peter Krempa Date: Mon, 27 Jan 2025 18:17:16 +0000 (+0100) Subject: qemuProcessHandleIOError: Populate I/O error reason to virStorageSource X-Git-Tag: v11.1.0-rc1~128 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=300f7e9bd4ee4e043cac1a84059fe4a60b101cf1;p=thirdparty%2Flibvirt.git qemuProcessHandleIOError: Populate I/O error reason to virStorageSource 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 Reviewed-by: Daniel P. BerrangĂ© --- diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 4497d089d0..d73c52542b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -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(×tamp); + 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);