mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
qemu: Remove support for legacy block jobs
Block job QMP commands with underscores rather than dashes were never released in upstream qemu, (they were added, but modified in the same release [1]), but a certain distro managed to backport the version in the middle. The change also slightly modified semantics for the abort command, which made us have a lot of code which was only ever present in certain downstream distros. Clean the upstream code from the legacy cruft and support only the upstream implementations. [1] See qemu commit v1.0-2176-gdb58f9c060 Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
23706c1708
commit
2350d10149
@ -6434,29 +6434,22 @@ qemuDomainGetMonitor(virDomainObjPtr vm)
|
||||
/**
|
||||
* qemuDomainSupportsBlockJobs:
|
||||
* @vm: domain object
|
||||
* @modern: pointer to bool that returns whether modern block jobs are supported
|
||||
*
|
||||
* Returns -1 in case when qemu does not support block jobs at all. Otherwise
|
||||
* returns 0 and optionally fills @modern to denote that modern (async) block
|
||||
* jobs are supported.
|
||||
* returns 0.
|
||||
*/
|
||||
int
|
||||
qemuDomainSupportsBlockJobs(virDomainObjPtr vm,
|
||||
bool *modern)
|
||||
qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
bool asynchronous = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_ASYNC);
|
||||
bool synchronous = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_SYNC);
|
||||
|
||||
if (!synchronous && !asynchronous) {
|
||||
if (!asynchronous) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("block jobs not supported with this QEMU binary"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (modern)
|
||||
*modern = asynchronous;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -715,7 +715,7 @@ int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
|
||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
|
||||
ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
||||
|
||||
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
|
||||
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
|
||||
ATTRIBUTE_NONNULL(1);
|
||||
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
|
||||
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
|
||||
|
@ -16413,7 +16413,6 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
char *device = NULL;
|
||||
bool modern;
|
||||
virDomainDiskDefPtr disk;
|
||||
virStorageSourcePtr baseSource = NULL;
|
||||
unsigned int baseIndex = 0;
|
||||
@ -16438,25 +16437,9 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
|
||||
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||
goto endjob;
|
||||
|
||||
if (!modern) {
|
||||
if (base) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("partial block pull not supported with this "
|
||||
"QEMU binary"));
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (bandwidth) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("setting bandwidth at start of block pull not "
|
||||
"supported with this QEMU binary"));
|
||||
goto endjob;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
||||
goto endjob;
|
||||
|
||||
@ -16511,7 +16494,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
|
||||
baseSource);
|
||||
if (!baseSource || basePath)
|
||||
ret = qemuMonitorBlockStream(priv->mon, device, basePath, backingPath,
|
||||
speed, modern);
|
||||
speed, true);
|
||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||
ret = -1;
|
||||
|
||||
@ -16542,7 +16525,6 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
||||
virDomainDiskDefPtr disk = NULL;
|
||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||
bool save = false;
|
||||
bool modern;
|
||||
bool pivot = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT);
|
||||
bool async = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC);
|
||||
virDomainObjPtr vm;
|
||||
@ -16566,7 +16548,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
|
||||
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||
goto endjob;
|
||||
|
||||
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
||||
@ -16583,7 +16565,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (modern && !async)
|
||||
if (!async)
|
||||
qemuBlockJobSyncBegin(disk);
|
||||
|
||||
if (pivot) {
|
||||
@ -16596,7 +16578,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
||||
}
|
||||
|
||||
qemuDomainObjEnterMonitor(driver, vm);
|
||||
ret = qemuMonitorBlockJobCancel(qemuDomainGetMonitor(vm), device, modern);
|
||||
ret = qemuMonitorBlockJobCancel(qemuDomainGetMonitor(vm), device, true);
|
||||
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
|
||||
ret = -1;
|
||||
goto endjob;
|
||||
@ -16623,25 +16605,14 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
||||
* while still holding the VM job, to prevent newly scheduled
|
||||
* block jobs from confusing us. */
|
||||
if (!async) {
|
||||
if (!modern) {
|
||||
/* Older qemu that lacked async reporting also lacked
|
||||
* blockcopy and active commit, so we can hardcode the
|
||||
* event to pull and let qemuBlockJobEventProcess() handle
|
||||
* the rest as usual */
|
||||
qemuBlockJobEventProcess(driver, vm, disk,
|
||||
QEMU_ASYNC_JOB_NONE,
|
||||
VIR_DOMAIN_BLOCK_JOB_TYPE_PULL,
|
||||
VIR_DOMAIN_BLOCK_JOB_CANCELED);
|
||||
} else {
|
||||
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||
qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
|
||||
while (diskPriv->blockjob) {
|
||||
if (virDomainObjWait(vm) < 0) {
|
||||
ret = -1;
|
||||
goto endjob;
|
||||
}
|
||||
qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
|
||||
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||
qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
|
||||
while (diskPriv->blockjob) {
|
||||
if (virDomainObjWait(vm) < 0) {
|
||||
ret = -1;
|
||||
goto endjob;
|
||||
}
|
||||
qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
|
||||
}
|
||||
}
|
||||
|
||||
@ -16728,7 +16699,7 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom,
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (qemuDomainSupportsBlockJobs(vm, NULL) < 0)
|
||||
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||
goto endjob;
|
||||
|
||||
if (!(disk = virDomainDiskByName(vm->def, path, true))) {
|
||||
@ -16784,7 +16755,6 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
|
||||
virDomainDiskDefPtr disk;
|
||||
int ret = -1;
|
||||
virDomainObjPtr vm;
|
||||
bool modern;
|
||||
const char *device;
|
||||
unsigned long long speed = bandwidth;
|
||||
|
||||
@ -16816,7 +16786,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
|
||||
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||
goto endjob;
|
||||
|
||||
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
||||
@ -16829,7 +16799,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
|
||||
ret = qemuMonitorBlockJobSetSpeed(qemuDomainGetMonitor(vm),
|
||||
device,
|
||||
speed,
|
||||
modern);
|
||||
true);
|
||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||
ret = -1;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user