提交 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, ...@@ -5741,6 +5741,25 @@ qemuDomainHotplugDelIOThread(virQEMUDriverPtr driver,
goto cleanup; 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 static int
qemuDomainChgIOThread(virQEMUDriverPtr driver, qemuDomainChgIOThread(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
...@@ -5775,6 +5794,9 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver, ...@@ -5775,6 +5794,9 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver,
if (qemuDomainHotplugAddIOThread(driver, vm, iothread_id) < 0) if (qemuDomainHotplugAddIOThread(driver, vm, iothread_id) < 0)
goto endjob; goto endjob;
} else { } else {
if (qemuDomainDelIOThreadCheck(def, iothread_id) < 0)
goto endjob;
if (qemuDomainHotplugDelIOThread(driver, vm, iothread_id) < 0) if (qemuDomainHotplugDelIOThread(driver, vm, iothread_id) < 0)
goto endjob; goto endjob;
} }
...@@ -5799,6 +5821,9 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver, ...@@ -5799,6 +5821,9 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver,
goto endjob; goto endjob;
} }
if (qemuDomainDelIOThreadCheck(persistentDef, iothread_id) < 0)
goto endjob;
virDomainIOThreadIDDel(persistentDef, iothread_id); virDomainIOThreadIDDel(persistentDef, iothread_id);
} }
...@@ -5857,7 +5882,6 @@ qemuDomainDelIOThread(virDomainPtr dom, ...@@ -5857,7 +5882,6 @@ qemuDomainDelIOThread(virDomainPtr dom,
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
int ret = -1; int ret = -1;
size_t i;
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
VIR_DOMAIN_AFFECT_CONFIG, -1); VIR_DOMAIN_AFFECT_CONFIG, -1);
...@@ -5874,17 +5898,6 @@ qemuDomainDelIOThread(virDomainPtr dom, ...@@ -5874,17 +5898,6 @@ qemuDomainDelIOThread(virDomainPtr dom,
if (virDomainDelIOThreadEnsureACL(dom->conn, vm->def, flags) < 0) if (virDomainDelIOThreadEnsureACL(dom->conn, vm->def, flags) < 0)
goto cleanup; 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); ret = qemuDomainChgIOThread(driver, vm, iothread_id, false, flags);
cleanup: cleanup:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册