mirror of https://gitee.com/openkylin/libvirt.git
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:
parent
3e35156bd1
commit
f5259ba402
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue