int
qemuBlockNodeNamesDetect(virQEMUDriverPtr driver,
- virDomainObjPtr vm)
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virHashTablePtr disktable = NULL;
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_NAMED_BLOCK_NODES))
return 0;
- qemuDomainObjEnterMonitor(driver, vm);
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+ return -1;
disktable = qemuMonitorGetBlockInfo(qemuDomainGetMonitor(vm));
data = qemuMonitorQueryNamedBlockNodes(qemuDomainGetMonitor(vm));
# include "internal.h"
# include "qemu_conf.h"
+# include "qemu_domain.h"
# include "virhash.h"
# include "virjson.h"
int
qemuBlockNodeNamesDetect(virQEMUDriverPtr driver,
- virDomainObjPtr vm);
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob);
virHashTablePtr
qemuBlockGetNodeData(virJSONValuePtr data);
int
qemuBlockJobUpdate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk)
{
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
int status = diskPriv->blockJobStatus;
if (status != -1) {
- qemuBlockJobEventProcess(driver, vm, disk,
+ qemuBlockJobEventProcess(driver, vm, disk, asyncJob,
diskPriv->blockJobType,
diskPriv->blockJobStatus);
diskPriv->blockJobStatus = -1;
qemuBlockJobEventProcess(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr disk,
+ qemuDomainAsyncJob asyncJob,
int type,
int status)
{
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk,
true, true));
- ignore_value(qemuBlockNodeNamesDetect(driver, vm));
+ ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
diskPriv->blockjob = false;
break;
void
qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk)
{
VIR_DEBUG("disk=%s", disk->dst);
- qemuBlockJobUpdate(driver, vm, disk);
+ qemuBlockJobUpdate(driver, vm, asyncJob, disk);
QEMU_DOMAIN_DISK_PRIVATE(disk)->blockJobSync = false;
}
# include "internal.h"
# include "qemu_conf.h"
+# include "qemu_domain.h"
int qemuBlockJobUpdate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk);
void qemuBlockJobEventProcess(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr disk,
+ qemuDomainAsyncJob asyncJob,
int type,
int status);
void qemuBlockJobSyncBegin(virDomainDiskDefPtr disk);
void qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk);
#endif /* __QEMU_BLOCKJOB_H__ */
}
if ((disk = qemuProcessFindDomainDiskByAlias(vm, diskAlias)))
- qemuBlockJobEventProcess(driver, vm, disk, type, status);
+ qemuBlockJobEventProcess(driver, vm, disk, QEMU_ASYNC_JOB_NONE, type, status);
endjob:
qemuDomainObjEndJob(driver, vm);
* event to pull and let qemuBlockJobEventProcess() handle
* the rest as usual */
qemuBlockJobEventProcess(driver, vm, disk,
+ QEMU_ASYNC_JOB_NONE,
VIR_DOMAIN_BLOCK_JOB_TYPE_PULL,
VIR_DOMAIN_BLOCK_JOB_CANCELED);
} else {
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
- qemuBlockJobUpdate(driver, vm, disk);
+ qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
while (diskPriv->blockjob) {
if (virDomainObjWait(vm) < 0) {
ret = -1;
goto endjob;
}
- qemuBlockJobUpdate(driver, vm, disk);
+ qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
}
}
}
endjob:
if (disk)
- qemuBlockJobSyncEnd(driver, vm, disk);
+ qemuBlockJobSyncEnd(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
qemuDomainObjEndJob(driver, vm);
cleanup:
goto endjob;
if (!src->nodebacking &&
- qemuBlockNodeNamesDetect(driver, vm) < 0)
+ qemuBlockNodeNamesDetect(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
goto endjob;
if (!src->nodebacking) {
*/
static int
qemuMigrationDriveMirrorReady(virQEMUDriverPtr driver,
- virDomainObjPtr vm)
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob)
{
size_t i;
size_t notReady = 0;
if (!diskPriv->migrating)
continue;
- status = qemuBlockJobUpdate(driver, vm, disk);
+ status = qemuBlockJobUpdate(driver, vm, asyncJob, disk);
if (status == VIR_DOMAIN_BLOCK_JOB_FAILED) {
virReportError(VIR_ERR_OPERATION_FAILED,
_("migration of disk %s failed"),
static int
qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver,
virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
bool check)
{
size_t i;
if (!diskPriv->migrating)
continue;
- status = qemuBlockJobUpdate(driver, vm, disk);
+ status = qemuBlockJobUpdate(driver, vm, asyncJob, disk);
switch (status) {
case VIR_DOMAIN_BLOCK_JOB_FAILED:
if (check) {
/* fallthrough */
case VIR_DOMAIN_BLOCK_JOB_CANCELED:
case VIR_DOMAIN_BLOCK_JOB_COMPLETED:
- qemuBlockJobSyncEnd(driver, vm, disk);
+ qemuBlockJobSyncEnd(driver, vm, asyncJob, disk);
diskPriv->migrating = false;
break;
int status;
int rv;
- status = qemuBlockJobUpdate(driver, vm, disk);
+ status = qemuBlockJobUpdate(driver, vm, asyncJob, disk);
switch (status) {
case VIR_DOMAIN_BLOCK_JOB_FAILED:
case VIR_DOMAIN_BLOCK_JOB_CANCELED:
err = virSaveLastError();
failed = true;
}
- qemuBlockJobSyncEnd(driver, vm, disk);
+ qemuBlockJobSyncEnd(driver, vm, asyncJob, disk);
diskPriv->migrating = false;
}
}
- while ((rv = qemuMigrationDriveMirrorCancelled(driver, vm, check)) != 1) {
+ while ((rv = qemuMigrationDriveMirrorCancelled(driver, vm, asyncJob,
+ check)) != 1) {
if (check && !failed &&
dconn && virConnectIsAlive(dconn) <= 0) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
VIR_FREE(nbd_dest);
if (qemuDomainObjExitMonitor(driver, vm) < 0 || mon_ret < 0) {
- qemuBlockJobSyncEnd(driver, vm, disk);
+ qemuBlockJobSyncEnd(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, disk);
goto cleanup;
}
diskPriv->migrating = true;
}
}
- while ((rv = qemuMigrationDriveMirrorReady(driver, vm)) != 1) {
+ while ((rv = qemuMigrationDriveMirrorReady(driver, vm,
+ QEMU_ASYNC_JOB_MIGRATION_OUT)) != 1) {
if (rv < 0)
goto cleanup;
goto error;
if (flags & QEMU_MIGRATION_COMPLETED_CHECK_STORAGE &&
- qemuMigrationDriveMirrorReady(driver, vm) < 0)
+ qemuMigrationDriveMirrorReady(driver, vm, asyncJob) < 0)
goto error;
if (flags & QEMU_MIGRATION_COMPLETED_ABORT_ON_ERROR &&
VIR_DEBUG("Drive mirror on disk %s is still running", disk->dst);
} else {
VIR_DEBUG("Drive mirror on disk %s is gone", disk->dst);
- qemuBlockJobSyncEnd(driver, vm, disk);
+ qemuBlockJobSyncEnd(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
diskPriv->migrating = false;
}
}
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
if (diskPriv->migrating) {
- qemuBlockJobSyncEnd(driver, vm, disk);
+ qemuBlockJobSyncEnd(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
diskPriv->migrating = false;
}
}
if (qemuProcessRefreshDisks(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
goto error;
- if (qemuBlockNodeNamesDetect(driver, obj) < 0)
+ if (qemuBlockNodeNamesDetect(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
goto error;
if (qemuRefreshVirtioChannelState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)