[Devel] Re: [PATCH user-cr] return, don't exist, at coord error
Oren Laadan
orenl at cs.columbia.edu
Sun Oct 18 21:41:55 PDT 2009
On Sun, 18 Oct 2009, Serge E. Hallyn wrote:
> Hmm, well... I dont' know what's going on with my userspace,
> Now it's not working for me even with this patch.
>
> As root I do:
>
> setcap cap_sys_admin+pe /bin/restart
> ckpt > /tmp/out
>
> then as a non-rootuid I do
> cat /tmp/out | /bin/retart -vd
> echo $?
>
> giving me:
> [hallyn at linuz11 ~]$ /bin/restart -vd < /tmp/out
> <4028>number of tasks: 1
> <4028>total tasks (including ghosts): 2
> <4028>pid 4177: propagate session 4285
> <4028>pid 4177: creator set to 4285
> <4028>pid 4177: set session
> <4028>pid 4177: moving up to 4285
> <4028>[0] pid 4285 ppid 4177 sid 0 creator 0
> <4028>[1] pid 4177 ppid 4285 sid 4285 creator 4285 S G
> <4028>found pgid/sid 0, need pidns
> <4028>new pidns without init
> <4028>forking coordinator in new pidns
> <1>forking child vpid 4285 flags 0x1
> <1>forked child vpid 2 (asked 4285)
Note that 'restart' decided to start a new pidns even though
you didn't ask for one. This may be related to the problem,
because it creates another intermediate process at restart -
the container init.
My recent user-space patch should fix this, and 'restart'
should not start a new pidns in this case. This may also
solve your current problem.
However, we still need to figure out why it does not report
the error correctly in the --pidns case.
Oren.
> <2>root task pid 2
> <2>pid 4285: pid 2 sid 0 parent 1
> <2>pid 4285: fork child 4177 with session
> <2>forking child vpid 4177 flags 0x12
> <3>pid 4177: pid 3 sid 0 parent 2
> <4029>c/r swap old 4177 new 3
> <3>about to call sys_restart(), flags 0x4
> <2>forked child vpid 3 (asked 4177)
> <4029>c/r swap old 4285 new 2
> <4029>c/r read input 16384
> <4029>c/r read input 16384
> <4029>c/r read input 16384
> restart failed: Operation not permitted
> Failed
> <1>restart failed ?
> <4029>c/r read input 16384
> <4029>c/r read input 14862
> <2>about to call sys_restart(), flags 0
> <4028>SIGCHLD: already collected
> <4028>task exited with status 255
> [hallyn at linuz11 ~]$ echo $?
> 0
>
> And when I previously added a debug statement at
> the end of main() printin gout the return value, it would
> say 'returning 0' even though 'restart failed ?' in the
> restart -vd output inicates that ret < 0.
>
> Note that if you don't set cap_sys_admin+pe on
> /bin/restart, then restart does return 255 (-1).
>
> I'm done for the day - will have to look at it more
> tomorrow.
>
> -serge
>
> Quoting Oren Laadan (orenl at librato.com):
> >
> > What was the command line you used for the restart ?
> >
> > Oren.
> >
> > Serge E. Hallyn wrote:
> > > All right I can't explain it at the moment, but exit(1) at
> > > ckpt_coordinator() (on error) causes restart.c to exit with 0,
> > > whereas return(ret) causes it to correctly exit with -1.
> > >
> > > Without this, a restart whose kernel portion ends with say
> > > -1 ends up returning from user-cr/restart.c with 0, so userspace
> > > can't tell whether sys_restart succeeded or failed. With the
> > > patch, it fails correctly.
> > >
> > > Signed-off-by: Serge E. Hallyn <serue at us.ibm.com>
> > > ---
> > > restart.c | 2 +-
> > > 1 files changed, 1 insertions(+), 1 deletions(-)
> > >
> > > diff --git a/restart.c b/restart.c
> > > index e6e72ac..87899ba 100644
> > > --- a/restart.c
> > > +++ b/restart.c
> > > @@ -933,7 +933,7 @@ static int ckpt_coordinator(struct ckpt_ctx *ctx)
> > > perror("restart failed");
> > > ckpt_verbose("Failed\n");
> > > ckpt_dbg("restart failed ?\n");
> > > - exit(1);
> > > + return ret;
> > > }
> > >
> > > ckpt_verbose("Success\n");
>
>
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list