On 10/20/2017 09:47 AM, Peter Krempa wrote: > When a user provides the backing chain, we will not need to re-detect > all the backing stores again, but should move to the end of the user > specified chain. Additionally if a user provides a full terminated chain > we should not attempt any further detection. > --- > src/qemu/qemu_domain.c | 48 +++++++++++++++++++++++++++++++++++++++--------- > 1 file changed, 39 insertions(+), 9 deletions(-) > > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c > index 3560cdd29..5973474ca 100644 > --- a/src/qemu/qemu_domain.c > +++ b/src/qemu/qemu_domain.c > @@ -6030,27 +6030,57 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, > bool report_broken) > { > virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); > - int ret = 0; > + virStorageSourcePtr src = disk->src; > + int ret = -1; > uid_t uid; > gid_t gid; > > - if (virStorageSourceIsEmpty(disk->src)) > + if (virStorageSourceIsEmpty(src)) { > + ret = 0; > goto cleanup; > + } > > if (virStorageSourceHasBacking(disk->src)) { could this one be just @src? > - if (force_probe) > - virStorageSourceBackingStoreClear(disk->src); > - else > - goto cleanup; > + if (force_probe) { > + virStorageSourceBackingStoreClear(src); > + } else { > + /* skip to the end of the chain */ > + while (virStorageSourceIsBacking(src)) { > + if (report_broken && > + virStorageFileSupportsAccess(src)) { > + > + if (qemuDomainStorageFileInit(driver, vm, src, disk->src) < 0) > + goto cleanup; > + > + if (virStorageFileAccess(src, F_OK) < 0) { > + virStorageFileReportBrokenChain(errno, src, disk->src); > + virStorageFileDeinit(src); > + goto cleanup; > + } > + > + virStorageFileDeinit(src); > + } > + src = src->backingStore; > + } > + } > } > > - qemuDomainGetImageIds(cfg, vm, disk->src, NULL, &uid, &gid); > + /* We skipped to the end of the chain. Skip detection if there's the > + * terminator. (An allocated but empty backingStore) */ > + if (src->backingStore) { > + ret = 0; > + goto cleanup; > + } > + > + qemuDomainGetImageIds(cfg, vm, src, disk->src, &uid, &gid); > > - if (virStorageFileGetMetadata(disk->src, > + if (virStorageFileGetMetadata(src, > uid, gid, > cfg->allowDiskFormatProbing, > report_broken) < 0) > - ret = -1; > + goto cleanup; > + > + ret = 0; > > cleanup: > virObjectUnref(cfg); > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list