render / rpms / libvirt

Forked from rpms/libvirt a year ago
Clone
6d3351
From c5e142b3b9bc25ed508b8b7b62907ed99daba84d Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <c5e142b3b9bc25ed508b8b7b62907ed99daba84d@dist-git>
6d3351
From: Michal Privoznik <mprivozn@redhat.com>
6d3351
Date: Thu, 11 May 2017 15:38:40 +0200
6d3351
Subject: [PATCH] qemuDomainAttachDeviceMknodRecursive: Don't try to create
6d3351
 devices under preserved mount points
6d3351
6d3351
https://bugzilla.redhat.com/show_bug.cgi?id=1449510
6d3351
6d3351
Just like in previous commit, this fixes the same issue for
6d3351
hotplug.
6d3351
6d3351
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
6d3351
Reviewed-by: Cedric Bosdonnat <cbosdonnat@suse.com>
6d3351
(cherry picked from commit b3418f36be75eb4bdecd6aa37cda7a268519ee46)
6d3351
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
---
6d3351
 src/qemu/qemu_domain.c | 114 ++++++++++++++++++++++++++++++++++++++++++-------
6d3351
 1 file changed, 98 insertions(+), 16 deletions(-)
6d3351
6d3351
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
6d3351
index 9217747d5..671569f6f 100644
6d3351
--- a/src/qemu/qemu_domain.c
6d3351
+++ b/src/qemu/qemu_domain.c
6d3351
@@ -8314,6 +8314,8 @@ static int
6d3351
 qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
6d3351
                                      virDomainObjPtr vm,
6d3351
                                      const char *file,
6d3351
+                                     char * const *devMountsPath,
6d3351
+                                     size_t ndevMountsPath,
6d3351
                                      unsigned int ttl)
6d3351
 {
6d3351
     struct qemuDomainAttachDeviceMknodData data;
6d3351
@@ -8391,20 +8393,36 @@ qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
6d3351
 #endif
6d3351
 
6d3351
     if (STRPREFIX(file, DEVPREFIX)) {
6d3351
-        if (qemuSecurityPreFork(driver->securityManager) < 0)
6d3351
-            goto cleanup;
6d3351
+        size_t i;
6d3351
 
6d3351
-        if (virProcessRunInMountNamespace(vm->pid,
6d3351
-                                          qemuDomainAttachDeviceMknodHelper,
6d3351
-                                          &data) < 0) {
6d3351
-            qemuSecurityPostFork(driver->securityManager);
6d3351
-            goto cleanup;
6d3351
+        for (i = 0; i < ndevMountsPath; i++) {
6d3351
+            if (STREQ(devMountsPath[i], "/dev"))
6d3351
+                continue;
6d3351
+            if (STRPREFIX(file, devMountsPath[i]))
6d3351
+                break;
6d3351
+        }
6d3351
+
6d3351
+        if (i == ndevMountsPath) {
6d3351
+            if (qemuSecurityPreFork(driver->securityManager) < 0)
6d3351
+                goto cleanup;
6d3351
+
6d3351
+            if (virProcessRunInMountNamespace(vm->pid,
6d3351
+                                              qemuDomainAttachDeviceMknodHelper,
6d3351
+                                              &data) < 0) {
6d3351
+                qemuSecurityPostFork(driver->securityManager);
6d3351
+                goto cleanup;
6d3351
+            }
6d3351
+            qemuSecurityPostFork(driver->securityManager);
6d3351
+        } else {
6d3351
+            VIR_DEBUG("Skipping dev %s because of %s mount point",
6d3351
+                      file, devMountsPath[i]);
6d3351
         }
6d3351
-        qemuSecurityPostFork(driver->securityManager);
6d3351
     }
6d3351
 
6d3351
     if (isLink &&
6d3351
-        qemuDomainAttachDeviceMknodRecursive(driver, vm, target, ttl -1) < 0)
6d3351
+        qemuDomainAttachDeviceMknodRecursive(driver, vm, target,
6d3351
+                                             devMountsPath, ndevMountsPath,
6d3351
+                                             ttl -1) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
     ret = 0;
6d3351
@@ -8421,11 +8439,15 @@ qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
6d3351
 static int
6d3351
 qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver,
6d3351
                             virDomainObjPtr vm,
6d3351
-                            const char *file)
6d3351
+                            const char *file,
6d3351
+                            char * const *devMountsPath,
6d3351
+                            size_t ndevMountsPath)
6d3351
 {
6d3351
     long symloop_max = sysconf(_SC_SYMLOOP_MAX);
6d3351
 
6d3351
-    return qemuDomainAttachDeviceMknodRecursive(driver, vm, file, symloop_max);
6d3351
+    return qemuDomainAttachDeviceMknodRecursive(driver, vm, file,
6d3351
+                                                devMountsPath, ndevMountsPath,
6d3351
+                                                symloop_max);
6d3351
 }
6d3351
 
6d3351
 
6d3351
@@ -8465,6 +8487,9 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
6d3351
                              virDomainObjPtr vm,
6d3351
                              virStorageSourcePtr src)
6d3351
 {
6d3351
+    virQEMUDriverConfigPtr cfg = NULL;
6d3351
+    char **devMountsPath = NULL;
6d3351
+    size_t ndevMountsPath = 0;
6d3351
     virStorageSourcePtr next;
6d3351
     struct stat sb;
6d3351
     int ret = -1;
6d3351
@@ -8472,6 +8497,12 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
6d3351
     if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))
6d3351
         return 0;
6d3351
 
6d3351
+    cfg = virQEMUDriverGetConfig(driver);
6d3351
+    if (qemuDomainGetPreservedMounts(cfg, vm,
6d3351
+                                     &devMountsPath, NULL,
6d3351
+                                     &ndevMountsPath) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
     for (next = src; next; next = next->backingStore) {
6d3351
         if (virStorageSourceIsEmpty(next) ||
6d3351
             !virStorageSourceIsLocalStorage(next)) {
6d3351
@@ -8490,12 +8521,15 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
6d3351
 
6d3351
         if (qemuDomainAttachDeviceMknod(driver,
6d3351
                                         vm,
6d3351
-                                        next->path) < 0)
6d3351
+                                        next->path,
6d3351
+                                        devMountsPath, ndevMountsPath) < 0)
6d3351
             goto cleanup;
6d3351
     }
6d3351
 
6d3351
     ret = 0;
6d3351
  cleanup:
6d3351
+    virStringListFreeCount(devMountsPath, ndevMountsPath);
6d3351
+    virObjectUnref(cfg);
6d3351
     return ret;
6d3351
 }
6d3351
 
6d3351
@@ -8520,6 +8554,9 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
6d3351
                                 virDomainObjPtr vm,
6d3351
                                 virDomainHostdevDefPtr hostdev)
6d3351
 {
6d3351
+    virQEMUDriverConfigPtr cfg = NULL;
6d3351
+    char **devMountsPath = NULL;
6d3351
+    size_t ndevMountsPath = 0;
6d3351
     int ret = -1;
6d3351
     char **path = NULL;
6d3351
     size_t i, npaths = 0;
6d3351
@@ -8530,10 +8567,17 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
6d3351
     if (qemuDomainGetHostdevPath(NULL, hostdev, false, &npaths, &path, NULL) < 0)
6d3351
         goto cleanup;
6d3351
 
6d3351
+    cfg = virQEMUDriverGetConfig(driver);
6d3351
+    if (qemuDomainGetPreservedMounts(cfg, vm,
6d3351
+                                     &devMountsPath, NULL,
6d3351
+                                     &ndevMountsPath) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
     for (i = 0; i < npaths; i++) {
6d3351
         if (qemuDomainAttachDeviceMknod(driver,
6d3351
                                         vm,
6d3351
-                                        path[i]) < 0)
6d3351
+                                        path[i],
6d3351
+                                        devMountsPath, ndevMountsPath) < 0)
6d3351
         goto cleanup;
6d3351
     }
6d3351
 
6d3351
@@ -8542,6 +8586,8 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
6d3351
     for (i = 0; i < npaths; i++)
6d3351
         VIR_FREE(path[i]);
6d3351
     VIR_FREE(path);
6d3351
+    virStringListFreeCount(devMountsPath, ndevMountsPath);
6d3351
+    virObjectUnref(cfg);
6d3351
     return ret;
6d3351
 }
6d3351
 
6d3351
@@ -8581,6 +8627,9 @@ qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
6d3351
                                virDomainObjPtr vm,
6d3351
                                virDomainMemoryDefPtr mem)
6d3351
 {
6d3351
+    virQEMUDriverConfigPtr cfg = NULL;
6d3351
+    char **devMountsPath = NULL;
6d3351
+    size_t ndevMountsPath = 0;
6d3351
     int ret = -1;
6d3351
 
6d3351
     if (mem->model != VIR_DOMAIN_MEMORY_MODEL_NVDIMM)
6d3351
@@ -8589,10 +8638,19 @@ qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
6d3351
     if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))
6d3351
         return 0;
6d3351
 
6d3351
-    if (qemuDomainAttachDeviceMknod(driver, vm, mem->nvdimmPath) < 0)
6d3351
+    cfg = virQEMUDriverGetConfig(driver);
6d3351
+    if (qemuDomainGetPreservedMounts(cfg, vm,
6d3351
+                                     &devMountsPath, NULL,
6d3351
+                                     &ndevMountsPath) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
+    if (qemuDomainAttachDeviceMknod(driver, vm, mem->nvdimmPath,
6d3351
+                                    devMountsPath, ndevMountsPath) < 0)
6d3351
         goto cleanup;
6d3351
     ret = 0;
6d3351
  cleanup:
6d3351
+    virStringListFreeCount(devMountsPath, ndevMountsPath);
6d3351
+    virObjectUnref(cfg);
6d3351
     return ret;
6d3351
 }
6d3351
 
6d3351
@@ -8623,6 +8681,9 @@ qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
6d3351
                                 virDomainObjPtr vm,
6d3351
                                 virDomainChrDefPtr chr)
6d3351
 {
6d3351
+    virQEMUDriverConfigPtr cfg = NULL;
6d3351
+    char **devMountsPath = NULL;
6d3351
+    size_t ndevMountsPath = 0;
6d3351
     const char *path;
6d3351
     int ret = -1;
6d3351
 
6d3351
@@ -8634,12 +8695,21 @@ qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
6d3351
 
6d3351
     path = chr->source->data.file.path;
6d3351
 
6d3351
+    cfg = virQEMUDriverGetConfig(driver);
6d3351
+    if (qemuDomainGetPreservedMounts(cfg, vm,
6d3351
+                                     &devMountsPath, NULL,
6d3351
+                                     &ndevMountsPath) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
     if (qemuDomainAttachDeviceMknod(driver,
6d3351
                                     vm,
6d3351
-                                    path) < 0)
6d3351
+                                    path,
6d3351
+                                    devMountsPath, ndevMountsPath) < 0)
6d3351
         goto cleanup;
6d3351
     ret = 0;
6d3351
  cleanup:
6d3351
+    virStringListFreeCount(devMountsPath, ndevMountsPath);
6d3351
+    virObjectUnref(cfg);
6d3351
     return ret;
6d3351
 }
6d3351
 
6d3351
@@ -8674,6 +8744,9 @@ qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
6d3351
                             virDomainObjPtr vm,
6d3351
                             virDomainRNGDefPtr rng)
6d3351
 {
6d3351
+    virQEMUDriverConfigPtr cfg = NULL;
6d3351
+    char **devMountsPath = NULL;
6d3351
+    size_t ndevMountsPath = 0;
6d3351
     const char *path = NULL;
6d3351
     int ret = -1;
6d3351
 
6d3351
@@ -8691,12 +8764,21 @@ qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
6d3351
         goto cleanup;
6d3351
     }
6d3351
 
6d3351
+    cfg = virQEMUDriverGetConfig(driver);
6d3351
+    if (qemuDomainGetPreservedMounts(cfg, vm,
6d3351
+                                     &devMountsPath, NULL,
6d3351
+                                     &ndevMountsPath) < 0)
6d3351
+        goto cleanup;
6d3351
+
6d3351
     if (qemuDomainAttachDeviceMknod(driver,
6d3351
                                     vm,
6d3351
-                                    path) < 0)
6d3351
+                                    path,
6d3351
+                                    devMountsPath, ndevMountsPath) < 0)
6d3351
         goto cleanup;
6d3351
     ret = 0;
6d3351
  cleanup:
6d3351
+    virStringListFreeCount(devMountsPath, ndevMountsPath);
6d3351
+    virObjectUnref(cfg);
6d3351
     return ret;
6d3351
 }
6d3351
 
6d3351
-- 
6d3351
2.13.0
6d3351