the logic to check for existence of a managed save image and use it to start the VM can be moved to libxlDomainStartNew. libxlDomainStart has become unwieldy and this is a small step to make it more manageable. Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxx> --- src/libxl/libxl_domain.c | 97 ++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 336b67b129..e906495b64 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1230,14 +1230,10 @@ libxlDomainStart(libxlDriverPrivate *driver, uint32_t restore_ver) { libxl_domain_config d_config; - virDomainDef *def = NULL; virObjectEvent *event = NULL; - libxlSavefileHeader hdr; int ret = -1; uint32_t domid = 0; g_autofree char *dom_xml = NULL; - g_autofree char *managed_save_path = NULL; - int managed_save_fd = -1; libxlDomainObjPrivate *priv = vm->privateData; g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver); virHostdevManager *hostdev_mgr = driver->hostdevMgr; @@ -1250,47 +1246,6 @@ libxlDomainStart(libxlDriverPrivate *driver, libxl_domain_config_init(&d_config); - /* If there is a managed saved state restore it instead of starting - * from scratch. The old state is removed once the restoring succeeded. */ - if (restore_fd < 0) { - managed_save_path = libxlDomainManagedSavePath(driver, vm); - if (managed_save_path == NULL) - goto cleanup; - - if (virFileExists(managed_save_path)) { - - managed_save_fd = libxlDomainSaveImageOpen(driver, managed_save_path, - &def, &hdr); - if (managed_save_fd < 0) - 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)) { - char vm_uuidstr[VIR_UUID_STRING_BUFLEN]; - char def_uuidstr[VIR_UUID_STRING_BUFLEN]; - virUUIDFormat(vm->def->uuid, vm_uuidstr); - virUUIDFormat(def->uuid, def_uuidstr); - virReportError(VIR_ERR_OPERATION_FAILED, - _("cannot restore domain '%s' uuid %s from a file" - " which belongs to domain '%s' uuid %s"), - vm->def->name, vm_uuidstr, def->name, def_uuidstr); - goto cleanup; - } - - virDomainObjAssignDef(vm, def, true, NULL); - def = NULL; - - if (unlink(managed_save_path) < 0) - VIR_WARN("Failed to remove the managed state %s", - managed_save_path); - - vm->hasManagedSave = false; - } - } - if (virDomainObjSetDefTransient(driver->xmlopt, vm, NULL) < 0) goto cleanup; @@ -1476,8 +1431,6 @@ libxlDomainStart(libxlDriverPrivate *driver, cleanup: libxl_domain_config_dispose(&d_config); - virDomainDefFree(def); - VIR_FORCE_CLOSE(managed_save_fd); return ret; } @@ -1486,7 +1439,55 @@ libxlDomainStartNew(libxlDriverPrivate *driver, virDomainObj *vm, bool start_paused) { - return libxlDomainStart(driver, vm, start_paused, -1, LIBXL_SAVE_VERSION); + g_autofree char *managed_save_path = NULL; + int restore_fd = -1; + virDomainDef *def = NULL; + libxlSavefileHeader hdr; + uint32_t restore_ver = LIBXL_SAVE_VERSION; + int ret = -1; + + /* If there is a managed saved state restore it instead of starting + * from scratch. The old state is removed once the restoring succeeded. */ + managed_save_path = libxlDomainManagedSavePath(driver, vm); + if (managed_save_path == NULL) + return -1; + + if (virFileExists(managed_save_path)) { + restore_fd = libxlDomainSaveImageOpen(driver, managed_save_path, + &def, &hdr); + if (restore_fd < 0) + goto cleanup; + + restore_ver = hdr.version; + + if (STRNEQ(vm->def->name, def->name) || + memcmp(vm->def->uuid, def->uuid, VIR_UUID_BUFLEN)) { + char vm_uuidstr[VIR_UUID_STRING_BUFLEN]; + char def_uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(vm->def->uuid, vm_uuidstr); + virUUIDFormat(def->uuid, def_uuidstr); + virReportError(VIR_ERR_OPERATION_FAILED, + _("cannot restore domain '%s' uuid %s from a file which belongs to domain '%s' uuid %s"), + vm->def->name, vm_uuidstr, def->name, def_uuidstr); + goto cleanup; + } + + virDomainObjAssignDef(vm, def, true, NULL); + def = NULL; + + if (unlink(managed_save_path) < 0) + VIR_WARN("Failed to remove the managed state %s", + managed_save_path); + + vm->hasManagedSave = false; + } + + ret = libxlDomainStart(driver, vm, start_paused, restore_fd, restore_ver); + + cleanup: + virDomainDefFree(def); + VIR_FORCE_CLOSE(restore_fd); + return ret; } int -- 2.31.1