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(a)redhat.com>
---
src/qemu/qemu_process.c | 10 ++++++++++
1 file changed, 10 insertions(+)
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);
--
2.48.1