[CRIU] [PATCH v10 07/11] net: open a netlink socket in criu's netns

Pavel Emelyanov xemul at virtuozzo.com
Thu Oct 27 05:49:37 PDT 2016


On 10/27/2016 07:55 AM, Andrei Vagin wrote:
> On Thu, Oct 20, 2016 at 10:25:27AM -0600, Tycho Andersen wrote:
>> We'll use this socket to restore macvlan interfaces.
>>
>> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
>> ---
>>  criu/net.c | 41 ++++++++++++++++++++++++++++++++++++++---
>>  1 file changed, 38 insertions(+), 3 deletions(-)
>>
>> diff --git a/criu/net.c b/criu/net.c
>> index f807c5e..f7d586e 100644
>> --- a/criu/net.c
>> +++ b/criu/net.c
>> @@ -1026,7 +1026,7 @@ static int changeflags(int s, char *name, short flags)
>>  	return 0;
>>  }
>>  
>> -static int restore_link(NetDeviceEntry *nde, int nlsk)
>> +static int restore_link(NetDeviceEntry *nde, int nlsk, int criu_nlsk)
>>  {
>>  	pr_info("Restoring link %s type %d\n", nde->name, nde->type);
>>  
>> @@ -1052,7 +1052,7 @@ static int restore_link(NetDeviceEntry *nde, int nlsk)
>>  
>>  static int restore_links(int pid, NetnsEntry **netns)
>>  {
>> -	int nlsk, ret;
>> +	int nlsk, criu_nlsk = -1, ret = -1, my_netns = -1, ns_fd = get_service_fd(NS_FD_OFF);
>>  	struct cr_img *img;
>>  	NetDeviceEntry *nde;
>>  
>> @@ -1067,6 +1067,38 @@ static int restore_links(int pid, NetnsEntry **netns)
>>  		return -1;
>>  	}
>>  
>> +	if (!(root_ns_mask & CLONE_NEWUSER)) {
>> +		/* FIXME: this whole dance is so we can have a netlink socket to criu's
>> +		 * netns in case we need it. It should really live on the ns_id struct,
>> +		 * but those aren't generated on restore yet.
>> +		 */
>> +		my_netns = open_proc(PROC_SELF, "ns/net");
>> +		if (my_netns < 0) {
>> +			pr_perror("couldn't open my netns");
>> +			goto out;
>> +		}
>> +
>> +		if (setns(ns_fd, CLONE_NEWNET) < 0) {
>> +			close(my_netns);
>> +			pr_perror("couldn't setns to parent ns");
>> +			goto out;
>> +		}
>> +
>> +		criu_nlsk = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
> 
> Why we can't create this socket before forking the root task? In this
> case it will work for userns too.

I wanted to have this socket for each netns created in your multi-ns patchset :)
and sit on ns_id structure.

-- Pavel

>> +		ret = setns(my_netns, CLONE_NEWNET);
>> +		close(my_netns);
>> +
>> +		if (ret < 0) {
>> +			pr_perror("Can't setns back my netns");
>> +			goto out;
>> +		}
>> +
>> +		if (criu_nlsk < 0) {
>> +			pr_perror("Can't create nlk socket");
>> +			goto out;
>> +		}
>> +	}
>> +
>>  	while (1) {
>>  		NetnsEntry **def_netns = netns;
>>  
>> @@ -1074,7 +1106,7 @@ static int restore_links(int pid, NetnsEntry **netns)
>>  		if (ret <= 0)
>>  			break;
>>  
>> -		ret = restore_link(nde, nlsk);
>> +		ret = restore_link(nde, nlsk, criu_nlsk);
>>  		if (ret) {
>>  			pr_err("Can't restore link\n");
>>  			goto exit;
>> @@ -1103,6 +1135,9 @@ exit:
>>  			break;
>>  	}
>>  
>> +out:
>> +	if (criu_nlsk >= 0)
>> +		close(criu_nlsk);
>>  	close(nlsk);
>>  	close_image(img);
>>  	return ret;
>> -- 
>> 2.7.4
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
> .
> 



More information about the CRIU mailing list