mirror of https://gitee.com/openkylin/libvirt.git
qemu: Move qemuDomainAttachDeviceDiskLive to qemu_hotplug.c
This commit is contained in:
parent
809ee6bad4
commit
7a5d85f9b1
|
@ -6270,120 +6270,6 @@ qemuDomainUndefine(virDomainPtr dom)
|
||||||
return qemuDomainUndefineFlags(dom, 0);
|
return qemuDomainUndefineFlags(dom, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
|
|
||||||
virQEMUDriverPtr driver,
|
|
||||||
virDomainObjPtr vm,
|
|
||||||
virDomainDeviceDefPtr dev)
|
|
||||||
{
|
|
||||||
virDomainDiskDefPtr disk = dev->data.disk;
|
|
||||||
virDomainDiskDefPtr orig_disk = NULL;
|
|
||||||
virDomainDeviceDefPtr dev_copy = NULL;
|
|
||||||
virDomainDiskDefPtr tmp = NULL;
|
|
||||||
virCgroupPtr cgroup = NULL;
|
|
||||||
virCapsPtr caps = NULL;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
if (disk->driverName != NULL && !STREQ(disk->driverName, "qemu")) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("unsupported driver name '%s' for disk '%s'"),
|
|
||||||
disk->driverName, disk->src);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemuTranslateDiskSourcePool(conn, disk) < 0)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
if (qemuSetUnprivSGIO(dev) < 0)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
if (qemuSetupDiskCgroup(vm, disk) < 0)
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
switch (disk->device) {
|
|
||||||
case VIR_DOMAIN_DISK_DEVICE_CDROM:
|
|
||||||
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
|
|
||||||
if (!(orig_disk = virDomainDiskFindByBusAndDst(vm->def,
|
|
||||||
disk->bus, disk->dst))) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("No device with bus '%s' and target '%s'"),
|
|
||||||
virDomainDiskBusTypeToString(disk->bus),
|
|
||||||
disk->dst);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
tmp = dev->data.disk;
|
|
||||||
dev->data.disk = orig_disk;
|
|
||||||
|
|
||||||
if (!(dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
|
||||||
caps, driver->xmlopt))) {
|
|
||||||
dev->data.disk = tmp;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
dev->data.disk = tmp;
|
|
||||||
|
|
||||||
ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, false);
|
|
||||||
/* 'disk' must not be accessed now - it has been free'd.
|
|
||||||
* 'orig_disk' now points to the new disk, while 'dev_copy'
|
|
||||||
* now points to the old disk */
|
|
||||||
|
|
||||||
/* Need to remove the shared disk entry for the original disk src
|
|
||||||
* if the operation is either ejecting or updating.
|
|
||||||
*/
|
|
||||||
if (ret == 0)
|
|
||||||
ignore_value(qemuRemoveSharedDevice(driver, dev_copy,
|
|
||||||
vm->def->name));
|
|
||||||
break;
|
|
||||||
case VIR_DOMAIN_DISK_DEVICE_DISK:
|
|
||||||
case VIR_DOMAIN_DISK_DEVICE_LUN:
|
|
||||||
if (disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
|
|
||||||
if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
_("disk device='lun' is not supported for usb bus"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ret = qemuDomainAttachUsbMassstorageDevice(conn, driver, vm,
|
|
||||||
disk);
|
|
||||||
} else if (disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO) {
|
|
||||||
ret = qemuDomainAttachVirtioDiskDevice(conn, driver, vm, disk);
|
|
||||||
} else if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
|
|
||||||
ret = qemuDomainAttachSCSIDisk(conn, driver, vm, disk);
|
|
||||||
} else {
|
|
||||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
|
||||||
_("disk bus '%s' cannot be hotplugged."),
|
|
||||||
virDomainDiskBusTypeToString(disk->bus));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
|
||||||
_("disk device type '%s' cannot be hotplugged"),
|
|
||||||
virDomainDiskDeviceTypeToString(disk->device));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret != 0 && cgroup) {
|
|
||||||
if (qemuTeardownDiskCgroup(vm, disk) < 0)
|
|
||||||
VIR_WARN("Failed to teardown cgroup for disk path %s",
|
|
||||||
NULLSTR(disk->src));
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
if (ret != 0)
|
|
||||||
ignore_value(qemuRemoveSharedDevice(driver, dev, vm->def->name));
|
|
||||||
virObjectUnref(caps);
|
|
||||||
virDomainDeviceDefFree(dev_copy);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuDomainAttachDeviceControllerLive(virQEMUDriverPtr driver,
|
qemuDomainAttachDeviceControllerLive(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
|
|
|
@ -217,10 +217,11 @@ cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
|
static int
|
||||||
virQEMUDriverPtr driver,
|
qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
|
||||||
virDomainObjPtr vm,
|
virQEMUDriverPtr driver,
|
||||||
virDomainDiskDefPtr disk)
|
virDomainObjPtr vm,
|
||||||
|
virDomainDiskDefPtr disk)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
@ -450,10 +451,11 @@ qemuDomainFindOrCreateSCSIDiskController(virQEMUDriverPtr driver,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int qemuDomainAttachSCSIDisk(virConnectPtr conn,
|
static int
|
||||||
virQEMUDriverPtr driver,
|
qemuDomainAttachSCSIDisk(virConnectPtr conn,
|
||||||
virDomainObjPtr vm,
|
virQEMUDriverPtr driver,
|
||||||
virDomainDiskDefPtr disk)
|
virDomainObjPtr vm,
|
||||||
|
virDomainDiskDefPtr disk)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
@ -573,10 +575,11 @@ error:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int qemuDomainAttachUsbMassstorageDevice(virConnectPtr conn,
|
static int
|
||||||
virQEMUDriverPtr driver,
|
qemuDomainAttachUsbMassstorageDevice(virConnectPtr conn,
|
||||||
virDomainObjPtr vm,
|
virQEMUDriverPtr driver,
|
||||||
virDomainDiskDefPtr disk)
|
virDomainObjPtr vm,
|
||||||
|
virDomainDiskDefPtr disk)
|
||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -665,6 +668,121 @@ error:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
|
||||||
|
virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
virDomainDeviceDefPtr dev)
|
||||||
|
{
|
||||||
|
virDomainDiskDefPtr disk = dev->data.disk;
|
||||||
|
virDomainDiskDefPtr orig_disk = NULL;
|
||||||
|
virDomainDeviceDefPtr dev_copy = NULL;
|
||||||
|
virDomainDiskDefPtr tmp = NULL;
|
||||||
|
virCgroupPtr cgroup = NULL;
|
||||||
|
virCapsPtr caps = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (disk->driverName != NULL && !STREQ(disk->driverName, "qemu")) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("unsupported driver name '%s' for disk '%s'"),
|
||||||
|
disk->driverName, disk->src);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemuTranslateDiskSourcePool(conn, disk) < 0)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
if (qemuSetUnprivSGIO(dev) < 0)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
if (qemuSetupDiskCgroup(vm, disk) < 0)
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
switch (disk->device) {
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_CDROM:
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
|
||||||
|
if (!(orig_disk = virDomainDiskFindByBusAndDst(vm->def,
|
||||||
|
disk->bus, disk->dst))) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("No device with bus '%s' and target '%s'"),
|
||||||
|
virDomainDiskBusTypeToString(disk->bus),
|
||||||
|
disk->dst);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
|
||||||
|
goto end;
|
||||||
|
|
||||||
|
tmp = dev->data.disk;
|
||||||
|
dev->data.disk = orig_disk;
|
||||||
|
|
||||||
|
if (!(dev_copy = virDomainDeviceDefCopy(dev, vm->def,
|
||||||
|
caps, driver->xmlopt))) {
|
||||||
|
dev->data.disk = tmp;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
dev->data.disk = tmp;
|
||||||
|
|
||||||
|
ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, false);
|
||||||
|
/* 'disk' must not be accessed now - it has been free'd.
|
||||||
|
* 'orig_disk' now points to the new disk, while 'dev_copy'
|
||||||
|
* now points to the old disk */
|
||||||
|
|
||||||
|
/* Need to remove the shared disk entry for the original disk src
|
||||||
|
* if the operation is either ejecting or updating.
|
||||||
|
*/
|
||||||
|
if (ret == 0)
|
||||||
|
ignore_value(qemuRemoveSharedDevice(driver, dev_copy,
|
||||||
|
vm->def->name));
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_DISK:
|
||||||
|
case VIR_DOMAIN_DISK_DEVICE_LUN:
|
||||||
|
if (disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
|
||||||
|
if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("disk device='lun' is not supported for usb bus"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret = qemuDomainAttachUsbMassstorageDevice(conn, driver, vm,
|
||||||
|
disk);
|
||||||
|
} else if (disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO) {
|
||||||
|
ret = qemuDomainAttachVirtioDiskDevice(conn, driver, vm, disk);
|
||||||
|
} else if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
|
||||||
|
ret = qemuDomainAttachSCSIDisk(conn, driver, vm, disk);
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
||||||
|
_("disk bus '%s' cannot be hotplugged."),
|
||||||
|
virDomainDiskBusTypeToString(disk->bus));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
|
||||||
|
_("disk device type '%s' cannot be hotplugged"),
|
||||||
|
virDomainDiskDeviceTypeToString(disk->device));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != 0 && cgroup) {
|
||||||
|
if (qemuTeardownDiskCgroup(vm, disk) < 0)
|
||||||
|
VIR_WARN("Failed to teardown cgroup for disk path %s",
|
||||||
|
NULLSTR(disk->src));
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
if (ret != 0)
|
||||||
|
ignore_value(qemuRemoveSharedDevice(driver, dev, vm->def->name));
|
||||||
|
virObjectUnref(caps);
|
||||||
|
virDomainDeviceDefFree(dev_copy);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* XXX conn required for network -> bridge resolution */
|
/* XXX conn required for network -> bridge resolution */
|
||||||
int qemuDomainAttachNetDevice(virConnectPtr conn,
|
int qemuDomainAttachNetDevice(virConnectPtr conn,
|
||||||
virQEMUDriverPtr driver,
|
virQEMUDriverPtr driver,
|
||||||
|
|
|
@ -36,21 +36,13 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
|
||||||
int qemuDomainCheckEjectableMedia(virQEMUDriverPtr driver,
|
int qemuDomainCheckEjectableMedia(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
enum qemuDomainAsyncJob asyncJob);
|
enum qemuDomainAsyncJob asyncJob);
|
||||||
int qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
|
|
||||||
virQEMUDriverPtr driver,
|
|
||||||
virDomainObjPtr vm,
|
|
||||||
virDomainDiskDefPtr disk);
|
|
||||||
int qemuDomainAttachPciControllerDevice(virQEMUDriverPtr driver,
|
int qemuDomainAttachPciControllerDevice(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
virDomainControllerDefPtr controller);
|
virDomainControllerDefPtr controller);
|
||||||
int qemuDomainAttachSCSIDisk(virConnectPtr conn,
|
int qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
|
||||||
virQEMUDriverPtr driver,
|
virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
virDomainDiskDefPtr disk);
|
virDomainDeviceDefPtr dev);
|
||||||
int qemuDomainAttachUsbMassstorageDevice(virConnectPtr conn,
|
|
||||||
virQEMUDriverPtr driver,
|
|
||||||
virDomainObjPtr vm,
|
|
||||||
virDomainDiskDefPtr disk);
|
|
||||||
int qemuDomainAttachNetDevice(virConnectPtr conn,
|
int qemuDomainAttachNetDevice(virConnectPtr conn,
|
||||||
virQEMUDriverPtr driver,
|
virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
|
|
Loading…
Reference in New Issue