mirror of https://gitee.com/openkylin/libvirt.git
qemu: check presence of each disk and its backing file as well
For disk with startupPolicy support, such as cdrom and floppy when its chain is broken, the startup policy will apply, otherwise, report an error.
This commit is contained in:
parent
d7b7aa2c20
commit
dbca841457
|
@ -2043,19 +2043,11 @@ qemuDomainCheckDiskStartupPolicy(virQEMUDriverPtr driver,
|
|||
break;
|
||||
|
||||
case VIR_DOMAIN_STARTUP_POLICY_MANDATORY:
|
||||
virReportSystemError(errno,
|
||||
_("cannot access file '%s'"),
|
||||
disk->src);
|
||||
goto error;
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_STARTUP_POLICY_REQUISITE:
|
||||
if (cold_boot) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot access file '%s'"),
|
||||
disk->src);
|
||||
if (cold_boot)
|
||||
goto error;
|
||||
}
|
||||
break;
|
||||
|
||||
case VIR_DOMAIN_STARTUP_POLICY_DEFAULT:
|
||||
|
@ -2064,6 +2056,7 @@ qemuDomainCheckDiskStartupPolicy(virQEMUDriverPtr driver,
|
|||
break;
|
||||
}
|
||||
|
||||
virResetLastError();
|
||||
VIR_DEBUG("Dropping disk '%s' on domain '%s' (UUID '%s') "
|
||||
"due to inaccessible source '%s'",
|
||||
disk->dst, vm->def->name, uuid, disk->src);
|
||||
|
@ -2089,30 +2082,30 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
|
|||
int ret = -1;
|
||||
size_t i;
|
||||
virDomainDiskDefPtr disk;
|
||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||
|
||||
VIR_DEBUG("Checking for disk presence");
|
||||
for (i = 0; i < vm->def->ndisks; i++) {
|
||||
disk = vm->def->disks[i];
|
||||
|
||||
if (!disk->startupPolicy || !disk->src)
|
||||
if (!disk->src)
|
||||
continue;
|
||||
|
||||
if (virFileAccessibleAs(disk->src, F_OK,
|
||||
cfg->user,
|
||||
cfg->group) >= 0) {
|
||||
/* disk accessible */
|
||||
if (qemuDomainDetermineDiskChain(driver, disk, false) >= 0 &&
|
||||
qemuDiskChainCheckBroken(disk) >= 0)
|
||||
continue;
|
||||
|
||||
if (disk->startupPolicy) {
|
||||
if (qemuDomainCheckDiskStartupPolicy(driver, vm, disk,
|
||||
cold_boot) >= 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (qemuDomainCheckDiskStartupPolicy(driver, vm, disk,
|
||||
cold_boot) < 0)
|
||||
goto cleanup;
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virObjectUnref(cfg);
|
||||
error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -3621,16 +3621,10 @@ int qemuProcessStart(virConnectPtr conn,
|
|||
if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0)
|
||||
goto cleanup;
|
||||
|
||||
VIR_DEBUG("Checking for CDROM and floppy presence");
|
||||
if (qemuDomainCheckDiskPresence(driver, vm,
|
||||
flags & VIR_QEMU_PROCESS_START_COLD) < 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < vm->def->ndisks; i++) {
|
||||
if (qemuDomainDetermineDiskChain(driver, vm->def->disks[i],
|
||||
false) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Get the advisory nodeset from numad if 'placement' of
|
||||
* either <vcpu> or <numatune> is 'auto'.
|
||||
|
|
Loading…
Reference in New Issue