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: Pavel Hrdina <phrdina@xxxxxxxxxx> --- src/qemu/qemu_driver.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 189c10ead5..1a7cc12874 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5740,6 +5740,25 @@ qemuDomainHotplugDelIOThread(virQEMUDriverPtr driver, } 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, unsigned int iothread_id, @@ -5773,6 +5792,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; } @@ -5797,6 +5819,9 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver, goto endjob; } + if (qemuDomainDelIOThreadCheck(persistentDef, iothread_id) < 0) + goto endjob; + virDomainIOThreadIDDel(persistentDef, iothread_id); } @@ -5855,7 +5880,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); @@ -5872,17 +5896,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: -- 2.11.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list