mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-07-30 13:37:17 +00:00
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: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
c96bd78e4e
commit
ae27cb9add
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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:
|
||||||
|
Loading…
Reference in New Issue
Block a user