qemu: migration: Properly setup mirror for blockdev configurations

With blockdev we need to refer to the nodename of the disk source image
as the source argument for the blockdev-mirror operation while still
keeping the old job name. With blockdev we must also persist the job in
qemu.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Peter Krempa 2019-12-06 18:50:46 +01:00
parent 3e35156bd1
commit f5259ba402
1 changed files with 20 additions and 4 deletions

View File

@ -817,7 +817,9 @@ static int
qemuMigrationSrcNBDStorageCopyBlockdev(virQEMUDriverPtr driver, qemuMigrationSrcNBDStorageCopyBlockdev(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
const char *diskAlias, const char *jobname,
const char *sourcename,
bool persistjob,
const char *host, const char *host,
int port, int port,
unsigned long long mirror_speed, unsigned long long mirror_speed,
@ -848,8 +850,8 @@ qemuMigrationSrcNBDStorageCopyBlockdev(virQEMUDriverPtr driver,
mon_ret = qemuBlockStorageSourceAttachApply(qemuDomainGetMonitor(vm), data); mon_ret = qemuBlockStorageSourceAttachApply(qemuDomainGetMonitor(vm), data);
if (mon_ret == 0) if (mon_ret == 0)
mon_ret = qemuMonitorBlockdevMirror(qemuDomainGetMonitor(vm), NULL, false, mon_ret = qemuMonitorBlockdevMirror(qemuDomainGetMonitor(vm), jobname, persistjob,
diskAlias, copysrc->nodeformat, sourcename, copysrc->nodeformat,
mirror_speed, 0, 0, mirror_shallow); mirror_speed, 0, 0, mirror_shallow);
if (mon_ret != 0) if (mon_ret != 0)
@ -914,6 +916,9 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
qemuBlockJobDataPtr job = NULL; qemuBlockJobDataPtr job = NULL;
char *diskAlias = NULL; char *diskAlias = NULL;
const char *jobname = NULL;
const char *sourcename = NULL;
bool persistjob = false;
int rc; int rc;
int ret = -1; int ret = -1;
@ -923,12 +928,23 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_COPY, diskAlias))) if (!(job = qemuBlockJobDiskNew(vm, disk, QEMU_BLOCKJOB_TYPE_COPY, diskAlias)))
goto cleanup; goto cleanup;
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
jobname = diskAlias;
sourcename = disk->src->nodeformat;
persistjob = true;
} else {
jobname = NULL;
sourcename = diskAlias;
persistjob = false;
}
qemuBlockJobSyncBegin(job); qemuBlockJobSyncBegin(job);
if (flags & VIR_MIGRATE_TLS || if (flags & VIR_MIGRATE_TLS ||
virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
rc = qemuMigrationSrcNBDStorageCopyBlockdev(driver, vm, rc = qemuMigrationSrcNBDStorageCopyBlockdev(driver, vm,
disk, diskAlias, disk, jobname,
sourcename, persistjob,
host, port, host, port,
mirror_speed, mirror_speed,
mirror_shallow, mirror_shallow,