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); qemuDomainObjEnterMonitor(driver, vm);
/* we continue on even in the face of error */ /* we continue on even in the face of error */
qemuMonitorDeleteSnapshot(priv->mon, snap->def->name); 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; qemuDomainObjPrivatePtr priv = vm->privateData;
char **aliases; char **aliases;
int rc;
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_DEL_EVENT)) if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_DEL_EVENT))
return 0; return 0;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1; return -1;
if (qemuMonitorGetDeviceAliases(priv->mon, &aliases) < 0) { rc = qemuMonitorGetDeviceAliases(priv->mon, &aliases);
qemuDomainObjExitMonitor(driver, vm); if (qemuDomainObjExitMonitor(driver, vm) < 0)
return -1;
if (rc < 0)
return -1; return -1;
}
qemuDomainObjExitMonitor(driver, vm);
virStringFreeList(priv->qemuDevices); virStringFreeList(priv->qemuDevices);
priv->qemuDevices = aliases; priv->qemuDevices = aliases;

View File

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

View File

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

View File

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

View File

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

View File

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