[libvirt] [PATCH 4/5] qemuDomainAttachDeviceMknodRecursive: Don't try to create devices under preserved mount points

Cedric Bosdonnat cbosdonnat at suse.com
Wed May 3 13:28:31 UTC 2017


On Fri, 2017-04-28 at 13:22 +0200, Michal Privoznik wrote:
> Just like in previous commit, this fixes the same issue for
> hotplug.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_domain.c | 112 ++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 97 insertions(+), 15 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 5840c57..60f8f01 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -8238,6 +8238,8 @@ static int
>  qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
>                                       virDomainObjPtr vm,
>                                       const char *file,
> +                                     char * const *devMountsPath,
> +                                     size_t ndevMountsPath,
>                                       unsigned int ttl)
>  {
>      struct qemuDomainAttachDeviceMknodData data;
> @@ -8315,20 +8317,36 @@ qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
>  #endif
>  
>      if (STRPREFIX(file, DEVPREFIX)) {
> -        if (qemuSecurityPreFork(driver->securityManager) < 0)
> -            goto cleanup;
> +        size_t i;
>  
> -        if (virProcessRunInMountNamespace(vm->pid,
> -                                          qemuDomainAttachDeviceMknodHelper,
> -                                          &data) < 0) {
> +        for (i = 0; i < ndevMountsPath; i++) {
> +            if (STREQ(devMountsPath[i], "/dev"))
> +                continue;
> +            if (STRPREFIX(file, devMountsPath[i]))
> +                break;
> +        }
> +
> +        if (i == ndevMountsPath) {
> +            if (qemuSecurityPreFork(driver->securityManager) < 0)
> +                goto cleanup;
> +
> +            if (virProcessRunInMountNamespace(vm->pid,
> +                                              qemuDomainAttachDeviceMknodHelper,
> +                                              &data) < 0) {
> +                qemuSecurityPostFork(driver->securityManager);
> +                goto cleanup;
> +            }
>              qemuSecurityPostFork(driver->securityManager);
> -            goto cleanup;
> +        } else {
> +            VIR_DEBUG("Skipping dev %s because of %s mount point",
> +                      file, devMountsPath[i]);
>          }
> -        qemuSecurityPostFork(driver->securityManager);
>      }
>  
>      if (isLink &&
> -        qemuDomainAttachDeviceMknodRecursive(driver, vm, target, ttl -1) < 0)
> +        qemuDomainAttachDeviceMknodRecursive(driver, vm, target,
> +                                             devMountsPath, ndevMountsPath,
> +                                             ttl -1) < 0)
>          goto cleanup;
>  
>      ret = 0;
> @@ -8345,11 +8363,15 @@ qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
>  static int
>  qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver,
>                              virDomainObjPtr vm,
> -                            const char *file)
> +                            const char *file,
> +                            char * const *devMountsPath,
> +                            size_t ndevMountsPath)
>  {
>      long symloop_max = sysconf(_SC_SYMLOOP_MAX);
>  
> -    return qemuDomainAttachDeviceMknodRecursive(driver, vm, file, symloop_max);
> +    return qemuDomainAttachDeviceMknodRecursive(driver, vm, file,
> +                                                devMountsPath, ndevMountsPath,
> +                                                symloop_max);
>  }
>  
>  
> @@ -8389,6 +8411,9 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
>                               virDomainObjPtr vm,
>                               virStorageSourcePtr src)
>  {
> +    virQEMUDriverConfigPtr cfg = NULL;
> +    char **devMountsPath = NULL;
> +    size_t ndevMountsPath = 0;
>      virStorageSourcePtr next;
>      struct stat sb;
>      int ret = -1;
> @@ -8396,6 +8421,12 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
>      if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))
>          return 0;
>  
> +    cfg = virQEMUDriverGetConfig(driver);
> +    if (qemuDomainGetPreservedMounts(cfg, vm,
> +                                     &devMountsPath, NULL,
> +                                     &ndevMountsPath) < 0)
> +        goto cleanup;
> +
>      for (next = src; next; next = next->backingStore) {
>          if (virStorageSourceIsEmpty(next) ||
>              !virStorageSourceIsLocalStorage(next)) {
> @@ -8414,12 +8445,15 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
>  
>          if (qemuDomainAttachDeviceMknod(driver,
>                                          vm,
> -                                        next->path) < 0)
> +                                        next->path,
> +                                        devMountsPath, ndevMountsPath) < 0)
>              goto cleanup;
>      }
>  
>      ret = 0;
>   cleanup:
> +    virStringListFreeCount(devMountsPath, ndevMountsPath);
> +    virObjectUnref(cfg);
>      return ret;
>  }
>  
> @@ -8444,6 +8478,9 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
>                                  virDomainObjPtr vm,
>                                  virDomainHostdevDefPtr hostdev)
>  {
> +    virQEMUDriverConfigPtr cfg = NULL;
> +    char **devMountsPath = NULL;
> +    size_t ndevMountsPath = 0;
>      int ret = -1;
>      char **path = NULL;
>      size_t i, npaths = 0;
> @@ -8454,10 +8491,17 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
>      if (qemuDomainGetHostdevPath(NULL, hostdev, false, &npaths, &path, NULL) < 0)
>          goto cleanup;
>  
> +    cfg = virQEMUDriverGetConfig(driver);
> +    if (qemuDomainGetPreservedMounts(cfg, vm,
> +                                     &devMountsPath, NULL,
> +                                     &ndevMountsPath) < 0)
> +        goto cleanup;
> +
>      for (i = 0; i < npaths; i++) {
>          if (qemuDomainAttachDeviceMknod(driver,
>                                          vm,
> -                                        path[i]) < 0)
> +                                        path[i],
> +                                        devMountsPath, ndevMountsPath) < 0)
>          goto cleanup;
>      }
>  
> @@ -8466,6 +8510,8 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
>      for (i = 0; i < npaths; i++)
>          VIR_FREE(path[i]);
>      VIR_FREE(path);
> +    virStringListFreeCount(devMountsPath, ndevMountsPath);
> +    virObjectUnref(cfg);
>      return ret;
>  }
>  
> @@ -8505,6 +8551,9 @@ qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
>                                 virDomainObjPtr vm,
>                                 virDomainMemoryDefPtr mem)
>  {
> +    virQEMUDriverConfigPtr cfg = NULL;
> +    char **devMountsPath = NULL;
> +    size_t ndevMountsPath = 0;
>      int ret = -1;
>  
>      if (mem->model != VIR_DOMAIN_MEMORY_MODEL_NVDIMM)
> @@ -8513,10 +8562,19 @@ qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
>      if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))
>          return 0;
>  
> -    if (qemuDomainAttachDeviceMknod(driver, vm, mem->nvdimmPath) < 0)
> +    cfg = virQEMUDriverGetConfig(driver);
> +    if (qemuDomainGetPreservedMounts(cfg, vm,
> +                                     &devMountsPath, NULL,
> +                                     &ndevMountsPath) < 0)
> +        goto cleanup;
> +
> +    if (qemuDomainAttachDeviceMknod(driver, vm, mem->nvdimmPath,
> +                                    devMountsPath, ndevMountsPath) < 0)
>          goto cleanup;
>      ret = 0;
>   cleanup:
> +    virStringListFreeCount(devMountsPath, ndevMountsPath);
> +    virObjectUnref(cfg);
>      return ret;
>  }
>  
> @@ -8547,6 +8605,9 @@ qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
>                                  virDomainObjPtr vm,
>                                  virDomainChrDefPtr chr)
>  {
> +    virQEMUDriverConfigPtr cfg = NULL;
> +    char **devMountsPath = NULL;
> +    size_t ndevMountsPath = 0;
>      const char *path;
>      int ret = -1;
>  
> @@ -8558,12 +8619,21 @@ qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
>  
>      path = chr->source->data.file.path;
>  
> +    cfg = virQEMUDriverGetConfig(driver);
> +    if (qemuDomainGetPreservedMounts(cfg, vm,
> +                                     &devMountsPath, NULL,
> +                                     &ndevMountsPath) < 0)
> +        goto cleanup;
> +
>      if (qemuDomainAttachDeviceMknod(driver,
>                                      vm,
> -                                    path) < 0)
> +                                    path,
> +                                    devMountsPath, ndevMountsPath) < 0)
>          goto cleanup;
>      ret = 0;
>   cleanup:
> +    virStringListFreeCount(devMountsPath, ndevMountsPath);
> +    virObjectUnref(cfg);
>      return ret;
>  }
>  
> @@ -8598,6 +8668,9 @@ qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
>                              virDomainObjPtr vm,
>                              virDomainRNGDefPtr rng)
>  {
> +    virQEMUDriverConfigPtr cfg = NULL;
> +    char **devMountsPath = NULL;
> +    size_t ndevMountsPath = 0;
>      const char *path = NULL;
>      int ret = -1;
>  
> @@ -8615,12 +8688,21 @@ qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
>          goto cleanup;
>      }
>  
> +    cfg = virQEMUDriverGetConfig(driver);
> +    if (qemuDomainGetPreservedMounts(cfg, vm,
> +                                     &devMountsPath, NULL,
> +                                     &ndevMountsPath) < 0)
> +        goto cleanup;
> +
>      if (qemuDomainAttachDeviceMknod(driver,
>                                      vm,
> -                                    path) < 0)
> +                                    path,
> +                                    devMountsPath, ndevMountsPath) < 0)
>          goto cleanup;
>      ret = 0;
>   cleanup:
> +    virStringListFreeCount(devMountsPath, ndevMountsPath);
> +    virObjectUnref(cfg);
>      return ret;
>  }
>  

ACK

--
Cedric




More information about the libvir-list mailing list