“8b877dd7c8ef71520d27cd187f6767fe6be02262”上不存在“paddle/fluid/operators/load_op.cc”
提交 ac442713 编写于 作者: L Laine Stump

qemu_hotplug: refactor qemuDomainDetachDiskLive and qemuDomainDetachDiskDevice

qemuDomainDetachDiskDevice() is only called from one place. Moving the
contents of the function to that place makes
qemuDomainDetachDiskLive() more similar to the other Detach functions
called by the toplevel qemuDomainDetachDevice().

The goal is to make each of the device-type-specific functions do this:

  1) find the exact device
  2) do any device-specific validation
  3) do general validation
  4) do device-specific shutdown (only needed for net devices)
  5) do the common block of code to send device_del to qemu, then
     optionally wait for a corresponding DEVICE_DELETED event from
     qemu.

with the final aim being that only items 1 & 2 will remain in each
device-type-specific function, while 3 & 5 (which are the same for
almost every type) will be de-duplicated and moved to the toplevel
function that calls all of these (qemuDomainDetachDeviceLive(), which
will also contain a callout to the one instance of (4) (netdev).
Signed-off-by: NLaine Stump <laine@laine.org>
ACKed-by: NPeter Krempa <pkrempa@redhat.com>
上级 1ed46f3a
...@@ -5273,47 +5273,6 @@ qemuDomainSignalDeviceRemoval(virDomainObjPtr vm, ...@@ -5273,47 +5273,6 @@ qemuDomainSignalDeviceRemoval(virDomainObjPtr vm,
} }
static int
qemuDomainDetachDiskDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr detach,
bool async)
{
int ret = -1;
if (qemuDomainDiskBlockJobIsActive(detach))
return -1;
if (detach->bus == VIR_DOMAIN_DISK_BUS_VIRTIO &&
qemuIsMultiFunctionDevice(vm->def, &detach->info)) {
virReportError(VIR_ERR_OPERATION_FAILED,
_("cannot hot unplug multifunction PCI device: %s"),
detach->dst);
return -1;
}
if (!async)
qemuDomainMarkDeviceForRemoval(vm, &detach->info);
if (qemuDomainDeleteDevice(vm, detach->info.alias) < 0) {
if (virDomainObjIsActive(vm))
virDomainAuditDisk(vm, detach->src, NULL, "detach", false);
goto cleanup;
}
if (async) {
ret = 0;
} else {
if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
ret = qemuDomainRemoveDiskDevice(driver, vm, detach);
}
cleanup:
if (!async)
qemuDomainResetDeviceRemoval(vm);
return ret;
}
static int static int
qemuFindDisk(virDomainDefPtr def, const char *dst) qemuFindDisk(virDomainDefPtr def, const char *dst)
{ {
...@@ -5335,6 +5294,7 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver, ...@@ -5335,6 +5294,7 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver,
{ {
virDomainDiskDefPtr disk; virDomainDiskDefPtr disk;
int idx; int idx;
int ret = -1;
if ((idx = qemuFindDisk(vm->def, dev->data.disk->dst)) < 0) { if ((idx = qemuFindDisk(vm->def, dev->data.disk->dst)) < 0) {
virReportError(VIR_ERR_OPERATION_FAILED, virReportError(VIR_ERR_OPERATION_FAILED,
...@@ -5351,7 +5311,7 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver, ...@@ -5351,7 +5311,7 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver,
case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_VIRTIO:
case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_USB:
case VIR_DOMAIN_DISK_BUS_SCSI: case VIR_DOMAIN_DISK_BUS_SCSI:
return qemuDomainDetachDiskDevice(driver, vm, disk, async); break;
case VIR_DOMAIN_DISK_BUS_IDE: case VIR_DOMAIN_DISK_BUS_IDE:
case VIR_DOMAIN_DISK_BUS_FDC: case VIR_DOMAIN_DISK_BUS_FDC:
...@@ -5361,12 +5321,12 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver, ...@@ -5361,12 +5321,12 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver,
case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_SD:
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("This type of disk cannot be hot unplugged")); _("This type of disk cannot be hot unplugged"));
break; return -1;
case VIR_DOMAIN_DISK_BUS_LAST: case VIR_DOMAIN_DISK_BUS_LAST:
default: default:
virReportEnumRangeError(virDomainDiskBus, disk->bus); virReportEnumRangeError(virDomainDiskBus, disk->bus);
break; return -1;
} }
break; break;
...@@ -5375,15 +5335,45 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver, ...@@ -5375,15 +5335,45 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver,
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
_("disk device type '%s' cannot be detached"), _("disk device type '%s' cannot be detached"),
virDomainDiskDeviceTypeToString(disk->device)); virDomainDiskDeviceTypeToString(disk->device));
break; return -1;
case VIR_DOMAIN_DISK_DEVICE_LAST: case VIR_DOMAIN_DISK_DEVICE_LAST:
default: default:
virReportEnumRangeError(virDomainDiskDevice, disk->device); virReportEnumRangeError(virDomainDiskDevice, disk->device);
break; return -1;
} }
return -1; if (qemuDomainDiskBlockJobIsActive(disk))
return -1;
if (disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO &&
qemuIsMultiFunctionDevice(vm->def, &disk->info)) {
virReportError(VIR_ERR_OPERATION_FAILED,
_("cannot hot unplug multifunction PCI device: %s"),
disk->dst);
return -1;
}
if (!async)
qemuDomainMarkDeviceForRemoval(vm, &disk->info);
if (qemuDomainDeleteDevice(vm, disk->info.alias) < 0) {
if (virDomainObjIsActive(vm))
virDomainAuditDisk(vm, disk->src, NULL, "detach", false);
goto cleanup;
}
if (async) {
ret = 0;
} else {
if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
ret = qemuDomainRemoveDiskDevice(driver, vm, disk);
}
cleanup:
if (!async)
qemuDomainResetDeviceRemoval(vm);
return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册