[CRIU] [PATCH 1/2] files: restore cwd after switching mntns

Andrew Vagin avagin at virtuozzo.com
Fri Nov 20 05:34:10 PST 2015


On Thu, Nov 19, 2015 at 04:50:54PM +0300, Pavel Emelyanov wrote:
> On 11/19/2015 03:37 PM, Andrew Vagin wrote:
> > On Thu, Nov 19, 2015 at 03:23:30PM +0300, Pavel Emelyanov wrote:
> >> On 11/18/2015 02:04 PM, Andrey Vagin wrote:
> >>> From: Andrew Vagin <avagin at virtuozzo.com>
> >>
> >> Comment required.
> > 
> > Here is a problem that restore_ns() restores a mount namespace, but
> > doesn't restore cwd, so cwd will be an root of the restired mntns.
> > 
> > CRIU doesn't expect this, so we will see errors. Fro example, Stas
> > reports an error that criu can't umount an roots yard.
> 
> Nice. Does the same problem exists for the root dir? Do we want to
> fix it too?

Yes, it's. It's another issue and we need to restore it in all places.

we restore cwd in all places except this one.

> 
> >>
> >>> Cc: Stanislav Kinsbursky <skinsbursky at openvz.org>
> >>> Reported-by: Stanislav Kinsbursky <skinsbursky at openvz.org>
> >>> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
> >>> ---
> >>>  files-reg.c | 16 ++++++++++++++++
> >>>  1 file changed, 16 insertions(+)
> >>>
> >>> diff --git a/files-reg.c b/files-reg.c
> >>> index 1e2daa9..ac334e7 100644
> >>> --- a/files-reg.c
> >>> +++ b/files-reg.c
> >>> @@ -423,6 +423,7 @@ void try_clean_remaps(int ns_fd)
> >>>  {
> >>>  	struct remap_info *ri;
> >>>  	int old_ns = -1;
> >>> +	int cwd_fd = -1;
> >>>  
> >>>  	if (list_empty(&remaps))
> >>>  		goto out;
> >>> @@ -436,6 +437,12 @@ void try_clean_remaps(int ns_fd)
> >>>  			return;
> >>>  		}
> >>>  
> >>> +		cwd_fd = open(".", O_DIRECTORY);
> >>> +		if (cwd_fd < 0) {
> >>> +			pr_perror("Unable to open cwd");
> >>> +			return;
> >>> +		}
> >>> +
> >>>  		if (setns(ns_fd, CLONE_NEWNS) < 0) {
> >>>  			close(old_ns);
> >>>  			pr_perror("`- Can't switch");
> >>> @@ -453,6 +460,15 @@ void try_clean_remaps(int ns_fd)
> >>>  		close(old_ns);
> >>>  	}
> >>>  
> >>> +	if (cwd_fd >= 0) {
> >>> +		if (fchdir(cwd_fd)) {
> >>> +			pr_perror("Unable to restore cwd");
> >>> +			close(cwd_fd);
> >>> +			return;
> >>> +		}
> >>> +		close(cwd_fd);
> >>> +	}
> >>> +
> >>>  out:
> >>>  	if (ns_fd >= 0)
> >>>  		close(ns_fd);
> >>>
> >>
> > .
> > 
> 


More information about the CRIU mailing list