mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
qemu: domain: Allow overriding disk source in qemuDomainDetermineDiskChain
When we need to detect a chain for a image which will become the new source for a disk (e.g. after a disk media change or a blockjob) we'd need to replace disk->src temporarily to do so. Move the 'disksrc' temporary variable to an argument and adjust callers. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
73163a0e86
commit
33b0a3bab8
@ -293,7 +293,7 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
|
||||
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
|
||||
disk->src->id = 0;
|
||||
virStorageSourceBackingStoreClear(disk->src);
|
||||
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, true));
|
||||
ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true));
|
||||
ignore_value(qemuBlockNodeNamesDetect(driver, vm, asyncJob));
|
||||
qemuBlockJobTerminate(job);
|
||||
}
|
||||
|
@ -8991,14 +8991,27 @@ qemuDomainStorageAlias(const char *device, int depth)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* qemuDomainDetermineDiskChain:
|
||||
* @driver: qemu driver object
|
||||
* @vm: domain object
|
||||
* @disk: disk definition
|
||||
* @disksrc: source to determine the chain for, may be NULL
|
||||
* @report_broken: report broken chain verbosely
|
||||
*
|
||||
* Prepares and initializes the backing chain of disk @disk. In cases where
|
||||
* a new source is to be associated with @disk the @disksrc parameter can be
|
||||
* used to override the source. If @report_broken is true missing images
|
||||
* in the backing chain are reported.
|
||||
*/
|
||||
int
|
||||
qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
|
||||
virDomainObjPtr vm,
|
||||
virDomainDiskDefPtr disk,
|
||||
virStorageSourcePtr disksrc,
|
||||
bool report_broken)
|
||||
{
|
||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||
virStorageSourcePtr disksrc = disk->src; /* disk source */
|
||||
virStorageSourcePtr src; /* iterator for the backing chain declared in XML */
|
||||
virStorageSourcePtr n; /* iterator for the backing chain detected from disk */
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
@ -9006,6 +9019,9 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
|
||||
if (!disksrc)
|
||||
disksrc = disk->src;
|
||||
|
||||
if (virStorageSourceIsEmpty(disksrc)) {
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
|
@ -742,6 +742,7 @@ int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
|
||||
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
|
||||
virDomainObjPtr vm,
|
||||
virDomainDiskDefPtr disk,
|
||||
virStorageSourcePtr disksrc,
|
||||
bool report_broken);
|
||||
|
||||
bool qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
|
||||
|
@ -17163,7 +17163,7 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
|
||||
oldsrc = disk->src;
|
||||
disk->src = disk->mirror;
|
||||
|
||||
if (qemuDomainDetermineDiskChain(driver, vm, disk, true) < 0)
|
||||
if (qemuDomainDetermineDiskChain(driver, vm, disk, disk->mirror, true) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (disk->mirror->format &&
|
||||
|
@ -820,7 +820,7 @@ qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
|
||||
|
||||
sharedAdded = true;
|
||||
|
||||
if (qemuDomainDetermineDiskChain(driver, vm, disk, true) < 0)
|
||||
if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0)
|
||||
@ -1197,7 +1197,7 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriverPtr driver,
|
||||
if (qemuSetUnprivSGIO(dev) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (qemuDomainDetermineDiskChain(driver, vm, disk, true) < 0)
|
||||
if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) < 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < vm->def->ndisks; i++) {
|
||||
|
@ -6210,7 +6210,7 @@ qemuProcessPrepareHostStorage(virQEMUDriverPtr driver,
|
||||
if (qemuDomainDiskIsMissingLocalOptional(disk) && cold_boot)
|
||||
VIR_INFO("optional disk '%s' source file is missing, "
|
||||
"skip checking disk chain", disk->dst);
|
||||
else if (qemuDomainDetermineDiskChain(driver, vm, disk, true) >= 0)
|
||||
else if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) >= 0)
|
||||
continue;
|
||||
|
||||
if (qemuDomainCheckDiskStartupPolicy(driver, vm, idx, cold_boot) >= 0)
|
||||
@ -8031,7 +8031,7 @@ qemuProcessReconnect(void *opaque)
|
||||
* qemuDomainDetermineDiskChain with @report_broken == false
|
||||
* to guarantee best-effort domain reconnect */
|
||||
virStorageSourceBackingStoreClear(disk->src);
|
||||
if (qemuDomainDetermineDiskChain(driver, obj, disk, false) < 0)
|
||||
if (qemuDomainDetermineDiskChain(driver, obj, disk, NULL, false) < 0)
|
||||
goto error;
|
||||
} else {
|
||||
VIR_DEBUG("skipping backing chain detection for '%s'", disk->dst);
|
||||
|
Loading…
x
Reference in New Issue
Block a user