[CRIU] [PATCH 1/2] mount: execute propagation logic for the root mount

Pavel Emelyanov xemul at parallels.com
Mon Mar 17 03:29:00 PDT 2014


On 03/14/2014 06:51 PM, Andrey Vagin wrote:
> The root mount isn't always private. For example it is mounted
> as a slave in LXC 1.0 containers. So we need to execute logic
> about propogation for the root mount too.
> 
> Reported-by: David Shwatrz <dshwatrz at gmail.com>
> Cc: David Shwatrz <dshwatrz at gmail.com>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  mount.c | 42 +++++++++++++++++++++++++++++-------------
>  1 file changed, 29 insertions(+), 13 deletions(-)
> 
> diff --git a/mount.c b/mount.c
> index 522ae3c..669335d 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -425,7 +425,7 @@ static int collect_shared(struct mount_info *info)
>  			}
>  		}
>  
> -		if (need_master) {
> +		if (need_master && m->parent) {
>  			pr_err("Mount %d (master_id: %d shared_id: %d) "
>  			       "has unreachable sharing\n", m->mnt_id,
>  				m->master_id, m->shared_id);
> @@ -994,11 +994,10 @@ static int propagate_siblings(struct mount_info *mi)
>  	return 0;
>  }
>  
> -static int propagate_mount(struct mount_info *mi)
> +static void propagate_over_parents(struct mount_info *mi)
>  {
>  	struct mount_info *t;
>  
> -	propagate_siblings(mi);
>  	umount_from_slaves(mi);
>  
>  	/* Propagate this mount to everyone from a parent group */
> @@ -1007,14 +1006,24 @@ static int propagate_mount(struct mount_info *mi)
>  		struct mount_info *c;
>  
>  		list_for_each_entry(c, &t->children, siblings) {
> -			if (mounts_equal(mi, c, false)) {
> -				pr_debug("\t\tPropogate %s\n", c->mountpoint);
> -				c->mounted = true;
> -				propagate_siblings(c);
> -				umount_from_slaves(c);
> -			}
> +			if (!mounts_equal(mi, c, false))
> +				continue;
> +			pr_debug("\t\tPropogate %s\n", c->mountpoint);
> +			c->mounted = true;
> +			propagate_siblings(c);
> +			umount_from_slaves(c);
>  		}
>  	}
> +}
> +
> +static int propagate_mount(struct mount_info *mi)
> +{
> +	struct mount_info *t;
> +
> +	propagate_siblings(mi);
> +
> +	if (mi->parent)
> +		propagate_over_parents(mi);
>  
>  	/*
>  	 * FIXME Currently non-root mounts can be restored
> @@ -1140,14 +1149,20 @@ static bool can_mount_now(struct mount_info *mi)
>  
>  static int do_mount_one(struct mount_info *mi)
>  {
> -	int ret;
> -
> -	if (!mi->parent)
> -		return 0;
> +	int ret = 0;
>  
>  	if (mi->mounted)
>  		return 0;
>  
> +	if (!mi->parent) {
> +		if (restore_shared_options(mi, !mi->shared_id && !mi->master_id,
> +						mi->shared_id,
> +						mi->master_id))
> +			return -1;
> +		mi->mounted = true;
> +		goto out;

Can we make this smoother by introducing a do_root_mount() call and
properly incorporating into if-else-if-else  clodeflow below?

> +	}
> +
>  	if (!can_mount_now(mi)) {
>  		pr_debug("Postpone slave %s\n", mi->mountpoint);
>  		return 1;
> @@ -1160,6 +1175,7 @@ static int do_mount_one(struct mount_info *mi)
>  	else
>  		ret = do_bind_mount(mi);
>  
> +out:
>  	if (ret == 0 && propagate_mount(mi))
>  		return -1;
>  
> 




More information about the CRIU mailing list