Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
---
 src/qemu/qemu_domain.c | 49 ++++++++++++++++++++++++++++++++++--------
 src/qemu/qemu_domain.h |  7 ++++++
 2 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index dd79cfd9d9..e63bea8b32 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6166,22 +6166,51 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver,
                         virDomainObjPtr obj,
                         virDomainTaintFlags taint,
                         qemuDomainLogContextPtr logCtxt)
+{
+    qemuDomainObjTaintMsg(driver, obj, taint, logCtxt, NULL);
+}
+
+void qemuDomainObjTaintMsg(virQEMUDriverPtr driver,
+                           virDomainObjPtr obj,
+                           virDomainTaintFlags taint,
+                           qemuDomainLogContextPtr logCtxt,
+                           const char *fmt, ...)
 {
     virErrorPtr orig_err = NULL;
     g_autofree char *timestamp = NULL;
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     int rc;
-
-    if (!virDomainObjTaint(obj, taint))
-        return;
+    g_autofree char *extra = NULL;
+    const char *extraprefix = "";
+    const char *extramsg = "";
+    const char *extrasuffix = "";
+    va_list args;
+
+    if (virDomainObjTaint(obj, taint)) {
+        /* If an extra message was given we must always
+         * emit the taint warning, otherwise it is a
+         * one-time only warning per VM
+         */
+        if (!fmt)
+            return;
+    }
 
     virUUIDFormat(obj->def->uuid, uuidstr);
 
-    VIR_WARN("Domain id=%d name='%s' uuid=%s is tainted: %s",
+    if (fmt) {
+        va_start(args, fmt);
+        extraprefix = " (";
+        extramsg = extra = g_strdup_vprintf(fmt, args);
+        extrasuffix = ")";
+        va_end(args);
+    }
+
+    VIR_WARN("Domain id=%d name='%s' uuid=%s is tainted: %s%s%s%s",
              obj->def->id,
              obj->def->name,
              uuidstr,
-             virDomainTaintTypeToString(taint));
+             virDomainTaintTypeToString(taint),
+             extraprefix, extramsg, extrasuffix);
 
     /* We don't care about errors logging taint info, so
      * preserve original error, and clear any error that
@@ -6193,16 +6222,18 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver,
 
     if (logCtxt) {
         rc = qemuDomainLogContextWrite(logCtxt,
-                                       "%s: Domain id=%d is tainted: %s\n",
+                                       "%s: Domain id=%d is tainted: 
%s%s%s%s\n",
                                        timestamp,
                                        obj->def->id,
-                                       virDomainTaintTypeToString(taint));
+                                       virDomainTaintTypeToString(taint),
+                                       extraprefix, extramsg, extrasuffix);
     } else {
         rc = qemuDomainLogAppendMessage(driver, obj,
-                                        "%s: Domain id=%d is tainted: %s\n",
+                                        "%s: Domain id=%d is tainted: 
%s%s%s%s\n",
                                         timestamp,
                                         obj->def->id,
-                                        virDomainTaintTypeToString(taint));
+                                        virDomainTaintTypeToString(taint),
+                                        extraprefix, extramsg, extrasuffix);
     }
 
     if (rc < 0)
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 154339ef8f..7453881a31 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -565,6 +565,13 @@ void qemuDomainObjTaint(virQEMUDriverPtr driver,
                         virDomainTaintFlags taint,
                         qemuDomainLogContextPtr logCtxt);
 
+void qemuDomainObjTaintMsg(virQEMUDriverPtr driver,
+                           virDomainObjPtr obj,
+                           virDomainTaintFlags taint,
+                           qemuDomainLogContextPtr logCtxt,
+                           const char *msg,
+                           ...) G_GNUC_PRINTF(5, 6);
+
 void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
                              virDomainObjPtr obj,
                              qemuDomainLogContextPtr logCtxt,
-- 
2.29.2

Reply via email to