Signed-off-by: Daniel P. Berrangé <berrange(a)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