提交 639a0098 编写于 作者: P Peter Krempa

qemu: Report better errors from broken backing chains

Request erroring out from the backing chain traveller and drop qemu's
internal backing chain integrity tester.

The backing chain traveller reports errors by itself with possibly more
detail than qemuDiskChainCheckBroken ever could.

We also need to make sure that we reconnect to existing qemu instances
even at the cost of losing the backing chain info (this really should be
stored in the XML rather than reloaded from disk, but that needs some
work).
上级 172ca0e7
...@@ -2513,27 +2513,6 @@ qemuDomainCheckDiskStartupPolicy(virQEMUDriverPtr driver, ...@@ -2513,27 +2513,6 @@ qemuDomainCheckDiskStartupPolicy(virQEMUDriverPtr driver,
return -1; 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 int
qemuDomainCheckDiskPresence(virQEMUDriverPtr driver, qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
...@@ -2561,8 +2540,7 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver, ...@@ -2561,8 +2540,7 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
virFileExists(virDomainDiskGetSource(disk))) virFileExists(virDomainDiskGetSource(disk)))
continue; continue;
if (qemuDomainDetermineDiskChain(driver, vm, disk, false) >= 0 && if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) >= 0)
qemuDiskChainCheckBroken(disk) >= 0)
continue; continue;
if (disk->startupPolicy && if (disk->startupPolicy &&
...@@ -2707,7 +2685,8 @@ int ...@@ -2707,7 +2685,8 @@ int
qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
bool force_probe) bool force_probe,
bool report_broken)
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
int ret = 0; int ret = 0;
...@@ -2729,7 +2708,7 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, ...@@ -2729,7 +2708,7 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
if (virStorageFileGetMetadata(disk->src, if (virStorageFileGetMetadata(disk->src,
uid, gid, uid, gid,
cfg->allowDiskFormatProbing, cfg->allowDiskFormatProbing,
false) < 0) report_broken) < 0)
ret = -1; ret = -1;
cleanup: cleanup:
......
...@@ -370,7 +370,8 @@ int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver, ...@@ -370,7 +370,8 @@ int qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, int qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,
bool force_probe); bool force_probe,
bool report_broken);
int qemuDomainStorageFileInit(virQEMUDriverPtr driver, int qemuDomainStorageFileInit(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
......
...@@ -6833,7 +6833,7 @@ qemuDomainChangeDiskMediaLive(virConnectPtr conn, ...@@ -6833,7 +6833,7 @@ qemuDomainChangeDiskMediaLive(virConnectPtr conn,
if (virStorageTranslateDiskSourcePool(conn, disk) < 0) if (virStorageTranslateDiskSourcePool(conn, disk) < 0)
goto end; goto end;
if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0) if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto end; goto end;
switch (disk->device) { switch (disk->device) {
...@@ -13254,7 +13254,8 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver, ...@@ -13254,7 +13254,8 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
for (i = 0; i < snap->def->ndisks; i++) { for (i = 0; i < snap->def->ndisks; i++) {
if (snap->def->disks[i].snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) if (snap->def->disks[i].snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
continue; continue;
qemuDomainDetermineDiskChain(driver, vm, vm->def->disks[i], true); ignore_value(qemuDomainDetermineDiskChain(driver, vm, vm->def->disks[i],
true, true));
} }
if (orig_err) { if (orig_err) {
virSetError(orig_err); virSetError(orig_err);
...@@ -15062,7 +15063,7 @@ qemuDomainBlockPivot(virConnectPtr conn, ...@@ -15062,7 +15063,7 @@ qemuDomainBlockPivot(virConnectPtr conn,
oldsrc = disk->src; oldsrc = disk->src;
disk->src = disk->mirror; disk->src = disk->mirror;
if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0) if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto cleanup; goto cleanup;
if (disk->mirror->format && if (disk->mirror->format &&
...@@ -15575,7 +15576,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, ...@@ -15575,7 +15576,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
goto endjob; goto endjob;
} }
if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0) if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto endjob; goto endjob;
if ((flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW) && if ((flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW) &&
...@@ -15944,7 +15945,7 @@ qemuDomainBlockCommit(virDomainPtr dom, ...@@ -15944,7 +15945,7 @@ qemuDomainBlockCommit(virDomainPtr dom,
disk->dst); disk->dst);
goto endjob; goto endjob;
} }
if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0) if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto endjob; goto endjob;
if (!top) if (!top)
......
...@@ -779,7 +779,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn, ...@@ -779,7 +779,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
if (qemuSetUnprivSGIO(dev) < 0) if (qemuSetUnprivSGIO(dev) < 0)
goto end; goto end;
if (qemuDomainDetermineDiskChain(driver, vm, disk, false) < 0) if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
goto end; goto end;
switch (disk->device) { switch (disk->device) {
......
...@@ -1090,7 +1090,8 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED, ...@@ -1090,7 +1090,8 @@ qemuProcessHandleBlockJob(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
save = disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_NONE; save = disk->mirrorState != VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE; disk->mirrorState = VIR_DOMAIN_DISK_MIRROR_STATE_NONE;
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN; 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 && } else if (disk->mirror &&
(type == VIR_DOMAIN_BLOCK_JOB_TYPE_COPY || (type == VIR_DOMAIN_BLOCK_JOB_TYPE_COPY ||
type == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT)) { type == VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT)) {
...@@ -3430,9 +3431,12 @@ qemuProcessReconnect(void *opaque) ...@@ -3430,9 +3431,12 @@ qemuProcessReconnect(void *opaque)
if (virStorageTranslateDiskSourcePool(conn, obj->def->disks[i]) < 0) if (virStorageTranslateDiskSourcePool(conn, obj->def->disks[i]) < 0)
goto error; goto error;
/* XXX we should be able to restore all data from XML in the future */ /* XXX we should be able to restore all data from XML in the future.
if (qemuDomainDetermineDiskChain(driver, obj, * This should be the only place that calls qemuDomainDetermineDiskChain
obj->def->disks[i], true) < 0) * with @report_broken == false to guarantee best-effort domain
* reconnect */
if (qemuDomainDetermineDiskChain(driver, obj, obj->def->disks[i],
true, false) < 0)
goto error; goto error;
dev.type = VIR_DOMAIN_DEVICE_DISK; dev.type = VIR_DOMAIN_DEVICE_DISK;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册