[Devel] [PATCH rh7] ve/fs/sync: fix CT's mountpoints traversal

Vladimir Davydov vdavydov at virtuozzo.com
Wed Feb 24 08:15:04 PST 2016


On Wed, Feb 24, 2016 at 06:36:22PM +0300, Andrey Ryabinin wrote:
> Currently sync reads 've->root_path.mnt' mount and iterate over it childs.
> This doesn't work, as not all in-container mounts could be reached that way.
> 
> This patch slightly rework's mounts traversal. Now sync just iterates over all
> mounts of current mount namespace (actually we iterate over all mounts that
> seen in container's /proc/mounts). This approach seems much more correct and
> also simpler.
> 
> I think we could get rid of 've->root_path' now.

It's still used in follow_dotdot to prevent chroot escape.

> 
> https://jira.sw.ru/browse/PSBM-44125
> 
> Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
...
> diff --git a/fs/sync.c b/fs/sync.c
> index 8119ab4..9242a60 100644
> --- a/fs/sync.c
> +++ b/fs/sync.c
> @@ -127,17 +127,17 @@ static int sync_filesystem_collected(struct list_head *sync_list, struct super_b
>  	return 0;
>  }
>  
> -static int sync_collect_filesystems(struct ve_struct *ve, struct list_head *sync_list)
> +static int sync_collect_filesystems(struct list_head *sync_list)
>  {
> -	struct mount *root = real_mount(ve->root_path.mnt);
>  	struct mount *mnt;
> +	struct mnt_namespace *mnt_ns = current->nsproxy->mnt_ns;

Will it work as expected if there are mount namespaces inside a
container?

>  	struct sync_sb *ss;
>  	int ret = 0;
>  
>  	BUG_ON(!list_empty(sync_list));
>  
>  	down_read(&namespace_sem);
> -	for (mnt = root; mnt; mnt = next_mnt(mnt, root)) {
> +	list_for_each_entry(mnt, &mnt_ns->list, mnt_list) {
>  		if (sync_filesystem_collected(sync_list, mnt->mnt.mnt_sb))
>  			continue;
>  
> @@ -161,20 +161,18 @@ static int sync_collect_filesystems(struct ve_struct *ve, struct list_head *sync
>  	return ret;
>  }
>  
> -static void sync_filesystems_ve(struct ve_struct *ve, struct user_beancounter *ub, int wait)
> +static void sync_filesystems_ub(struct user_beancounter *ub, int wait)
>  {
>  	struct super_block *sb;
>  	LIST_HEAD(sync_list);
>  	struct sync_sb *ss;
>  
> -	mutex_lock(&ve->sync_mutex);		/* Could be down_interruptible */
> -

This mutex isn't here to protect ve->root_path. I don't know why we need
it or whether we need it at all, but anyway this should go in a separate
patch with a proper comment.


More information about the Devel mailing list