]> xenbits.xensource.com Git - libvirt.git/commitdiff
Migrate VMs between different-endianess hosts
authorStefan Berger <stefanb@us.ibm.com>
Thu, 14 Apr 2011 18:48:03 +0000 (14:48 -0400)
committerStefan Berger <stefanb@us.ibm.com>
Thu, 14 Apr 2011 18:48:03 +0000 (14:48 -0400)
This patch enables the migration of Qemu VMs between hosts of different endianess. I tested this by migrating a i686 VM between a x86 and ppc64 host.

I am converting the 'int's in the VM's state header to uint32_t assuming this doesn't break compatibility with existing deployments other than Linux.

bootstrap.conf
src/qemu/qemu_driver.c

index 3db0c6373a02d5e827550f0ebaf7dc486fc986fe..293f86eb9e2119b9ce446a43175ee246cbd8aa8d 100644 (file)
@@ -21,6 +21,7 @@
 gnulib_modules='
 areadlink
 base64
+byteswap
 c-ctype
 c-strcase
 c-strcasestr
index b580a0caf4ac779c692451ffd2ca7c052cca5609..c1a44c959394a7b5cea4bef31f839df5116fcb3f 100644 (file)
@@ -43,6 +43,7 @@
 #include <sys/wait.h>
 #include <sys/ioctl.h>
 #include <sys/un.h>
+#include <byteswap.h>
 
 
 #include "qemu_driver.h"
@@ -1810,13 +1811,22 @@ VIR_ENUM_IMPL(qemudSaveCompression, QEMUD_SAVE_FORMAT_LAST,
 
 struct qemud_save_header {
     char magic[sizeof(QEMUD_SAVE_MAGIC)-1];
-    int version;
-    int xml_len;
-    int was_running;
-    int compressed;
-    int unused[15];
+    uint32_t version;
+    uint32_t xml_len;
+    uint32_t was_running;
+    uint32_t compressed;
+    uint32_t unused[15];
 };
 
+static inline void
+bswap_header(struct qemud_save_header *hdr) {
+    hdr->version = bswap_32(hdr->version);
+    hdr->xml_len = bswap_32(hdr->xml_len);
+    hdr->was_running = bswap_32(hdr->was_running);
+    hdr->compressed = bswap_32(hdr->compressed);
+}
+
+
 /* return -errno on failure, or 0 on success */
 static int
 qemuDomainSaveHeader(int fd, const char *path, char *xml,
@@ -3025,6 +3035,11 @@ qemuDomainSaveImageOpen(struct qemud_driver *driver,
         goto error;
     }
 
+    if (header.version > QEMUD_SAVE_VERSION) {
+        /* convert endianess and try again */
+        bswap_header(&header);
+    }
+
     if (header.version > QEMUD_SAVE_VERSION) {
         qemuReportError(VIR_ERR_OPERATION_FAILED,
                         _("image version is not supported (%d > %d)"),