From 33b0a3bab8e6ba4a3c1f36850915bf01718e4355 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 16 Jan 2019 15:33:07 +0100 Subject: [PATCH] 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 Reviewed-by: John Ferlan --- src/qemu/qemu_blockjob.c | 2 +- src/qemu/qemu_domain.c | 18 +++++++++++++++++- src/qemu/qemu_domain.h | 1 + src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_hotplug.c | 4 ++-- src/qemu/qemu_process.c | 4 ++-- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 09a2975231..f19d44b04f 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -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); } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1196f4eb19..733a44de85 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index defbffbf94..e7c5a0a49c 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -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, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 46b2f758ca..e14bd10c23 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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 && diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 6138ad8005..ea46a01a87 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -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++) { diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9ccc3601a2..fa83d9fc0e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -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);