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:
Peter Krempa 2019-01-16 15:33:07 +01:00
parent 73163a0e86
commit 33b0a3bab8
6 changed files with 24 additions and 7 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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,

View File

@ -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 &&

View File

@ -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++) {

View File

@ -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);