[CRIU] [PATCH 2/4] service: page-server: return port back to user

Ruslan Kuprieiev kupruser at gmail.com
Wed Sep 17 07:53:29 PDT 2014


On 17.09.2014 17:44, Pavel Emelyanov wrote:
> On 09/17/2014 11:25 AM, Ruslan Kuprieiev wrote:
>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>> ---
>>   cr-service.c | 44 ++++++++++++++++++++++++++++----------------
>>   1 file changed, 28 insertions(+), 16 deletions(-)
>>
>> diff --git a/cr-service.c b/cr-service.c
>> index d144f47..2af6e8f 100644
>> --- a/cr-service.c
>> +++ b/cr-service.c
>> @@ -505,7 +505,7 @@ static int pre_dump_loop(int sk, CriuReq *msg)
>>   
>>   static int start_page_server_req(int sk, CriuOpts *req)
>>   {
>> -	int ret, pid, start_pipe[2];
>> +	int ret = -1, pid, start_pipe[2];
>>   	ssize_t count;
>>   	bool success = false;
>>   	CriuResp resp = CRIU_RESP__INIT;
>> @@ -532,28 +532,40 @@ static int start_page_server_req(int sk, CriuOpts *req)
>>   
>>   		pr_debug("Starting page server\n");
>>   
>> -		ret = cr_page_server(true, start_pipe[1]);
>> +		pid = cr_page_server(true, start_pipe[1]);
>> +		if (pid <= 0)
>> +			goto out_ch;
>> +
>> +		count = write(start_pipe[1], &opts.ps_port, sizeof(opts.ps_port));
>> +		if (count != sizeof(opts.ps_port))
>> +			goto out_ch;
>> +
>> +		ret = pid;
>>   out_ch:
>> -		count = write(start_pipe[1], &ret, sizeof(ret));
>> +		if (ret < 0 && pid > 0)
>> +			kill(pid, SIGKILL);
>>   		close(start_pipe[1]);
>> -		if (count != sizeof(ret))
>> -			exit(1);
>> -		exit(0);
>> +		exit(ret);
>>   	}
>>   
>>   	close(start_pipe[1]);
>> -	wait(NULL);
>> -	ret = -1;
>> -	count = read(start_pipe[0], &ret, sizeof(ret));
>> -	if (count != sizeof(ret))
>> -		success = false;
>> -	else if (ret > 0) {
>> -		success = true;
>> -		ps.has_pid = true;
>> -		ps.pid = ret;
>> -		resp.ps = &ps;
>> +	wait(&ret);
>> +	if (ret <= 0)
>> +		goto out;
>> +
>> +	count = read(start_pipe[0], &opts.ps_port, sizeof(opts.ps_port));
>> +	if (count != sizeof(opts.ps_port)) {
>> +		kill(ret, SIGKILL);
>> +		goto out;
>>   	}
>>   
>> +	success = true;
>> +	ps.has_pid = true;
>> +	ps.pid = ret;
> The ret here would be ... what? Last time it was passed
> as pointer to wait() call, but its argument is a) not pointer
> to store pid and b) this task's child is not page server task.

Last time exit value of child wasn't used at all:

-	wait(NULL);

And ps pid was transfered through pipe.

And yes, sorry, i've used a bad way to transfer ps pid.
Will fix.

>> +	ps.has_port = true;
>> +	ps.port = opts.ps_port;
>> +	resp.ps = &ps;
>> +
>>   	pr_debug("Page server started\n");
>>   out:
>>   	resp.type = CRIU_REQ_TYPE__PAGE_SERVER;
>>



More information about the CRIU mailing list