/* Number of Xen scheduler parameters */
#define XEN_SCHED_CREDIT_NPARAM 2
+static void libxlDomainManagedSaveLoad(void *payload,
+ const void *n ATTRIBUTE_UNUSED,
+ void *opaque);
+
+
static libxlDriverPrivatePtr libxl_driver = NULL;
/* Function declarations */
VIR_WARN("Failed to remove the managed state %s",
managed_save_path);
}
+ vm->hasManagedSave = false;
}
VIR_FREE(managed_save_path);
}
virHashForEach(libxl_driver->domains.objs, libxlAutostartDomain,
libxl_driver);
+ virHashForEach(libxl_driver->domains.objs, libxlDomainManagedSaveLoad,
+ libxl_driver);
+
libxlDriverUnlock(libxl_driver);
return 0;
goto cleanup;
}
+ vm->hasManagedSave = true;
+
if (!vm->persistent) {
virDomainRemoveInactive(&driver->domains, vm);
vm = NULL;
return ret;
}
+static void
+libxlDomainManagedSaveLoad(void *payload,
+ const void *n ATTRIBUTE_UNUSED,
+ void *opaque)
+{
+ virDomainObjPtr vm = payload;
+ libxlDriverPrivatePtr driver = opaque;
+ char *name;
+
+ virDomainObjLock(vm);
+
+ if (!(name = libxlDomainManagedSavePath(driver, vm)))
+ goto cleanup;
+
+ vm->hasManagedSave = virFileExists(name);
+
+cleanup:
+ virDomainObjUnlock(vm);
+ VIR_FREE(name);
+}
+
static int
libxlDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
{
libxlDriverPrivatePtr driver = dom->conn->privateData;
virDomainObjPtr vm = NULL;
int ret = -1;
- char *name = NULL;
virCheckFlags(0, -1);
goto cleanup;
}
- name = libxlDomainManagedSavePath(driver, vm);
- if (name == NULL)
- goto cleanup;
-
- ret = virFileExists(name);
+ ret = vm->hasManagedSave;
cleanup:
- VIR_FREE(name);
if (vm)
virDomainObjUnlock(vm);
libxlDriverUnlock(driver);
goto cleanup;
ret = unlink(name);
+ vm->hasManagedSave = false;
cleanup:
VIR_FREE(name);
static int qemudDomainGetMaxVcpus(virDomainPtr dom);
+static void qemuDomainManagedSaveLoad(void *payload,
+ const void *n ATTRIBUTE_UNUSED,
+ void *opaque);
+
+
struct qemud_driver *qemu_driver = NULL;
virHashForEach(qemu_driver->domains.objs, qemuDomainSnapshotLoad,
qemu_driver->snapshotDir);
+ virHashForEach(qemu_driver->domains.objs, qemuDomainManagedSaveLoad,
+ qemu_driver);
+
qemu_driver->workerPool = virThreadPoolNew(0, 1, 0, processWatchdogEvent, qemu_driver);
if (!qemu_driver->workerPool)
goto error;
}
ret = 0;
+ vm->hasManagedSave = true;
/* Shut it down */
qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SAVED, 0);
return ret;
}
+static void
+qemuDomainManagedSaveLoad(void *payload,
+ const void *n ATTRIBUTE_UNUSED,
+ void *opaque)
+{
+ virDomainObjPtr vm = payload;
+ struct qemud_driver *driver = opaque;
+ char *name;
+
+ virDomainObjLock(vm);
+
+ if (!(name = qemuDomainManagedSavePath(driver, vm)))
+ goto cleanup;
+
+ vm->hasManagedSave = virFileExists(name);
+
+cleanup:
+ virDomainObjUnlock(vm);
+ VIR_FREE(name);
+}
+
static int
qemuDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
{
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm = NULL;
int ret = -1;
- char *name = NULL;
virCheckFlags(0, -1);
goto cleanup;
}
- name = qemuDomainManagedSavePath(driver, vm);
- if (name == NULL)
- goto cleanup;
-
- ret = virFileExists(name);
+ ret = vm->hasManagedSave;
cleanup:
- VIR_FREE(name);
if (vm)
virDomainObjUnlock(vm);
qemuDriverUnlock(driver);
goto cleanup;
ret = unlink(name);
+ vm->hasManagedSave = false;
cleanup:
VIR_FREE(name);
ret = qemuDomainObjRestore(conn, driver, vm, managed_save,
start_paused, bypass_cache);
- if (ret == 0 && unlink(managed_save) < 0)
- VIR_WARN("Failed to remove the managed state %s", managed_save);
+ if (ret == 0) {
+ if (unlink(managed_save) < 0)
+ VIR_WARN("Failed to remove the managed state %s", managed_save);
+ else
+ vm->hasManagedSave = false;
+ }
+
if (ret > 0)
VIR_WARN("Ignoring incomplete managed state %s", managed_save);
else