mirror of
https://github.com/libvirt/libvirt.git
synced 2026-09-03 20:53:04 -05: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:
+3
-10
@@ -6434,29 +6434,22 @@ qemuDomainGetMonitor(virDomainObjPtr vm)
|
|||||||
/**
|
/**
|
||||||
* qemuDomainSupportsBlockJobs:
|
* qemuDomainSupportsBlockJobs:
|
||||||
* @vm: domain object
|
* @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 -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
|
* returns 0.
|
||||||
* jobs are supported.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
qemuDomainSupportsBlockJobs(virDomainObjPtr vm,
|
qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
|
||||||
bool *modern)
|
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
bool asynchronous = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_ASYNC);
|
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",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("block jobs not supported with this QEMU binary"));
|
_("block jobs not supported with this QEMU binary"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modern)
|
|
||||||
*modern = asynchronous;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -715,7 +715,7 @@ int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
|
|||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
|
||||||
ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
||||||
|
|
||||||
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm, bool *modern)
|
int qemuDomainSupportsBlockJobs(virDomainObjPtr vm)
|
||||||
ATTRIBUTE_NONNULL(1);
|
ATTRIBUTE_NONNULL(1);
|
||||||
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
|
bool qemuDomainDiskBlockJobIsActive(virDomainDiskDefPtr disk);
|
||||||
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
|
bool qemuDomainHasBlockjob(virDomainObjPtr vm, bool copy_only)
|
||||||
|
|||||||
+15
-45
@@ -16413,7 +16413,6 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
|
|||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
char *device = NULL;
|
char *device = NULL;
|
||||||
bool modern;
|
|
||||||
virDomainDiskDefPtr disk;
|
virDomainDiskDefPtr disk;
|
||||||
virStorageSourcePtr baseSource = NULL;
|
virStorageSourcePtr baseSource = NULL;
|
||||||
unsigned int baseIndex = 0;
|
unsigned int baseIndex = 0;
|
||||||
@@ -16438,25 +16437,9 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
|
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||||
goto endjob;
|
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)))
|
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
@@ -16511,7 +16494,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
|
|||||||
baseSource);
|
baseSource);
|
||||||
if (!baseSource || basePath)
|
if (!baseSource || basePath)
|
||||||
ret = qemuMonitorBlockStream(priv->mon, device, basePath, backingPath,
|
ret = qemuMonitorBlockStream(priv->mon, device, basePath, backingPath,
|
||||||
speed, modern);
|
speed, true);
|
||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
@@ -16542,7 +16525,6 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
|||||||
virDomainDiskDefPtr disk = NULL;
|
virDomainDiskDefPtr disk = NULL;
|
||||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||||
bool save = false;
|
bool save = false;
|
||||||
bool modern;
|
|
||||||
bool pivot = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT);
|
bool pivot = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT);
|
||||||
bool async = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC);
|
bool async = !!(flags & VIR_DOMAIN_BLOCK_JOB_ABORT_ASYNC);
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
@@ -16566,7 +16548,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
|
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
||||||
@@ -16583,7 +16565,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modern && !async)
|
if (!async)
|
||||||
qemuBlockJobSyncBegin(disk);
|
qemuBlockJobSyncBegin(disk);
|
||||||
|
|
||||||
if (pivot) {
|
if (pivot) {
|
||||||
@@ -16596,7 +16578,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
|||||||
}
|
}
|
||||||
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
qemuDomainObjEnterMonitor(driver, vm);
|
||||||
ret = qemuMonitorBlockJobCancel(qemuDomainGetMonitor(vm), device, modern);
|
ret = qemuMonitorBlockJobCancel(qemuDomainGetMonitor(vm), device, true);
|
||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
|
if (qemuDomainObjExitMonitor(driver, vm) < 0) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto endjob;
|
goto endjob;
|
||||||
@@ -16623,25 +16605,14 @@ qemuDomainBlockJobAbort(virDomainPtr dom,
|
|||||||
* while still holding the VM job, to prevent newly scheduled
|
* while still holding the VM job, to prevent newly scheduled
|
||||||
* block jobs from confusing us. */
|
* block jobs from confusing us. */
|
||||||
if (!async) {
|
if (!async) {
|
||||||
if (!modern) {
|
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||||
/* Older qemu that lacked async reporting also lacked
|
qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
|
||||||
* blockcopy and active commit, so we can hardcode the
|
while (diskPriv->blockjob) {
|
||||||
* event to pull and let qemuBlockJobEventProcess() handle
|
if (virDomainObjWait(vm) < 0) {
|
||||||
* the rest as usual */
|
ret = -1;
|
||||||
qemuBlockJobEventProcess(driver, vm, disk,
|
goto endjob;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
qemuBlockJobUpdate(driver, vm, QEMU_ASYNC_JOB_NONE, disk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16728,7 +16699,7 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuDomainSupportsBlockJobs(vm, NULL) < 0)
|
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
if (!(disk = virDomainDiskByName(vm->def, path, true))) {
|
if (!(disk = virDomainDiskByName(vm->def, path, true))) {
|
||||||
@@ -16784,7 +16755,6 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
|
|||||||
virDomainDiskDefPtr disk;
|
virDomainDiskDefPtr disk;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
bool modern;
|
|
||||||
const char *device;
|
const char *device;
|
||||||
unsigned long long speed = bandwidth;
|
unsigned long long speed = bandwidth;
|
||||||
|
|
||||||
@@ -16816,7 +16786,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
|
if (qemuDomainSupportsBlockJobs(vm) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
if (!(disk = qemuDomainDiskByName(vm->def, path)))
|
||||||
@@ -16829,7 +16799,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom,
|
|||||||
ret = qemuMonitorBlockJobSetSpeed(qemuDomainGetMonitor(vm),
|
ret = qemuMonitorBlockJobSetSpeed(qemuDomainGetMonitor(vm),
|
||||||
device,
|
device,
|
||||||
speed,
|
speed,
|
||||||
modern);
|
true);
|
||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user