https://bugzilla.redhat.com/show_bug.cgi?id=1226234#c3
We use virDomainDefGetMemoryActual to get the newmem
, but when we failed to remove the memory device, 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 | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index def3de8..f4b6178 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -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,12 +2917,18 @@ 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);
- if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
- goto cleanup;
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ rc = -1;
+
+ VIR_FREE(backendAlias);
+
+ virDomainAuditMemory(vm, oldmem, newmem, "update", rc == 0);
+ if (rc < 0)
+ return -1;
vm->def->mem.cur_balloon -= mem->size;
@@ -2930,14 +2936,7 @@ qemuDomainRemoveMemoryDevice(virQEMUDriverPtr driver,
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