[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