Refactor disk unplugging

We can reuse some of the code for other purposes.

Signed-off-by: Wolfgang Mauerer <wolfgang.mauerer@siemens.com>
This commit is contained in:
Wolfgang Mauerer 2010-05-05 16:52:14 +02:00 committed by Eric Blake
parent 2de2d525fc
commit dc1a2fcce6

View File

@ -7866,6 +7866,36 @@ cleanup:
}
static inline int qemudFindDisk(virDomainDefPtr def, char *dst)
{
int i;
for (i = 0 ; i < def->ndisks ; i++) {
if (STREQ(def->disks[i]->dst, dst)) {
return i;
}
}
return -1;
}
static inline void qemudShrinkDisks(virDomainDefPtr def, int i)
{
if (def->ndisks > 1) {
memmove(def->disks + i,
def->disks + i + 1,
sizeof(*def->disks) *
(def->ndisks - (i + 1)));
def->ndisks--;
if (VIR_REALLOC_N(def->disks, def->ndisks) < 0) {
/* ignore, harmless */
}
} else {
VIR_FREE(def->disks);
def->ndisks = 0;
}
}
static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
virDomainObjPtr vm,
virDomainDeviceDefPtr dev,
@ -7875,19 +7905,16 @@ static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
virDomainDiskDefPtr detach = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData;
for (i = 0 ; i < vm->def->ndisks ; i++) {
if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) {
detach = vm->def->disks[i];
break;
}
}
i = qemudFindDisk(vm->def, dev->data.disk->dst);
if (!detach) {
if (i < 0) {
qemuReportError(VIR_ERR_OPERATION_FAILED,
_("disk %s not found"), dev->data.disk->dst);
goto cleanup;
}
detach = vm->def->disks[i];
if (!virDomainDeviceAddressIsValid(&detach->info,
VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)) {
qemuReportError(VIR_ERR_OPERATION_FAILED, "%s",
@ -7910,19 +7937,8 @@ static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
if (vm->def->ndisks > 1) {
memmove(vm->def->disks + i,
vm->def->disks + i + 1,
sizeof(*vm->def->disks) *
(vm->def->ndisks - (i + 1)));
vm->def->ndisks--;
if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks) < 0) {
/* ignore, harmless */
}
} else {
VIR_FREE(vm->def->disks);
vm->def->ndisks = 0;
}
qemudShrinkDisks(vm->def, i);
virDomainDiskDefFree(detach);
if (driver->securityDriver &&