提交 ae27cb9a 编写于 作者: P Pavel Hrdina

qemu_driver: always check whether iothread is used by disk or not

If virDomainDelIOThread API was called with VIR_DOMAIN_AFFECT_LIVE
and VIR_DOMAIN_AFFECT_CONFIG and both XML were already a different
it could result in removing iothread from config XML even if there
was a disk using that iothread.
Signed-off-by: NPavel Hrdina <phrdina@redhat.com>
上级 c96bd78e
......@@ -5741,6 +5741,25 @@ qemuDomainHotplugDelIOThread(virQEMUDriverPtr driver,
goto cleanup;
}
static int
qemuDomainDelIOThreadCheck(virDomainDefPtr def,
unsigned int iothread_id)
{
size_t i;
for (i = 0; i < def->ndisks; i++) {
if (def->disks[i]->iothread == iothread_id) {
virReportError(VIR_ERR_INVALID_ARG,
_("cannot remove IOThread %u since it "
"is being used by disk '%s'"),
iothread_id, def->disks[i]->dst);
return -1;
}
}
return 0;
}
static int
qemuDomainChgIOThread(virQEMUDriverPtr driver,
virDomainObjPtr vm,
......@@ -5775,6 +5794,9 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver,
if (qemuDomainHotplugAddIOThread(driver, vm, iothread_id) < 0)
goto endjob;
} else {
if (qemuDomainDelIOThreadCheck(def, iothread_id) < 0)
goto endjob;
if (qemuDomainHotplugDelIOThread(driver, vm, iothread_id) < 0)
goto endjob;
}
......@@ -5799,6 +5821,9 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver,
goto endjob;
}
if (qemuDomainDelIOThreadCheck(persistentDef, iothread_id) < 0)
goto endjob;
virDomainIOThreadIDDel(persistentDef, iothread_id);
}
......@@ -5857,7 +5882,6 @@ qemuDomainDelIOThread(virDomainPtr dom,
virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm = NULL;
int ret = -1;
size_t i;
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
VIR_DOMAIN_AFFECT_CONFIG, -1);
......@@ -5874,17 +5898,6 @@ qemuDomainDelIOThread(virDomainPtr dom,
if (virDomainDelIOThreadEnsureACL(dom->conn, vm->def, flags) < 0)
goto cleanup;
/* If there is a disk using the IOThread to be removed, then fail. */
for (i = 0; i < vm->def->ndisks; i++) {
if (vm->def->disks[i]->iothread == iothread_id) {
virReportError(VIR_ERR_INVALID_ARG,
_("cannot remove IOThread %u since it "
"is being used by disk '%s'"),
iothread_id, vm->def->disks[i]->dst);
goto cleanup;
}
}
ret = qemuDomainChgIOThread(driver, vm, iothread_id, false, flags);
cleanup:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册