Linux Container Development
 help / color / mirror / Atom feed
* [PATCH user-cr] return, don't exist, at coord error
@ 2009-10-19  2:29 Serge E. Hallyn
       [not found] ` <20091019022942.GA21306-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Serge E. Hallyn @ 2009-10-19  2:29 UTC (permalink / raw)
  To: Oren Laadan; +Cc: Linux Containers

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-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
---
 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");
-- 
1.6.1.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH user-cr] return, don't exist, at coord error
       [not found] ` <20091019022942.GA21306-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-10-19  2:57   ` Oren Laadan
       [not found]     ` <4ADBD593.9070006-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Oren Laadan @ 2009-10-19  2:57 UTC (permalink / raw)
  To: Serge E. Hallyn; +Cc: Linux Containers


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-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> ---
>  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");

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH user-cr] return, don't exist, at coord error
       [not found]     ` <4ADBD593.9070006-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
@ 2009-10-19  3:50       ` Serge E. Hallyn
       [not found]         ` <20091019035033.GA23390-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Serge E. Hallyn @ 2009-10-19  3:50 UTC (permalink / raw)
  To: Oren Laadan; +Cc: Linux Containers

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@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)
<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@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-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org):
> 
> 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-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> > ---
> >  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");

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH user-cr] return, don't exist, at coord error
       [not found]         ` <20091019035033.GA23390-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2009-10-19  4:41           ` Oren Laadan
  0 siblings, 0 replies; 4+ messages in thread
From: Oren Laadan @ 2009-10-19  4:41 UTC (permalink / raw)
  To: Serge E. Hallyn; +Cc: Linux Containers

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@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@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-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org):
> > 
> > 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-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
> > > ---
> > >  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");
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-10-19  4:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-19  2:29 [PATCH user-cr] return, don't exist, at coord error Serge E. Hallyn
     [not found] ` <20091019022942.GA21306-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-10-19  2:57   ` Oren Laadan
     [not found]     ` <4ADBD593.9070006-RdfvBDnrOixBDgjK7y7TUQ@public.gmane.org>
2009-10-19  3:50       ` Serge E. Hallyn
     [not found]         ` <20091019035033.GA23390-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-10-19  4:41           ` Oren Laadan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox