[libvirt] [PATCH] qemuDomainGetPreservedMounts: Fetch list of /dev/* mounts dynamically

Martin Kletzander mkletzan at redhat.com
Thu Jan 5 15:01:43 UTC 2017


On Thu, Jan 05, 2017 at 02:41:02PM +0100, Michal Privoznik wrote:
>With my namespace patches, we are spawning qemu in its own
>namespace so that we can manage /dev entries ourselves. However,
>some filesystems mounted under /dev needs to be preserved in
>order to be shared with the parent namespace (e.g. /dev/pts).
>Currently, the list of mount points to preserve is hardcoded
>which ain't right - on some systems there might be less or more
>items under real /dev that on our list. The solution is to parse
>/proc/mounts and fetch the list from there.
>
>Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>---
> src/qemu/qemu_domain.c | 126 +++++++++++++++++++++++++++++++------------------
> 1 file changed, 81 insertions(+), 45 deletions(-)
>
>diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
>index 67e8836f3b..e0631bf55a 100644
>--- a/src/qemu/qemu_domain.c
>+++ b/src/qemu/qemu_domain.c
>@@ -200,33 +194,73 @@ qemuDomainEnableNamespace(virDomainObjPtr vm,
> }
>
>
>+/**
>+ * qemuDomainGetPreservedMounts:
>+ *
>+ * Process list of mounted filesystems and:
>+ * a) save all FSs mounted under /dev to @devPath
>+ * b) generate backup path for all the entries in a)
>+ *
>+ * Any of the return pointers can be NULL.
>+ *
>+ * Returns 0 on success, -1 otherwise (with error reported)
>+ */
> static int
> qemuDomainGetPreservedMounts(virQEMUDriverPtr driver,
>                              virDomainObjPtr vm,
>-                             char ***devMountsPath,
>-                             size_t *ndevMountsPath)
>+                             char ***devPath,
>+                             char ***devSavePath,
>+                             size_t *ndevPath)
> {
>     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>-    char **paths;
>-    size_t i;
>+    char **paths = NULL, **mounts = NULL;
>+    size_t i, nmounts;
>
>-    if (VIR_ALLOC_N(paths, ARRAY_CARDINALITY(devPreserveMounts)) < 0)
>+    if (virFileGetMountSubtree(PROC_MOUNTS, "/dev",
>+                               &mounts, &nmounts) < 0)
>         goto error;
>
>-    for (i = 0; i < ARRAY_CARDINALITY(devPreserveMounts); i++) {
>+    if (!nmounts) {
>+        if (ndevPath)
>+            *ndevPath = 0;
>+        return 0;
>+    }
>+
>+    /* Okay, this is crazy. But virFileGetMountSubtree() fetched us all the
>+     * mount points under /dev including /dev itself. Fortunately, the paths
>+     * are sorted based in their length so we skip the first one (/dev) as it

"based on", abut it's not sorted by length, just sorted.  But it will
work alright for this case.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170105/54fa2456/attachment-0001.sig>


More information about the libvir-list mailing list