mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-07-11 12:25:52 +00:00
qemu: domain: skip chain detection to end of backing chain
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.
This commit is contained in:
parent
b0a46b609e
commit
a92c4f7537
@ -6050,27 +6050,57 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
|
|||||||
bool report_broken)
|
bool report_broken)
|
||||||
{
|
{
|
||||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||||
int ret = 0;
|
virStorageSourcePtr src = disk->src;
|
||||||
|
int ret = -1;
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
|
|
||||||
if (virStorageSourceIsEmpty(disk->src))
|
if (virStorageSourceIsEmpty(src)) {
|
||||||
|
ret = 0;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virStorageSourceHasBacking(disk->src)) {
|
|
||||||
if (force_probe)
|
|
||||||
virStorageSourceBackingStoreClear(disk->src);
|
|
||||||
else
|
|
||||||
goto cleanup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qemuDomainGetImageIds(cfg, vm, disk->src, NULL, &uid, &gid);
|
if (virStorageSourceHasBacking(src)) {
|
||||||
|
if (force_probe) {
|
||||||
|
virStorageSourceBackingStoreClear(src);
|
||||||
|
} else {
|
||||||
|
/* skip to the end of the chain */
|
||||||
|
while (virStorageSourceIsBacking(src)) {
|
||||||
|
if (report_broken &&
|
||||||
|
virStorageFileSupportsAccess(src)) {
|
||||||
|
|
||||||
if (virStorageFileGetMetadata(disk->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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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(src,
|
||||||
uid, gid,
|
uid, gid,
|
||||||
cfg->allowDiskFormatProbing,
|
cfg->allowDiskFormatProbing,
|
||||||
report_broken) < 0)
|
report_broken) < 0)
|
||||||
ret = -1;
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
|
Loading…
Reference in New Issue
Block a user