[CRIU] [PATCH 8/9] mounts: handle shared and slave mounts
Pavel Emelyanov
xemul at parallels.com
Thu Jul 25 07:02:05 EDT 2013
On 07/24/2013 12:10 PM, Andrey Vagin wrote:
> The idea is simple. If a mount can't be mounted now, we will try to
> mount it later.
>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> mount.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 50 insertions(+), 4 deletions(-)
>
> diff --git a/mount.c b/mount.c
> index 333b658..8016dcc 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -732,13 +732,33 @@ static int do_new_mount(struct mount_info *mi)
> {
> char *src;
> struct fstype *tp = mi->fstype;
> + struct mount_info *t;
>
> src = resolve_source(mi);
> if (!src)
> return -1;
>
> + /*
> + * Wait while all parent are not mounted
> + *
> + * FIXME a child is shared only between parents,
> + * who was present in a moment of birth
> + */
> + if (mi->parent->flags & MS_SHARED) {
> + list_for_each_entry(t, &mi->parent->mnt_share, mnt_share)
> + if (!t->mounted) {
> + pr_debug("Postpone %s due to %s\n", mi->mountpoint, t->mountpoint);
> + return 1;
> + }
> + list_for_each_entry(t, &mi->parent->mnt_slave_list, mnt_slave)
> + if (!t->mounted) {
> + pr_debug("Postpone %s\n", mi->mountpoint);
> + return 1;
> + }
You umount slaves anyway, presumably this can be skipped.
> + }
> +
> if (mount(src, mi->mountpoint, tp->name,
> - mi->flags, mi->options) < 0) {
> + mi->flags & (~MS_SHARED), mi->options) < 0) {
> pr_perror("Can't mount at %s", mi->mountpoint);
> return -1;
> }
> @@ -746,6 +766,8 @@ static int do_new_mount(struct mount_info *mi)
> if (restore_shared_options(mi, 0, mi->shared_id, 0))
> return -1;
>
> + mi->mounted = true;
> +
> if (tp->restore && tp->restore(mi))
> return -1;
>
> @@ -754,8 +776,27 @@ static int do_new_mount(struct mount_info *mi)
>
> static int do_bind_mount(struct mount_info *mi)
> {
> - pr_err("No bind mounts at %s\n", mi->mountpoint);
> - return -1;
> + char rpath[PATH_MAX];
> + bool shared = mi->shared_id && mi->shared_id == mi->bind->shared_id;
> +
> + snprintf(rpath, sizeof(rpath), "%s%s", mi->bind->mountpoint, mi->root);
> +
> + pr_info("Bind %s to %s\n", rpath, mi->mountpoint);
> +
> + if (mount(rpath, mi->mountpoint, NULL,
> + MS_BIND, NULL) < 0) {
> + pr_perror("Can't mount at %s", mi->mountpoint);
> + return -1;
> + }
> +
> + if (restore_shared_options(mi, !shared,
> + mi->shared_id && !shared,
> + mi->master_id))
> + return -1;
> +
> + mi->mounted = true;
> +
> + return 0;
> }
>
> static inline int fsroot_mounted(struct mount_info *mi)
> @@ -773,9 +814,14 @@ static int do_mount_one(struct mount_info *mi)
> if (mi->mounted)
> return 0;
>
> + if ((mi->master_id || !fsroot_mounted(mi)) && mi->bind == NULL) {
> + pr_debug("Postpone slave %s\n", mi->mountpoint);
> + return 1;
> + }
> +
> pr_debug("\tMounting %s @%s\n", mi->fstype->name, mi->mountpoint);
>
> - if (fsroot_mounted(mi))
> + if (!mi->bind)
> ret = do_new_mount(mi);
> else
> ret = do_bind_mount(mi);
>
More information about the CRIU
mailing list