[CRIU] [PATCH] mount: Find NS_ROOT for cr-time mount on restore
Andrei Vagin
avagin at virtuozzo.com
Thu Jun 1 22:46:39 MSK 2017
On Fri, May 19, 2017 at 03:13:09PM +0300, Kirill Tkhai wrote:
> After commit 2e8970beda5b "mount: create a mount point
> for the root mount namespace in the roots yard", top
> of the tree of mount_infos points to the fake mount.
> So, when we're looking for appropriate place for
> binfmt_misc, we can't find "xxx/proc/sys/fs/binfmt_misc".
> Fix that by finding real NS_ROOT manually.
>
> https://jira.sw.ru/browse/PSBM-66457
>
> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
Applied, thanks
> ---
> criu/mount.c | 34 ++++++++++++++++++++++++++++++----
> 1 file changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/criu/mount.c b/criu/mount.c
> index 634491310..cef7e7437 100644
> --- a/criu/mount.c
> +++ b/criu/mount.c
> @@ -42,7 +42,7 @@
> #undef LOG_PREFIX
> #define LOG_PREFIX "mnt: "
>
> -#define BINFMT_MISC_HOME "/proc/sys/fs/binfmt_misc"
> +#define BINFMT_MISC_HOME "proc/sys/fs/binfmt_misc"
> #define CRTIME_MNT_ID 0
>
> /* A helper mount_info entry for the roots yard */
> @@ -1194,15 +1194,41 @@ int open_mountpoint(struct mount_info *pm)
> static __maybe_unused int add_cr_time_mount(struct mount_info *root, char *fsname, const char *path, unsigned int s_dev)
> {
> struct mount_info *mi, *t, *parent;
> + bool add_slash = false;
> + int len;
> +
> + if (!root->nsid) {
> + /* On restore we have fake top mount_info. Find real NS_ROOT */
> + list_for_each_entry(t, &root->children, siblings)
> + if (t->nsid->type == NS_ROOT) {
> + root = t;
> + break;
> + }
> + if (!root->nsid) {
> + pr_err("Can't find NS_ROOT\n");
> + return -1;
> + }
> + }
>
> mi = mnt_entry_alloc();
> if (!mi)
> return -1;
> - mi->mountpoint = xmalloc(strlen(path) + 2);
> +
> + len = strlen(root->mountpoint);
> + /* It may be "./" or "./path/to/dir" */
> + if (root->mountpoint[len - 1] != '/') {
> + add_slash = true;
> + len++;
> + }
> +
> + mi->mountpoint = xmalloc(len + strlen(path) + 1);
> if (!mi->mountpoint)
> return -1;
> mi->ns_mountpoint = mi->mountpoint;
> - sprintf(mi->mountpoint, ".%s", path);
> + if (!add_slash)
> + sprintf(mi->mountpoint, "%s%s", root->mountpoint, path);
> + else
> + sprintf(mi->mountpoint, "%s/%s", root->mountpoint, path);
> mi->mnt_id = CRTIME_MNT_ID;
> mi->flags = mi->sb_flags = 0;
> mi->root = xstrdup("/");
> @@ -3243,7 +3269,7 @@ int collect_mnt_namespaces(bool for_dump)
> }
>
> if (ns) {
> - ret = mount_cr_time_mount(ns, &s_dev, "binfmt_misc", BINFMT_MISC_HOME,
> + ret = mount_cr_time_mount(ns, &s_dev, "binfmt_misc", "/" BINFMT_MISC_HOME,
> "binfmt_misc");
> if (ret == -EPERM)
> pr_info("Can't mount binfmt_misc: EPERM. Running in user_ns?\n");
>
More information about the CRIU
mailing list