[libvirt] [PATCH] Perform feature flag compat checking in QEMU migration cookies

Daniel P. Berrange berrange at redhat.com
Thu May 19 11:21:17 UTC 2011


To allow new mandatory migration cookie data to be introduced,
add support for checking supported feature flags when parsing
migration cookie.

* src/qemu/qemu_migration.c: Feature flag checking in migration
  cookie parsing
---
 src/qemu/qemu_migration.c |   56 ++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 55 insertions(+), 1 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 4d7bc38..f69bbfd 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -48,7 +48,18 @@
 #define timeval_to_ms(tv)       (((tv).tv_sec * 1000ull) + ((tv).tv_usec / 1000))
 
 enum qemuMigrationCookieFlags {
-    QEMU_MIGRATION_COOKIE_GRAPHICS = (1 << 0),
+    QEMU_MIGRATION_COOKIE_FLAG_GRAPHICS,
+
+    QEMU_MIGRATION_COOKIE_FLAG_LAST
+};
+
+VIR_ENUM_DECL(qemuMigrationCookieFlag);
+VIR_ENUM_IMPL(qemuMigrationCookieFlag,
+              QEMU_MIGRATION_COOKIE_FLAG_LAST,
+              "graphics");
+
+enum qemuMigrationCookieFeatures {
+    QEMU_MIGRATION_COOKIE_GRAPHICS  = (1 << QEMU_MIGRATION_COOKIE_FLAG_GRAPHICS),
 };
 
 typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics;
@@ -65,6 +76,7 @@ typedef struct _qemuMigrationCookie qemuMigrationCookie;
 typedef qemuMigrationCookie *qemuMigrationCookiePtr;
 struct _qemuMigrationCookie {
     int flags;
+    int flagsMandatory;
 
     /* Host properties */
     unsigned char hostuuid[VIR_UUID_BUFLEN];
@@ -286,6 +298,7 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf,
 {
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     char hostuuidstr[VIR_UUID_STRING_BUFLEN];
+    int i;
 
     virUUIDFormat(mig->uuid, uuidstr);
     virUUIDFormat(mig->hostuuid, hostuuidstr);
@@ -296,6 +309,12 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf,
     virBufferEscapeString(buf, "  <hostname>%s</hostname>\n", mig->hostname);
     virBufferAsprintf(buf, "  <hostuuid>%s</hostuuid>\n", hostuuidstr);
 
+    for (i = 0 ; i < QEMU_MIGRATION_COOKIE_FLAG_LAST ; i++) {
+        if (mig->flagsMandatory & (1 << i))
+            virBufferAsprintf(buf, "  <feature name='%s'/>",
+                              qemuMigrationCookieFlagTypeToString(i));
+    }
+
     if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) &&
         mig->graphics)
         qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics);
@@ -377,6 +396,8 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
 {
     char uuidstr[VIR_UUID_STRING_BUFLEN];
     char *tmp;
+    xmlNodePtr *nodes = NULL;
+    int i, n;
 
     /* We don't store the uuid, name, hostname, or hostuuid
      * values. We just compare them to local data to do some
@@ -440,6 +461,38 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
     }
     VIR_FREE(tmp);
 
+    /* Check to ensure all mandatory features from XML are also
+     * present in 'flags' */
+    if ((n = virXPathNodeSet("./features", ctxt, &nodes)) < 0)
+        goto error;
+
+    for (i = 0 ; i < n ; i++) {
+        int val;
+        char *str = virXMLPropString(nodes[i], "name");
+        if (!str) {
+            qemuReportError(VIR_ERR_INTERNAL_ERROR,
+                            "%s", _("missing feature name"));
+            goto error;
+        }
+
+        if ((val = qemuMigrationCookieFlagTypeFromString(str)) < 0) {
+            qemuReportError(VIR_ERR_INTERNAL_ERROR,
+                            _("Unknown migration cookie feature %s"),
+                            str);
+            VIR_FREE(str);
+            goto error;
+        }
+
+        if ((flags & (1 << val)) == 0) {
+            qemuReportError(VIR_ERR_INTERNAL_ERROR,
+                            _("Unsupported migration cookie feature %s"),
+                            str);
+            VIR_FREE(str);
+        }
+        VIR_FREE(str);
+    }
+    VIR_FREE(nodes);
+
     if ((flags & QEMU_MIGRATION_COOKIE_GRAPHICS) &&
         virXPathBoolean("count(./graphics) > 0", ctxt) &&
         (!(mig->graphics = qemuMigrationCookieGraphicsXMLParse(ctxt))))
@@ -449,6 +502,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig,
 
 error:
     VIR_FREE(tmp);
+    VIR_FREE(nodes);
     return -1;
 }
 
-- 
1.7.4.4




More information about the libvir-list mailing list