提交 cec4e329 编写于 作者: P Peter Krempa

qemu: checkpoint: Fix rollback and access to unlocked 'vm' when deleting checkpoints

Delete/merge bitmaps when deleting checkpoints using a 'transaction' so
that we don't have to deal with halfway-failed scenarios and also fix
access to 'vm' while in the monitor lock.
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 2eb7c683
......@@ -130,11 +130,14 @@ qemuCheckpointDiscard(virQEMUDriverPtr driver,
if (!metadata_only) {
qemuDomainObjPrivatePtr priv = vm->privateData;
bool success = true;
bool search_parents;
virDomainCheckpointDefPtr chkdef = virDomainCheckpointObjGetDef(chk);
int rc;
g_autoptr(virJSONValue) actions = NULL;
if (!(actions = virJSONValueNewArray()))
return -1;
qemuDomainObjEnterMonitor(driver, vm);
parent = virDomainCheckpointFindByName(vm->checkpoints,
chk->def->parent_name);
for (i = 0; i < chkdef->ndisks; i++) {
......@@ -164,31 +167,29 @@ qemuCheckpointDiscard(virQEMUDriverPtr driver,
continue;
search_parents = false;
arr = virJSONValueNewArray();
if (!arr ||
virJSONValueArrayAppendString(arr, disk->bitmap) < 0) {
success = false;
break;
}
if (chk == virDomainCheckpointGetCurrent(vm->checkpoints) &&
qemuMonitorEnableBitmap(priv->mon, node,
disk2->bitmap) < 0) {
success = false;
break;
}
if (qemuMonitorMergeBitmaps(priv->mon, node,
disk2->bitmap, &arr) < 0) {
success = false;
break;
if (!(arr = virJSONValueNewArray()))
return -1;
if (virJSONValueArrayAppendString(arr, disk->bitmap) < 0)
return -1;
if (chk == virDomainCheckpointGetCurrent(vm->checkpoints)) {
if (qemuMonitorTransactionBitmapEnable(actions, node, disk2->bitmap) < 0)
return -1;
}
if (qemuMonitorTransactionBitmapMerge(actions, node, disk2->bitmap, &arr) < 0)
return -1;
}
}
if (qemuMonitorDeleteBitmap(priv->mon, node, disk->bitmap) < 0) {
success = false;
break;
}
if (qemuMonitorTransactionBitmapRemove(actions, node, disk->bitmap) < 0)
return -1;
}
if (qemuDomainObjExitMonitor(driver, vm) < 0 || !success)
qemuDomainObjEnterMonitor(driver, vm);
rc = qemuMonitorTransaction(priv->mon, &actions);
if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
return -1;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册