[CRIU] Re: [PATCH 4/4] sockets: Restore unconnected dgram sockets v4

Cyrill Gorcunov gorcunov at openvz.org
Tue Apr 17 10:32:45 EDT 2012


On Tue, Apr 17, 2012 at 06:15:26PM +0400, Pavel Emelyanov wrote:
> 
> > @@ -1370,6 +1435,16 @@ static int open_unixsk_standalone(struct unix_sk_info *ui)
> >  	if (restore_fown(sk, &ui->ue.fown))
> >  		return -1;
> >  
> > +	/*
> > +	 * No connect should be done over external peers,
> > +	 * simply bind only to them, and that's all.
> > +	 */
> > +	if (ui->peer && ui->peer->ue.uflags & USK_EXTERN) {
> > +		if (bind_unix_sk(sk, ui->peer))
> > +			return -1;
> > +		return sk;
> > +	}
> > +
> >  	if (bind_unix_sk(sk, ui))
> >  		return -1;
> >  
> 
> I don't understand why this hunk is needed. This only occurs when we meet someone's file
> descriptor pointing to this socket. External sockets don't have anybody with a descriptor
> pointing on them (otherwise they would be "internal")
> 

OK, letme explain, the crond uses /dev/log to send messages, lets say our socket
is sk1 (id = 1), while /dev/log socket is sk2 (id = 2) (and it's external one not bound to
us).

So in dump we have

sk1: id 1 peer 2 name nil (it correspond some fd inside crond)
sk2: id 2 peer 0 name /dev/log

once dump complete, on image it looks like

 sk1: id 1 peer  2 name nil
 sk2: id 2 peer -1 name /dev/log

so sk1 must be created and bount to peer's name /dev/log,
so I need a special case otherwise bind_unix_sk(sk, ui) will
simply bind to null string.

> > @@ -1483,6 +1558,9 @@ int resolve_unix_peers(void)
> >  		if (!ui->ue.peer)
> >  			continue;
> >  
> > +		if ((ui->ue.uflags & USK_EXTERN) && opts.ext_unix_sk)
> > +			continue;
> > +
> >  		peer = find_unix_sk(ui->ue.peer);
> >  		if (!peer) {
> >  			pr_err("FATAL: Peer 0x%x unresolved for 0x%x\n",
> 
> External socket cannot have a peer on it. Otherwise it's not "external" but "lost internal".
> 

yes, this snippet is redundant.

	Cyrill


More information about the CRIU mailing list