On Fri, 2017-04-28 at 13:22 +0200, Michal Privoznik wrote: > Currently, all we need to do in qemuDomainCreateDeviceRecursive() is to > take given @device, get all kinds of info on it (major & minor numbers, > owner, seclabels) and create its copy at a temporary location @path > (usually /var/run/libvirt/qemu/$domName.dev), if @device live under > /dev. This is, however, very loose condition, as it also means > /dev/shm/* is created too. Therefor, we will need to pass more arguments > into the function for better decision making (e.g. list of mount points > under /dev). Instead of adding more arguments to all the functions (not > easily reachable because some functions are callback with strictly > defined type), lets just turn this one 'const char *' into a 'struct *'. > New "arguments" can be then added at no cost. > > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > src/qemu/qemu_domain.c | 106 ++++++++++++++++++++++++++----------------------- > 1 file changed, 57 insertions(+), 49 deletions(-) > > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c > index be02d54..9e18f7e 100644 > --- a/src/qemu/qemu_domain.c > +++ b/src/qemu/qemu_domain.c > @@ -7337,9 +7337,14 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg, > } > > > +struct qemuDomainCreateDeviceData { > + const char *path; /* Path to temp new /dev location */ > +}; > + > + > static int > qemuDomainCreateDeviceRecursive(const char *device, > - const char *path, > + const struct qemuDomainCreateDeviceData *data, > bool allow_noent, > unsigned int ttl) > { > @@ -7388,7 +7393,7 @@ qemuDomainCreateDeviceRecursive(const char *device, > */ > if (STRPREFIX(device, DEVPREFIX)) { > if (virAsprintf(&devicePath, "%s/%s", > - path, device + strlen(DEVPREFIX)) < 0) > + data->path, device + strlen(DEVPREFIX)) < 0) > goto cleanup; > > if (virFileMakeParentPath(devicePath) < 0) { > @@ -7449,7 +7454,7 @@ qemuDomainCreateDeviceRecursive(const char *device, > tmp = NULL; > } > > - if (qemuDomainCreateDeviceRecursive(target, path, > + if (qemuDomainCreateDeviceRecursive(target, data, > allow_noent, ttl - 1) < 0) > goto cleanup; > } else { > @@ -7533,12 +7538,12 @@ qemuDomainCreateDeviceRecursive(const char *device, > > static int > qemuDomainCreateDevice(const char *device, > - const char *path, > + const struct qemuDomainCreateDeviceData *data, > bool allow_noent) > { > long symloop_max = sysconf(_SC_SYMLOOP_MAX); > > - return qemuDomainCreateDeviceRecursive(device, path, > + return qemuDomainCreateDeviceRecursive(device, data, > allow_noent, symloop_max); > } > > @@ -7546,7 +7551,7 @@ qemuDomainCreateDevice(const char *device, > static int > qemuDomainPopulateDevices(virQEMUDriverConfigPtr cfg, > virDomainObjPtr vm ATTRIBUTE_UNUSED, > - const char *path) > + const struct qemuDomainCreateDeviceData *data) > { > const char *const *devices = (const char *const *) cfg->cgroupDeviceACL; > size_t i; > @@ -7556,7 +7561,7 @@ qemuDomainPopulateDevices(virQEMUDriverConfigPtr cfg, > devices = defaultDeviceACL; > > for (i = 0; devices[i]; i++) { > - if (qemuDomainCreateDevice(devices[i], path, true) < 0) > + if (qemuDomainCreateDevice(devices[i], data, true) < 0) > goto cleanup; > } > > @@ -7570,7 +7575,7 @@ static int > qemuDomainSetupDev(virQEMUDriverConfigPtr cfg, > virSecurityManagerPtr mgr, > virDomainObjPtr vm, > - const char *path) > + const struct qemuDomainCreateDeviceData *data) > { > char *mount_options = NULL; > char *opts = NULL; > @@ -7592,10 +7597,10 @@ qemuDomainSetupDev(virQEMUDriverConfigPtr cfg, > "mode=755,size=65536%s", mount_options) < 0) > goto cleanup; > > - if (virFileSetupDev(path, opts) < 0) > + if (virFileSetupDev(data->path, opts) < 0) > goto cleanup; > > - if (qemuDomainPopulateDevices(cfg, vm, path) < 0) > + if (qemuDomainPopulateDevices(cfg, vm, data) < 0) > goto cleanup; > > ret = 0; > @@ -7609,7 +7614,7 @@ qemuDomainSetupDev(virQEMUDriverConfigPtr cfg, > static int > qemuDomainSetupDisk(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainDiskDefPtr disk, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > virStorageSourcePtr next; > char *dst = NULL; > @@ -7621,7 +7626,7 @@ qemuDomainSetupDisk(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > continue; > } > > - if (qemuDomainCreateDevice(next->path, devPath, false) < 0) > + if (qemuDomainCreateDevice(next->path, data, false) < 0) > goto cleanup; > } > > @@ -7635,7 +7640,7 @@ qemuDomainSetupDisk(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > static int > qemuDomainSetupAllDisks(virQEMUDriverConfigPtr cfg, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > size_t i; > VIR_DEBUG("Setting up disks"); > @@ -7643,7 +7648,7 @@ qemuDomainSetupAllDisks(virQEMUDriverConfigPtr cfg, > for (i = 0; i < vm->def->ndisks; i++) { > if (qemuDomainSetupDisk(cfg, > vm->def->disks[i], > - devPath) < 0) > + data) < 0) > return -1; > } > > @@ -7655,7 +7660,7 @@ qemuDomainSetupAllDisks(virQEMUDriverConfigPtr cfg, > static int > qemuDomainSetupHostdev(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainHostdevDefPtr dev, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > int ret = -1; > char **path = NULL; > @@ -7665,7 +7670,7 @@ qemuDomainSetupHostdev(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > goto cleanup; > > for (i = 0; i < npaths; i++) { > - if (qemuDomainCreateDevice(path[i], devPath, false) < 0) > + if (qemuDomainCreateDevice(path[i], data, false) < 0) > goto cleanup; > } > > @@ -7681,7 +7686,7 @@ qemuDomainSetupHostdev(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > static int > qemuDomainSetupAllHostdevs(virQEMUDriverConfigPtr cfg, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > size_t i; > > @@ -7689,7 +7694,7 @@ qemuDomainSetupAllHostdevs(virQEMUDriverConfigPtr cfg, > for (i = 0; i < vm->def->nhostdevs; i++) { > if (qemuDomainSetupHostdev(cfg, > vm->def->hostdevs[i], > - devPath) < 0) > + data) < 0) > return -1; > } > VIR_DEBUG("Setup all hostdevs"); > @@ -7700,19 +7705,19 @@ qemuDomainSetupAllHostdevs(virQEMUDriverConfigPtr cfg, > static int > qemuDomainSetupMemory(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainMemoryDefPtr mem, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > if (mem->model != VIR_DOMAIN_MEMORY_MODEL_NVDIMM) > return 0; > > - return qemuDomainCreateDevice(mem->nvdimmPath, devPath, false); > + return qemuDomainCreateDevice(mem->nvdimmPath, data, false); > } > > > static int > qemuDomainSetupAllMemories(virQEMUDriverConfigPtr cfg, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > size_t i; > > @@ -7720,7 +7725,7 @@ qemuDomainSetupAllMemories(virQEMUDriverConfigPtr cfg, > for (i = 0; i < vm->def->nmems; i++) { > if (qemuDomainSetupMemory(cfg, > vm->def->mems[i], > - devPath) < 0) > + data) < 0) > return -1; > } > VIR_DEBUG("Setup all memories"); > @@ -7733,26 +7738,26 @@ qemuDomainSetupChardev(virDomainDefPtr def ATTRIBUTE_UNUSED, > virDomainChrDefPtr dev, > void *opaque) > { > - const char *devPath = opaque; > + const struct qemuDomainCreateDeviceData *data = opaque; > > if (dev->source->type != VIR_DOMAIN_CHR_TYPE_DEV) > return 0; > > - return qemuDomainCreateDevice(dev->source->data.file.path, devPath, false); > + return qemuDomainCreateDevice(dev->source->data.file.path, data, false); > } > > > static int > qemuDomainSetupAllChardevs(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > VIR_DEBUG("Setting up chardevs"); > > if (virDomainChrDefForeach(vm->def, > true, > qemuDomainSetupChardev, > - (void *) devPath) < 0) > + (void *) data) < 0) > return -1; > > VIR_DEBUG("Setup all chardevs"); > @@ -7763,7 +7768,7 @@ qemuDomainSetupAllChardevs(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > static int > qemuDomainSetupTPM(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > virDomainTPMDefPtr dev = vm->def->tpm; > > @@ -7775,7 +7780,7 @@ qemuDomainSetupTPM(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > switch (dev->type) { > case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: > if (qemuDomainCreateDevice(dev->data.passthrough.source.data.file.path, > - devPath, false) < 0) > + data, false) < 0) > return -1; > break; > > @@ -7792,7 +7797,7 @@ qemuDomainSetupTPM(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > static int > qemuDomainSetupGraphics(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainGraphicsDefPtr gfx, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > const char *rendernode = gfx->data.spice.rendernode; > > @@ -7801,14 +7806,14 @@ qemuDomainSetupGraphics(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > !rendernode) > return 0; > > - return qemuDomainCreateDevice(rendernode, devPath, false); > + return qemuDomainCreateDevice(rendernode, data, false); > } > > > static int > qemuDomainSetupAllGraphics(virQEMUDriverConfigPtr cfg, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > size_t i; > > @@ -7816,7 +7821,7 @@ qemuDomainSetupAllGraphics(virQEMUDriverConfigPtr cfg, > for (i = 0; i < vm->def->ngraphics; i++) { > if (qemuDomainSetupGraphics(cfg, > vm->def->graphics[i], > - devPath) < 0) > + data) < 0) > return -1; > } > > @@ -7828,13 +7833,13 @@ qemuDomainSetupAllGraphics(virQEMUDriverConfigPtr cfg, > static int > qemuDomainSetupInput(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainInputDefPtr input, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > int ret = -1; > > switch ((virDomainInputType) input->type) { > case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: > - if (qemuDomainCreateDevice(input->source.evdev, devPath, false) < 0) > + if (qemuDomainCreateDevice(input->source.evdev, data, false) < 0) > goto cleanup; > break; > > @@ -7855,7 +7860,7 @@ qemuDomainSetupInput(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > static int > qemuDomainSetupAllInputs(virQEMUDriverConfigPtr cfg, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > size_t i; > > @@ -7863,7 +7868,7 @@ qemuDomainSetupAllInputs(virQEMUDriverConfigPtr cfg, > for (i = 0; i < vm->def->ninputs; i++) { > if (qemuDomainSetupInput(cfg, > vm->def->inputs[i], > - devPath) < 0) > + data) < 0) > return -1; > } > VIR_DEBUG("Setup all inputs"); > @@ -7874,11 +7879,11 @@ qemuDomainSetupAllInputs(virQEMUDriverConfigPtr cfg, > static int > qemuDomainSetupRNG(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > virDomainRNGDefPtr rng, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > switch ((virDomainRNGBackend) rng->backend) { > case VIR_DOMAIN_RNG_BACKEND_RANDOM: > - if (qemuDomainCreateDevice(rng->source.file, devPath, false) < 0) > + if (qemuDomainCreateDevice(rng->source.file, data, false) < 0) > return -1; > > case VIR_DOMAIN_RNG_BACKEND_EGD: > @@ -7894,7 +7899,7 @@ qemuDomainSetupRNG(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, > static int > qemuDomainSetupAllRNGs(virQEMUDriverConfigPtr cfg, > virDomainObjPtr vm, > - const char *devPath) > + const struct qemuDomainCreateDeviceData *data) > { > size_t i; > > @@ -7902,7 +7907,7 @@ qemuDomainSetupAllRNGs(virQEMUDriverConfigPtr cfg, > for (i = 0; i < vm->def->nrngs; i++) { > if (qemuDomainSetupRNG(cfg, > vm->def->rngs[i], > - devPath) < 0) > + data) < 0) > return -1; > } > > @@ -7916,6 +7921,7 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg, > virSecurityManagerPtr mgr, > virDomainObjPtr vm) > { > + struct qemuDomainCreateDeviceData data; > char *devPath = NULL; > char **devMountsPath = NULL, **devMountsSavePath = NULL; > size_t ndevMountsPath = 0, i; > @@ -7944,34 +7950,36 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg, > goto cleanup; > } > > + data.path = devPath; > + > if (virProcessSetupPrivateMountNS() < 0) > goto cleanup; > > - if (qemuDomainSetupDev(cfg, mgr, vm, devPath) < 0) > + if (qemuDomainSetupDev(cfg, mgr, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupAllDisks(cfg, vm, devPath) < 0) > + if (qemuDomainSetupAllDisks(cfg, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupAllHostdevs(cfg, vm, devPath) < 0) > + if (qemuDomainSetupAllHostdevs(cfg, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupAllMemories(cfg, vm, devPath) < 0) > + if (qemuDomainSetupAllMemories(cfg, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupAllChardevs(cfg, vm, devPath) < 0) > + if (qemuDomainSetupAllChardevs(cfg, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupTPM(cfg, vm, devPath) < 0) > + if (qemuDomainSetupTPM(cfg, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupAllGraphics(cfg, vm, devPath) < 0) > + if (qemuDomainSetupAllGraphics(cfg, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupAllInputs(cfg, vm, devPath) < 0) > + if (qemuDomainSetupAllInputs(cfg, vm, &data) < 0) > goto cleanup; > > - if (qemuDomainSetupAllRNGs(cfg, vm, devPath) < 0) > + if (qemuDomainSetupAllRNGs(cfg, vm, &data) < 0) > goto cleanup; > > /* Save some mount points because we want to share them with the host */ ACK -- Cedric -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list