[libvirt] [PATCH v3 2/2] qemu: add a target type check when hot/cold-plug a Chr device

Luyao Huang lhuang at redhat.com
Thu Jan 22 02:28:19 UTC 2015


https://bugzilla.redhat.com/show_bug.cgi?id=1164627

Add a func just check the base target type which
qemu support. And this check will help to avoid add a qemu
unsupport target type chr device to a running guest(hotplug)
or to the guest inactive XML (coldplug, will effect next boot)

And this check only check the target type, and other things
have been checked in virDomainChrDefParseXML.

Signed-off-by: Luyao Huang <lhuang at redhat.com>
---
 src/libvirt_private.syms |  2 ++
 src/qemu/qemu_hotplug.c  | 67 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index a2eec83..7fb722d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -145,6 +145,8 @@ virDomainBlockedReasonTypeFromString;
 virDomainBlockedReasonTypeToString;
 virDomainCapabilitiesPolicyTypeToString;
 virDomainCapsFeatureTypeToString;
+virDomainChrChannelTargetTypeFromString;
+virDomainChrChannelTargetTypeToString;
 virDomainChrConsoleTargetTypeFromString;
 virDomainChrConsoleTargetTypeToString;
 virDomainChrDefForeach;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 9ed96dc..2e02d05 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1401,10 +1401,77 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver,
 
 }
 
+static int
+qemuDomainChrCheckDefSupport(virDomainChrDefPtr chr)
+{
+    switch (chr->deviceType) {
+    case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
+        switch ((virDomainChrSerialTargetType) chr->targetType) {
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
+            break;
+
+        case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST:
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unsupported serial target type %s for qemu"),
+                           NULLSTR(virDomainChrSerialTargetTypeToString(chr->targetType)));
+            return -1;
+            break;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
+        break;
+
+    case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
+        switch ((virDomainChrChannelTargetType) chr->targetType) {
+        case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD:
+        case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO:
+            break;
+
+        case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_NONE:
+        case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST:
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unsupported channel target type %s for qemu"),
+                           NULLSTR(virDomainChrChannelTargetTypeToString(chr->targetType)));
+            return -1;
+            break;
+        }
+        break;
+
+    case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
+        switch ((virDomainChrConsoleTargetType) chr->targetType) {
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM:
+            break;
+
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_UML:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ:
+        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST:
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unsupported console target type %s for qemu"),
+                           NULLSTR(virDomainChrConsoleTargetTypeToString(chr->targetType)));
+            return -1;
+            break;
+        }
+        break;
+    }
+
+    return 0;
+}
+
 int
 qemuDomainChrInsert(virDomainDefPtr vmdef,
                     virDomainChrDefPtr chr)
 {
+    if (qemuDomainChrCheckDefSupport(chr) < 0)
+        return -1;
+
     if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
         chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL) {
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
-- 
1.8.3.1




More information about the libvir-list mailing list