return -1;
}
-static int
-qemuDiskChainCheckBroken(virDomainDiskDefPtr disk)
-{
- char *brokenFile = NULL;
-
- if (!virDomainDiskGetSource(disk))
- return 0;
-
- if (virStorageFileChainGetBroken(disk->src, &brokenFile) < 0)
- return -1;
-
- if (brokenFile) {
- virReportError(VIR_ERR_INVALID_ARG,
- _("Backing file '%s' of image '%s' is missing."),
- brokenFile, virDomainDiskGetSource(disk));
- VIR_FREE(brokenFile);
- return -1;
- }
-
- return 0;
-}
int
qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
virFileExists(virDomainDiskGetSource(disk)))
continue;
- if (qemuDomainDetermineDiskChain(driver, vm, disk, false) >= 0 &&
- qemuDiskChainCheckBroken(disk) >= 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) >= 0)
continue;
if (disk->startupPolicy &&
qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr disk,
- bool force_probe)
+ bool force_probe,
+ bool report_broken)
{
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
int ret = 0;
if (virStorageFileGetMetadata(disk->src,
uid, gid,
cfg->allowDiskFormatProbing,
- false) < 0)
+ report_broken) < 0)
ret = -1;
cleanup:
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr disk,
- bool force_probe);
+ bool force_probe,
+ bool report_broken);
int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
virDomainObjPtr vm,
if (virStorageTranslateDiskSourcePool(conn, disk) < 0)
goto end;
- if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto end;
switch (disk->device) {
for (i = 0; i < snap->def->ndisks; i++) {
if (snap->def->disks[i].snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
continue;
- qemuDomainDetermineDiskChain(driver, vm, vm->def->disks[i], true);
+ ignore_value(qemuDomainDetermineDiskChain(driver, vm, vm->def->disks[i],
+ true, true));
}
if (orig_err) {
virSetError(orig_err);
oldsrc = disk->src;
disk->src = disk->mirror;
- if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto cleanup;
if (disk->mirror->format &&
goto endjob;
}
- if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto endjob;
if ((flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW) &&
disk->dst);
goto endjob;
}
- if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto endjob;
if (!top)
if (qemuSetUnprivSGIO(dev) < 0)
goto end;
- if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0)
+ if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto end;
switch (disk->device) {
save = disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN;
- qemuDomainDetermineDiskChain(driver, vm, disk, true);
+ ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk,
+ true, true));
} else if (disk->mirror &&
(type == VIR_DOMAIN_BLOCK_JOB_TYPE_COPY ||
type == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT)) {
if (virStorageTranslateDiskSourcePool(conn, obj->def->disks[i]) < 0)
goto error;
- /* XXX we should be able to restore all data from XML in the future */
- if (qemuDomainDetermineDiskChain(driver, obj,
- obj->def->disks[i], true) < 0)
+ /* XXX we should be able to restore all data from XML in the future.
+ * This should be the only place that calls qemuDomainDetermineDiskChain
+ * with @report_broken == false to guarantee best-effort domain
+ * reconnect */
+ if (qemuDomainDetermineDiskChain(driver, obj, obj->def->disks[i],
+ true, false) < 0)
goto error;
dev.type = VIR_DOMAIN_DEVICE_DISK;