[PATCH v1 28/34] qemuDomainDetachDeviceUnlink: Unlink paths in one go

Michal Privoznik posted 34 patches 5 years, 6 months ago
[PATCH v1 28/34] qemuDomainDetachDeviceUnlink: Unlink paths in one go
Posted by Michal Privoznik 5 years, 6 months ago
Simirarly to qemuDomainAttachDeviceMknodHelper() which was
modified just a couple of commits ago, modify the unlink helper
which is called on device detach so that it can unlink multiple
files in one go instead of forking off for every single one of
them.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 src/qemu/qemu_domain_namespace.c | 65 +++++++++++++++-----------------
 1 file changed, 30 insertions(+), 35 deletions(-)

diff --git a/src/qemu/qemu_domain_namespace.c b/src/qemu/qemu_domain_namespace.c
index 41d79559f9..4e0b50d885 100644
--- a/src/qemu/qemu_domain_namespace.c
+++ b/src/qemu/qemu_domain_namespace.c
@@ -1286,44 +1286,21 @@ static int
 qemuDomainDetachDeviceUnlinkHelper(pid_t pid G_GNUC_UNUSED,
                                    void *opaque)
 {
-    const char *path = opaque;
-
-    VIR_DEBUG("Unlinking %s", path);
-    if (unlink(path) < 0 && errno != ENOENT) {
-        virReportSystemError(errno,
-                             _("Unable to remove device %s"), path);
-        return -1;
-    }
-
-    return 0;
-}
-
-
-static int
-qemuDomainDetachDeviceUnlink(virQEMUDriverPtr driver G_GNUC_UNUSED,
-                             virDomainObjPtr vm,
-                             const char *file,
-                             char * const *devMountsPath,
-                             size_t ndevMountsPath)
-{
+    char **paths = opaque;
     size_t i;
 
-    if (STRPREFIX(file, QEMU_DEVPREFIX)) {
-        for (i = 0; i < ndevMountsPath; i++) {
-            if (STREQ(devMountsPath[i], "/dev"))
-                continue;
-            if (STRPREFIX(file, devMountsPath[i]))
-                break;
-        }
+    for (i = 0; paths[i]; i++) {
+        const char *path = paths[i];
 
-        if (i == ndevMountsPath) {
-            if (virProcessRunInMountNamespace(vm->pid,
-                                              qemuDomainDetachDeviceUnlinkHelper,
-                                              (void *)file) < 0)
-                return -1;
+        VIR_DEBUG("Unlinking %s", path);
+        if (unlink(path) < 0 && errno != ENOENT) {
+            virReportSystemError(errno,
+                                 _("Unable to remove device %s"), path);
+            return -1;
         }
     }
 
+    virStringListFree(paths);
     return 0;
 }
 
@@ -1336,6 +1313,7 @@ qemuDomainNamespaceUnlinkPaths(virDomainObjPtr vm,
     qemuDomainObjPrivatePtr priv = vm->privateData;
     virQEMUDriverPtr driver = priv->driver;
     g_autoptr(virQEMUDriverConfig) cfg = NULL;
+    VIR_AUTOSTRINGLIST unlinkPaths = NULL;
     char **devMountsPath = NULL;
     size_t ndevMountsPath = 0;
     size_t i;
@@ -1352,11 +1330,28 @@ qemuDomainNamespaceUnlinkPaths(virDomainObjPtr vm,
         goto cleanup;
 
     for (i = 0; i < npaths; i++) {
-        if (qemuDomainDetachDeviceUnlink(driver, vm, paths[i],
-                                         devMountsPath, ndevMountsPath) < 0)
-            goto cleanup;
+        const char *file = paths[i];
+
+        if (STRPREFIX(file, QEMU_DEVPREFIX)) {
+            for (i = 0; i < ndevMountsPath; i++) {
+                if (STREQ(devMountsPath[i], "/dev"))
+                    continue;
+                if (STRPREFIX(file, devMountsPath[i]))
+                    break;
+            }
+
+            if (i == ndevMountsPath &&
+                virStringListAdd(&unlinkPaths, file) < 0)
+                return -1;
+        }
     }
 
+    if (unlinkPaths &&
+        virProcessRunInMountNamespace(vm->pid,
+                                      qemuDomainDetachDeviceUnlinkHelper,
+                                      unlinkPaths) < 0)
+        return -1;
+
     ret = 0;
  cleanup:
     virStringListFreeCount(devMountsPath, ndevMountsPath);
-- 
2.26.2

Re: [PATCH v1 28/34] qemuDomainDetachDeviceUnlink: Unlink paths in one go
Posted by Ján Tomko 5 years, 6 months ago
On a Wednesday in 2020, Michal Privoznik wrote:
>Simirarly to qemuDomainAttachDeviceMknodHelper() which was
>modified just a couple of commits ago, modify the unlink helper
>which is called on device detach so that it can unlink multiple
>files in one go instead of forking off for every single one of
>them.
>
>Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
>---
> src/qemu/qemu_domain_namespace.c | 65 +++++++++++++++-----------------
> 1 file changed, 30 insertions(+), 35 deletions(-)
>

Reviewed-by: Ján Tomko <jtomko@redhat.com>

Jano