99cbc7
From ff34df48cc7f197877034c319409c11f4a3b794e Mon Sep 17 00:00:00 2001
99cbc7
Message-Id: <ff34df48cc7f197877034c319409c11f4a3b794e@dist-git>
99cbc7
From: Laine Stump <laine@laine.org>
99cbc7
Date: Thu, 11 Apr 2019 15:14:36 -0400
99cbc7
Subject: [PATCH] qemu_hotplug: merge qemuDomainDetachThisHostDevice into
99cbc7
 qemuDomainDetachHostDevice
99cbc7
99cbc7
It's now only called from one place, and combining the two functions
99cbc7
highlights the similarity with Detach functions for other device
99cbc7
types.
99cbc7
99cbc7
Signed-off-by: Laine Stump <laine@laine.org>
99cbc7
ACKed-by: Peter Krempa <pkrempa@redhat.com>
99cbc7
(cherry picked from commit 6be2414820a23663f9e6b7b4ed510ebbf3126307)
99cbc7
99cbc7
Partially-Resolves: https://bugzilla.redhat.com/1658198
99cbc7
Signed-off-by: Laine Stump <laine@redhat.com>
99cbc7
Signed-off-by: Laine Stump <laine@laine.org>
99cbc7
Message-Id: <20190411191453.24055-25-laine@redhat.com>
99cbc7
Acked-by: Michal Privoznik <mprivozn@redhat.com>
99cbc7
---
99cbc7
 src/qemu/qemu_hotplug.c | 101 +++++++++++++++-------------------------
99cbc7
 1 file changed, 38 insertions(+), 63 deletions(-)
99cbc7
99cbc7
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
99cbc7
index ac395b9177..8a3946a6e2 100644
99cbc7
--- a/src/qemu/qemu_hotplug.c
99cbc7
+++ b/src/qemu/qemu_hotplug.c
99cbc7
@@ -4938,68 +4938,6 @@ int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver,
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
-static int
99cbc7
-qemuDomainDetachThisHostDevice(virQEMUDriverPtr driver,
99cbc7
-                               virDomainObjPtr vm,
99cbc7
-                               virDomainHostdevDefPtr detach,
99cbc7
-                               bool async)
99cbc7
-{
99cbc7
-    int ret = -1;
99cbc7
-
99cbc7
-    if (qemuIsMultiFunctionDevice(vm->def, detach->info)) {
99cbc7
-        virReportError(VIR_ERR_OPERATION_FAILED,
99cbc7
-                       _("cannot hot unplug multifunction PCI device with guest address: "
99cbc7
-                         "%.4x:%.2x:%.2x.%.1x"),
99cbc7
-                       detach->info->addr.pci.domain, detach->info->addr.pci.bus,
99cbc7
-                       detach->info->addr.pci.slot, detach->info->addr.pci.function);
99cbc7
-        return -1;
99cbc7
-    }
99cbc7
-
99cbc7
-    if (!detach->info->alias) {
99cbc7
-        virReportError(VIR_ERR_OPERATION_FAILED,
99cbc7
-                       "%s", _("device cannot be detached without a device alias"));
99cbc7
-        return -1;
99cbc7
-    }
99cbc7
-
99cbc7
-    switch (detach->source.subsys.type) {
99cbc7
-    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
99cbc7
-    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
99cbc7
-    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
99cbc7
-    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
99cbc7
-    case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
99cbc7
-       /* we support detach of all these types of hostdev */
99cbc7
-       break;
99cbc7
-
99cbc7
-    default:
99cbc7
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
99cbc7
-                       _("hot unplug is not supported for hostdev subsys type '%s'"),
99cbc7
-                       virDomainHostdevSubsysTypeToString(detach->source.subsys.type));
99cbc7
-        return -1;
99cbc7
-    }
99cbc7
-
99cbc7
-    if (!async)
99cbc7
-        qemuDomainMarkDeviceForRemoval(vm, detach->info);
99cbc7
-
99cbc7
-    if (qemuDomainDeleteDevice(vm, detach->info->alias) < 0) {
99cbc7
-        if (virDomainObjIsActive(vm))
99cbc7
-            virDomainAuditHostdev(vm, detach, "detach", false);
99cbc7
-        goto cleanup;
99cbc7
-    }
99cbc7
-
99cbc7
-    if (async) {
99cbc7
-        ret = 0;
99cbc7
-    } else {
99cbc7
-        if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
99cbc7
-            ret = qemuDomainRemoveHostDevice(driver, vm, detach);
99cbc7
-    }
99cbc7
-
99cbc7
- cleanup:
99cbc7
-    if (!async)
99cbc7
-        qemuDomainResetDeviceRemoval(vm);
99cbc7
-
99cbc7
-    return ret;
99cbc7
-}
99cbc7
-
99cbc7
 /* search for a hostdev matching dev and detach it */
99cbc7
 int qemuDomainDetachHostDevice(virQEMUDriverPtr driver,
99cbc7
                                virDomainObjPtr vm,
99cbc7
@@ -5014,6 +4952,7 @@ int qemuDomainDetachHostDevice(virQEMUDriverPtr driver,
99cbc7
     virDomainHostdevSubsysMediatedDevPtr mdevsrc = &subsys->u.mdev;
99cbc7
     virDomainHostdevDefPtr detach = NULL;
99cbc7
     int idx;
99cbc7
+    int ret = -1;
99cbc7
 
99cbc7
     if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
99cbc7
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
99cbc7
@@ -5075,7 +5014,43 @@ int qemuDomainDetachHostDevice(virQEMUDriverPtr driver,
99cbc7
         return -1;
99cbc7
     }
99cbc7
 
99cbc7
-    return qemuDomainDetachThisHostDevice(driver, vm, detach, async);
99cbc7
+    if (qemuIsMultiFunctionDevice(vm->def, detach->info)) {
99cbc7
+        virReportError(VIR_ERR_OPERATION_FAILED,
99cbc7
+                       _("cannot hot unplug multifunction PCI device with guest address: "
99cbc7
+                         "%.4x:%.2x:%.2x.%.1x"),
99cbc7
+                       detach->info->addr.pci.domain, detach->info->addr.pci.bus,
99cbc7
+                       detach->info->addr.pci.slot, detach->info->addr.pci.function);
99cbc7
+        return -1;
99cbc7
+    }
99cbc7
+
99cbc7
+    if (!detach->info->alias) {
99cbc7
+        virReportError(VIR_ERR_OPERATION_FAILED,
99cbc7
+                       "%s", _("device cannot be detached without a device alias"));
99cbc7
+        return -1;
99cbc7
+    }
99cbc7
+
99cbc7
+    if (!async)
99cbc7
+        qemuDomainMarkDeviceForRemoval(vm, detach->info);
99cbc7
+
99cbc7
+    if (qemuDomainDeleteDevice(vm, detach->info->alias) < 0) {
99cbc7
+        if (virDomainObjIsActive(vm))
99cbc7
+            virDomainAuditHostdev(vm, detach, "detach", false);
99cbc7
+        goto cleanup;
99cbc7
+    }
99cbc7
+
99cbc7
+    if (async) {
99cbc7
+        ret = 0;
99cbc7
+    } else {
99cbc7
+        if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
99cbc7
+            ret = qemuDomainRemoveHostDevice(driver, vm, detach);
99cbc7
+    }
99cbc7
+
99cbc7
+ cleanup:
99cbc7
+    if (!async)
99cbc7
+        qemuDomainResetDeviceRemoval(vm);
99cbc7
+
99cbc7
+    return ret;
99cbc7
+
99cbc7
 }
99cbc7
 
99cbc7
 
99cbc7
-- 
99cbc7
2.21.0
99cbc7