From 30626ed15b239c424ae891f096057a696eadd715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Fri, 22 Jan 2021 11:44:32 +0000 Subject: [PATCH] qemu: add ability to associate a string message with taint warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel P. Berrangé --- src/qemu/qemu_domain.c | 47 +++++++++++++++++++++++++++++++++++------- src/qemu/qemu_domain.h | 7 +++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e60f814e36..38bdcf08f1 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -6197,22 +6197,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; + g_autofree char *extra = NULL; + const char *extraprefix = ""; + const char *extramsg = ""; + const char *extrasuffix = ""; + va_list args; - if (!virDomainObjTaint(obj, taint)) - return; + 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 @@ -6224,16 +6253,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,