mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: take current async job into account in qemuBlockNodeNamesDetect
Becase it can be called during migration out (namely on cancelling blockjobs). Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
135c56e2b8
commit
dd8e40790b
@ -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,
|
|||||||
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 @@
|
|||||||
# 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);
|
|||||||
|
|
||||||
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");
|
|||||||
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
|
|||||||
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,
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
|
|
||||||
# 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
* 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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
/* 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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user