[PATCH v1] qemu: save status xml after generating taint message

Kristina Hanicova khanicov at redhat.com
Tue Jul 27 12:35:59 UTC 2021


We didn't always save status xml after generating new taint
message, which resulted in it being deleted in case of a libvirtd
restart.  Some taint messages were preserved thanks to saving
status xml separately at the end of the calling functions (which
makes sense, because qemuDomainObjTaint was usually called there
multiple times).  But for special cases (e.g. When only few taint
messages are generated) we need a separate function for
generating them and saving status xml explicitly.

Resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=1965589

Signed-off-by: Kristina Hanicova <khanicov at redhat.com>
---
 src/qemu/qemu_domain.c | 11 +++++++++++
 src/qemu/qemu_domain.h |  5 +++++
 src/qemu/qemu_driver.c |  4 ++--
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 7e2efc8168..ce55ac39c1 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6464,6 +6464,17 @@ void qemuDomainObjTaint(virQEMUDriver *driver,
     qemuDomainObjTaintMsg(driver, obj, taint, logCtxt, NULL);
 }
 
+void qemuDomainObjTaintAndSave(virQEMUDriver *driver,
+                               virDomainObj *obj,
+                               virDomainTaintFlags taint,
+                               qemuDomainLogContext *logCtxt)
+{
+    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+
+    qemuDomainObjTaintMsg(driver, obj, taint, logCtxt, NULL);
+    ignore_value(virDomainObjSave(obj, driver->xmlopt, cfg->stateDir));
+}
+
 void qemuDomainObjTaintMsg(virQEMUDriver *driver,
                            virDomainObj *obj,
                            virDomainTaintFlags taint,
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index acf6ca5ab6..9bd711cbd4 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -568,6 +568,11 @@ void qemuDomainObjTaint(virQEMUDriver *driver,
                         virDomainTaintFlags taint,
                         qemuDomainLogContext *logCtxt);
 
+void qemuDomainObjTaintAndSave(virQEMUDriver *driver,
+                               virDomainObj *obj,
+                               virDomainTaintFlags taint,
+                               qemuDomainLogContext *logCtxt);
+
 void qemuDomainObjTaintMsg(virQEMUDriver *driver,
                            virDomainObj *obj,
                            virDomainTaintFlags taint,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0b35bbc15c..195c0ba7a0 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -14010,7 +14010,7 @@ static int qemuDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
 
     priv = vm->privateData;
 
-    qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR, NULL);
+    qemuDomainObjTaintAndSave(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR, NULL);
 
     hmp = !!(flags & VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP);
 
@@ -16877,7 +16877,7 @@ qemuDomainQemuAgentCommand(virDomainPtr domain,
     if (!qemuDomainAgentAvailable(vm, true))
         goto endjob;
 
-    qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_GA_COMMAND, NULL);
+    qemuDomainObjTaintAndSave(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_GA_COMMAND, NULL);
 
     agent = qemuDomainObjEnterAgent(vm);
     ret = qemuAgentArbitraryCommand(agent, cmd, &result, timeout);
-- 
2.31.1




More information about the libvir-list mailing list