+++ /dev/null
-From 1c9995693f2f9207e4371e04c265705f29c0d575 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 9 May 2024 09:20:08 -0600
-Subject: net: change proto and proto_ops accept type
-
-From: Jens Axboe <axboe@kernel.dk>
-
-[ Upstream commit 92ef0fd55ac80dfc2e4654edfe5d1ddfa6e070fe ]
-
-Rather than pass in flags, error pointer, and whether this is a kernel
-invocation or not, add a struct proto_accept_arg struct as the argument.
-This then holds all of these arguments, and prepares accept for being
-able to pass back more information.
-
-No functional changes in this patch.
-
-Acked-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Jens Axboe <axboe@kernel.dk>
-Stable-dep-of: 1b536948e805 ("af_unix: Annotate data-race of sk->sk_state in unix_accept().")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- crypto/af_alg.c | 11 ++++++-----
- crypto/algif_hash.c | 10 +++++-----
- drivers/xen/pvcalls-back.c | 6 +++++-
- fs/ocfs2/cluster/tcp.c | 5 ++++-
- include/crypto/if_alg.h | 3 ++-
- include/linux/net.h | 4 +++-
- include/net/inet_common.h | 4 ++--
- include/net/inet_connection_sock.h | 2 +-
- include/net/sock.h | 12 +++++++++---
- net/atm/svc.c | 8 ++++----
- net/ax25/af_ax25.c | 6 +++---
- net/bluetooth/iso.c | 4 ++--
- net/bluetooth/l2cap_sock.c | 4 ++--
- net/bluetooth/rfcomm/sock.c | 6 +++---
- net/bluetooth/sco.c | 4 ++--
- net/core/sock.c | 4 ++--
- net/ipv4/af_inet.c | 10 +++++-----
- net/ipv4/inet_connection_sock.c | 6 +++---
- net/iucv/af_iucv.c | 4 ++--
- net/llc/af_llc.c | 7 +++----
- net/mptcp/protocol.c | 11 +++++------
- net/netrom/af_netrom.c | 6 +++---
- net/nfc/llcp_sock.c | 4 ++--
- net/phonet/pep.c | 12 ++++++------
- net/phonet/socket.c | 7 +++----
- net/rds/tcp_listen.c | 6 +++++-
- net/rose/af_rose.c | 6 +++---
- net/sctp/socket.c | 8 ++++----
- net/smc/af_smc.c | 6 +++---
- net/socket.c | 13 ++++++++++---
- net/tipc/socket.c | 13 +++++--------
- net/unix/af_unix.c | 21 ++++++++++-----------
- net/vmw_vsock/af_vsock.c | 6 +++---
- net/x25/af_x25.c | 4 ++--
- 34 files changed, 132 insertions(+), 111 deletions(-)
-
-diff --git a/crypto/af_alg.c b/crypto/af_alg.c
-index 68cc9290cabe9..598bf46691706 100644
---- a/crypto/af_alg.c
-+++ b/crypto/af_alg.c
-@@ -407,7 +407,8 @@ static int alg_setsockopt(struct socket *sock, int level, int optname,
- return err;
- }
-
--int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern)
-+int af_alg_accept(struct sock *sk, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct alg_sock *ask = alg_sk(sk);
- const struct af_alg_type *type;
-@@ -422,7 +423,7 @@ int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern)
- if (!type)
- goto unlock;
-
-- sk2 = sk_alloc(sock_net(sk), PF_ALG, GFP_KERNEL, &alg_proto, kern);
-+ sk2 = sk_alloc(sock_net(sk), PF_ALG, GFP_KERNEL, &alg_proto, arg->kern);
- err = -ENOMEM;
- if (!sk2)
- goto unlock;
-@@ -468,10 +469,10 @@ int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern)
- }
- EXPORT_SYMBOL_GPL(af_alg_accept);
-
--static int alg_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int alg_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
-- return af_alg_accept(sock->sk, newsock, kern);
-+ return af_alg_accept(sock->sk, newsock, arg);
- }
-
- static const struct proto_ops alg_proto_ops = {
-diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
-index e24c829d7a015..7c7394d46a235 100644
---- a/crypto/algif_hash.c
-+++ b/crypto/algif_hash.c
-@@ -223,8 +223,8 @@ static int hash_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
- return err ?: len;
- }
-
--static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int hash_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk = sock->sk;
- struct alg_sock *ask = alg_sk(sk);
-@@ -252,7 +252,7 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
- if (err)
- goto out_free_state;
-
-- err = af_alg_accept(ask->parent, newsock, kern);
-+ err = af_alg_accept(ask->parent, newsock, arg);
- if (err)
- goto out_free_state;
-
-@@ -355,7 +355,7 @@ static int hash_recvmsg_nokey(struct socket *sock, struct msghdr *msg,
- }
-
- static int hash_accept_nokey(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- int err;
-
-@@ -363,7 +363,7 @@ static int hash_accept_nokey(struct socket *sock, struct socket *newsock,
- if (err)
- return err;
-
-- return hash_accept(sock, newsock, flags, kern);
-+ return hash_accept(sock, newsock, arg);
- }
-
- static struct proto_ops algif_hash_ops_nokey = {
-diff --git a/drivers/xen/pvcalls-back.c b/drivers/xen/pvcalls-back.c
-index d52593466a792..fd7ed65e0197d 100644
---- a/drivers/xen/pvcalls-back.c
-+++ b/drivers/xen/pvcalls-back.c
-@@ -517,6 +517,10 @@ static void __pvcalls_back_accept(struct work_struct *work)
- {
- struct sockpass_mapping *mappass = container_of(
- work, struct sockpass_mapping, register_work);
-+ struct proto_accept_arg arg = {
-+ .flags = O_NONBLOCK,
-+ .kern = true,
-+ };
- struct sock_mapping *map;
- struct pvcalls_ioworker *iow;
- struct pvcalls_fedata *fedata;
-@@ -548,7 +552,7 @@ static void __pvcalls_back_accept(struct work_struct *work)
- sock->type = mappass->sock->type;
- sock->ops = mappass->sock->ops;
-
-- ret = inet_accept(mappass->sock, sock, O_NONBLOCK, true);
-+ ret = inet_accept(mappass->sock, sock, &arg);
- if (ret == -EAGAIN) {
- sock_release(sock);
- return;
-diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c
-index 960080753d3bd..2b8fa3e782fb6 100644
---- a/fs/ocfs2/cluster/tcp.c
-+++ b/fs/ocfs2/cluster/tcp.c
-@@ -1784,6 +1784,9 @@ static int o2net_accept_one(struct socket *sock, int *more)
- struct o2nm_node *node = NULL;
- struct o2nm_node *local_node = NULL;
- struct o2net_sock_container *sc = NULL;
-+ struct proto_accept_arg arg = {
-+ .flags = O_NONBLOCK,
-+ };
- struct o2net_node *nn;
- unsigned int nofs_flag;
-
-@@ -1802,7 +1805,7 @@ static int o2net_accept_one(struct socket *sock, int *more)
-
- new_sock->type = sock->type;
- new_sock->ops = sock->ops;
-- ret = sock->ops->accept(sock, new_sock, O_NONBLOCK, false);
-+ ret = sock->ops->accept(sock, new_sock, &arg);
- if (ret < 0)
- goto out;
-
-diff --git a/include/crypto/if_alg.h b/include/crypto/if_alg.h
-index 78ecaf5db04c6..f7b3b93f3a49a 100644
---- a/include/crypto/if_alg.h
-+++ b/include/crypto/if_alg.h
-@@ -166,7 +166,8 @@ int af_alg_unregister_type(const struct af_alg_type *type);
-
- int af_alg_release(struct socket *sock);
- void af_alg_release_parent(struct sock *sk);
--int af_alg_accept(struct sock *sk, struct socket *newsock, bool kern);
-+int af_alg_accept(struct sock *sk, struct socket *newsock,
-+ struct proto_accept_arg *arg);
-
- void af_alg_free_sg(struct af_alg_sgl *sgl);
-
-diff --git a/include/linux/net.h b/include/linux/net.h
-index 15df6d5f27a7b..688320b79fcc6 100644
---- a/include/linux/net.h
-+++ b/include/linux/net.h
-@@ -153,6 +153,7 @@ struct sockaddr;
- struct msghdr;
- struct module;
- struct sk_buff;
-+struct proto_accept_arg;
- typedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *,
- unsigned int, size_t);
- typedef int (*skb_read_actor_t)(struct sock *, struct sk_buff *);
-@@ -171,7 +172,8 @@ struct proto_ops {
- int (*socketpair)(struct socket *sock1,
- struct socket *sock2);
- int (*accept) (struct socket *sock,
-- struct socket *newsock, int flags, bool kern);
-+ struct socket *newsock,
-+ struct proto_accept_arg *arg);
- int (*getname) (struct socket *sock,
- struct sockaddr *addr,
- int peer);
-diff --git a/include/net/inet_common.h b/include/net/inet_common.h
-index f50a644d87a98..c17a6585d0b0b 100644
---- a/include/net/inet_common.h
-+++ b/include/net/inet_common.h
-@@ -29,8 +29,8 @@ int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
- int addr_len, int flags, int is_sendmsg);
- int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr,
- int addr_len, int flags);
--int inet_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern);
-+int inet_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg);
- void __inet_accept(struct socket *sock, struct socket *newsock,
- struct sock *newsk);
- int inet_send_prepare(struct sock *sk);
-diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h
-index ccf171f7eb60d..aa435d90f12f9 100644
---- a/include/net/inet_connection_sock.h
-+++ b/include/net/inet_connection_sock.h
-@@ -253,7 +253,7 @@ inet_csk_rto_backoff(const struct inet_connection_sock *icsk,
- return (unsigned long)min_t(u64, when, max_when);
- }
-
--struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern);
-+struct sock *inet_csk_accept(struct sock *sk, struct proto_accept_arg *arg);
-
- int inet_csk_get_port(struct sock *sk, unsigned short snum);
-
-diff --git a/include/net/sock.h b/include/net/sock.h
-index 944f71a8ab223..774ee477e6572 100644
---- a/include/net/sock.h
-+++ b/include/net/sock.h
-@@ -1194,6 +1194,12 @@ static inline void sk_prot_clear_nulls(struct sock *sk, int size)
- size - offsetof(struct sock, sk_node.pprev));
- }
-
-+struct proto_accept_arg {
-+ int flags;
-+ int err;
-+ bool kern;
-+};
-+
- /* Networking protocol blocks we attach to sockets.
- * socket layer -> transport layer interface
- */
-@@ -1208,8 +1214,8 @@ struct proto {
- int addr_len);
- int (*disconnect)(struct sock *sk, int flags);
-
-- struct sock * (*accept)(struct sock *sk, int flags, int *err,
-- bool kern);
-+ struct sock * (*accept)(struct sock *sk,
-+ struct proto_accept_arg *arg);
-
- int (*ioctl)(struct sock *sk, int cmd,
- int *karg);
-@@ -1882,7 +1888,7 @@ int sock_cmsg_send(struct sock *sk, struct msghdr *msg,
- int sock_no_bind(struct socket *, struct sockaddr *, int);
- int sock_no_connect(struct socket *, struct sockaddr *, int, int);
- int sock_no_socketpair(struct socket *, struct socket *);
--int sock_no_accept(struct socket *, struct socket *, int, bool);
-+int sock_no_accept(struct socket *, struct socket *, struct proto_accept_arg *);
- int sock_no_getname(struct socket *, struct sockaddr *, int);
- int sock_no_ioctl(struct socket *, unsigned int, unsigned long);
- int sock_no_listen(struct socket *, int);
-diff --git a/net/atm/svc.c b/net/atm/svc.c
-index 36a814f1fbd16..f8137ae693b08 100644
---- a/net/atm/svc.c
-+++ b/net/atm/svc.c
-@@ -324,8 +324,8 @@ static int svc_listen(struct socket *sock, int backlog)
- return error;
- }
-
--static int svc_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int svc_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk = sock->sk;
- struct sk_buff *skb;
-@@ -336,7 +336,7 @@ static int svc_accept(struct socket *sock, struct socket *newsock, int flags,
-
- lock_sock(sk);
-
-- error = svc_create(sock_net(sk), newsock, 0, kern);
-+ error = svc_create(sock_net(sk), newsock, 0, arg->kern);
- if (error)
- goto out;
-
-@@ -355,7 +355,7 @@ static int svc_accept(struct socket *sock, struct socket *newsock, int flags,
- error = -sk->sk_err;
- break;
- }
-- if (flags & O_NONBLOCK) {
-+ if (arg->flags & O_NONBLOCK) {
- error = -EAGAIN;
- break;
- }
-diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
-index 5fff5930e4deb..d6f9fae06a9d8 100644
---- a/net/ax25/af_ax25.c
-+++ b/net/ax25/af_ax25.c
-@@ -1373,8 +1373,8 @@ static int __must_check ax25_connect(struct socket *sock,
- return err;
- }
-
--static int ax25_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int ax25_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sk_buff *skb;
- struct sock *newsk;
-@@ -1411,7 +1411,7 @@ static int ax25_accept(struct socket *sock, struct socket *newsock, int flags,
- if (skb)
- break;
-
-- if (flags & O_NONBLOCK) {
-+ if (arg->flags & O_NONBLOCK) {
- err = -EWOULDBLOCK;
- break;
- }
-diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
-index 00c0d8413c638..cc055b952ce69 100644
---- a/net/bluetooth/iso.c
-+++ b/net/bluetooth/iso.c
-@@ -1159,7 +1159,7 @@ static int iso_sock_listen(struct socket *sock, int backlog)
- }
-
- static int iso_sock_accept(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- DEFINE_WAIT_FUNC(wait, woken_wake_function);
- struct sock *sk = sock->sk, *ch;
-@@ -1168,7 +1168,7 @@ static int iso_sock_accept(struct socket *sock, struct socket *newsock,
-
- lock_sock(sk);
-
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- BT_DBG("sk %p timeo %ld", sk, timeo);
-
-diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
-index 8645461d45e81..6db60946c627c 100644
---- a/net/bluetooth/l2cap_sock.c
-+++ b/net/bluetooth/l2cap_sock.c
-@@ -327,7 +327,7 @@ static int l2cap_sock_listen(struct socket *sock, int backlog)
- }
-
- static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- DEFINE_WAIT_FUNC(wait, woken_wake_function);
- struct sock *sk = sock->sk, *nsk;
-@@ -336,7 +336,7 @@ static int l2cap_sock_accept(struct socket *sock, struct socket *newsock,
-
- lock_sock_nested(sk, L2CAP_NESTING_PARENT);
-
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- BT_DBG("sk %p timeo %ld", sk, timeo);
-
-diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
-index 29aa07e9db9d7..37d63d768afb8 100644
---- a/net/bluetooth/rfcomm/sock.c
-+++ b/net/bluetooth/rfcomm/sock.c
-@@ -468,8 +468,8 @@ static int rfcomm_sock_listen(struct socket *sock, int backlog)
- return err;
- }
-
--static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- DEFINE_WAIT_FUNC(wait, woken_wake_function);
- struct sock *sk = sock->sk, *nsk;
-@@ -483,7 +483,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f
- goto done;
- }
-
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- BT_DBG("sk %p timeo %ld", sk, timeo);
-
-diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
-index 71d36582d4efa..a5ac160c592eb 100644
---- a/net/bluetooth/sco.c
-+++ b/net/bluetooth/sco.c
-@@ -647,7 +647,7 @@ static int sco_sock_listen(struct socket *sock, int backlog)
- }
-
- static int sco_sock_accept(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- DEFINE_WAIT_FUNC(wait, woken_wake_function);
- struct sock *sk = sock->sk, *ch;
-@@ -656,7 +656,7 @@ static int sco_sock_accept(struct socket *sock, struct socket *newsock,
-
- lock_sock(sk);
-
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- BT_DBG("sk %p timeo %ld", sk, timeo);
-
-diff --git a/net/core/sock.c b/net/core/sock.c
-index 0963689a59506..5a06715871f4a 100644
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -3242,8 +3242,8 @@ int sock_no_socketpair(struct socket *sock1, struct socket *sock2)
- }
- EXPORT_SYMBOL(sock_no_socketpair);
-
--int sock_no_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+int sock_no_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- return -EOPNOTSUPP;
- }
-diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
-index 5622ddd3bf55b..c39ccd92172d3 100644
---- a/net/ipv4/af_inet.c
-+++ b/net/ipv4/af_inet.c
-@@ -773,16 +773,16 @@ void __inet_accept(struct socket *sock, struct socket *newsock, struct sock *new
- * Accept a pending connection. The TCP layer now gives BSD semantics.
- */
-
--int inet_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+int inet_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk1 = sock->sk, *sk2;
-- int err = -EINVAL;
-
- /* IPV6_ADDRFORM can change sk->sk_prot under us. */
-- sk2 = READ_ONCE(sk1->sk_prot)->accept(sk1, flags, &err, kern);
-+ arg->err = -EINVAL;
-+ sk2 = READ_ONCE(sk1->sk_prot)->accept(sk1, arg);
- if (!sk2)
-- return err;
-+ return arg->err;
-
- lock_sock(sk2);
- __inet_accept(sock, newsock, sk2);
-diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
-index 3b38610958ee4..7734d189c66b8 100644
---- a/net/ipv4/inet_connection_sock.c
-+++ b/net/ipv4/inet_connection_sock.c
-@@ -661,7 +661,7 @@ static int inet_csk_wait_for_connect(struct sock *sk, long timeo)
- /*
- * This will accept the next outstanding connection.
- */
--struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern)
-+struct sock *inet_csk_accept(struct sock *sk, struct proto_accept_arg *arg)
- {
- struct inet_connection_sock *icsk = inet_csk(sk);
- struct request_sock_queue *queue = &icsk->icsk_accept_queue;
-@@ -680,7 +680,7 @@ struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern)
-
- /* Find already established connection */
- if (reqsk_queue_empty(queue)) {
-- long timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ long timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- /* If this is a non blocking socket don't sleep */
- error = -EAGAIN;
-@@ -745,7 +745,7 @@ struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern)
- out_err:
- newsk = NULL;
- req = NULL;
-- *err = error;
-+ arg->err = error;
- goto out;
- }
- EXPORT_SYMBOL(inet_csk_accept);
-diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c
-index 7c8c3adcac6e9..089acf6bd36d7 100644
---- a/net/iucv/af_iucv.c
-+++ b/net/iucv/af_iucv.c
-@@ -795,7 +795,7 @@ static int iucv_sock_listen(struct socket *sock, int backlog)
-
- /* Accept a pending connection */
- static int iucv_sock_accept(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- DECLARE_WAITQUEUE(wait, current);
- struct sock *sk = sock->sk, *nsk;
-@@ -809,7 +809,7 @@ static int iucv_sock_accept(struct socket *sock, struct socket *newsock,
- goto done;
- }
-
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- /* Wait for an incoming connection */
- add_wait_queue_exclusive(sk_sleep(sk), &wait);
-diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
-index fde1140d899ef..4eb52add7103b 100644
---- a/net/llc/af_llc.c
-+++ b/net/llc/af_llc.c
-@@ -688,14 +688,13 @@ static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb)
- * llc_ui_accept - accept a new incoming connection.
- * @sock: Socket which connections arrive on.
- * @newsock: Socket to move incoming connection to.
-- * @flags: User specified operational flags.
-- * @kern: If the socket is kernel internal
-+ * @arg: User specified arguments
- *
- * Accept a new incoming connection.
- * Returns 0 upon success, negative otherwise.
- */
--static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int llc_ui_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk = sock->sk, *newsk;
- struct llc_sock *llc, *newllc;
-diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
-index 327dcf06edd47..e4644d50c909e 100644
---- a/net/mptcp/protocol.c
-+++ b/net/mptcp/protocol.c
-@@ -3878,11 +3878,10 @@ static int mptcp_listen(struct socket *sock, int backlog)
- }
-
- static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- struct mptcp_sock *msk = mptcp_sk(sock->sk);
- struct sock *ssk, *newsk;
-- int err;
-
- pr_debug("msk=%p", msk);
-
-@@ -3894,9 +3893,9 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
- return -EINVAL;
-
- pr_debug("ssk=%p, listener=%p", ssk, mptcp_subflow_ctx(ssk));
-- newsk = inet_csk_accept(ssk, flags, &err, kern);
-+ newsk = inet_csk_accept(ssk, arg);
- if (!newsk)
-- return err;
-+ return arg->err;
-
- pr_debug("newsk=%p, subflow is mptcp=%d", newsk, sk_is_mptcp(newsk));
- if (sk_is_mptcp(newsk)) {
-@@ -3917,7 +3916,7 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
- newsk = new_mptcp_sock;
- MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPCAPABLEPASSIVEACK);
-
-- newsk->sk_kern_sock = kern;
-+ newsk->sk_kern_sock = arg->kern;
- lock_sock(newsk);
- __inet_accept(sock, newsock, newsk);
-
-@@ -3946,7 +3945,7 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
- }
- } else {
- tcpfallback:
-- newsk->sk_kern_sock = kern;
-+ newsk->sk_kern_sock = arg->kern;
- lock_sock(newsk);
- __inet_accept(sock, newsock, newsk);
- /* we are being invoked after accepting a non-mp-capable
-diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
-index 104a80b75477f..6ee148f0e6d04 100644
---- a/net/netrom/af_netrom.c
-+++ b/net/netrom/af_netrom.c
-@@ -772,8 +772,8 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
- return err;
- }
-
--static int nr_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int nr_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sk_buff *skb;
- struct sock *newsk;
-@@ -805,7 +805,7 @@ static int nr_accept(struct socket *sock, struct socket *newsock, int flags,
- if (skb)
- break;
-
-- if (flags & O_NONBLOCK) {
-+ if (arg->flags & O_NONBLOCK) {
- err = -EWOULDBLOCK;
- break;
- }
-diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c
-index d5344563e525c..57a2f97004e17 100644
---- a/net/nfc/llcp_sock.c
-+++ b/net/nfc/llcp_sock.c
-@@ -447,7 +447,7 @@ struct sock *nfc_llcp_accept_dequeue(struct sock *parent,
- }
-
- static int llcp_sock_accept(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- DECLARE_WAITQUEUE(wait, current);
- struct sock *sk = sock->sk, *new_sk;
-@@ -463,7 +463,7 @@ static int llcp_sock_accept(struct socket *sock, struct socket *newsock,
- goto error;
- }
-
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- /* Wait for an incoming connection. */
- add_wait_queue_exclusive(sk_sleep(sk), &wait);
-diff --git a/net/phonet/pep.c b/net/phonet/pep.c
-index 3dd5f52bc1b58..53a858478e22f 100644
---- a/net/phonet/pep.c
-+++ b/net/phonet/pep.c
-@@ -759,8 +759,8 @@ static void pep_sock_close(struct sock *sk, long timeout)
- sock_put(sk);
- }
-
--static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp,
-- bool kern)
-+static struct sock *pep_sock_accept(struct sock *sk,
-+ struct proto_accept_arg *arg)
- {
- struct pep_sock *pn = pep_sk(sk), *newpn;
- struct sock *newsk = NULL;
-@@ -772,8 +772,8 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp,
- u8 pipe_handle, enabled, n_sb;
- u8 aligned = 0;
-
-- skb = skb_recv_datagram(sk, (flags & O_NONBLOCK) ? MSG_DONTWAIT : 0,
-- errp);
-+ skb = skb_recv_datagram(sk, (arg->flags & O_NONBLOCK) ? MSG_DONTWAIT : 0,
-+ &arg->err);
- if (!skb)
- return NULL;
-
-@@ -836,7 +836,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp,
-
- /* Create a new to-be-accepted sock */
- newsk = sk_alloc(sock_net(sk), PF_PHONET, GFP_KERNEL, sk->sk_prot,
-- kern);
-+ arg->kern);
- if (!newsk) {
- pep_reject_conn(sk, skb, PN_PIPE_ERR_OVERLOAD, GFP_KERNEL);
- err = -ENOBUFS;
-@@ -878,7 +878,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp,
- drop:
- release_sock(sk);
- kfree_skb(skb);
-- *errp = err;
-+ arg->err = err;
- return newsk;
- }
-
-diff --git a/net/phonet/socket.c b/net/phonet/socket.c
-index 1018340d89a7d..5ce0b3ee5def8 100644
---- a/net/phonet/socket.c
-+++ b/net/phonet/socket.c
-@@ -292,18 +292,17 @@ static int pn_socket_connect(struct socket *sock, struct sockaddr *addr,
- }
-
- static int pn_socket_accept(struct socket *sock, struct socket *newsock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk = sock->sk;
- struct sock *newsk;
-- int err;
-
- if (unlikely(sk->sk_state != TCP_LISTEN))
- return -EINVAL;
-
-- newsk = sk->sk_prot->accept(sk, flags, &err, kern);
-+ newsk = sk->sk_prot->accept(sk, arg);
- if (!newsk)
-- return err;
-+ return arg->err;
-
- lock_sock(newsk);
- sock_graft(newsk, newsock);
-diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
-index 05008ce5c4219..d89bd8d0c3545 100644
---- a/net/rds/tcp_listen.c
-+++ b/net/rds/tcp_listen.c
-@@ -105,6 +105,10 @@ int rds_tcp_accept_one(struct socket *sock)
- int conn_state;
- struct rds_conn_path *cp;
- struct in6_addr *my_addr, *peer_addr;
-+ struct proto_accept_arg arg = {
-+ .flags = O_NONBLOCK,
-+ .kern = true,
-+ };
- #if !IS_ENABLED(CONFIG_IPV6)
- struct in6_addr saddr, daddr;
- #endif
-@@ -119,7 +123,7 @@ int rds_tcp_accept_one(struct socket *sock)
- if (ret)
- goto out;
-
-- ret = sock->ops->accept(sock, new_sock, O_NONBLOCK, true);
-+ ret = sock->ops->accept(sock, new_sock, &arg);
- if (ret < 0)
- goto out;
-
-diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
-index ef81d019b20f4..59050caab65c8 100644
---- a/net/rose/af_rose.c
-+++ b/net/rose/af_rose.c
-@@ -919,8 +919,8 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le
- return err;
- }
-
--static int rose_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int rose_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sk_buff *skb;
- struct sock *newsk;
-@@ -953,7 +953,7 @@ static int rose_accept(struct socket *sock, struct socket *newsock, int flags,
- if (skb)
- break;
-
-- if (flags & O_NONBLOCK) {
-+ if (arg->flags & O_NONBLOCK) {
- err = -EWOULDBLOCK;
- break;
- }
-diff --git a/net/sctp/socket.c b/net/sctp/socket.c
-index c67679a41044f..732c67a9ce475 100644
---- a/net/sctp/socket.c
-+++ b/net/sctp/socket.c
-@@ -4847,7 +4847,7 @@ static int sctp_disconnect(struct sock *sk, int flags)
- * descriptor will be returned from accept() to represent the newly
- * formed association.
- */
--static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)
-+static struct sock *sctp_accept(struct sock *sk, struct proto_accept_arg *arg)
- {
- struct sctp_sock *sp;
- struct sctp_endpoint *ep;
-@@ -4871,7 +4871,7 @@ static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)
- goto out;
- }
-
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
-
- error = sctp_wait_for_accept(sk, timeo);
- if (error)
-@@ -4882,7 +4882,7 @@ static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)
- */
- asoc = list_entry(ep->asocs.next, struct sctp_association, asocs);
-
-- newsk = sp->pf->create_accept_sk(sk, asoc, kern);
-+ newsk = sp->pf->create_accept_sk(sk, asoc, arg->kern);
- if (!newsk) {
- error = -ENOMEM;
- goto out;
-@@ -4899,7 +4899,7 @@ static struct sock *sctp_accept(struct sock *sk, int flags, int *err, bool kern)
-
- out:
- release_sock(sk);
-- *err = error;
-+ arg->err = error;
- return newsk;
- }
-
-diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
-index 5f9f3d4c1df5f..ee6d8887c5730 100644
---- a/net/smc/af_smc.c
-+++ b/net/smc/af_smc.c
-@@ -2656,7 +2656,7 @@ static int smc_listen(struct socket *sock, int backlog)
- }
-
- static int smc_accept(struct socket *sock, struct socket *new_sock,
-- int flags, bool kern)
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk = sock->sk, *nsk;
- DECLARE_WAITQUEUE(wait, current);
-@@ -2675,7 +2675,7 @@ static int smc_accept(struct socket *sock, struct socket *new_sock,
- }
-
- /* Wait for an incoming connection */
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
- add_wait_queue_exclusive(sk_sleep(sk), &wait);
- while (!(nsk = smc_accept_dequeue(sk, new_sock))) {
- set_current_state(TASK_INTERRUPTIBLE);
-@@ -2702,7 +2702,7 @@ static int smc_accept(struct socket *sock, struct socket *new_sock,
- if (rc)
- goto out;
-
-- if (lsmc->sockopt_defer_accept && !(flags & O_NONBLOCK)) {
-+ if (lsmc->sockopt_defer_accept && !(arg->flags & O_NONBLOCK)) {
- /* wait till data arrives on the socket */
- timeo = msecs_to_jiffies(lsmc->sockopt_defer_accept *
- MSEC_PER_SEC);
-diff --git a/net/socket.c b/net/socket.c
-index e5f3af49a8b62..2a78cff7159fe 100644
---- a/net/socket.c
-+++ b/net/socket.c
-@@ -1898,6 +1898,9 @@ struct file *do_accept(struct file *file, unsigned file_flags,
- struct file *newfile;
- int err, len;
- struct sockaddr_storage address;
-+ struct proto_accept_arg arg = {
-+ .flags = file_flags,
-+ };
- const struct proto_ops *ops;
-
- sock = sock_from_file(file);
-@@ -1926,8 +1929,8 @@ struct file *do_accept(struct file *file, unsigned file_flags,
- if (err)
- goto out_fd;
-
-- err = ops->accept(sock, newsock, sock->file->f_flags | file_flags,
-- false);
-+ arg.flags |= sock->file->f_flags;
-+ err = ops->accept(sock, newsock, &arg);
- if (err < 0)
- goto out_fd;
-
-@@ -3580,6 +3583,10 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
- {
- struct sock *sk = sock->sk;
- const struct proto_ops *ops = READ_ONCE(sock->ops);
-+ struct proto_accept_arg arg = {
-+ .flags = flags,
-+ .kern = true,
-+ };
- int err;
-
- err = sock_create_lite(sk->sk_family, sk->sk_type, sk->sk_protocol,
-@@ -3587,7 +3594,7 @@ int kernel_accept(struct socket *sock, struct socket **newsock, int flags)
- if (err < 0)
- goto done;
-
-- err = ops->accept(sock, *newsock, flags, true);
-+ err = ops->accept(sock, *newsock, &arg);
- if (err < 0) {
- sock_release(*newsock);
- *newsock = NULL;
-diff --git a/net/tipc/socket.c b/net/tipc/socket.c
-index 7e4135db58163..ed656c0ffe3d0 100644
---- a/net/tipc/socket.c
-+++ b/net/tipc/socket.c
-@@ -146,8 +146,6 @@ static void tipc_data_ready(struct sock *sk);
- static void tipc_write_space(struct sock *sk);
- static void tipc_sock_destruct(struct sock *sk);
- static int tipc_release(struct socket *sock);
--static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags,
-- bool kern);
- static void tipc_sk_timeout(struct timer_list *t);
- static int tipc_sk_publish(struct tipc_sock *tsk, struct tipc_uaddr *ua);
- static int tipc_sk_withdraw(struct tipc_sock *tsk, struct tipc_uaddr *ua);
-@@ -2711,13 +2709,12 @@ static int tipc_wait_for_accept(struct socket *sock, long timeo)
- * tipc_accept - wait for connection request
- * @sock: listening socket
- * @new_sock: new socket that is to be connected
-- * @flags: file-related flags associated with socket
-- * @kern: caused by kernel or by userspace?
-+ * @arg: arguments for accept
- *
- * Return: 0 on success, errno otherwise
- */
--static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags,
-- bool kern)
-+static int tipc_accept(struct socket *sock, struct socket *new_sock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *new_sk, *sk = sock->sk;
- struct tipc_sock *new_tsock;
-@@ -2733,14 +2730,14 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags,
- res = -EINVAL;
- goto exit;
- }
-- timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK);
-+ timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK);
- res = tipc_wait_for_accept(sock, timeo);
- if (res)
- goto exit;
-
- buf = skb_peek(&sk->sk_receive_queue);
-
-- res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, kern);
-+ res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, arg->kern);
- if (res)
- goto exit;
- security_sk_clone(sock->sk, new_sock->sk);
-diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
-index a1938ba24a696..417cf4adb4e04 100644
---- a/net/unix/af_unix.c
-+++ b/net/unix/af_unix.c
-@@ -749,7 +749,7 @@ static int unix_bind(struct socket *, struct sockaddr *, int);
- static int unix_stream_connect(struct socket *, struct sockaddr *,
- int addr_len, int flags);
- static int unix_socketpair(struct socket *, struct socket *);
--static int unix_accept(struct socket *, struct socket *, int, bool);
-+static int unix_accept(struct socket *, struct socket *, struct proto_accept_arg *arg);
- static int unix_getname(struct socket *, struct sockaddr *, int);
- static __poll_t unix_poll(struct file *, struct socket *, poll_table *);
- static __poll_t unix_dgram_poll(struct file *, struct socket *,
-@@ -1694,19 +1694,18 @@ static void unix_sock_inherit_flags(const struct socket *old,
- set_bit(SOCK_PASSSEC, &new->flags);
- }
-
--static int unix_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int unix_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk = sock->sk;
- struct sk_buff *skb;
- struct sock *tsk;
-- int err;
-
-- err = -EOPNOTSUPP;
-+ arg->err = -EOPNOTSUPP;
- if (sock->type != SOCK_STREAM && sock->type != SOCK_SEQPACKET)
- goto out;
-
-- err = -EINVAL;
-+ arg->err = -EINVAL;
- if (sk->sk_state != TCP_LISTEN)
- goto out;
-
-@@ -1714,12 +1713,12 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags,
- * so that no locks are necessary.
- */
-
-- skb = skb_recv_datagram(sk, (flags & O_NONBLOCK) ? MSG_DONTWAIT : 0,
-- &err);
-+ skb = skb_recv_datagram(sk, (arg->flags & O_NONBLOCK) ? MSG_DONTWAIT : 0,
-+ &arg->err);
- if (!skb) {
- /* This means receive shutdown. */
-- if (err == 0)
-- err = -EINVAL;
-+ if (arg->err == 0)
-+ arg->err = -EINVAL;
- goto out;
- }
-
-@@ -1737,7 +1736,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags,
- return 0;
-
- out:
-- return err;
-+ return arg->err;
- }
-
-
-diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
-index 54ba7316f8085..4b040285aa78c 100644
---- a/net/vmw_vsock/af_vsock.c
-+++ b/net/vmw_vsock/af_vsock.c
-@@ -1500,8 +1500,8 @@ static int vsock_connect(struct socket *sock, struct sockaddr *addr,
- return err;
- }
-
--static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int vsock_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *listener;
- int err;
-@@ -1528,7 +1528,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,
- /* Wait for children sockets to appear; these are the new sockets
- * created upon connection establishment.
- */
-- timeout = sock_rcvtimeo(listener, flags & O_NONBLOCK);
-+ timeout = sock_rcvtimeo(listener, arg->flags & O_NONBLOCK);
- prepare_to_wait(sk_sleep(listener), &wait, TASK_INTERRUPTIBLE);
-
- while ((connected = vsock_dequeue_accept(listener)) == NULL &&
-diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
-index d18d51412cc00..8dda4178497c9 100644
---- a/net/x25/af_x25.c
-+++ b/net/x25/af_x25.c
-@@ -871,8 +871,8 @@ static int x25_wait_for_data(struct sock *sk, long timeout)
- return rc;
- }
-
--static int x25_accept(struct socket *sock, struct socket *newsock, int flags,
-- bool kern)
-+static int x25_accept(struct socket *sock, struct socket *newsock,
-+ struct proto_accept_arg *arg)
- {
- struct sock *sk = sock->sk;
- struct sock *newsk;
---
-2.43.0
-