mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 06:50:22 +03:00
qemu: blockjob: Split out update of persistent XML disk's source on mirror jobs
Both active block commit and block copy modify the disk source of the active definition and thus also must modify the corresponding inactive definition source so that the VM starts up later. This is currently implemented in the legacy block job handler but the logic will be useful also for the new handlers. Split it out which also simplifies it. Signed-off-by: Peter Krempa <pkrempa@redhat.com> ACKed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
dae7d01322
commit
3b27b5f35a
@ -434,6 +434,44 @@ qemuBlockJobEmitEvents(virQEMUDriverPtr driver,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* qemuBlockJobRewriteConfigDiskSource:
|
||||
* @vm: domain object
|
||||
* @disk: live definition disk
|
||||
* @newsrc: new source which should be also considered for the new disk
|
||||
*
|
||||
* For block jobs which modify the running disk source it is required that we
|
||||
* try our best to update the config XML's disk source as well in most cases.
|
||||
*
|
||||
* This helper finds the disk from the persistent definition corresponding to
|
||||
* @disk and updates its source to @newsrc.
|
||||
*/
|
||||
static void
|
||||
qemuBlockJobRewriteConfigDiskSource(virDomainObjPtr vm,
|
||||
virDomainDiskDefPtr disk,
|
||||
virStorageSourcePtr newsrc)
|
||||
{
|
||||
virDomainDiskDefPtr persistDisk = NULL;
|
||||
VIR_AUTOUNREF(virStorageSourcePtr) copy = NULL;
|
||||
|
||||
if (!vm->newDef)
|
||||
return;
|
||||
|
||||
if (!(persistDisk = virDomainDiskByName(vm->newDef, disk->dst, false)))
|
||||
return;
|
||||
|
||||
if (!(copy = virStorageSourceCopy(newsrc, false)) ||
|
||||
virStorageSourceInitChainElement(copy, persistDisk->src, true) < 0) {
|
||||
VIR_WARN("Unable to update persistent definition on vm %s after block job",
|
||||
vm->def->name);
|
||||
return;
|
||||
}
|
||||
|
||||
virObjectUnref(persistDisk->src);
|
||||
VIR_STEAL_PTR(persistDisk->src, copy);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
|
||||
virDomainObjPtr vm,
|
||||
@ -441,36 +479,12 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
|
||||
int asyncJob)
|
||||
{
|
||||
virDomainDiskDefPtr disk = job->disk;
|
||||
virDomainDiskDefPtr persistDisk = NULL;
|
||||
|
||||
if (!disk)
|
||||
return;
|
||||
|
||||
if (disk->mirrorState == VIR_DOMAIN_DISK_MIRROR_STATE_PIVOT) {
|
||||
if (vm->newDef) {
|
||||
virStorageSourcePtr copy = NULL;
|
||||
|
||||
if ((persistDisk = virDomainDiskByName(vm->newDef,
|
||||
disk->dst, false))) {
|
||||
copy = virStorageSourceCopy(disk->mirror, false);
|
||||
if (!copy ||
|
||||
virStorageSourceInitChainElement(copy,
|
||||
persistDisk->src,
|
||||
true) < 0) {
|
||||
VIR_WARN("Unable to update persistent definition "
|
||||
"on vm %s after block job",
|
||||
vm->def->name);
|
||||
virObjectUnref(copy);
|
||||
copy = NULL;
|
||||
persistDisk = NULL;
|
||||
}
|
||||
}
|
||||
if (copy) {
|
||||
virObjectUnref(persistDisk->src);
|
||||
persistDisk->src = copy;
|
||||
}
|
||||
}
|
||||
|
||||
qemuBlockJobRewriteConfigDiskSource(vm, disk, disk->mirror);
|
||||
/* XXX We want to revoke security labels as well as audit that
|
||||
* revocation, before dropping the original source. But it gets
|
||||
* tricky if both source and mirror share common backing files (we
|
||||
|
Loading…
x
Reference in New Issue
Block a user