error:
if (period) {
- virErrorPtr saved = virSaveLastError();
+ virErrorPtr saved;
+
+ virErrorPreserveLast(&saved);
ignore_value(virCgroupSetCpuCfsPeriod(cgroup, old_period));
- if (saved) {
- virSetError(saved);
- virFreeError(saved);
- }
+ virErrorRestore(&saved);
}
return -1;
if (!data)
return;
- err = virSaveLastError();
+ virErrorPreserveLast(&err);
virCgroupSetCpusetMems(data->emulatorCgroup, data->emulatorMemMask);
- virSetError(err);
- virFreeError(err);
+ virErrorRestore(&err);
qemuCgroupEmulatorAllNodesDataFree(data);
}
ret = 0;
cleanup:
if (ret < 0) {
- virErrorPtr saved_err = virSaveLastError();
+ virErrorPtr saved_err;
+
+ virErrorPreserveLast(&saved_err);
virDomainConfNWFilterTeardown(net);
- virSetError(saved_err);
- virFreeError(saved_err);
+ virErrorRestore(&saved_err);
}
for (i = 0; vhostfd && i < vhostfdSize; i++) {
if (ret < 0)
error:
/* free up any resources in the network driver
* but don't overwrite the original error */
- originalError = virSaveLastError();
+ virErrorPreserveLast(&originalError);
for (i = 0; last_good_net != -1 && i <= last_good_net; i++)
virDomainConfNWFilterTeardown(def->nets[i]);
- virSetError(originalError);
- virFreeError(originalError);
+ virErrorRestore(&originalError);
return -1;
}
/* We don't care about errors logging taint info, so
* preserve original error, and clear any error that
* is raised */
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
if (!(timestamp = virTimeStringNow()))
goto cleanup;
cleanup:
VIR_FREE(timestamp);
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
}
endjob:
if (ret < 0) {
if (was_running && virDomainObjIsActive(vm)) {
- virErrorPtr save_err = virSaveLastError();
+ virErrorPtr save_err;
+ virErrorPreserveLast(&save_err);
if (qemuProcessStartCPUs(driver, vm,
VIR_DOMAIN_RUNNING_SAVE_CANCELED,
QEMU_ASYNC_JOB_SAVE) < 0) {
VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR));
}
- virSetError(save_err);
- virFreeError(save_err);
+ virErrorRestore(&save_err);
}
}
qemuDomainObjEndAsyncJob(driver, vm);
goto cleanup;
if (!virDomainDefCheckABIStability(def, newdef_migr, driver->xmlopt)) {
- virErrorPtr err = virSaveLastError();
+ virErrorPtr save_err;
+
+ virErrorPreserveLast(&save_err);
/* Due to a bug in older version of external snapshot creation
* code, the XML saved in the save image was not a migratable
* the user provided XML if the check against the migratable XML
* fails. Snapshots created prior to v1.1.3 have this issue. */
if (!virDomainDefCheckABIStability(def, newdef, driver->xmlopt)) {
- virSetError(err);
- virFreeError(err);
+ virErrorRestore(&save_err);
goto cleanup;
}
- virFreeError(err);
+ virFreeError(save_err);
/* use the user provided XML */
ret = g_steal_pointer(&newdef);
* must manually kill it and ignore any error related to
* the process
*/
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
VIR_FORCE_CLOSE(intermediatefd);
VIR_FORCE_CLOSE(*fd);
}
}
VIR_DEBUG("Decompression binary stderr: %s", NULLSTR(errbuf));
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
}
VIR_FORCE_CLOSE(intermediatefd);
agent = qemuDomainObjEnterAgent(vm);
if (!report)
- err = virSaveLastError();
+ virErrorPreserveLast(&err);
thawed = qemuAgentFSThaw(agent);
- if (!report)
- virSetError(err);
qemuDomainObjExitAgent(vm, agent);
- virFreeError(err);
+ virErrorRestore(&err);
return thawed;
}
endjob:
if (ret < 0 && clean_access) {
- virErrorPtr orig_err = virSaveLastError();
+ virErrorPtr orig_err;
+ virErrorPreserveLast(&orig_err);
/* Revert access to read-only, if possible. */
qemuDomainStorageSourceAccessAllow(driver, vm, baseSource, true, false);
if (top_parent && top_parent != disk->src)
qemuDomainStorageSourceAccessAllow(driver, vm, top_parent, true, false);
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
}
qemuBlockJobStartupFinalize(vm, job);
qemuDomainObjEndJob(driver, vm);
if (rv != 0) {
if (rv < 0) {
if (!err)
- err = virSaveLastError();
+ virErrorPreserveLast(&err);
failed = true;
}
qemuBlockJobSyncEnd(vm, job, asyncJob);
}
if (failed && !err)
- err = virSaveLastError();
+ virErrorPreserveLast(&err);
if (virDomainObjWait(vm) < 0)
goto cleanup;
ret = failed ? -1 : 0;
cleanup:
- if (err) {
- virSetError(err);
- virFreeError(err);
- }
+ virErrorRestore(&err);
return ret;
}
virObjectEventStateQueue(driver->domainEventState, event);
qemuDomainEventEmitJobCompleted(driver, vm);
} else {
- virErrorPtr orig_err = virSaveLastError();
+ virErrorPtr orig_err;
int reason;
+ virErrorPreserveLast(&orig_err);
+
/* cancel any outstanding NBD jobs */
qemuMigrationSrcNBDCopyCancel(driver, vm, false,
QEMU_ASYNC_JOB_MIGRATION_OUT, NULL);
- virSetError(orig_err);
- virFreeError(orig_err);
+ virErrorRestore(&orig_err);
if (virDomainObjGetState(vm, &reason) == VIR_DOMAIN_PAUSED &&
reason == VIR_DOMAIN_PAUSED_POSTCOPY)
return;
abrt:
- err = virSaveLastError();
+ virErrorPreserveLast(&err);
if (err && err->code == VIR_ERR_OK) {
virFreeError(err);
err = NULL;
}
virStreamAbort(data->st);
- if (err) {
- virSetError(err);
- virFreeError(err);
- }
+ virErrorRestore(&err);
error:
/* Let the source qemu know that the transfer cant continue anymore.
if (events)
priv->signalIOError = false;
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
return ret;
error:
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
if (virDomainObjIsActive(vm)) {
if (cancel &&
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("domainMigratePrepare2 did not set uri"));
cancelled = true;
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
goto finish;
}
/* Perform failed. Make sure Finish doesn't overwrite the error */
if (ret < 0)
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
/* If Perform returns < 0, then we need to cancel the VM
* startup on the destination
virObjectUnref(st);
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
VIR_FREE(uri_out);
VIR_FREE(cookie);
if (useParams &&
virTypedParamsReplaceString(¶ms, &nparams,
VIR_MIGRATE_PARAM_URI, uri_out) < 0) {
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
goto finish;
}
} else if (!uri && !(flags & VIR_MIGRATE_TUNNELLED)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("domainMigratePrepare3 did not set uri"));
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
goto finish;
}
/* Perform failed. Make sure Finish doesn't overwrite the error */
if (ret < 0) {
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
} else {
qemuMigrationJobSetPhase(driver, vm,
QEMU_MIGRATION_PHASE_PERFORM3_DONE);
* one we need to preserve it in case confirm3 overwrites
*/
if (!orig_err)
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
/*
* If cancelled, then src VM will be restarted, else
virObjectUnref(st);
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
VIR_FREE(uri_out);
VIR_FREE(cookiein);
VIR_FREE(cookieout);
}
cleanup:
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
qemuDomainObjEnterRemote(vm);
virConnectUnregisterCloseCallback(dconn, qemuMigrationSrcConnectionClosed);
virObjectUnref(dconn);
ignore_value(qemuDomainObjExitRemote(vm, false));
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
virObjectUnref(cfg);
return ret;
}
endjob:
if (ret < 0)
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
/* v2 proto has no confirm phase so we need to reset migration parameters
* here
qemuDomainRemoveInactiveJob(driver, vm);
}
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
cleanup:
virObjectEventStateQueue(driver->domainEventState, event);
/* Need to save the current error, in case shutting
* down the process overwrites it
*/
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
/*
* In v3 protocol, the source VM is still available to
VIR_FREE(priv->origname);
virDomainObjEndAPI(&vm);
qemuMigrationCookieFree(mig);
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
virObjectUnref(cfg);
/* Set a special error if Finish is expected to return NULL as a result of
if (rc < 0) {
if (rc == -2) {
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
virCommandAbort(cmd);
if (virDomainObjIsActive(vm) &&
qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
cleanup:
if (ret < 0 && !orig_err)
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
/* Restore max migration bandwidth */
if (virDomainObjIsActive(vm) &&
virCommandFree(cmd);
}
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
return ret;
}
VIR_DEBUG("Restoring saved incoming migration error for domain %s: %s",
name, err->message);
- virSetError(err);
- virFreeError(err);
+ virErrorRestore(&err);
}
qemuMigrationParamsPtr origParams,
unsigned long apiFlags)
{
- virErrorPtr err = virSaveLastError();
+ virErrorPtr err;
+
+ virErrorPreserveLast(&err);
VIR_DEBUG("Resetting migration parameters %p, flags 0x%lx",
origParams, apiFlags);
qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams, apiFlags);
cleanup:
- if (err) {
- virSetError(err);
- virFreeError(err);
- }
+ virErrorRestore(&err);
}
*/
if (mon->msg) {
if (mon->lastError.code == VIR_ERR_OK) {
- virErrorPtr err = virSaveLastError();
+ virErrorPtr err;
+
+ virErrorPreserveLast(&err);
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("QEMU monitor was closed"));
virCopyLastError(&mon->lastError);
- if (err) {
- virSetError(err);
- virFreeError(err);
- } else {
+ if (err)
+ virErrorRestore(&err);
+ else
virResetLastError();
- }
}
mon->msg->finished = 1;
virCondSignal(&mon->notify);
VIR_DEBUG("fdname=%s", fdname);
- error = virSaveLastError();
+ virErrorPreserveLast(&error);
QEMU_CHECK_MONITOR_GOTO(mon, cleanup);
ret = qemuMonitorJSONCloseFileHandle(mon, fdname);
cleanup:
- if (error) {
- virSetError(error);
- virFreeError(error);
- }
+ virErrorRestore(&error);
return ret;
}
/* This method is routinely used in clean up paths. Disable error
* reporting so we don't squash a legit error. */
- orig_err = virSaveLastError();
+ virErrorPreserveLast(&orig_err);
if (asyncJob != QEMU_ASYNC_JOB_NONE) {
if (qemuDomainObjBeginNestedJob(driver, vm, asyncJob) < 0)
qemuDomainObjEndJob(driver, vm);
cleanup:
- if (orig_err) {
- virSetError(orig_err);
- virFreeError(orig_err);
- }
+ virErrorRestore(&orig_err);
virObjectUnref(conn);
virObjectUnref(cfg);
}