https://bugzilla.redhat.com/show_bug.cgi?id=1226234#c3
After hot-plug a memory device success, the audit log show
that memory update failed:
type=VIRT_RESOURCE ... old-mem=1024000 new-mem=1548288 \
exe="/usr/sbin/libvirtd" hostname=? addr=? terminal=pts/2 res=failed
This is because the ret is still -1 when we call audit function to help
Also we need audit when hot-plug/hot-unplug get failed in qemu side.
And i notice we use virDomainDefGetMemoryActual to get the newmem
, but when we failed to attach the memory device we the virDomainDefGetMemoryActual
will still output the oldmem size, so the audit log will not right
in that case.
Signed-off-by: Luyao Huang <lhuang(a)redhat.com>
---
src/qemu/qemu_hotplug.c | 30 +++++++++++++-----------------
1 file changed, 13 insertions(+), 17 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 1ea397f..cf7ffa9 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1745,6 +1745,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
qemuDomainObjPrivatePtr priv = vm->privateData;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
unsigned long long oldmem = virDomainDefGetMemoryActual(vm->def);
+ unsigned long long newmem = oldmem + mem->size;
char *devstr = NULL;
char *objalias = NULL;
const char *backendType;
@@ -1800,7 +1801,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
/* we shouldn't touch mem now, as the def might be freed */
mem = NULL;
- goto cleanup;
+ goto audit;
}
event = virDomainEventDeviceAddedNewFromObj(vm, objalias);
@@ -1811,9 +1812,6 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
if (fix_balloon)
vm->def->mem.cur_balloon += mem->size;
- virDomainAuditMemory(vm, oldmem, virDomainDefGetMemoryActual(vm->def),
- "update", ret == 0);
-
/* mem is consumed by vm->def */
mem = NULL;
@@ -1823,6 +1821,8 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
ret = 0;
+ audit:
+ virDomainAuditMemory(vm, oldmem, newmem, "update", ret == 0);
cleanup:
virObjectUnref(cfg);
VIR_FREE(devstr);
@@ -1833,7 +1833,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
removedef:
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
mem = NULL;
- goto cleanup;
+ goto audit;
}
if ((id = virDomainMemoryFindByDef(vm->def, mem)) >= 0)
@@ -1841,7 +1841,7 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
else
mem = NULL;
- goto cleanup;
+ goto audit;
}
@@ -2904,11 +2904,11 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver,
{
qemuDomainObjPrivatePtr priv = vm->privateData;
unsigned long long oldmem = virDomainDefGetMemoryActual(vm->def);
+ unsigned long long newmem = oldmem - mem->size;
virObjectEventPtr event;
char *backendAlias = NULL;
int rc;
int idx;
- int ret = -1;
VIR_DEBUG("Removing memory device %s from domain %p %s",
mem->info.alias, vm, vm->def->name);
@@ -2917,27 +2917,23 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver,
qemuDomainEventQueue(driver, event);
if (virAsprintf(&backendAlias, "mem%s", mem->info.alias) < 0)
- goto cleanup;
+ return -1;
qemuDomainObjEnterMonitor(driver, vm);
rc = qemuMonitorDelObject(priv->mon, backendAlias);
+ VIR_FREE(backendAlias);
if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
- goto cleanup;
+ return -1;
vm->def->mem.cur_balloon -= mem->size;
+ virDomainAuditMemory(vm, oldmem, newmem, "update", rc == 0);
+
if ((idx = virDomainMemoryFindByDef(vm->def, mem)) >= 0)
virDomainMemoryRemove(vm->def, idx);
virDomainMemoryDefFree(mem);
- ret = 0;
-
- cleanup:
- virDomainAuditMemory(vm, oldmem, virDomainDefGetMemoryActual(vm->def),
- "update", ret == 0);
-
- VIR_FREE(backendAlias);
- return ret;
+ return 0;
}
--
1.8.3.1