[libvirt] [PATCH 2/2] LXC: introduce lxcContainerUnmountForSharedRoot
Gao feng
gaofeng at cn.fujitsu.com
Wed Sep 11 08:02:51 UTC 2013
On 09/11/2013 04:00 PM, Gao feng wrote:
> Move the unmounting private or useless filesystem of host
> to this function.
>
> Signed-off-by: Gao feng <gaofeng at cn.fujitsu.com>
> ---
I forgot to remove the "tmp" in lxcContainerSetupPivotRoot,a new patchset
will come soon.
> src/lxc/lxc_container.c | 96 ++++++++++++++++++++++++++++---------------------
> 1 file changed, 55 insertions(+), 41 deletions(-)
>
> diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
> index 0ab4ab7..1423b6d 100644
> --- a/src/lxc/lxc_container.c
> +++ b/src/lxc/lxc_container.c
> @@ -1472,6 +1472,60 @@ cleanup:
> }
>
>
> +static int lxcContainerUnmountForSharedRoot(const char *stateDir,
> + const char *domain)
> +{
> + int ret = -1;
> + char *tmp = NULL;
> +
> +#if WITH_SELINUX
> + /* Some versions of Linux kernel don't let you overmount
> + * the selinux filesystem, so make sure we kill it first
> + */
> + /* Filed coverity bug for false positive 'USE_AFTER_FREE' due to swap
> + * of root->src with root->dst and the VIR_FREE(root->src) prior to the
> + * reset of root->src in lxcContainerPrepareRoot()
> + */
> + /* coverity[deref_arg] */
> + if (lxcContainerUnmountSubtree(SELINUX_MOUNT, false) < 0)
> + goto cleanup;
> +#endif
> +
> + /* These filesystems are created by libvirt temporarily, they
> + * shouldn't appear in container. */
> + if (virAsprintf(&tmp, "%s/%s.dev", stateDir, domain) < 0 ||
> + lxcContainerUnmountSubtree(tmp, false) < 0)
> + goto cleanup;
> +
> + VIR_FREE(tmp);
> + if (virAsprintf(&tmp, "%s/%s.devpts", stateDir, domain) < 0 ||
> + lxcContainerUnmountSubtree(tmp, false) < 0)
> + goto cleanup;
> +
> +#if WITH_FUSE
> + VIR_FREE(tmp);
> + if (virAsprintf(&tmp, "%s/%s.fuse", stateDir, domain) < 0 ||
> + lxcContainerUnmountSubtree(tmp, false) < 0)
> + goto cleanup;
> +#endif
> +
> + /* If we have the root source being '/', then we need to
> + * get rid of any existing stuff under /proc, /sys & /tmp.
> + * We need new namespace aware versions of those. We must
> + * do /proc last otherwise we won't find /proc/mounts :-) */
> + if (lxcContainerUnmountSubtree("/sys", false) < 0 ||
> + lxcContainerUnmountSubtree("/dev", false) < 0 ||
> + lxcContainerUnmountSubtree("/proc", false) < 0)
> + goto cleanup;
> +
> + ret = 0;
> +
> +cleanup:
> + VIR_FREE(tmp);
> + return ret;
> +}
> +
> +
> /* Got a FS mapped to /, we're going the pivot_root
> * approach to do a better-chroot-than-chroot
> * this is based on this thread http://lkml.org/lkml/2008/3/5/29
> @@ -1509,48 +1563,8 @@ static int lxcContainerSetupPivotRoot(virDomainDefPtr vmDef,
> if (lxcContainerPivotRoot(root) < 0)
> goto cleanup;
>
> -#if WITH_SELINUX
> - /* Some versions of Linux kernel don't let you overmount
> - * the selinux filesystem, so make sure we kill it first
> - */
> - /* Filed coverity bug for false positive 'USE_AFTER_FREE' due to swap
> - * of root->src with root->dst and the VIR_FREE(root->src) prior to the
> - * reset of root->src in lxcContainerPrepareRoot()
> - */
> - /* coverity[deref_arg] */
> - if (STREQ(root->src, "/") &&
> - lxcContainerUnmountSubtree(SELINUX_MOUNT, false) < 0)
> - goto cleanup;
> -#endif
> -
> - /* These filesystems are created by libvirt temporarily, they
> - * shouldn't appear in container. */
> - if (STREQ(root->src, "/")) {
> - if (virAsprintf(&tmp, "%s/%s.dev", stateDir, vmDef->name) < 0 ||
> - lxcContainerUnmountSubtree(tmp, false) < 0)
> - goto cleanup;
> -
> - VIR_FREE(tmp);
> - if (virAsprintf(&tmp, "%s/%s.devpts", stateDir, vmDef->name) < 0 ||
> - lxcContainerUnmountSubtree(tmp, false) < 0)
> - goto cleanup;
> -
> -#if WITH_FUSE
> - VIR_FREE(tmp);
> - if (virAsprintf(&tmp, "%s/%s.fuse", stateDir, vmDef->name) < 0 ||
> - lxcContainerUnmountSubtree(tmp, false) < 0)
> - goto cleanup;
> -#endif
> - }
> -
> - /* If we have the root source being '/', then we need to
> - * get rid of any existing stuff under /proc, /sys & /tmp.
> - * We need new namespace aware versions of those. We must
> - * do /proc last otherwise we won't find /proc/mounts :-) */
> if (STREQ(root->src, "/") &&
> - (lxcContainerUnmountSubtree("/sys", false) < 0 ||
> - lxcContainerUnmountSubtree("/dev", false) < 0 ||
> - lxcContainerUnmountSubtree("/proc", false) < 0))
> + lxcContainerUnmountForSharedRoot(stateDir, vmDef->name) < 0)
> goto cleanup;
>
> /* Mounts the core /proc, /sys, etc filesystems */
>
More information about the libvir-list
mailing list