* is sent but failed, and number of frozen filesystems on success. If -2 is
* returned, FSThaw should be called revert the quiesced status. */
static int
-qemuDomainSnapshotFSFreeze(virQEMUDriverPtr driver,
+qemuDomainSnapshotFSFreeze(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
virDomainObjPtr vm,
const char **mountpoints,
unsigned int nmountpoints)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
- virQEMUDriverConfigPtr cfg;
int frozen;
- if (priv->quiesced) {
- virReportError(VIR_ERR_OPERATION_INVALID, "%s",
- _("domain is already quiesced"));
- return -1;
- }
-
if (!qemuDomainAgentAvailable(priv, true))
return -1;
- priv->quiesced = true;
-
- cfg = virQEMUDriverGetConfig(driver);
- if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) {
- priv->quiesced = false;
- virObjectUnref(cfg);
- return -1;
- }
- virObjectUnref(cfg);
-
qemuDomainObjEnterAgent(vm);
frozen = qemuAgentFSFreeze(priv->agent, mountpoints, nmountpoints);
qemuDomainObjExitAgent(vm);
/* Return -1 on error, otherwise number of thawed filesystems. */
static int
-qemuDomainSnapshotFSThaw(virQEMUDriverPtr driver,
+qemuDomainSnapshotFSThaw(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
virDomainObjPtr vm,
bool report)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
- virQEMUDriverConfigPtr cfg;
int thawed;
virErrorPtr err = NULL;
if (!qemuDomainAgentAvailable(priv, report))
return -1;
- if (!priv->quiesced && report) {
- virReportError(VIR_ERR_OPERATION_INVALID, "%s",
- _("domain is not quiesced"));
- return -1;
- }
-
qemuDomainObjEnterAgent(vm);
if (!report)
err = virSaveLastError();
virFreeError(err);
- if (!report || thawed >= 0) {
- priv->quiesced = false;
-
- cfg = virQEMUDriverGetConfig(driver);
- if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) {
- /* Revert the statuses when we failed to save them. */
- priv->quiesced = true;
- thawed = -1;
- }
- virObjectUnref(cfg);
- }
-
return thawed;
}
}
ret = qemuDomainSnapshotFSFreeze(driver, vm, mountpoints, nmountpoints);
- if (ret == -2) {
- qemuDomainSnapshotFSThaw(driver, vm, false);
- ret = -1;
- }
endjob:
if (!qemuDomainObjEndJob(driver, vm))
priv = vm->privateData;
if (priv->agent)
qemuAgentNotifyEvent(priv->agent, QEMU_AGENT_EVENT_RESET);
- /* Clear some domain runtime information. For instance,
- * fsfreeze won't survive domain reset. This, however,
- * required the domain status file to be rewritten onto disk. */
- priv->quiesced = false;
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
VIR_WARN("Failed to save status on vm %s", vm->def->name);
virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
priv->nbdPort = 0;
- priv->quiesced = false;
if (priv->agent) {
qemuAgentClose(priv->agent);