提交 dd8e4079 编写于 作者: N Nikolay Shirokovskiy 提交者: Jiri Denemark

qemu: take current async job into account in qemuBlockNodeNamesDetect

Becase it can be called during migration out (namely on cancelling
blockjobs).
Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
上级 135c56e2
...@@ -336,7 +336,8 @@ qemuBlockDiskDetectNodes(virDomainDiskDefPtr disk, ...@@ -336,7 +336,8 @@ qemuBlockDiskDetectNodes(virDomainDiskDefPtr disk,
int int
qemuBlockNodeNamesDetect(virQEMUDriverPtr driver, qemuBlockNodeNamesDetect(virQEMUDriverPtr driver,
virDomainObjPtr vm) virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
virHashTablePtr disktable = NULL; virHashTablePtr disktable = NULL;
...@@ -350,7 +351,8 @@ qemuBlockNodeNamesDetect(virQEMUDriverPtr driver, ...@@ -350,7 +351,8 @@ qemuBlockNodeNamesDetect(virQEMUDriverPtr driver,
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_NAMED_BLOCK_NODES)) if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_NAMED_BLOCK_NODES))
return 0; return 0;
qemuDomainObjEnterMonitor(driver, vm); if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
disktable = qemuMonitorGetBlockInfo(qemuDomainGetMonitor(vm)); disktable = qemuMonitorGetBlockInfo(qemuDomainGetMonitor(vm));
data = qemuMonitorQueryNamedBlockNodes(qemuDomainGetMonitor(vm)); data = qemuMonitorQueryNamedBlockNodes(qemuDomainGetMonitor(vm));
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
# include "internal.h" # include "internal.h"
# include "qemu_conf.h" # include "qemu_conf.h"
# include "qemu_domain.h"
# include "virhash.h" # include "virhash.h"
# include "virjson.h" # include "virjson.h"
...@@ -46,7 +47,8 @@ qemuBlockNodeNameGetBackingChain(virJSONValuePtr data); ...@@ -46,7 +47,8 @@ qemuBlockNodeNameGetBackingChain(virJSONValuePtr data);
int int
qemuBlockNodeNamesDetect(virQEMUDriverPtr driver, qemuBlockNodeNamesDetect(virQEMUDriverPtr driver,
virDomainObjPtr vm); virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob);
virHashTablePtr virHashTablePtr
qemuBlockGetNodeData(virJSONValuePtr data); qemuBlockGetNodeData(virJSONValuePtr data);
......
...@@ -55,13 +55,14 @@ VIR_LOG_INIT("qemu.qemu_blockjob"); ...@@ -55,13 +55,14 @@ VIR_LOG_INIT("qemu.qemu_blockjob");
int int
qemuBlockJobUpdate(virQEMUDriverPtr driver, qemuBlockJobUpdate(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk) virDomainDiskDefPtr disk)
{ {
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
int status = diskPriv->blockJobStatus; int status = diskPriv->blockJobStatus;
if (status != -1) { if (status != -1) {
qemuBlockJobEventProcess(driver, vm, disk, qemuBlockJobEventProcess(driver, vm, disk, asyncJob,
diskPriv->blockJobType, diskPriv->blockJobType,
diskPriv->blockJobStatus); diskPriv->blockJobStatus);
diskPriv->blockJobStatus = -1; diskPriv->blockJobStatus = -1;
...@@ -87,6 +88,7 @@ void ...@@ -87,6 +88,7 @@ void
qemuBlockJobEventProcess(virQEMUDriverPtr driver, qemuBlockJobEventProcess(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
qemuDomainAsyncJob asyncJob,
int type, int type,
int status) int status)
{ {
...@@ -167,7 +169,7 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver, ...@@ -167,7 +169,7 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN; disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk,
true, true)); true, true));
ignore_value(qemuBlockNodeNamesDetect(driver, vm)); ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
diskPriv->blockjob = false; diskPriv->blockjob = false;
break; break;
...@@ -247,9 +249,10 @@ qemuBlockJobSyncBegin(virDomainDiskDefPtr disk) ...@@ -247,9 +249,10 @@ qemuBlockJobSyncBegin(virDomainDiskDefPtr disk)
void void
qemuBlockJobSyncEnd(virQEMUDriverPtr driver, qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk) virDomainDiskDefPtr disk)
{ {
VIR_DEBUG("disk=%s", disk->dst); VIR_DEBUG("disk=%s", disk->dst);
qemuBlockJobUpdate(driver, vm, disk); qemuBlockJobUpdate(driver, vm, asyncJob, disk);
QEMU_DOMAIN_DISK_PRIVATE(disk)->blockJobSync = false; QEMU_DOMAIN_DISK_PRIVATE(disk)->blockJobSync = false;
} }
...@@ -24,19 +24,23 @@ ...@@ -24,19 +24,23 @@
# include "internal.h" # include "internal.h"
# include "qemu_conf.h" # include "qemu_conf.h"
# include "qemu_domain.h"
int qemuBlockJobUpdate(virQEMUDriverPtr driver, int qemuBlockJobUpdate(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk); virDomainDiskDefPtr disk);
void qemuBlockJobEventProcess(virQEMUDriverPtr driver, void qemuBlockJobEventProcess(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
qemuDomainAsyncJob asyncJob,
int type, int type,
int status); int status);
void qemuBlockJobSyncBegin(virDomainDiskDefPtr disk); void qemuBlockJobSyncBegin(virDomainDiskDefPtr disk);
void qemuBlockJobSyncEnd(virQEMUDriverPtr driver, void qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob,
virDomainDiskDefPtr disk); virDomainDiskDefPtr disk);
#endif /* __QEMU_BLOCKJOB_H__ */ #endif /* __QEMU_BLOCKJOB_H__ */
...@@ -4513,7 +4513,7 @@ processBlockJobEvent(virQEMUDriverPtr driver, ...@@ -4513,7 +4513,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
} }
if ((disk = qemuProcessFindDomainDiskByAlias(vm, diskAlias))) if ((disk = qemuProcessFindDomainDiskByAlias(vm, diskAlias)))
qemuBlockJobEventProcess(driver, vm, disk, type, status); qemuBlockJobEventProcess(driver, vm, disk, QEMU_ASYNC_JOB_NONE, type, status);
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
...@@ -16239,24 +16239,25 @@ qemuDomainBlockJobAbort(virDomainPtr dom, ...@@ -16239,24 +16239,25 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
* event to pull and let qemuBlockJobEventProcess() handle * event to pull and let qemuBlockJobEventProcess() handle
* the rest as usual */ * the rest as usual */
qemuBlockJobEventProcess(driver, vm, disk, qemuBlockJobEventProcess(driver, vm, disk,
QEMU_ASYNC_JOB_NONE,
VIR_DOMAIN_BLOCK_JOB_TYPE_PULL, VIR_DOMAIN_BLOCK_JOB_TYPE_PULL,
VIR_DOMAIN_BLOCK_JOB_CANCELED); VIR_DOMAIN_BLOCK_JOB_CANCELED);
} else { } else {
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
qemuBlockJobUpdate(driver, vm, disk); qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
while (diskPriv->blockjob) { while (diskPriv->blockjob) {
if (virDomainObjWait(vm) < 0) { if (virDomainObjWait(vm) < 0) {
ret = -1; ret = -1;
goto endjob; goto endjob;
} }
qemuBlockJobUpdate(driver, vm, disk); qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
} }
} }
} }
endjob: endjob:
if (disk) if (disk)
qemuBlockJobSyncEnd(driver, vm, disk); qemuBlockJobSyncEnd(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
cleanup: cleanup:
...@@ -20404,7 +20405,7 @@ qemuDomainSetBlockThreshold(virDomainPtr dom, ...@@ -20404,7 +20405,7 @@ qemuDomainSetBlockThreshold(virDomainPtr dom,
goto endjob; goto endjob;
if (!src->nodebacking && if (!src->nodebacking &&
qemuBlockNodeNamesDetect(driver, vm) < 0) qemuBlockNodeNamesDetect(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
goto endjob; goto endjob;
if (!src->nodebacking) { if (!src->nodebacking) {
......
...@@ -601,7 +601,8 @@ qemuMigrationStopNBDServer(virQEMUDriverPtr driver, ...@@ -601,7 +601,8 @@ qemuMigrationStopNBDServer(virQEMUDriverPtr driver,
*/ */
static int static int
qemuMigrationDriveMirrorReady(virQEMUDriverPtr driver, qemuMigrationDriveMirrorReady(virQEMUDriverPtr driver,
virDomainObjPtr vm) virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob)
{ {
size_t i; size_t i;
size_t notReady = 0; size_t notReady = 0;
...@@ -614,7 +615,7 @@ qemuMigrationDriveMirrorReady(virQEMUDriverPtr driver, ...@@ -614,7 +615,7 @@ qemuMigrationDriveMirrorReady(virQEMUDriverPtr driver,
if (!diskPriv->migrating) if (!diskPriv->migrating)
continue; continue;
status = qemuBlockJobUpdate(driver, vm, disk); status = qemuBlockJobUpdate(driver, vm, asyncJob, disk);
if (status == VIR_DOMAIN_BLOCK_JOB_FAILED) { if (status == VIR_DOMAIN_BLOCK_JOB_FAILED) {
virReportError(VIR_ERR_OPERATION_FAILED, virReportError(VIR_ERR_OPERATION_FAILED,
_("migration of disk %s failed"), _("migration of disk %s failed"),
...@@ -649,6 +650,7 @@ qemuMigrationDriveMirrorReady(virQEMUDriverPtr driver, ...@@ -649,6 +650,7 @@ qemuMigrationDriveMirrorReady(virQEMUDriverPtr driver,
static int static int
qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver, qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob,
bool check) bool check)
{ {
size_t i; size_t i;
...@@ -663,7 +665,7 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver, ...@@ -663,7 +665,7 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver,
if (!diskPriv->migrating) if (!diskPriv->migrating)
continue; continue;
status = qemuBlockJobUpdate(driver, vm, disk); status = qemuBlockJobUpdate(driver, vm, asyncJob, disk);
switch (status) { switch (status) {
case VIR_DOMAIN_BLOCK_JOB_FAILED: case VIR_DOMAIN_BLOCK_JOB_FAILED:
if (check) { if (check) {
...@@ -675,7 +677,7 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver, ...@@ -675,7 +677,7 @@ qemuMigrationDriveMirrorCancelled(virQEMUDriverPtr driver,
/* fallthrough */ /* fallthrough */
case VIR_DOMAIN_BLOCK_JOB_CANCELED: case VIR_DOMAIN_BLOCK_JOB_CANCELED:
case VIR_DOMAIN_BLOCK_JOB_COMPLETED: case VIR_DOMAIN_BLOCK_JOB_COMPLETED:
qemuBlockJobSyncEnd(driver, vm, disk); qemuBlockJobSyncEnd(driver, vm, asyncJob, disk);
diskPriv->migrating = false; diskPriv->migrating = false;
break; break;
...@@ -723,7 +725,7 @@ qemuMigrationCancelOneDriveMirror(virQEMUDriverPtr driver, ...@@ -723,7 +725,7 @@ qemuMigrationCancelOneDriveMirror(virQEMUDriverPtr driver,
int status; int status;
int rv; int rv;
status = qemuBlockJobUpdate(driver, vm, disk); status = qemuBlockJobUpdate(driver, vm, asyncJob, disk);
switch (status) { switch (status) {
case VIR_DOMAIN_BLOCK_JOB_FAILED: case VIR_DOMAIN_BLOCK_JOB_FAILED:
case VIR_DOMAIN_BLOCK_JOB_CANCELED: case VIR_DOMAIN_BLOCK_JOB_CANCELED:
...@@ -800,12 +802,13 @@ qemuMigrationCancelDriveMirror(virQEMUDriverPtr driver, ...@@ -800,12 +802,13 @@ qemuMigrationCancelDriveMirror(virQEMUDriverPtr driver,
err = virSaveLastError(); err = virSaveLastError();
failed = true; failed = true;
} }
qemuBlockJobSyncEnd(driver, vm, disk); qemuBlockJobSyncEnd(driver, vm, asyncJob, disk);
diskPriv->migrating = false; diskPriv->migrating = false;
} }
} }
while ((rv = qemuMigrationDriveMirrorCancelled(driver, vm, check)) != 1) { while ((rv = qemuMigrationDriveMirrorCancelled(driver, vm, asyncJob,
check)) != 1) {
if (check && !failed && if (check && !failed &&
dconn && virConnectIsAlive(dconn) <= 0) { dconn && virConnectIsAlive(dconn) <= 0) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s", virReportError(VIR_ERR_OPERATION_FAILED, "%s",
...@@ -931,7 +934,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, ...@@ -931,7 +934,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
VIR_FREE(nbd_dest); VIR_FREE(nbd_dest);
if (qemuDomainObjExitMonitor(driver, vm) < 0 || mon_ret < 0) { if (qemuDomainObjExitMonitor(driver, vm) < 0 || mon_ret < 0) {
qemuBlockJobSyncEnd(driver, vm, disk); qemuBlockJobSyncEnd(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, disk);
goto cleanup; goto cleanup;
} }
diskPriv->migrating = true; diskPriv->migrating = true;
...@@ -942,7 +945,8 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, ...@@ -942,7 +945,8 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
} }
} }
while ((rv = qemuMigrationDriveMirrorReady(driver, vm)) != 1) { while ((rv = qemuMigrationDriveMirrorReady(driver, vm,
QEMU_ASYNC_JOB_MIGRATION_OUT)) != 1) {
if (rv < 0) if (rv < 0)
goto cleanup; goto cleanup;
...@@ -1487,7 +1491,7 @@ qemuMigrationCompleted(virQEMUDriverPtr driver, ...@@ -1487,7 +1491,7 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
goto error; goto error;
if (flags & QEMU_MIGRATION_COMPLETED_CHECK_STORAGE && if (flags & QEMU_MIGRATION_COMPLETED_CHECK_STORAGE &&
qemuMigrationDriveMirrorReady(driver, vm) < 0) qemuMigrationDriveMirrorReady(driver, vm, asyncJob) < 0)
goto error; goto error;
if (flags & QEMU_MIGRATION_COMPLETED_ABORT_ON_ERROR && if (flags & QEMU_MIGRATION_COMPLETED_ABORT_ON_ERROR &&
...@@ -5573,7 +5577,7 @@ qemuMigrationCancel(virQEMUDriverPtr driver, ...@@ -5573,7 +5577,7 @@ qemuMigrationCancel(virQEMUDriverPtr driver,
VIR_DEBUG("Drive mirror on disk %s is still running", disk->dst); VIR_DEBUG("Drive mirror on disk %s is still running", disk->dst);
} else { } else {
VIR_DEBUG("Drive mirror on disk %s is gone", disk->dst); 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; diskPriv->migrating = false;
} }
} }
...@@ -5595,7 +5599,7 @@ qemuMigrationCancel(virQEMUDriverPtr driver, ...@@ -5595,7 +5599,7 @@ qemuMigrationCancel(virQEMUDriverPtr driver,
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
if (diskPriv->migrating) { if (diskPriv->migrating) {
qemuBlockJobSyncEnd(driver, vm, disk); qemuBlockJobSyncEnd(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
diskPriv->migrating = false; diskPriv->migrating = false;
} }
} }
......
...@@ -3489,7 +3489,7 @@ qemuProcessReconnect(void *opaque) ...@@ -3489,7 +3489,7 @@ qemuProcessReconnect(void *opaque)
if (qemuProcessRefreshDisks(driver, obj, QEMU_ASYNC_JOB_NONE) < 0) if (qemuProcessRefreshDisks(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
goto error; goto error;
if (qemuBlockNodeNamesDetect(driver, obj) < 0) if (qemuBlockNodeNamesDetect(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
goto error; goto error;
if (qemuRefreshVirtioChannelState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0) if (qemuRefreshVirtioChannelState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册