mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: blockPivot: Don't pause the VM any more since we don't use drive-reopen
Support for drive-reopen was never present in the upstream code so we don't need to pause the VM when doing the block pivot. Kill all the code related to this semi-upstream artifact.
This commit is contained in:
parent
db37f3cc3a
commit
7c62f239f4
@ -16037,14 +16037,14 @@ qemuDiskPathToAlias(virDomainObjPtr vm, const char *path, int *idxret)
|
|||||||
* abort with pivot; this updates the VM definition as appropriate, on
|
* abort with pivot; this updates the VM definition as appropriate, on
|
||||||
* either success or failure. */
|
* either success or failure. */
|
||||||
static int
|
static int
|
||||||
qemuDomainBlockPivot(virConnectPtr conn,
|
qemuDomainBlockPivot(virQEMUDriverPtr driver,
|
||||||
virQEMUDriverPtr driver, virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
const char *device, virDomainDiskDefPtr disk)
|
const char *device,
|
||||||
|
virDomainDiskDefPtr disk)
|
||||||
{
|
{
|
||||||
int ret = -1, rc;
|
int ret = -1, rc;
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
virDomainBlockJobInfo info;
|
virDomainBlockJobInfo info;
|
||||||
bool resume = false;
|
|
||||||
virStorageSourcePtr oldsrc = NULL;
|
virStorageSourcePtr oldsrc = NULL;
|
||||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||||
|
|
||||||
@ -16075,29 +16075,6 @@ qemuDomainBlockPivot(virConnectPtr conn,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we are using the older 'drive-reopen', we want to make sure
|
|
||||||
* that management apps can tell whether the command succeeded,
|
|
||||||
* even if libvirtd is restarted at the wrong time. To accomplish
|
|
||||||
* that, we pause the guest before drive-reopen, and resume it
|
|
||||||
* only when we know the outcome; if libvirtd restarts, then
|
|
||||||
* management will see the guest still paused, and know that no
|
|
||||||
* guest I/O has caused the source and mirror to diverge. XXX
|
|
||||||
* With the newer 'block-job-complete', we need to use a
|
|
||||||
* persistent bitmap to make things safe; so for now, we just
|
|
||||||
* blindly pause the guest. */
|
|
||||||
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
|
||||||
if (qemuProcessStopCPUs(driver, vm, VIR_DOMAIN_PAUSED_SAVE,
|
|
||||||
QEMU_ASYNC_JOB_NONE) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
resume = true;
|
|
||||||
if (!virDomainObjIsActive(vm)) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("guest unexpectedly quit"));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For active commit, the mirror is part of the already labeled
|
/* For active commit, the mirror is part of the already labeled
|
||||||
* chain. For blockcopy, we previously labeled only the top-level
|
* chain. For blockcopy, we previously labeled only the top-level
|
||||||
* image; but if the user is reusing an external image that
|
* image; but if the user is reusing an external image that
|
||||||
@ -16171,21 +16148,6 @@ qemuDomainBlockPivot(virConnectPtr conn,
|
|||||||
if (oldsrc)
|
if (oldsrc)
|
||||||
disk->src = oldsrc;
|
disk->src = oldsrc;
|
||||||
|
|
||||||
if (resume && virDomainObjIsActive(vm) &&
|
|
||||||
qemuProcessStartCPUs(driver, vm, conn,
|
|
||||||
VIR_DOMAIN_RUNNING_UNPAUSED,
|
|
||||||
QEMU_ASYNC_JOB_NONE) < 0) {
|
|
||||||
virObjectEventPtr event = NULL;
|
|
||||||
event = virDomainEventLifecycleNewFromObj(vm,
|
|
||||||
VIR_DOMAIN_EVENT_SUSPENDED,
|
|
||||||
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
|
|
||||||
if (event)
|
|
||||||
qemuDomainEventQueue(driver, event);
|
|
||||||
if (virGetLastError() == NULL) {
|
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
|
||||||
_("resuming after drive-reopen failed"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -16289,7 +16251,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (disk->mirror && (flags & VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT)) {
|
if (disk->mirror && (flags & VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT)) {
|
||||||
ret = qemuDomainBlockPivot(conn, driver, vm, device, disk);
|
ret = qemuDomainBlockPivot(driver, vm, device, disk);
|
||||||
if (ret < 0 && async)
|
if (ret < 0 && async)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
goto waitjob;
|
goto waitjob;
|
||||||
|
Loading…
Reference in New Issue
Block a user