mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: refactor qemuDomainCheckDiskPresence for only disk presence check
Refactor this function to make it focus on disk presence checking, including diskchain checking, and not only for CDROM and Floppy. This change is good for the following patches.
This commit is contained in:
parent
6f4a0ebe8c
commit
e2ccc96cf0
@ -2026,6 +2026,61 @@ cleanup:
|
|||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuDomainCheckDiskStartupPolicy(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
virDomainDiskDefPtr disk,
|
||||||
|
bool cold_boot)
|
||||||
|
{
|
||||||
|
char uuid[VIR_UUID_STRING_BUFLEN];
|
||||||
|
virDomainEventPtr event = NULL;
|
||||||
|
int startupPolicy = disk->startupPolicy;
|
||||||
|
|
||||||
|
virUUIDFormat(vm->def->uuid, uuid);
|
||||||
|
|
||||||
|
switch ((enum virDomainStartupPolicy) startupPolicy) {
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_OPTIONAL:
|
||||||
|
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);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_DEFAULT:
|
||||||
|
case VIR_DOMAIN_STARTUP_POLICY_LAST:
|
||||||
|
/* this should never happen */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG("Dropping disk '%s' on domain '%s' (UUID '%s') "
|
||||||
|
"due to inaccessible source '%s'",
|
||||||
|
disk->dst, vm->def->name, uuid, disk->src);
|
||||||
|
|
||||||
|
event = virDomainEventDiskChangeNewFromObj(vm, disk->src, NULL, disk->info.alias,
|
||||||
|
VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START);
|
||||||
|
if (event)
|
||||||
|
qemuDomainEventQueue(driver, event);
|
||||||
|
|
||||||
|
VIR_FREE(disk->src);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
|
qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
@ -2034,12 +2089,8 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
size_t i;
|
size_t i;
|
||||||
virDomainDiskDefPtr disk;
|
virDomainDiskDefPtr disk;
|
||||||
char uuid[VIR_UUID_STRING_BUFLEN];
|
|
||||||
virDomainEventPtr event = NULL;
|
|
||||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||||
|
|
||||||
virUUIDFormat(vm->def->uuid, uuid);
|
|
||||||
|
|
||||||
for (i = 0; i < vm->def->ndisks; i++) {
|
for (i = 0; i < vm->def->ndisks; i++) {
|
||||||
disk = vm->def->disks[i];
|
disk = vm->def->disks[i];
|
||||||
|
|
||||||
@ -2053,42 +2104,9 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ((enum virDomainStartupPolicy) disk->startupPolicy) {
|
if (qemuDomainCheckDiskStartupPolicy(driver, vm, disk,
|
||||||
case VIR_DOMAIN_STARTUP_POLICY_OPTIONAL:
|
cold_boot) < 0)
|
||||||
break;
|
goto cleanup;
|
||||||
|
|
||||||
case VIR_DOMAIN_STARTUP_POLICY_MANDATORY:
|
|
||||||
virReportSystemError(errno,
|
|
||||||
_("cannot access file '%s'"),
|
|
||||||
disk->src);
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_STARTUP_POLICY_REQUISITE:
|
|
||||||
if (cold_boot) {
|
|
||||||
virReportSystemError(errno,
|
|
||||||
_("cannot access file '%s'"),
|
|
||||||
disk->src);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_STARTUP_POLICY_DEFAULT:
|
|
||||||
case VIR_DOMAIN_STARTUP_POLICY_LAST:
|
|
||||||
/* this should never happen */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
VIR_DEBUG("Dropping disk '%s' on domain '%s' (UUID '%s') "
|
|
||||||
"due to inaccessible source '%s'",
|
|
||||||
disk->dst, vm->def->name, uuid, disk->src);
|
|
||||||
|
|
||||||
event = virDomainEventDiskChangeNewFromObj(vm, disk->src, NULL, disk->info.alias,
|
|
||||||
VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START);
|
|
||||||
if (event)
|
|
||||||
qemuDomainEventQueue(driver, event);
|
|
||||||
|
|
||||||
VIR_FREE(disk->src);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user