}
libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm);
- if (libxlDomainStart(driver, vm, false, -1) < 0) {
+ if (libxlDomainStartNew(driver, vm, false) < 0) {
virErrorPtr err = virGetLastError();
VIR_ERROR(_("Failed to restart VM '%s': %s"),
vm->def->name, err ? err->message : _("unknown error"));
}
+#ifdef LIBXL_HAVE_SRM_V2
+# define LIBXL_DOMSTART_RESTORE_VER_ATTR /* empty */
+#else
+# define LIBXL_DOMSTART_RESTORE_VER_ATTR ATTRIBUTE_UNUSED
+#endif
+
/*
* Start a domain through libxenlight.
*
* virDomainObjPtr must be locked and a job acquired on invocation
*/
-int
-libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
- bool start_paused, int restore_fd)
+static int
+libxlDomainStart(libxlDriverPrivatePtr driver,
+ virDomainObjPtr vm,
+ bool start_paused,
+ int restore_fd,
+ uint32_t restore_ver LIBXL_DOMSTART_RESTORE_VER_ATTR)
{
libxl_domain_config d_config;
virDomainDefPtr def = NULL;
goto cleanup;
restore_fd = managed_save_fd;
+ restore_ver = hdr.version;
if (STRNEQ(vm->def->name, def->name) ||
memcmp(vm->def->uuid, def->uuid, VIR_UUID_BUFLEN)) {
&domid, NULL, &aop_console_how);
} else {
libxl_domain_restore_params_init(¶ms);
+#ifdef LIBXL_HAVE_SRM_V2
+ params.stream_version = restore_ver;
+#endif
ret = libxl_domain_create_restore(cfg->ctx, &d_config, &domid,
restore_fd, ¶ms, NULL,
&aop_console_how);
return ret;
}
+int
+libxlDomainStartNew(libxlDriverPrivatePtr driver,
+ virDomainObjPtr vm,
+ bool start_paused)
+{
+ return libxlDomainStart(driver, vm, start_paused, -1, LIBXL_SAVE_VERSION);
+}
+
+int
+libxlDomainStartRestore(libxlDriverPrivatePtr driver,
+ virDomainObjPtr vm,
+ bool start_paused,
+ int restore_fd,
+ uint32_t restore_ver)
+{
+ return libxlDomainStart(driver, vm, start_paused,
+ restore_fd, restore_ver);
+}
+
bool
libxlDomainDefCheckABIStability(libxlDriverPrivatePtr driver,
virDomainDefPtr src,
}
if (vm->autostart && !virDomainObjIsActive(vm) &&
- libxlDomainStart(driver, vm, false, -1) < 0) {
+ libxlDomainStartNew(driver, vm, false) < 0) {
err = virGetLastError();
VIR_ERROR(_("Failed to autostart VM '%s': %s"),
vm->def->name,
goto cleanup;
}
- if (libxlDomainStart(driver, vm, (flags & VIR_DOMAIN_START_PAUSED) != 0,
- -1) < 0) {
+ if (libxlDomainStartNew(driver, vm,
+ (flags & VIR_DOMAIN_START_PAUSED) != 0) < 0) {
if (!vm->persistent) {
virDomainObjListRemove(driver->domains, vm);
vm = NULL;
goto cleanup;
}
- ret = libxlDomainStart(driver, vm, (flags & VIR_DOMAIN_SAVE_PAUSED) != 0, fd);
+ ret = libxlDomainStartRestore(driver, vm,
+ (flags & VIR_DOMAIN_SAVE_PAUSED) != 0,
+ fd, hdr.version);
if (ret < 0 && !vm->persistent)
virDomainObjListRemove(driver->domains, vm);
goto endjob;
}
- ret = libxlDomainStart(driver, vm, (flags & VIR_DOMAIN_START_PAUSED) != 0, -1);
+ ret = libxlDomainStartNew(driver, vm,
+ (flags & VIR_DOMAIN_START_PAUSED) != 0);
if (ret < 0)
goto endjob;
dom->id = vm->def->id;