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@xxxxxxxxxx> > --- > 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list