[libvirt] [PATCHv2 2/2] qemu: fix the audit log is not correct after hot-unplug memory device

Luyao Huang lhuang at redhat.com
Thu Aug 13 14:15:28 UTC 2015


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 at 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




More information about the libvir-list mailing list