Always check return value of qemuDomainObjExitMonitor

Depending on the context, either error out if the domain
has disappeared in the meantime, or just ignore the value
to allow marking the function as ATTRIBUTE_RETURN_CHECK.
This commit is contained in:
Ján Tomko 2014-12-16 10:40:58 +01:00
parent 3070bc8ee5
commit 5c703ca396
6 changed files with 257 additions and 212 deletions

View File

@ -2317,7 +2317,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver,
qemuDomainObjEnterMonitor(driver, vm);
/* we continue on even in the face of error */
qemuMonitorDeleteSnapshot(priv->mon, snap->def->name);
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
}
}
@ -2752,17 +2752,18 @@ qemuDomainUpdateDeviceList(virQEMUDriverPtr driver,
{
qemuDomainObjPrivatePtr priv = vm->privateData;
char **aliases;
int rc;
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_DEL_EVENT))
return 0;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
if (qemuMonitorGetDeviceAliases(priv->mon, &aliases) < 0) {
qemuDomainObjExitMonitor(driver, vm);
rc = qemuMonitorGetDeviceAliases(priv->mon, &aliases);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
if (rc < 0)
return -1;
}
qemuDomainObjExitMonitor(driver, vm);
virStringFreeList(priv->qemuDevices);
priv->qemuDevices = aliases;

View File

@ -247,7 +247,8 @@ void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
virDomainObjPtr obj)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
ATTRIBUTE_RETURN_CHECK;
int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
virDomainObjPtr obj,
qemuDomainAsyncJob asyncJob)

View File

@ -1982,7 +1982,8 @@ static int qemuDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSystemPowerdown(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
}
endjob:
@ -2077,7 +2078,8 @@ qemuDomainReboot(virDomainPtr dom, unsigned int flags)
} else {
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSystemPowerdown(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret == 0)
qemuDomainSetFakeReboot(driver, vm, isReboot);
@ -2120,7 +2122,8 @@ qemuDomainReset(virDomainPtr dom, unsigned int flags)
priv = vm->privateData;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSystemReset(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
priv->fakeReboot = false;
@ -2337,7 +2340,8 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
priv = vm->privateData;
qemuDomainObjEnterMonitor(driver, vm);
r = qemuMonitorSetBalloon(priv->mon, newmem);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
virDomainAuditMemory(vm, vm->def->mem.cur_balloon, newmem, "update",
r == 1);
if (r < 0)
@ -2419,7 +2423,8 @@ static int qemuDomainSetMemoryStatsPeriod(virDomainPtr dom, int period,
qemuDomainObjEnterMonitor(driver, vm);
r = qemuMonitorSetMemoryStatsPeriod(priv->mon, period);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
if (r < 0) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("unable to set balloon driver collection period"));
@ -2483,7 +2488,8 @@ static int qemuDomainInjectNMI(virDomainPtr domain, unsigned int flags)
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorInjectNMI(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -2545,7 +2551,8 @@ static int qemuDomainSendKey(virDomainPtr domain,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSendKey(priv->mon, holdtime, keycodes, nkeycodes);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -2600,7 +2607,10 @@ static int qemuDomainGetInfo(virDomainPtr dom,
} else {
qemuDomainObjEnterMonitor(driver, vm);
err = qemuMonitorGetBalloonInfo(priv->mon, &balloon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
qemuDomainObjEndJob(driver, vm);
goto cleanup;
}
}
qemuDomainObjEndJob(driver, vm);
@ -3496,7 +3506,7 @@ static int qemuDumpToFd(virQEMUDriverPtr driver, virDomainObjPtr vm,
ret = qemuMonitorDumpToFd(priv->mon, fd, dumpformat);
cleanup:
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
return ret;
}
@ -3695,7 +3705,8 @@ qemuDomainCoreDumpWithFormat(virDomainPtr dom,
priv = vm->privateData;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSystemReset(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
}
if (resume && virDomainObjIsActive(vm)) {
@ -3792,10 +3803,11 @@ qemuDomainScreenshot(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorScreendump(priv->mon, tmp) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto endjob;
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
if (VIR_CLOSE(tmp_fd) < 0) {
virReportSystemError(errno, _("unable to close %s"), tmp);
@ -4220,7 +4232,8 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorQueryRxFilter(priv->mon, devAlias, &guestFilter);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0)
goto endjob;
@ -6233,7 +6246,8 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
err = qemuMonitorGetBalloonInfo(priv->mon, &balloon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
err = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -7000,7 +7014,7 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
}
if (ret == 0)
qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE);
ret = qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE);
return ret;
}
@ -7076,7 +7090,7 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
}
if (ret == 0)
qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE);
ret = qemuDomainUpdateDeviceList(driver, vm, QEMU_ASYNC_JOB_NONE);
return ret;
}
@ -10101,10 +10115,11 @@ qemuDomainBlockResize(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorBlockResize(priv->mon, device, size) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto endjob;
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
ret = 0;
@ -10758,7 +10773,8 @@ qemuDomainMemoryStats(virDomainPtr dom,
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorGetMemoryStats(priv->mon, stats, nr_stats);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret >= 0 && ret < nr_stats) {
long rss;
@ -10892,16 +10908,17 @@ qemuDomainMemoryPeek(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
if (flags == VIR_MEMORY_VIRTUAL) {
if (qemuMonitorSaveVirtualMemory(priv->mon, offset, size, tmp) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto endjob;
}
} else {
if (qemuMonitorSavePhysicalMemory(priv->mon, offset, size, tmp) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto endjob;
}
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
/* Read the memory file into buffer. */
if (saferead(fd, buffer, size) == (ssize_t) -1) {
@ -11139,7 +11156,8 @@ qemuDomainGetBlockInfo(virDomainPtr dom,
ret = qemuMonitorGetBlockExtent(priv->mon,
disk->info.alias,
&src->allocation);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
}
if (ret == 0) {
@ -12379,7 +12397,8 @@ static int qemuDomainAbortJob(virDomainPtr dom)
qemuDomainObjAbortAsyncJob(vm);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorMigrateCancel(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -12422,7 +12441,8 @@ qemuDomainMigrateSetMaxDowntime(virDomainPtr dom,
VIR_DEBUG("Setting migration downtime to %llums", downtime);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSetMigrationDowntime(priv->mon, downtime);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -12475,7 +12495,8 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
ret = qemuMonitorGetMigrationCacheSize(priv->mon, cacheSize);
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -12529,7 +12550,8 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
ret = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -12579,7 +12601,8 @@ qemuDomainMigrateSetMaxSpeed(virDomainPtr dom,
VIR_DEBUG("Setting migration bandwidth to %luMbs", bandwidth);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSetMigrationSpeed(priv->mon, bandwidth);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret == 0)
priv->migMaxBandwidth = bandwidth;
@ -12895,7 +12918,8 @@ qemuDomainSnapshotCreateActiveInternal(virConnectPtr conn,
}
ret = qemuMonitorCreateSnapshot(priv->mon, snap->def->name);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0)
goto cleanup;
@ -13351,7 +13375,7 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
char *device = NULL;
char *source = NULL;
const char *formatStr = NULL;
int ret = -1;
int ret = -1, rc;
bool need_unlink = false;
if (snap->snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
@ -13413,18 +13437,14 @@ qemuDomainSnapshotCreateSingleDiskActive(virQEMUDriverPtr driver,
qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto cleanup;
ret = qemuMonitorDiskSnapshot(priv->mon, actions, device, source,
formatStr, reuse);
ret = rc = qemuMonitorDiskSnapshot(priv->mon, actions, device, source,
formatStr, reuse);
if (!actions) {
qemuDomainObjExitMonitor(driver, vm);
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("domain crashed while taking the snapshot"));
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
}
}
virDomainAuditDisk(vm, disk->src, snap->src, "snapshot", ret >= 0);
virDomainAuditDisk(vm, disk->src, snap->src, "snapshot", rc >= 0);
if (ret < 0)
goto cleanup;
@ -13559,12 +13579,8 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
if (ret == 0) {
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
ret = qemuMonitorTransaction(priv->mon, actions);
qemuDomainObjExitMonitor(driver, vm);
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("domain crashed while taking the snapshot"));
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
}
} else {
/* failed to enter monitor, clean stuff up and quit */
ret = -1;
@ -14657,7 +14673,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
}
qemuDomainObjEnterMonitor(driver, vm);
rc = qemuMonitorLoadSnapshot(priv->mon, snap->def->name);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
if (rc < 0) {
/* XXX resume domain if it was running before the
* failed loadvm attempt? */
@ -15029,7 +15046,8 @@ static int qemuDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorArbitraryCommand(priv->mon, cmd, result, hmp);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -15351,14 +15369,10 @@ qemuDomainBlockPivot(virConnectPtr conn,
if (!disk->mirrorState) {
qemuDomainObjEnterMonitor(driver, vm);
rc = qemuMonitorBlockJobInfo(priv->mon, device, &info, NULL);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
if (rc < 0)
goto cleanup;
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
_("domain is not running"));
goto cleanup;
}
if (rc == 1 && info.cur == info.end &&
info.type == VIR_DOMAIN_BLOCK_JOB_TYPE_COPY)
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_READY;
@ -15435,7 +15449,10 @@ qemuDomainBlockPivot(virConnectPtr conn,
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorDrivePivot(priv->mon, device, disk->mirror->path, format);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
ret = -1;
goto cleanup;
}
if (ret < 0) {
/* On failure, qemu abandons the mirror, and reverts back to
@ -15638,7 +15655,8 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorBlockJob(priv->mon, device, basePath, backingPath,
speed, mode, async);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0) {
if (mode == BLOCK_JOB_ABORT && disk->mirror)
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
@ -15683,7 +15701,8 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorBlockJobInfo(priv->mon, device, &dummy, NULL);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret <= 0)
break;
@ -15787,7 +15806,8 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom, const char *path,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorBlockJobInfo(priv->mon, device, info, &bandwidth);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0)
goto endjob;
@ -16005,7 +16025,8 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
ret = qemuMonitorDriveMirror(priv->mon, device, mirror->path, format,
bandwidth, granularity, buf_size, flags);
virDomainAuditDisk(vm, NULL, mirror, "mirror", ret >= 0);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0) {
qemuDomainPrepareDiskChainElement(driver, vm, mirror,
VIR_DISK_CHAIN_NO_ACCESS);
@ -16402,7 +16423,10 @@ qemuDomainBlockCommit(virDomainPtr dom,
ret = qemuMonitorBlockCommit(priv->mon, device,
topPath, basePath, backingPath,
speed);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
ret = -1;
goto endjob;
}
if (mirror) {
if (ret == 0) {
@ -16496,7 +16520,10 @@ qemuDomainOpenGraphics(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorOpenGraphics(priv->mon, protocol, fd, "graphicsfd",
(flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) != 0);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
ret = -1;
goto cleanup;
}
qemuDomainObjEndJob(driver, vm);
cleanup:
@ -16565,7 +16592,10 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorOpenGraphics(priv->mon, protocol, pair[1], "graphicsfd",
(flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH));
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
ret = -1;
goto cleanup;
}
qemuDomainObjEndJob(driver, vm);
if (ret < 0)
goto cleanup;
@ -17008,7 +17038,8 @@ qemuDomainGetBlockIoTune(virDomainPtr dom,
goto endjob;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorGetBlockIoThrottle(priv->mon, device, &reply, supportMaxOptions);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
if (ret < 0)
goto endjob;
}
@ -17180,7 +17211,8 @@ qemuDomainGetDiskErrors(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
table = qemuMonitorGetBlockInfo(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
if (!table)
goto endjob;
@ -17459,7 +17491,8 @@ qemuDomainPMWakeup(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSystemWakeup(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
endjob:
qemuDomainObjEndJob(driver, vm);
@ -17890,7 +17923,8 @@ qemuDomainSetTime(virDomainPtr dom,
qemuDomainObjEnterMonitor(driver, vm);
rv = qemuMonitorRTCResetReinjection(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
if (rv < 0)
goto endjob;
@ -18535,7 +18569,8 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver,
visitBacking);
ignore_value(qemuMonitorBlockStatsUpdateCapacity(priv->mon, stats,
visitBacking));
qemuDomainObjExitMonitor(driver, dom);
if (qemuDomainObjExitMonitor(driver, dom) < 0)
goto cleanup;
if (rc < 0) {
virResetLastError();

View File

@ -193,7 +193,10 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorEjectMedia(priv->mon, driveAlias, force);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
ret = -1;
goto cleanup;
}
if (ret < 0)
goto error;
@ -236,7 +239,10 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
driveAlias,
sourcestr,
format);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
ret = -1;
goto cleanup;
}
}
virDomainAuditDisk(vm, disk->src, newsrc, "update", ret >= 0);
@ -275,7 +281,8 @@ qemuDomainCheckEjectableMedia(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
table = qemuMonitorGetBlockInfo(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
}
if (!table)
@ -1031,7 +1038,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
if (qemuMonitorAddNetdev(priv->mon, netstr,
tapfd, tapfdName, tapfdSize,
vhostfd, vhostfdName, vhostfdSize) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
virDomainAuditNet(vm, NULL, net, "attach", false);
goto cleanup;
}
@ -1039,24 +1046,19 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
if (qemuMonitorAddHostNetwork(priv->mon, netstr,
tapfd, tapfdName, tapfdSize,
vhostfd, vhostfdName, vhostfdSize) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
virDomainAuditNet(vm, NULL, net, "attach", false);
goto cleanup;
}
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
for (i = 0; i < tapfdSize; i++)
VIR_FORCE_CLOSE(tapfd[i]);
for (i = 0; i < vhostfdSize; i++)
VIR_FORCE_CLOSE(vhostfd[i]);
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("guest unexpectedly quit"));
goto cleanup;
}
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
if (!(nicstr = qemuBuildNicDevStr(vm->def, net, vlan, 0,
vhostfdSize, priv->qemuCaps)))
@ -1069,7 +1071,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
qemuDomainObjEnterMonitor(driver, vm);
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
if (qemuMonitorAddDevice(priv->mon, nicstr) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
virDomainAuditNet(vm, NULL, net, "attach", false);
goto try_remove;
}
@ -1077,14 +1079,15 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
guestAddr = net->info.addr.pci;
if (qemuMonitorAddPCINetwork(priv->mon, nicstr,
&guestAddr) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
virDomainAuditNet(vm, NULL, net, "attach", false);
goto try_remove;
}
net->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
memcpy(&net->info.addr.pci, &guestAddr, sizeof(guestAddr));
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
/* set link state */
if (net->linkstate == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN) {
@ -1096,7 +1099,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_NETDEV)) {
if (qemuMonitorSetLink(priv->mon, net->info.alias, VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DOWN) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
virDomainAuditNet(vm, NULL, net, "attach", false);
goto try_remove;
}
@ -1105,7 +1108,8 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
_("setting of link state not supported: Link is up"));
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
}
/* link set to down */
}
@ -1179,7 +1183,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
if (qemuMonitorRemoveNetdev(priv->mon, netdev_name) < 0)
VIR_WARN("Failed to remove network backend for netdev %s",
netdev_name);
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
VIR_FREE(netdev_name);
} else {
VIR_WARN("Unable to remove network backend");
@ -1192,7 +1196,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
if (qemuMonitorRemoveHostNetwork(priv->mon, vlan, hostnet_name) < 0)
VIR_WARN("Failed to remove network backend for vlan %d, net %s",
vlan, hostnet_name);
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
VIR_FREE(hostnet_name);
}
goto cleanup;

View File

@ -550,7 +550,7 @@ qemuMigrationCookieAddNBD(qemuMigrationCookiePtr mig,
qemuDomainObjPrivatePtr priv = vm->privateData;
virHashTablePtr stats = NULL;
size_t i;
int ret = -1;
int ret = -1, rc;
/* It is not a bug if there already is a NBD data */
if (!mig->nbd &&
@ -571,18 +571,11 @@ qemuMigrationCookieAddNBD(qemuMigrationCookiePtr mig,
goto cleanup;
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorBlockStatsUpdateCapacity(priv->mon, stats,
false) < 0) {
qemuDomainObjExitMonitor(driver, vm);
rc = qemuMonitorBlockStatsUpdateCapacity(priv->mon, stats, false);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
}
qemuDomainObjExitMonitor(driver, vm);
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("domain exited meanwhile"));
if (rc < 0)
goto cleanup;
}
}
if (!disk->info.alias ||
@ -1655,15 +1648,13 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
if (!port &&
((virPortAllocatorAcquire(driver->migrationPorts, &port) < 0) ||
(qemuMonitorNBDServerStart(priv->mon, listenAddr, port) < 0))) {
qemuDomainObjExitMonitor(driver, vm);
goto cleanup;
goto exit_monitor;
}
if (qemuMonitorNBDServerAdd(priv->mon, diskAlias, true) < 0) {
qemuDomainObjExitMonitor(driver, vm);
if (qemuMonitorNBDServerAdd(priv->mon, diskAlias, true) < 0)
goto exit_monitor;
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
}
qemuDomainObjExitMonitor(driver, vm);
}
priv->nbdPort = port;
@ -1674,6 +1665,10 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
if (ret < 0)
virPortAllocatorRelease(driver->migrationPorts, port);
return ret;
exit_monitor:
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto cleanup;
}
/**
@ -1763,7 +1758,8 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
goto error;
mon_ret = qemuMonitorDriveMirror(priv->mon, diskAlias, nbd_dest,
NULL, speed, 0, 0, mirror_flags);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto error;
if (mon_ret < 0)
goto error;
@ -1784,7 +1780,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
/* explicitly do this *after* we entered the monitor,
* as this is a critical section so we are guaranteed
* priv->job.asyncAbort will not change */
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
priv->job.current->type = VIR_DOMAIN_JOB_CANCELLED;
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
@ -1793,7 +1789,8 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
}
mon_ret = qemuMonitorBlockJobInfo(priv->mon, diskAlias, &info,
NULL);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto error;
if (mon_ret < 0)
goto error;
@ -1848,7 +1845,8 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
BLOCK_JOB_ABORT, true) < 0) {
VIR_WARN("Unable to cancel block-job on '%s'", diskAlias);
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
break;
} else {
VIR_WARN("Unable to enter monitor. No block job cancelled");
}
@ -1860,7 +1858,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
}
static void
static int
qemuMigrationStopNBDServer(virQEMUDriverPtr driver,
virDomainObjPtr vm,
qemuMigrationCookiePtr mig)
@ -1868,22 +1866,23 @@ qemuMigrationStopNBDServer(virQEMUDriverPtr driver,
qemuDomainObjPrivatePtr priv = vm->privateData;
if (!mig->nbd)
return;
return 0;
if (qemuDomainObjEnterMonitorAsync(driver, vm,
QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
return;
return -1;
if (qemuMonitorNBDServerStop(priv->mon) < 0)
VIR_WARN("Unable to stop NBD server");
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
priv->nbdPort = 0;
return 0;
}
static void
static int
qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig,
virQEMUDriverPtr driver,
virDomainObjPtr vm)
@ -1891,6 +1890,7 @@ qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig,
qemuDomainObjPrivatePtr priv = vm->privateData;
size_t i;
char *diskAlias = NULL;
int ret = 0;
VIR_DEBUG("mig=%p nbdPort=%d", mig->nbd, priv->nbdPort);
@ -1914,12 +1914,15 @@ qemuMigrationCancelDriveMirror(qemuMigrationCookiePtr mig,
if (qemuMonitorBlockJob(priv->mon, diskAlias, NULL, NULL, 0,
BLOCK_JOB_ABORT, true) < 0)
VIR_WARN("Unable to stop block job on %s", diskAlias);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
ret = -1;
goto cleanup;
}
}
cleanup:
VIR_FREE(diskAlias);
return;
return ret;
}
/* Validate whether the domain is safe to migrate. If vm is NULL,
@ -2125,7 +2128,8 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver,
state);
cleanup:
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
return ret;
}
@ -2164,7 +2168,8 @@ qemuMigrationSetAutoConverge(virQEMUDriverPtr driver,
state);
cleanup:
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
return ret;
}
@ -2210,7 +2215,8 @@ qemuMigrationSetPinAll(virQEMUDriverPtr driver,
state);
cleanup:
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
return ret;
}
@ -2222,6 +2228,7 @@ qemuMigrationWaitForSpice(virQEMUDriverPtr driver,
bool wait_for_spice = false;
bool spice_migrated = false;
size_t i = 0;
int rc;
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION)) {
for (i = 0; i < vm->def->ngraphics; i++) {
@ -2243,12 +2250,11 @@ qemuMigrationWaitForSpice(virQEMUDriverPtr driver,
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
return -1;
if (qemuMonitorGetSpiceMigrationStatus(priv->mon,
&spice_migrated) < 0) {
qemuDomainObjExitMonitor(driver, vm);
rc = qemuMonitorGetSpiceMigrationStatus(priv->mon, &spice_migrated);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
if (rc < 0)
return -1;
}
qemuDomainObjExitMonitor(driver, vm);
virObjectUnlock(vm);
nanosleep(&ts, NULL);
virObjectLock(vm);
@ -2278,7 +2284,8 @@ qemuMigrationUpdateJobStatus(virQEMUDriverPtr driver,
}
ret = qemuMonitorGetMigrationStatus(priv->mon, &status);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
if (ret < 0 ||
qemuDomainJobInfoUpdateTime(priv->job.current) < 0)
@ -2476,7 +2483,8 @@ qemuDomainMigrateGraphicsRelocate(virQEMUDriverPtr driver,
QEMU_ASYNC_JOB_MIGRATION_OUT) == 0) {
ret = qemuMonitorGraphicsRelocate(priv->mon, type, listenAddress,
port, tlsPort, tlsSubject);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
}
cleanup:
@ -3875,7 +3883,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
/* explicitly do this *after* we entered the monitor,
* as this is a critical section so we are guaranteed
* priv->job.asyncAbort will not change */
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
priv->job.current->type = VIR_DOMAIN_JOB_CANCELLED;
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
@ -3883,24 +3891,20 @@ qemuMigrationRun(virQEMUDriverPtr driver,
goto cleanup;
}
if (qemuMonitorSetMigrationSpeed(priv->mon, migrate_speed) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto cleanup;
}
if (qemuMonitorSetMigrationSpeed(priv->mon, migrate_speed) < 0)
goto exit_monitor;
/* connect to the destination qemu if needed */
if (spec->destType == MIGRATION_DEST_CONNECT_HOST &&
qemuMigrationConnect(driver, vm, spec) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto cleanup;
goto exit_monitor;
}
switch (spec->destType) {
case MIGRATION_DEST_HOST:
if (STREQ(spec->dest.host.protocol, "rdma") &&
virProcessSetMaxMemLock(vm->pid, vm->def->mem.hard_limit << 10) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto cleanup;
goto exit_monitor;
}
ret = qemuMonitorMigrateToHost(priv->mon, migrate_flags,
spec->dest.host.protocol,
@ -3934,17 +3938,12 @@ qemuMigrationRun(virQEMUDriverPtr driver,
VIR_FORCE_CLOSE(spec->dest.fd.qemu);
break;
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0)
goto cleanup;
ret = -1;
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("guest unexpectedly quit"));
goto cleanup;
}
/* From this point onwards we *must* call cancel to abort the
* migration on source if anything goes wrong */
@ -4001,7 +4000,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
/* cancel any outstanding NBD jobs */
if (mig)
qemuMigrationCancelDriveMirror(mig, driver, vm);
ignore_value(qemuMigrationCancelDriveMirror(mig, driver, vm));
if (spec->fwdType != MIGRATION_FWD_DIRECT) {
if (iothread && qemuMigrationStopTunnel(iothread, ret < 0) < 0)
@ -4036,6 +4035,10 @@ qemuMigrationRun(virQEMUDriverPtr driver,
return ret;
exit_monitor:
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto cleanup;
cancel:
orig_err = virSaveLastError();
@ -4043,7 +4046,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm,
QEMU_ASYNC_JOB_MIGRATION_OUT) == 0) {
qemuMonitorMigrateCancel(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
}
}
goto cleanup;
@ -5143,7 +5146,8 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
VIR_WARN("unable to provide network data for relocation");
}
qemuMigrationStopNBDServer(driver, vm, mig);
if (qemuMigrationStopNBDServer(driver, vm, mig) < 0)
goto endjob;
if (flags & VIR_MIGRATE_PERSIST_DEST) {
virDomainDefPtr vmdef;
@ -5320,7 +5324,8 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
qemuMonitorSetMigrationSpeed(priv->mon,
QEMU_DOMAIN_MIG_BANDWIDTH_MAX);
priv->migMaxBandwidth = QEMU_DOMAIN_MIG_BANDWIDTH_MAX;
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
}
if (!virDomainObjIsActive(vm)) {
@ -5396,11 +5401,11 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
if (virSetCloseExec(pipeFD[1]) < 0) {
virReportSystemError(errno, "%s",
_("Unable to set cloexec flag"));
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto cleanup;
}
if (virCommandRunAsync(cmd, NULL) < 0) {
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto cleanup;
}
rc = qemuMonitorMigrateToFd(priv->mon,
@ -5415,14 +5420,8 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
args, path, offset);
}
}
qemuDomainObjExitMonitor(driver, vm);
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("guest unexpectedly quit"));
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
}
if (rc < 0)
goto cleanup;
@ -5435,7 +5434,7 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
if (virDomainObjIsActive(vm) &&
qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
qemuMonitorMigrateCancel(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
}
}
goto cleanup;
@ -5455,7 +5454,7 @@ qemuMigrationToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
qemuMonitorSetMigrationSpeed(priv->mon, saveMigBandwidth);
priv->migMaxBandwidth = saveMigBandwidth;
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
}
VIR_FORCE_CLOSE(pipeFD[0]);

View File

@ -571,7 +571,7 @@ qemuProcessFakeReboot(void *opaque)
virObjectEventPtr event = NULL;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virDomainRunningReason reason = VIR_DOMAIN_RUNNING_BOOTED;
int ret = -1;
int ret = -1, rc;
VIR_DEBUG("vm=%p", vm);
virObjectLock(vm);
@ -585,17 +585,13 @@ qemuProcessFakeReboot(void *opaque)
}
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorSystemReset(priv->mon) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto endjob;
}
qemuDomainObjExitMonitor(driver, vm);
rc = qemuMonitorSystemReset(priv->mon);
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("guest unexpectedly quit"));
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
if (rc < 0)
goto endjob;
}
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_CRASHED)
reason = VIR_DOMAIN_RUNNING_CRASHED;
@ -1662,7 +1658,8 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob,
if (ret == 0 &&
virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MONITOR_JSON))
ret = virQEMUCapsProbeQMP(priv->qemuCaps, priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
error:
@ -2118,7 +2115,8 @@ qemuProcessReconnectRefreshChannelVirtioState(virQEMUDriverPtr driver,
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorGetChardevInfo(priv->mon, &info);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0)
goto cleanup;
@ -2171,9 +2169,10 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto cleanup;
ret = qemuMonitorGetChardevInfo(priv->mon, &info);
qemuDomainObjExitMonitor(driver, vm);
VIR_DEBUG("qemuMonitorGetChardevInfo returned %i", ret);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret == 0) {
if ((ret = qemuProcessFindCharDevicePTYsMonitor(vm, qemuCaps,
info)) < 0)
@ -2264,18 +2263,19 @@ qemuProcessDetectVcpuPIDs(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
/* failure to get the VCPU<-> PID mapping or to execute the query
* command will not be treated fatal as some versions of qemu don't
* support this command */
if ((ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids)) <= 0) {
qemuDomainObjExitMonitor(driver, vm);
if (ncpupids <= 0) {
virResetLastError();
priv->nvcpupids = 0;
priv->vcpupids = NULL;
return 0;
}
qemuDomainObjExitMonitor(driver, vm);
if (ncpupids != vm->def->vcpus) {
virReportError(VIR_ERR_INTERNAL_ERROR,
@ -2310,7 +2310,8 @@ qemuProcessDetectIOThreadPIDs(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto cleanup;
niothreads = qemuMonitorGetIOThreads(priv->mon, &iothreads);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
if (niothreads < 0)
goto cleanup;
@ -3023,11 +3024,13 @@ qemuProcessInitPCIAddresses(virQEMUDriverPtr driver,
return -1;
naddrs = qemuMonitorGetAllPCIAddresses(priv->mon,
&addrs);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
if (naddrs > 0)
ret = qemuProcessDetectPCIAddresses(vm, addrs, naddrs);
cleanup:
VIR_FREE(addrs);
return ret;
@ -3135,7 +3138,8 @@ qemuProcessUpdateVideoRamSize(virQEMUDriverPtr driver,
}
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
cfg = virQEMUDriverGetConfig(driver);
ret = virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm);
@ -3144,7 +3148,7 @@ qemuProcessUpdateVideoRamSize(virQEMUDriverPtr driver,
return ret;
error:
qemuDomainObjExitMonitor(driver, vm);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
return -1;
}
@ -3256,7 +3260,8 @@ qemuProcessStartCPUs(virQEMUDriverPtr driver, virDomainObjPtr vm,
goto release;
ret = qemuMonitorStartCPUs(priv->mon, conn);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0)
goto release;
@ -3289,7 +3294,8 @@ int qemuProcessStopCPUs(virQEMUDriverPtr driver,
goto cleanup;
ret = qemuMonitorStopCPUs(priv->mon);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret < 0)
goto cleanup;
@ -3358,9 +3364,10 @@ qemuProcessUpdateState(virQEMUDriverPtr driver, virDomainObjPtr vm)
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorGetStatus(priv->mon, &running, &reason);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
if (ret < 0 || !virDomainObjIsActive(vm))
if (ret < 0)
return -1;
state = virDomainObjGetState(vm, NULL);
@ -3472,7 +3479,8 @@ qemuProcessRecoverMigration(virQEMUDriverPtr driver,
vm->def->name);
qemuDomainObjEnterMonitor(driver, vm);
ignore_value(qemuMonitorMigrateCancel(priv->mon));
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
/* resume the domain but only if it was paused as a result of
* migration */
if (state == VIR_DOMAIN_PAUSED &&
@ -3541,7 +3549,8 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver,
case QEMU_ASYNC_JOB_SNAPSHOT:
qemuDomainObjEnterMonitor(driver, vm);
ignore_value(qemuMonitorMigrateCancel(priv->mon));
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
/* resume the domain but only if it was paused as a result of
* running a migration-to-file operation. Although we are
* recovering an async job, this function is run at startup
@ -4066,7 +4075,8 @@ qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return false;
rc = qemuMonitorGetGuestCPU(priv->mon, arch, &guestcpu);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
return false;
if (rc < 0) {
if (rc == -2)
@ -4853,12 +4863,10 @@ int qemuProcessStart(virConnectPtr conn,
VIR_DEBUG("Setting network link states");
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto cleanup;
if (qemuProcessSetLinkStates(vm) < 0) {
qemuDomainObjExitMonitor(driver, vm);
if (qemuProcessSetLinkStates(vm) < 0)
goto exit_monitor;
if (qemuDomainObjExitMonitor(driver, vm))
goto cleanup;
}
qemuDomainObjExitMonitor(driver, vm);
VIR_DEBUG("Fetching list of active devices");
if (qemuDomainUpdateDeviceList(driver, vm, asyncJob) < 0)
@ -4882,10 +4890,8 @@ int qemuProcessStart(virConnectPtr conn,
goto cleanup;
if (period)
qemuMonitorSetMemoryStatsPeriod(priv->mon, period);
if (qemuMonitorSetBalloon(priv->mon, cur_balloon) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto cleanup;
}
if (qemuMonitorSetBalloon(priv->mon, cur_balloon) < 0)
goto exit_monitor;
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
@ -4962,6 +4968,10 @@ int qemuProcessStart(virConnectPtr conn,
virObjectUnref(caps);
return -1;
exit_monitor:
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto cleanup;
}
@ -5468,21 +5478,13 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
VIR_DEBUG("Getting initial memory amount");
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorGetBalloonInfo(priv->mon, &vm->def->mem.cur_balloon) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto error;
}
if (qemuMonitorGetStatus(priv->mon, &running, &reason) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto error;
}
if (qemuMonitorGetVirtType(priv->mon, &vm->def->virtType) < 0) {
qemuDomainObjExitMonitor(driver, vm);
goto error;
}
qemuDomainObjExitMonitor(driver, vm);
if (!virDomainObjIsActive(vm))
if (qemuMonitorGetBalloonInfo(priv->mon, &vm->def->mem.cur_balloon) < 0)
goto exit_monitor;
if (qemuMonitorGetStatus(priv->mon, &running, &reason) < 0)
goto exit_monitor;
if (qemuMonitorGetVirtType(priv->mon, &vm->def->virtType) < 0)
goto exit_monitor;
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto error;
if (running) {
@ -5492,7 +5494,8 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
qemuDomainObjEnterMonitor(driver, vm);
qemuMonitorSetMemoryStatsPeriod(priv->mon,
vm->def->memballoon->period);
qemuDomainObjExitMonitor(driver, vm);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto error;
}
} else {
virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, reason);
@ -5527,6 +5530,8 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
return 0;
exit_monitor:
ignore_value(qemuDomainObjExitMonitor(driver, vm));
error:
/* We jump here if we failed to attach to the VM for any reason.
* Leave the domain running, but pretend we never attempted to