|
|
0a7476 |
From 2c396c9f38179ca8a2428d30bc26be1bb05789c1 Mon Sep 17 00:00:00 2001
|
|
|
0a7476 |
Message-Id: <2c396c9f38179ca8a2428d30bc26be1bb05789c1@dist-git>
|
|
|
0a7476 |
From: Michal Privoznik <mprivozn@redhat.com>
|
|
|
0a7476 |
Date: Thu, 11 Apr 2019 15:14:25 -0400
|
|
|
0a7476 |
Subject: [PATCH] qemu_hotplug: Introduce and use qemuDomainDeleteDevice
|
|
|
0a7476 |
|
|
|
0a7476 |
The aim of this function will be to fix return value of
|
|
|
0a7476 |
qemuMonitorDelDevice() in one specific case. But that is yet to
|
|
|
0a7476 |
come. Right now this is nothing but a plain substitution.
|
|
|
0a7476 |
|
|
|
0a7476 |
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
|
|
0a7476 |
ACKed-by: Peter Krempa <pkrempa@redhat.com>
|
|
|
0a7476 |
(cherry picked from commit 4cd13478ac331f5e42c926d4f2111dd89d2970a6)
|
|
|
0a7476 |
|
|
|
0a7476 |
Partially-Resolves: https://bugzilla.redhat.com/1658198
|
|
|
0a7476 |
Signed-off-by: Laine Stump <laine@redhat.com>
|
|
|
0a7476 |
|
|
|
0a7476 |
Conflicts: src/qemu/qemu_hotplug.c:
|
|
|
0a7476 |
- qemuDomainDetachExtensionDevice() (erroneously) added to
|
|
|
0a7476 |
qemuDomainDetachControllerDevice upstream, doesn't exist
|
|
|
0a7476 |
downstream.
|
|
|
0a7476 |
Signed-off-by: Laine Stump <laine@laine.org>
|
|
|
0a7476 |
Message-Id: <20190411191453.24055-14-laine@redhat.com>
|
|
|
0a7476 |
Acked-by: Michal Privoznik <mprivozn@redhat.com>
|
|
|
0a7476 |
---
|
|
|
0a7476 |
src/qemu/qemu_hotplug.c | 239 ++++++++++++++--------------------------
|
|
|
0a7476 |
1 file changed, 82 insertions(+), 157 deletions(-)
|
|
|
0a7476 |
|
|
|
0a7476 |
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
|
|
|
0a7476 |
index 963b87f798..1f41efa180 100644
|
|
|
0a7476 |
--- a/src/qemu/qemu_hotplug.c
|
|
|
0a7476 |
+++ b/src/qemu/qemu_hotplug.c
|
|
|
0a7476 |
@@ -68,6 +68,45 @@ VIR_LOG_INIT("qemu.qemu_hotplug");
|
|
|
0a7476 |
unsigned long long qemuDomainRemoveDeviceWaitTime = 1000ull * 5;
|
|
|
0a7476 |
|
|
|
0a7476 |
|
|
|
0a7476 |
+/**
|
|
|
0a7476 |
+ * qemuDomainDeleteDevice:
|
|
|
0a7476 |
+ * @vm: domain object
|
|
|
0a7476 |
+ * @alias: device to remove
|
|
|
0a7476 |
+ *
|
|
|
0a7476 |
+ * This is a wrapper over qemuMonitorDelDevice() plus enter/exit
|
|
|
0a7476 |
+ * monitor calls. This function MUST be used instead of plain
|
|
|
0a7476 |
+ * qemuMonitorDelDevice() in all places where @alias represents a
|
|
|
0a7476 |
+ * device from domain XML, i.e. caller marks the device for
|
|
|
0a7476 |
+ * removal and then calls qemuDomainWaitForDeviceRemoval()
|
|
|
0a7476 |
+ * followed by qemuDomainRemove*Device().
|
|
|
0a7476 |
+ *
|
|
|
0a7476 |
+ * For collateral devices (e.g. extension devices like zPCI) it
|
|
|
0a7476 |
+ * is safe to use plain qemuMonitorDelDevice().
|
|
|
0a7476 |
+ *
|
|
|
0a7476 |
+ * Upon entry, @vm must be locked.
|
|
|
0a7476 |
+ *
|
|
|
0a7476 |
+ * Returns: 0 on success,
|
|
|
0a7476 |
+ * -1 otherwise.
|
|
|
0a7476 |
+ */
|
|
|
0a7476 |
+static int
|
|
|
0a7476 |
+qemuDomainDeleteDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
+ const char *alias)
|
|
|
0a7476 |
+{
|
|
|
0a7476 |
+ qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
+ virQEMUDriverPtr driver = priv->driver;
|
|
|
0a7476 |
+ int rc;
|
|
|
0a7476 |
+
|
|
|
0a7476 |
+ qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
+
|
|
|
0a7476 |
+ rc = qemuMonitorDelDevice(priv->mon, alias);
|
|
|
0a7476 |
+
|
|
|
0a7476 |
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ rc = -1;
|
|
|
0a7476 |
+
|
|
|
0a7476 |
+ return rc;
|
|
|
0a7476 |
+}
|
|
|
0a7476 |
+
|
|
|
0a7476 |
+
|
|
|
0a7476 |
/**
|
|
|
0a7476 |
* qemuHotplugPrepareDiskAccess:
|
|
|
0a7476 |
* @driver: qemu driver struct
|
|
|
0a7476 |
@@ -4689,7 +4728,6 @@ qemuDomainDetachVirtioDiskDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (qemuIsMultiFunctionDevice(vm->def, &detach->info)) {
|
|
|
0a7476 |
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
0a7476 |
@@ -4701,15 +4739,11 @@ qemuDomainDetachVirtioDiskDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) {
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- virDomainAuditDisk(vm, detach->src, NULL, "detach", false);
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, detach->info.alias) < 0) {
|
|
|
0a7476 |
+ if (virDomainObjIsActive(vm))
|
|
|
0a7476 |
+ virDomainAuditDisk(vm, detach->src, NULL, "detach", false);
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
}
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
ret = 0;
|
|
|
0a7476 |
@@ -4731,7 +4765,6 @@ qemuDomainDetachDiskDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (qemuDomainDiskBlockJobIsActive(detach))
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
@@ -4739,15 +4772,11 @@ qemuDomainDetachDiskDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) {
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- virDomainAuditDisk(vm, detach->src, NULL, "detach", false);
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, detach->info.alias) < 0) {
|
|
|
0a7476 |
+ if (virDomainObjIsActive(vm))
|
|
|
0a7476 |
+ virDomainAuditDisk(vm, detach->src, NULL, "detach", false);
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
}
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
ret = 0;
|
|
|
0a7476 |
@@ -4882,7 +4911,6 @@ int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
{
|
|
|
0a7476 |
int idx, ret = -1;
|
|
|
0a7476 |
virDomainControllerDefPtr detach = NULL;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
|
|
|
0a7476 |
if ((idx = virDomainControllerFind(vm->def,
|
|
|
0a7476 |
dev->data.controller->type,
|
|
|
0a7476 |
@@ -4928,12 +4956,7 @@ int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, detach->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
@@ -4950,14 +4973,11 @@ int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
}
|
|
|
0a7476 |
|
|
|
0a7476 |
static int
|
|
|
0a7476 |
-qemuDomainDetachHostPCIDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
- virDomainObjPtr vm,
|
|
|
0a7476 |
+qemuDomainDetachHostPCIDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
virDomainHostdevDefPtr detach,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
virDomainHostdevSubsysPCIPtr pcisrc = &detach->source.subsys.u.pci;
|
|
|
0a7476 |
- int ret;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (qemuIsMultiFunctionDevice(vm->def, detach->info)) {
|
|
|
0a7476 |
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
0a7476 |
@@ -4970,23 +4990,14 @@ qemuDomainDetachHostPCIDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- ret = -1;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- return ret;
|
|
|
0a7476 |
+ return qemuDomainDeleteDevice(vm, detach->info->alias);
|
|
|
0a7476 |
}
|
|
|
0a7476 |
|
|
|
0a7476 |
static int
|
|
|
0a7476 |
-qemuDomainDetachHostUSBDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
- virDomainObjPtr vm,
|
|
|
0a7476 |
+qemuDomainDetachHostUSBDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
virDomainHostdevDefPtr detach,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
- int ret;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
if (!detach->info->alias) {
|
|
|
0a7476 |
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
0a7476 |
"%s", _("device cannot be detached without a device alias"));
|
|
|
0a7476 |
@@ -4996,23 +5007,14 @@ qemuDomainDetachHostUSBDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- ret = -1;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- return ret;
|
|
|
0a7476 |
+ return qemuDomainDeleteDevice(vm, detach->info->alias);
|
|
|
0a7476 |
}
|
|
|
0a7476 |
|
|
|
0a7476 |
static int
|
|
|
0a7476 |
-qemuDomainDetachHostSCSIDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
- virDomainObjPtr vm,
|
|
|
0a7476 |
+qemuDomainDetachHostSCSIDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
virDomainHostdevDefPtr detach,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
- int ret = -1;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
if (!detach->info->alias) {
|
|
|
0a7476 |
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
0a7476 |
"%s", _("device cannot be detached without a device alias"));
|
|
|
0a7476 |
@@ -5022,24 +5024,14 @@ qemuDomainDetachHostSCSIDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- return -1;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- return ret;
|
|
|
0a7476 |
+ return qemuDomainDeleteDevice(vm, detach->info->alias);
|
|
|
0a7476 |
}
|
|
|
0a7476 |
|
|
|
0a7476 |
static int
|
|
|
0a7476 |
-qemuDomainDetachSCSIVHostDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
- virDomainObjPtr vm,
|
|
|
0a7476 |
+qemuDomainDetachSCSIVHostDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
virDomainHostdevDefPtr detach,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
- int ret = -1;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
if (!detach->info->alias) {
|
|
|
0a7476 |
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
0a7476 |
"%s", _("device cannot be detached without a device alias"));
|
|
|
0a7476 |
@@ -5049,25 +5041,15 @@ qemuDomainDetachSCSIVHostDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- return -1;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- return ret;
|
|
|
0a7476 |
+ return qemuDomainDeleteDevice(vm, detach->info->alias);
|
|
|
0a7476 |
}
|
|
|
0a7476 |
|
|
|
0a7476 |
|
|
|
0a7476 |
static int
|
|
|
0a7476 |
-qemuDomainDetachMediatedDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
- virDomainObjPtr vm,
|
|
|
0a7476 |
+qemuDomainDetachMediatedDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
virDomainHostdevDefPtr detach,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- int ret = -1;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
if (!detach->info->alias) {
|
|
|
0a7476 |
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
|
|
0a7476 |
_("device cannot be detached without a device alias"));
|
|
|
0a7476 |
@@ -5077,12 +5059,7 @@ qemuDomainDetachMediatedDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- ret = -1;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- return ret;
|
|
|
0a7476 |
+ return qemuDomainDeleteDevice(vm, detach->info->alias);
|
|
|
0a7476 |
}
|
|
|
0a7476 |
|
|
|
0a7476 |
|
|
|
0a7476 |
@@ -5099,19 +5076,19 @@ qemuDomainDetachThisHostDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
|
|
|
0a7476 |
switch (detach->source.subsys.type) {
|
|
|
0a7476 |
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
|
|
|
0a7476 |
- ret = qemuDomainDetachHostPCIDevice(driver, vm, detach, async);
|
|
|
0a7476 |
+ ret = qemuDomainDetachHostPCIDevice(vm, detach, async);
|
|
|
0a7476 |
break;
|
|
|
0a7476 |
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
|
|
|
0a7476 |
- ret = qemuDomainDetachHostUSBDevice(driver, vm, detach, async);
|
|
|
0a7476 |
+ ret = qemuDomainDetachHostUSBDevice(vm, detach, async);
|
|
|
0a7476 |
break;
|
|
|
0a7476 |
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
|
|
|
0a7476 |
- ret = qemuDomainDetachHostSCSIDevice(driver, vm, detach, async);
|
|
|
0a7476 |
+ ret = qemuDomainDetachHostSCSIDevice(vm, detach, async);
|
|
|
0a7476 |
break;
|
|
|
0a7476 |
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
|
|
|
0a7476 |
- ret = qemuDomainDetachSCSIVHostDevice(driver, vm, detach, async);
|
|
|
0a7476 |
+ ret = qemuDomainDetachSCSIVHostDevice(vm, detach, async);
|
|
|
0a7476 |
break;
|
|
|
0a7476 |
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
|
|
|
0a7476 |
- ret = qemuDomainDetachMediatedDevice(driver, vm, detach, async);
|
|
|
0a7476 |
+ ret = qemuDomainDetachMediatedDevice(vm, detach, async);
|
|
|
0a7476 |
break;
|
|
|
0a7476 |
default:
|
|
|
0a7476 |
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
|
0a7476 |
@@ -5228,7 +5205,6 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
ssize_t idx = -1;
|
|
|
0a7476 |
virDomainShmemDefPtr shmem = NULL;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
|
|
|
0a7476 |
if ((idx = virDomainShmemDefFind(vm->def, dev)) < 0) {
|
|
|
0a7476 |
virReportError(VIR_ERR_DEVICE_MISSING,
|
|
|
0a7476 |
@@ -5257,12 +5233,7 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &shmem->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, shmem->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, shmem->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
@@ -5287,7 +5258,6 @@ qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
|
|
|
0a7476 |
{
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
virDomainWatchdogDefPtr watchdog = vm->def->watchdog;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (!watchdog) {
|
|
|
0a7476 |
virReportError(VIR_ERR_DEVICE_MISSING, "%s",
|
|
|
0a7476 |
@@ -5318,12 +5288,7 @@ qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &watchdog->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, watchdog->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, watchdog->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
@@ -5347,7 +5312,6 @@ qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
virDomainRedirdevDefPtr tmpRedirdevDef;
|
|
|
0a7476 |
ssize_t idx;
|
|
|
0a7476 |
|
|
|
0a7476 |
@@ -5368,12 +5332,7 @@ qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &tmpRedirdevDef->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, tmpRedirdevDef->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, tmpRedirdevDef->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
@@ -5398,7 +5357,6 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
{
|
|
|
0a7476 |
int detachidx, ret = -1;
|
|
|
0a7476 |
virDomainNetDefPtr detach = NULL;
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
|
|
|
0a7476 |
if ((detachidx = virDomainNetFindIdx(vm->def, dev->data.net)) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
@@ -5439,15 +5397,11 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &detach->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) {
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- virDomainAuditNet(vm, detach, NULL, "detach", false);
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, detach->info.alias) < 0) {
|
|
|
0a7476 |
+ if (virDomainObjIsActive(vm))
|
|
|
0a7476 |
+ virDomainAuditNet(vm, detach, NULL, "detach", false);
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
}
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
ret = 0;
|
|
|
0a7476 |
@@ -5610,20 +5564,19 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async && !guestfwd)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &tmpChr->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
if (guestfwd) {
|
|
|
0a7476 |
- if (qemuMonitorRemoveNetdev(priv->mon, tmpChr->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
+ int rc;
|
|
|
0a7476 |
+ qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
+ rc = qemuMonitorRemoveNetdev(priv->mon, tmpChr->info.alias);
|
|
|
0a7476 |
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ rc = -1;
|
|
|
0a7476 |
+
|
|
|
0a7476 |
+ if (rc < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
} else {
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, tmpChr->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, tmpChr->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
}
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (guestfwd) {
|
|
|
0a7476 |
ret = qemuDomainRemoveChrDevice(driver, vm, tmpChr, false);
|
|
|
0a7476 |
@@ -5647,10 +5600,8 @@ qemuDomainDetachRNGDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
virDomainRNGDefPtr rng,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
ssize_t idx;
|
|
|
0a7476 |
virDomainRNGDefPtr tmpRNG;
|
|
|
0a7476 |
- int rc;
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
|
|
|
0a7476 |
if ((idx = virDomainRNGFind(vm->def, rng)) < 0) {
|
|
|
0a7476 |
@@ -5672,9 +5623,7 @@ qemuDomainDetachRNGDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &tmpRNG->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- rc = qemuMonitorDelDevice(priv->mon, tmpRNG->info.alias);
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) || rc < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, tmpRNG->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
@@ -5697,10 +5646,8 @@ qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
virDomainMemoryDefPtr memdef,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
virDomainMemoryDefPtr mem;
|
|
|
0a7476 |
int idx;
|
|
|
0a7476 |
- int rc;
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
|
|
|
0a7476 |
qemuDomainMemoryDeviceAlignSize(vm->def, memdef);
|
|
|
0a7476 |
@@ -5724,9 +5671,7 @@ qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &mem->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- rc = qemuMonitorDelDevice(priv->mon, mem->info.alias);
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, mem->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
@@ -5831,15 +5776,9 @@ qemuDomainHotplugDelVcpu(virQEMUDriverPtr driver,
|
|
|
0a7476 |
|
|
|
0a7476 |
qemuDomainMarkDeviceAliasForRemoval(vm, vcpupriv->alias);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- rc = qemuMonitorDelDevice(qemuDomainGetMonitor(vm), vcpupriv->alias);
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
-
|
|
|
0a7476 |
- if (rc < 0) {
|
|
|
0a7476 |
- virDomainAuditVcpu(vm, oldvcpus, oldvcpus - nvcpus, "update", false);
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, vcpupriv->alias) < 0) {
|
|
|
0a7476 |
+ if (virDomainObjIsActive(vm))
|
|
|
0a7476 |
+ virDomainAuditVcpu(vm, oldvcpus, oldvcpus - nvcpus, "update", false);
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
}
|
|
|
0a7476 |
|
|
|
0a7476 |
@@ -6409,8 +6348,6 @@ qemuDomainDetachInputDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
virDomainInputDefPtr def,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
- virQEMUDriverPtr driver = priv->driver;
|
|
|
0a7476 |
virDomainInputDefPtr input;
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
int idx;
|
|
|
0a7476 |
@@ -6440,12 +6377,7 @@ qemuDomainDetachInputDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &input->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, input->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, input->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
@@ -6467,8 +6399,6 @@ qemuDomainDetachVsockDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
virDomainVsockDefPtr dev,
|
|
|
0a7476 |
bool async)
|
|
|
0a7476 |
{
|
|
|
0a7476 |
- qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
0a7476 |
- virQEMUDriverPtr driver = priv->driver;
|
|
|
0a7476 |
virDomainVsockDefPtr vsock = vm->def->vsock;
|
|
|
0a7476 |
int ret = -1;
|
|
|
0a7476 |
|
|
|
0a7476 |
@@ -6483,12 +6413,7 @@ qemuDomainDetachVsockDevice(virDomainObjPtr vm,
|
|
|
0a7476 |
if (!async)
|
|
|
0a7476 |
qemuDomainMarkDeviceForRemoval(vm, &vsock->info);
|
|
|
0a7476 |
|
|
|
0a7476 |
- qemuDomainObjEnterMonitor(driver, vm);
|
|
|
0a7476 |
- if (qemuMonitorDelDevice(priv->mon, vsock->info.alias) < 0) {
|
|
|
0a7476 |
- ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
|
|
0a7476 |
- goto cleanup;
|
|
|
0a7476 |
- }
|
|
|
0a7476 |
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
|
|
0a7476 |
+ if (qemuDomainDeleteDevice(vm, vsock->info.alias) < 0)
|
|
|
0a7476 |
goto cleanup;
|
|
|
0a7476 |
|
|
|
0a7476 |
if (async) {
|
|
|
0a7476 |
--
|
|
|
0a7476 |
2.21.0
|
|
|
0a7476 |
|