mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
Migrate VMs between different-endianess hosts
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.
This commit is contained in:
parent
c59f3d8de4
commit
cf2145d546
@ -21,6 +21,7 @@
|
||||
gnulib_modules='
|
||||
areadlink
|
||||
base64
|
||||
byteswap
|
||||
c-ctype
|
||||
c-strcase
|
||||
c-strcasestr
|
||||
|
@ -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)"),
|
||||
|
Loading…
x
Reference in New Issue
Block a user