[CRIU] [PATCH 5/6] mount: clone a mount namespace to open a detached mount

Andrei Vagin avagin at virtuozzo.com
Mon Feb 6 22:19:27 PST 2017


On Mon, Feb 06, 2017 at 01:12:48PM +0300, Pavel Emelyanov wrote:
> On 01/04/2017 02:40 AM, Andrei Vagin wrote:
> > From: Andrei Vagin <avagin at virtuozzo.com>
> > 
> > If we can't create a temporary directory for a detached mount,
> > we can clone a whole mount namespace, open a mount and release
> > the created namespace. The result will be the same.
> > 
> > https://jira.sw.ru/browse/PSBM-57135
> > https://github.com/opencontainers/runc/issues/1202
> > Signed-off-by: Andrei Vagin <avagin at virtuozzo.com>
> > ---
> >  criu/mount.c | 18 +++++++++++++++---
> >  1 file changed, 15 insertions(+), 3 deletions(-)
> > 
> > diff --git a/criu/mount.c b/criu/mount.c
> > index 4749f59..c0bf234 100644
> > --- a/criu/mount.c
> > +++ b/criu/mount.c
> > @@ -1123,10 +1123,22 @@ int open_mountpoint(struct mount_info *pm)
> >  		goto out;
> >  
> >  	mnt_path = get_clean_mnt(pm, mnt_path_tmp, mnt_path_root);
> > -	if (mnt_path == NULL)
> > -		goto out;
> > +	if (mnt_path == NULL) {
> > +		/*
> > +		 * We probably can't create a temporary direcotry,
> > +		 * so we can try to clone the mount namespace, open
> > +		 * the required mount and destroy this mount namespace.
> > +		 */
> 
> Creation is seen (unshare), where is the destruction part?

This function will call restore_ns()
> 
> > +		if (unshare(CLONE_NEWNS)) {
> > +			pr_perror("Unable to clone a mount namespace");
> > +			goto out;
> > +		}
> >  
> > -	fd = open_detach_mount(mnt_path);
> > +		fd = open(pm->mountpoint, O_RDONLY | O_DIRECTORY, 0);
> > +		if (fd < 0)
> > +			pr_perror("Can't open directory %s: %d", pm->mountpoint, fd);
> > +	} else
> > +		fd = open_detach_mount(mnt_path);
> >  	if (fd < 0)
> >  		goto out;

        if (restore_ns(ns_old, &mnt_ns_desc)) {
                ns_old = -1;
                goto out;
        }

> >  
> > 
> 


More information about the CRIU mailing list