[CRIU] [PATCH v5 24/33] files: Add new_fd parameter to file_desc_ops::open()

Kirill Tkhai ktkhai at virtuozzo.com
Wed Jan 18 02:59:38 PST 2017


On 18.01.2017 13:12, Pavel Emelyanov wrote:
> On 01/12/2017 04:59 PM, Kirill Tkhai wrote:
>> On 26.12.2016 17:28, Kirill Tkhai wrote:
>>> Return results of work separate: a new fd is in a parameter,
>>> a status is in return value.
> 
> Why do you need this? It should be described in patch comment.

OK

> 
>>> Also, export open_pipe()
>>>
>>> v5: Use 0 and -1 for successful return and error.
>>>
>>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>>
>> Rebased on new criu (sk-packet.c).    
>>
>> diff --git a/criu/eventfd.c b/criu/eventfd.c
>> index 0aab4287e..68edb1c56 100644
>> --- a/criu/eventfd.c
>> +++ b/criu/eventfd.c
>> @@ -79,7 +79,7 @@ const struct fdtype_ops eventfd_dump_ops = {
>>  	.dump		= dump_one_eventfd,
>>  };
>>  
>> -static int eventfd_open(struct file_desc *d)
>> +static int eventfd_open(struct file_desc *d, int *new_fd)
>>  {
>>  	struct eventfd_file_info *info;
>>  	int tmp;
>> @@ -99,7 +99,8 @@ static int eventfd_open(struct file_desc *d)
>>  		goto err_close;
>>  	}
>>  
>> -	return tmp;
>> +	*new_fd = tmp;
>> +	return 0;
>>  
>>  err_close:
>>  	close(tmp);
>> diff --git a/criu/eventpoll.c b/criu/eventpoll.c
>> index 42a656f31..aaea54a56 100644
>> --- a/criu/eventpoll.c
>> +++ b/criu/eventpoll.c
>> @@ -114,7 +114,7 @@ const struct fdtype_ops eventpoll_dump_ops = {
>>  	.dump		= dump_one_eventpoll,
>>  };
>>  
>> -static int eventpoll_open(struct file_desc *d)
>> +static int eventpoll_open(struct file_desc *d, int *new_fd)
>>  {
>>  	struct eventpoll_file_info *info;
>>  	int tmp;
>> @@ -136,7 +136,8 @@ static int eventpoll_open(struct file_desc *d)
>>  		goto err_close;
>>  	}
>>  
>> -	return tmp;
>> +	*new_fd = tmp;
>> +	return 0;
>>  err_close:
>>  	close(tmp);
>>  	return -1;
>> diff --git a/criu/fifo.c b/criu/fifo.c
>> index 68f55b4e5..cb642befc 100644
>> --- a/criu/fifo.c
>> +++ b/criu/fifo.c
>> @@ -106,11 +106,16 @@ static int do_open_fifo(int ns_root_fd, struct reg_file_info *rfi, void *arg)
>>  	return new_fifo;
>>  }
>>  
>> -static int open_fifo_fd(struct file_desc *d)
>> +static int open_fifo_fd(struct file_desc *d, int *new_fd)
>>  {
>>  	struct fifo_info *info = container_of(d, struct fifo_info, d);
>> +	int fd;
>>  
>> -	return open_path(info->reg_d, do_open_fifo, info);
>> +	fd = open_path(info->reg_d, do_open_fifo, info);
>> +	if (fd < 0)
>> +		return -1;
>> +	*new_fd = fd;
>> +	return 0;
>>  }
>>  
>>  static void collect_fifo_fd(struct file_desc *d,
>> diff --git a/criu/files-ext.c b/criu/files-ext.c
>> index 4c129fa64..df23ec671 100644
>> --- a/criu/files-ext.c
>> +++ b/criu/files-ext.c
>> @@ -37,7 +37,7 @@ struct ext_file_info {
>>  	ExtFileEntry		*xfe;
>>  };
>>  
>> -static int open_fd(struct file_desc *d)
>> +static int open_fd(struct file_desc *d, int *new_fd)
>>  {
>>  	struct ext_file_info *xfi;
>>  	int fd;
>> @@ -53,7 +53,8 @@ static int open_fd(struct file_desc *d)
>>  	if (restore_fown(fd, xfi->xfe->fown))
>>  		return -1;
>>  
>> -	return fd;
>> +	*new_fd = fd;
>> +	return 0;
>>  }
>>  
>>  static struct file_desc_ops ext_desc_ops = {
>> diff --git a/criu/files-reg.c b/criu/files-reg.c
>> index 73a1838c9..6e488e898 100644
>> --- a/criu/files-reg.c
>> +++ b/criu/files-reg.c
>> @@ -1659,9 +1659,15 @@ static void collect_reg_fd(struct file_desc *fdesc,
>>  	collect_gen_fd(fle, ri);
>>  }
>>  
>> -static int open_fe_fd(struct file_desc *fd)
>> +static int open_fe_fd(struct file_desc *fd, int *new_fd)
>>  {
>> -	return open_path(fd, do_open_reg, NULL);
>> +	int tmp;
>> +
>> +	tmp = open_path(fd, do_open_reg, NULL);
>> +	if (tmp < 0)
>> +		return -1;
>> +	*new_fd = tmp;
>> +	return 0;
>>  }
>>  
>>  static char *reg_file_path(struct file_desc *d, char *buf, size_t s)
>> diff --git a/criu/files.c b/criu/files.c
>> index e798a4062..f996d29f0 100644
>> --- a/criu/files.c
>> +++ b/criu/files.c
>> @@ -1053,8 +1053,7 @@ static int open_fd(int pid, struct fdinfo_list_entry *fle)
>>  	if (fle != file_master(d))
>>  		return 0;
>>  
>> -	new_fd = d->ops->open(d);
>> -	if (new_fd < 0)
>> +	if (d->ops->open(d, &new_fd) < 0)
>>  		return -1;
>>  
>>  	if (reopen_fd_as(fle->fe->fd, new_fd))
>> diff --git a/criu/fsnotify.c b/criu/fsnotify.c
>> index 07ccca964..0dcb07c7c 100644
>> --- a/criu/fsnotify.c
>> +++ b/criu/fsnotify.c
>> @@ -674,7 +674,7 @@ static int restore_one_fanotify(int fd, struct fsnotify_mark_info *mark)
>>  	return ret;
>>  }
>>  
>> -static int open_inotify_fd(struct file_desc *d)
>> +static int open_inotify_fd(struct file_desc *d, int *new_fd)
>>  {
>>  	struct fsnotify_file_info *info;
>>  	struct fsnotify_mark_info *wd_info;
>> @@ -699,10 +699,11 @@ static int open_inotify_fd(struct file_desc *d)
>>  	if (restore_fown(tmp, info->ife->fown))
>>  		close_safe(&tmp);
>>  
>> -	return tmp;
>> +	*new_fd = tmp;
>> +	return 0;
>>  }
>>  
>> -static int open_fanotify_fd(struct file_desc *d)
>> +static int open_fanotify_fd(struct file_desc *d, int *new_fd)
>>  {
>>  	struct fsnotify_file_info *info;
>>  	struct fsnotify_mark_info *mark;
>> @@ -734,7 +735,8 @@ static int open_fanotify_fd(struct file_desc *d)
>>  	if (restore_fown(ret, info->ffe->fown))
>>  		close_safe(&ret);
>>  
>> -	return ret;
>> +	*new_fd = ret;
>> +	return 0;
>>  }
>>  
>>  static struct file_desc_ops inotify_desc_ops = {
>> diff --git a/criu/include/files.h b/criu/include/files.h
>> index 5fffed6a8..093e077d0 100644
>> --- a/criu/include/files.h
>> +++ b/criu/include/files.h
>> @@ -105,7 +105,7 @@ struct file_desc_ops {
>>  	 * The returned descriptor may be closed (dup2-ed to another)
>>  	 * so it shouldn't be saved for any post-actions.
>>  	 */
>> -	int			(*open)(struct file_desc *d);
>> +	int			(*open)(struct file_desc *d, int *new_fd);
>>  	/*
>>  	 * Called on a file when all files of that type are opened
>>  	 * and with the fd being the "restored" one.
>> diff --git a/criu/include/pipes.h b/criu/include/pipes.h
>> index a16069bd2..47d98aee7 100644
>> --- a/criu/include/pipes.h
>> +++ b/criu/include/pipes.h
>> @@ -58,5 +58,6 @@ struct pipe_info {
>>  
>>  extern int collect_one_pipe_ops(void *o, ProtobufCMessage *base,
>>  				struct file_desc_ops *ops);
>> +extern int open_pipe(struct file_desc *d, int *new_fd);
>>  
>>  #endif /* __CR_PIPES_H__ */
>> diff --git a/criu/namespaces.c b/criu/namespaces.c
>> index 412362976..b954f9796 100644
>> --- a/criu/namespaces.c
>> +++ b/criu/namespaces.c
>> @@ -496,7 +496,7 @@ struct ns_file_info {
>>  	NsFileEntry		*nfe;
>>  };
>>  
>> -static int open_ns_fd(struct file_desc *d)
>> +static int open_ns_fd(struct file_desc *d, int *new_fd)
>>  {
>>  	struct ns_file_info *nfi = container_of(d, struct ns_file_info, d);
>>  	struct pstree_item *item, *t;
>> @@ -558,7 +558,8 @@ static int open_ns_fd(struct file_desc *d)
>>  		return fd;
>>  	}
>>  
>> -	return fd;
>> +	*new_fd = fd;
>> +	return 0;
>>  }
>>  
>>  static struct file_desc_ops ns_desc_ops = {
>> diff --git a/criu/pipes.c b/criu/pipes.c
>> index 08dd7d19e..6eaabeb4b 100644
>> --- a/criu/pipes.c
>> +++ b/criu/pipes.c
>> @@ -227,7 +227,7 @@ static int reopen_pipe(int fd, int flags)
>>  	return ret;
>>  }
>>  
>> -static int recv_pipe_fd(struct pipe_info *pi)
>> +static int recv_pipe_fd(struct pipe_info *pi, int *new_fd)
>>  {
>>  	struct fdinfo_list_entry *fle;
>>  	int tmp, fd;
>> @@ -252,9 +252,10 @@ static int recv_pipe_fd(struct pipe_info *pi)
>>  			close(fd);
>>  			return -1;
>>  		}
>> +		*new_fd = fd;
>>  	}
>>  
>> -	return fd;
>> +	return fd < 0 ? -1 : 0;
>>  }
>>  
>>  static char *pipe_d_name(struct file_desc *d, char *buf, size_t s)
>> @@ -271,7 +272,7 @@ static char *pipe_d_name(struct file_desc *d, char *buf, size_t s)
>>  	return buf;
>>  }
>>  
>> -static int open_pipe(struct file_desc *d)
>> +int open_pipe(struct file_desc *d, int *new_fd)
>>  {
>>  	struct pipe_info *pi, *p;
>>  	int ret, tmp;
>> @@ -284,11 +285,11 @@ static int open_pipe(struct file_desc *d)
>>  			return tmp;
>>  
>>  		pi->reopen = 1;
>> -		goto out;
>> +		goto reopen;
>>  	}
>>  
>>  	if (!pi->create)
>> -		return recv_pipe_fd(pi);
>> +		return recv_pipe_fd(pi, new_fd);
>>  
>>  	if (pipe(pfd) < 0) {
>>  		pr_perror("Can't create pipe");
>> @@ -316,15 +317,17 @@ static int open_pipe(struct file_desc *d)
>>  	close(pfd[!(pi->pe->flags & O_WRONLY)]);
>>  	tmp = pfd[pi->pe->flags & O_WRONLY];
>>  
>> -out:
>> +reopen:
>>  	if (pi->reopen)
>>  		tmp = reopen_pipe(tmp, pi->pe->flags);
>>  
>>  	if (tmp >= 0)
>>  		if (rst_file_params(tmp, pi->pe->fown, pi->pe->flags))
>>  			return -1;
>> -
>> -	return tmp;
>> +	if (tmp < 0)
>> +		return -1;
>> +	*new_fd = tmp;
>> +	return 0;
>>  }
>>  
>>  static struct file_desc_ops pipe_desc_ops = {
>> diff --git a/criu/signalfd.c b/criu/signalfd.c
>> index 2f5db5879..7c3ab4f33 100644
>> --- a/criu/signalfd.c
>> +++ b/criu/signalfd.c
>> @@ -72,7 +72,7 @@ static void sigset_fill(sigset_t *to, unsigned long long from)
>>  		}
>>  }
>>  
>> -static int signalfd_open(struct file_desc *d)
>> +static int signalfd_open(struct file_desc *d, int *new_fd)
>>  {
>>  	struct signalfd_info *info;
>>  	int tmp;
>> @@ -94,7 +94,8 @@ static int signalfd_open(struct file_desc *d)
>>  		goto err_close;
>>  	}
>>  
>> -	return tmp;
>> +	*new_fd = tmp;
>> +	return 0;
>>  
>>  err_close:
>>  	close(tmp);
>> diff --git a/criu/sk-inet.c b/criu/sk-inet.c
>> index 470baa821..552f8bba3 100644
>> --- a/criu/sk-inet.c
>> +++ b/criu/sk-inet.c
>> @@ -484,7 +484,7 @@ int inet_collect_one(struct nlmsghdr *h, int family, int type)
>>  	return ret;
>>  }
>>  
>> -static int open_inet_sk(struct file_desc *d);
>> +static int open_inet_sk(struct file_desc *d, int *new_fd);
>>  static int post_open_inet_sk(struct file_desc *d, int sk);
>>  
>>  static struct file_desc_ops inet_desc_ops = {
>> @@ -604,7 +604,7 @@ int restore_ip_opts(int sk, IpOptsEntry *ioe)
>>  
>>  	return ret;
>>  }
>> -static int open_inet_sk(struct file_desc *d)
>> +static int open_inet_sk(struct file_desc *d, int *new_fd)
>>  {
>>  	struct inet_sk_info *ii;
>>  	InetSkEntry *ie;
>> @@ -701,7 +701,8 @@ static int open_inet_sk(struct file_desc *d)
>>  	if (restore_socket_opts(sk, ie->opts))
>>  		goto err;
>>  
>> -	return sk;
>> +	*new_fd = sk;
>> +	return 0;
>>  
>>  err:
>>  	close(sk);
>> diff --git a/criu/sk-netlink.c b/criu/sk-netlink.c
>> index dc5c4a105..e61aa4455 100644
>> --- a/criu/sk-netlink.c
>> +++ b/criu/sk-netlink.c
>> @@ -155,7 +155,7 @@ struct netlink_sock_info {
>>  	struct file_desc d;
>>  };
>>  
>> -static int open_netlink_sk(struct file_desc *d)
>> +static int open_netlink_sk(struct file_desc *d, int *new_fd)
>>  {
>>  	struct netlink_sock_info *nsi;
>>  	NetlinkSkEntry *nse;
>> @@ -206,7 +206,8 @@ static int open_netlink_sk(struct file_desc *d)
>>  	if (restore_socket_opts(sk, nse->opts))
>>  		goto err;
>>  
>> -	return sk;
>> +	*new_fd = sk;
>> +	return 0;
>>  err:
>>  	close(sk);
>>  	return -1;
>> diff --git a/criu/sk-packet.c b/criu/sk-packet.c
>> index a7657bfc3..841a4aae6 100644
>> --- a/criu/sk-packet.c
>> +++ b/criu/sk-packet.c
>> @@ -405,7 +405,7 @@ static int restore_rings(int sk, PacketSockEntry *psk)
>>  	return 0;
>>  }
>>  
>> -static int open_packet_sk_spkt(PacketSockEntry *pse)
>> +static int open_packet_sk_spkt(PacketSockEntry *pse, int *new_fd)
>>  {
>>  	struct sockaddr addr_spkt;
>>  	int sk;
>> @@ -447,14 +447,15 @@ static int open_packet_sk_spkt(PacketSockEntry *pse)
>>  	if (restore_socket_opts(sk, pse->opts))
>>  		goto err;
>>  
>> -	return sk;
>> +	*new_fd = sk;
>> +	return 0;
>>  
>>  err:
>>  	close(sk);
>>  	return -1;
>>  }
>>  
>> -static int open_packet_sk(struct file_desc *d)
>> +static int open_packet_sk(struct file_desc *d, int *new_fd)
>>  {
>>  	struct packet_sock_info *psi;
>>  	PacketSockEntry *pse;
>> @@ -467,7 +468,7 @@ static int open_packet_sk(struct file_desc *d)
>>  	pr_info("Opening packet socket id %#x\n", pse->id);
>>  
>>  	if (pse->type == SOCK_PACKET)
>> -		return open_packet_sk_spkt(pse);
>> +		return open_packet_sk_spkt(pse, new_fd);
>>  
>>  	sk = socket(PF_PACKET, pse->type, pse->protocol);
>>  	if (sk < 0) {
>> @@ -538,7 +539,8 @@ static int open_packet_sk(struct file_desc *d)
>>  	if (restore_socket_opts(sk, pse->opts))
>>  		goto err_cl;
>>  
>> -	return sk;
>> +	*new_fd = sk;
>> +	return 0;
>>  
>>  err_cl:
>>  	close(sk);
>> diff --git a/criu/sk-unix.c b/criu/sk-unix.c
>> index cb7a04df5..27badb857 100644
>> --- a/criu/sk-unix.c
>> +++ b/criu/sk-unix.c
>> @@ -1054,7 +1054,7 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui)
>>  	return ret;
>>  }
>>  
>> -static int open_unixsk_pair_master(struct unix_sk_info *ui)
>> +static int open_unixsk_pair_master(struct unix_sk_info *ui, int *new_fd)
>>  {
>>  	int sk[2];
>>  	struct unix_sk_info *peer = ui->peer;
>> @@ -1093,10 +1093,11 @@ static int open_unixsk_pair_master(struct unix_sk_info *ui)
>>  
>>  	close(sk[1]);
>>  
>> -	return sk[0];
>> +	*new_fd = sk[0];
>> +	return 0;
>>  }
>>  
>> -static int open_unixsk_pair_slave(struct unix_sk_info *ui)
>> +static int open_unixsk_pair_slave(struct unix_sk_info *ui, int *new_fd)
>>  {
>>  	struct fdinfo_list_entry *fle;
>>  	int sk;
>> @@ -1124,10 +1125,11 @@ static int open_unixsk_pair_slave(struct unix_sk_info *ui)
>>  	if (shutdown_unix_sk(sk, ui))
>>  		return -1;
>>  
>> -	return sk;
>> +	*new_fd = sk;
>> +	return 0;
>>  }
>>  
>> -static int open_unixsk_standalone(struct unix_sk_info *ui)
>> +static int open_unixsk_standalone(struct unix_sk_info *ui, int *new_fd)
>>  {
>>  	int sk;
>>  
>> @@ -1264,26 +1266,28 @@ static int open_unixsk_standalone(struct unix_sk_info *ui)
>>  	if (restore_socket_opts(sk, ui->ue->opts))
>>  		return -1;
>>  
>> -	return sk;
>> +	*new_fd = sk;
>> +	return 0;
>>  }
>>  
>> -static int open_unix_sk(struct file_desc *d)
>> +static int open_unix_sk(struct file_desc *d, int *new_fd)
>>  {
>>  	struct unix_sk_info *ui;
>> +	int ret;
>>  
>>  	ui = container_of(d, struct unix_sk_info, d);
>>  
>> -	int unixsk_fd = -1;
>> -
>> -	if (inherited_fd(d, &unixsk_fd)) {
>> +	if (inherited_fd(d, new_fd)) {
>>  		ui->ue->uflags |= USK_INHERIT;
>> -		return unixsk_fd;
>> +		ret = *new_fd >= 0 ? 0 : -1;
>>  	} else if (ui->flags & USK_PAIR_MASTER)
>> -		return open_unixsk_pair_master(ui);
>> +		ret = open_unixsk_pair_master(ui, new_fd);
>>  	else if (ui->flags & USK_PAIR_SLAVE)
>> -		return open_unixsk_pair_slave(ui);
>> +		ret = open_unixsk_pair_slave(ui, new_fd);
>>  	else
>> -		return open_unixsk_standalone(ui);
>> +		ret = open_unixsk_standalone(ui, new_fd);
>> +
>> +	return ret;
>>  }
>>  
>>  static char *socket_d_name(struct file_desc *d, char *buf, size_t s)
>> diff --git a/criu/timerfd.c b/criu/timerfd.c
>> index a18588c05..476bf602e 100644
>> --- a/criu/timerfd.c
>> +++ b/criu/timerfd.c
>> @@ -122,7 +122,7 @@ int prepare_timerfds(struct task_restore_args *ta)
>>  	return 0;
>>  }
>>  
>> -static int timerfd_open(struct file_desc *d)
>> +static int timerfd_open(struct file_desc *d, int *new_fd)
>>  {
>>  	struct timerfd_info *info;
>>  	TimerfdEntry *tfe;
>> @@ -150,7 +150,8 @@ static int timerfd_open(struct file_desc *d)
>>  	info->t_fd = file_master(d)->fe->fd;
>>  	list_add_tail(&info->rlist, &rst_timerfds);
>>  
>> -	return tmp;
>> +	*new_fd = tmp;
>> +	return 0;
>>  
>>  err_close:
>>  	close_safe(&tmp);
>> diff --git a/criu/tty.c b/criu/tty.c
>> index 97443e85e..8b342a95d 100644
>> --- a/criu/tty.c
>> +++ b/criu/tty.c
>> @@ -1093,19 +1093,23 @@ static int open_ext_tty(struct tty_info *info)
>>  	return fd;
>>  }
>>  
>> -static int tty_open(struct file_desc *d)
>> +static int tty_open(struct file_desc *d, int *new_fd)
>>  {
>>  	struct tty_info *info = container_of(d, struct tty_info, d);
>> +	int ret;
>>  
>>  	tty_show_pty_info("open", info);
>>  
>>  	if (!info->create)
>> -		return receive_tty(info);
>> -
>> -	if (is_pty(info->driver) && !tty_is_master(info))
>> -		return pty_open_unpaired_slave(d, info);
>> -
>> -	return info->driver->open(info);
>> +		ret = receive_tty(info);
>> +	else if (is_pty(info->driver) && !tty_is_master(info))
>> +		ret = pty_open_unpaired_slave(d, info);
>> +	else
>> +		ret = info->driver->open(info);
>> +	if (ret < 0)
>> +		return -1;
>> +	*new_fd = ret;
>> +	return 0;
>>  }
>>  
>>  static void tty_collect_fd(struct file_desc *d, struct fdinfo_list_entry *fle,
>> diff --git a/criu/tun.c b/criu/tun.c
>> index 391f968bb..6a429b6c2 100644
>> --- a/criu/tun.c
>> +++ b/criu/tun.c
>> @@ -320,7 +320,7 @@ struct tunfile_info {
>>  	TunfileEntry *tfe;
>>  };
>>  
>> -static int tunfile_open(struct file_desc *d)
>> +static int tunfile_open(struct file_desc *d, int *new_fd)
>>  {
>>  	int fd;
>>  	struct tunfile_info *ti;
>> @@ -334,7 +334,7 @@ static int tunfile_open(struct file_desc *d)
>>  
>>  	if (!ti->tfe->netdev)
>>  		/* just-opened tun file */
>> -		return fd;
>> +		goto ok;;
>>  
>>  	tl = find_tun_link(ti->tfe->netdev);
>>  	if (!tl) {
>> @@ -367,8 +367,9 @@ static int tunfile_open(struct file_desc *d)
>>  			goto err;
>>  		}
>>  	}
>> -
>> -	return fd;
>> +ok:
>> +	*new_fd = fd;
>> +	return 0;
>>  
>>  err:
>>  	close(fd);
>> .
>>
> 


More information about the CRIU mailing list