Unverified Commit fe67b063 authored by Christian Brauner's avatar Christian Brauner
Browse files

net/handshake: convert handshake_nl_accept_doit() to FD_PREPARE()

parent 910c361f
Loading
Loading
Loading
Loading
+18 −20
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ int handshake_nl_accept_doit(struct sk_buff *skb, struct genl_info *info)
	struct handshake_net *hn = handshake_pernet(net);
	struct handshake_req *req = NULL;
	struct socket *sock;
	int class, fd, err;
	int class, err;

	err = -EOPNOTSUPP;
	if (!hn)
@@ -106,26 +106,24 @@ int handshake_nl_accept_doit(struct sk_buff *skb, struct genl_info *info)

	err = -EAGAIN;
	req = handshake_req_next(hn, class);
	if (!req)
		goto out_status;

	if (req) {
		sock = req->hr_sk->sk_socket;
	fd = get_unused_fd_flags(O_CLOEXEC);
	if (fd < 0) {
		err = fd;
		goto out_complete;
	}

	err = req->hr_proto->hp_accept(req, info, fd);
	if (err) {
		put_unused_fd(fd);
		FD_PREPARE(fdf, O_CLOEXEC, sock->file);
		if (fdf.err) {
			err = fdf.err;
			goto out_complete;
		}

	fd_install(fd, get_file(sock->file));
		get_file(sock->file); /* FD_PREPARE() consumes a reference. */
		err = req->hr_proto->hp_accept(req, info, fd_prepare_fd(fdf));
		if (err)
			goto out_complete; /* Automatic cleanup handles fput */

	trace_handshake_cmd_accept(net, req, req->hr_sk, fd);
		trace_handshake_cmd_accept(net, req, req->hr_sk, fd_prepare_fd(fdf));
		fd_publish(fdf);
		return 0;
	}

out_complete:
	handshake_complete(req, -EIO, NULL);