[libvirt] [PATCH 3/3] Ensure hotplug / monitor commands log taint warnings

Daniel P. Berrange berrange at redhat.com
Wed May 4 11:28:48 UTC 2011


Open the domain log file for hotplug and custom monitor command
usage to write taint warnings.

* src/qemu/qemu_domain.c, src/qemu/qemu_domain.h: Add
  qemuDomainOpenLogWrite/qemuDomainOpenLogRead methods
* src/qemu/qemu_process.c: Remove qemuProcessOpenLogFD
  and qemuProcessReadLogFD methods (moved to qemu_domain)
* src/qemu/qemu_process.c: Open log in hotplug and qemu
  monitor command functions
---
 src/qemu/qemu_domain.c  |   80 ++++++++++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_domain.h  |    5 +++
 src/qemu/qemu_driver.c  |   16 +++++++--
 src/qemu/qemu_process.c |   81 ++---------------------------------------------
 4 files changed, 101 insertions(+), 81 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 78839cc..202340f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -33,8 +33,10 @@
 #include "cpu/cpu.h"
 #include "ignore-value.h"
 #include "uuid.h"
+#include "files.h"
 
 #include <sys/time.h>
+#include <fcntl.h>
 
 #include <libxml/xpathInternals.h>
 
@@ -699,6 +701,84 @@ cleanup:
     return ret;
 }
 
+
+int
+qemuDomainOpenLogWrite(struct qemud_driver *driver,
+                       virDomainObjPtr vm, bool append)
+{
+    char *logfile;
+    mode_t logmode;
+    int fd = -1;
+
+    if (virAsprintf(&logfile, "%s/%s.log", driver->logDir, vm->def->name) < 0) {
+        virReportOOMError();
+        return -1;
+    }
+
+    logmode = O_CREAT | O_WRONLY;
+    /* Only logrotate files in /var/log, so only append if running privileged */
+    if (driver->privileged || append)
+        logmode |= O_APPEND;
+    else
+        logmode |= O_TRUNC;
+
+    if ((fd = open(logfile, logmode, S_IRUSR | S_IWUSR)) < 0) {
+        virReportSystemError(errno,
+                             _("failed to create logfile %s"),
+                             logfile);
+        VIR_FREE(logfile);
+        return -1;
+    }
+    VIR_FREE(logfile);
+    if (virSetCloseExec(fd) < 0) {
+        virReportSystemError(errno, "%s",
+                             _("Unable to set VM logfile close-on-exec flag"));
+        VIR_FORCE_CLOSE(fd);
+        return -1;
+    }
+    return fd;
+}
+
+
+int
+qemuDomainOpenLogRead(struct qemud_driver *driver,
+                      virDomainObjPtr vm, off_t pos)
+{
+    char *logfile;
+    mode_t logmode = O_RDONLY;
+    int fd = -1;
+
+    if (virAsprintf(&logfile, "%s/%s.log", driver->logDir, vm->def->name) < 0) {
+        virReportOOMError();
+        return -1;
+    }
+
+    if ((fd = open(logfile, logmode)) < 0) {
+        virReportSystemError(errno,
+                             _("failed to create logfile %s"),
+                             logfile);
+        VIR_FREE(logfile);
+        return -1;
+    }
+    if (virSetCloseExec(fd) < 0) {
+        virReportSystemError(errno, "%s",
+                             _("Unable to set VM logfile close-on-exec flag"));
+        VIR_FORCE_CLOSE(fd);
+        VIR_FREE(logfile);
+        return -1;
+    }
+    if (pos < 0 || lseek(fd, pos, SEEK_SET) < 0) {
+        virReportSystemError(pos < 0 ? 0 : errno,
+                             _("Unable to seek to %lld in %s"),
+                             (long long) pos, logfile);
+        VIR_FORCE_CLOSE(fd);
+    }
+    VIR_FREE(logfile);
+    return fd;
+}
+
+
+
 void qemuDomainObjTaint(virDomainObjPtr obj,
                         int taint,
                         int logFD)
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index dbef4e1..cab7991 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -112,6 +112,11 @@ char *qemuDomainFormatXML(struct qemud_driver *driver,
                           virDomainObjPtr vm,
                           int flags);
 
+int qemuDomainOpenLogWrite(struct qemud_driver *driver,
+                           virDomainObjPtr vm, bool append);
+int qemuDomainOpenLogRead(struct qemud_driver *driver,
+                          virDomainObjPtr vm, off_t pos);
+
 void qemuDomainObjTaint(virDomainObjPtr obj,
                         int taint,
                         int logFD);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 13f9362..75e4631 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3881,10 +3881,14 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
 {
     struct qemud_driver *driver = dom->conn->privateData;
     int ret = -1;
+    int logFD = -1;
+
+    if ((logFD = qemuDomainOpenLogWrite(driver, vm, true)) < 0)
+        return -1;
 
     switch (dev->type) {
     case VIR_DOMAIN_DEVICE_DISK:
-        qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, -1);
+        qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, logFD);
         ret = qemuDomainAttachDeviceDiskLive(driver, vm, dev, qemuCaps);
         if (!ret)
             dev->data.disk = NULL;
@@ -3897,7 +3901,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
         break;
 
     case VIR_DOMAIN_DEVICE_NET:
-        qemuDomainObjCheckNetTaint(vm, dev->data.net, -1);
+        qemuDomainObjCheckNetTaint(vm, dev->data.net, logFD);
         ret = qemuDomainAttachNetDevice(dom->conn, driver, vm,
                                         dev->data.net, qemuCaps);
         if (!ret)
@@ -3918,6 +3922,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
         break;
     }
 
+    VIR_FORCE_CLOSE(logFD);
     return ret;
 }
 
@@ -6982,6 +6987,7 @@ static int qemuDomainMonitorCommand(virDomainPtr domain, const char *cmd,
     int ret = -1;
     qemuDomainObjPrivatePtr priv;
     bool hmp;
+    int logFD = -1;
 
     virCheckFlags(VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP, -1);
 
@@ -7001,9 +7007,12 @@ static int qemuDomainMonitorCommand(virDomainPtr domain, const char *cmd,
         goto cleanup;
    }
 
+    if ((logFD = qemuDomainOpenLogWrite(driver, vm, true)) < 0)
+        goto cleanup;
+
     priv = vm->privateData;
 
-    qemuDomainObjTaint(vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR, -1);
+    qemuDomainObjTaint(vm, VIR_DOMAIN_TAINT_CUSTOM_MONITOR, logFD);
 
     hmp = !!(flags & VIR_DOMAIN_QEMU_MONITOR_COMMAND_HMP);
 
@@ -7021,6 +7030,7 @@ cleanup:
     if (vm)
         virDomainObjUnlock(vm);
     qemuDriverUnlock(driver);
+    VIR_FORCE_CLOSE(logFD);
     return ret;
 }
 
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index c521dbf..187c4c9 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -679,81 +679,6 @@ error:
     return ret;
 }
 
-static int
-qemuProcessLogFD(struct qemud_driver *driver, const char* name, bool append)
-{
-    char *logfile;
-    mode_t logmode;
-    int fd = -1;
-
-    if (virAsprintf(&logfile, "%s/%s.log", driver->logDir, name) < 0) {
-        virReportOOMError();
-        return -1;
-    }
-
-    logmode = O_CREAT | O_WRONLY;
-    /* Only logrotate files in /var/log, so only append if running privileged */
-    if (driver->privileged || append)
-        logmode |= O_APPEND;
-    else
-        logmode |= O_TRUNC;
-
-    if ((fd = open(logfile, logmode, S_IRUSR | S_IWUSR)) < 0) {
-        virReportSystemError(errno,
-                             _("failed to create logfile %s"),
-                             logfile);
-        VIR_FREE(logfile);
-        return -1;
-    }
-    VIR_FREE(logfile);
-    if (virSetCloseExec(fd) < 0) {
-        virReportSystemError(errno, "%s",
-                             _("Unable to set VM logfile close-on-exec flag"));
-        VIR_FORCE_CLOSE(fd);
-        return -1;
-    }
-    return fd;
-}
-
-
-static int
-qemuProcessLogReadFD(const char* logDir, const char* name, off_t pos)
-{
-    char *logfile;
-    mode_t logmode = O_RDONLY;
-    int fd = -1;
-
-    if (virAsprintf(&logfile, "%s/%s.log", logDir, name) < 0) {
-        qemuReportError(VIR_ERR_INTERNAL_ERROR,
-                        _("failed to build logfile name %s/%s.log"),
-                        logDir, name);
-        return -1;
-    }
-
-    if ((fd = open(logfile, logmode)) < 0) {
-        virReportSystemError(errno,
-                             _("failed to create logfile %s"),
-                             logfile);
-        VIR_FREE(logfile);
-        return -1;
-    }
-    if (virSetCloseExec(fd) < 0) {
-        virReportSystemError(errno, "%s",
-                             _("Unable to set VM logfile close-on-exec flag"));
-        VIR_FORCE_CLOSE(fd);
-        VIR_FREE(logfile);
-        return -1;
-    }
-    if (pos < 0 || lseek(fd, pos, SEEK_SET) < 0) {
-        virReportSystemError(pos < 0 ? 0 : errno,
-                             _("Unable to seek to %lld in %s"),
-                             (long long) pos, logfile);
-        VIR_FORCE_CLOSE(fd);
-    }
-    VIR_FREE(logfile);
-    return fd;
-}
-
 
 typedef int qemuProcessLogHandleOutput(virDomainObjPtr vm,
                                        const char *output,
@@ -1051,7 +976,7 @@ qemuProcessWaitForMonitor(struct qemud_driver* driver,
     virHashTablePtr paths = NULL;
     qemuDomainObjPrivatePtr priv;
 
-    if ((logfd = qemuProcessLogReadFD(driver->logDir, vm->def->name, pos)) < 0)
+    if ((logfd = qemuDomainOpenLogRead(driver, vm, pos)) < 0)
         return -1;
 
     if (VIR_ALLOC_N(buf, buf_size) < 0) {
@@ -2200,7 +2125,7 @@ int qemuProcessStart(virConnectPtr conn,
     }
 
     VIR_DEBUG0("Creating domain log file");
-    if ((logfile = qemuProcessLogFD(driver, vm->def->name, false)) < 0)
+    if ((logfile = qemuDomainOpenLogWrite(driver, vm, false)) < 0)
         goto cleanup;
 
     VIR_DEBUG0("Determining emulator version");
@@ -2463,7 +2388,7 @@ void qemuProcessStop(struct qemud_driver *driver,
         return;
     }
 
-    if ((logfile = qemuProcessLogFD(driver, vm->def->name, true)) < 0) {
+    if ((logfile = qemuDomainOpenLogWrite(driver, vm, true)) < 0) {
         /* To not break the normal domain shutdown process, skip the
          * timestamp log writing if failed on opening log file. */
         VIR_WARN("Unable to open logfile: %s",
-- 
1.7.4.4




More information about the libvir-list mailing list