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

Pavel Emelyanov xemul at virtuozzo.com
Wed Jan 18 02:12:16 PST 2017


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.

>> 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