]> git.dujemihanovic.xyz Git - linux.git/commitdiff
net: change proto and proto_ops accept type
authorJens Axboe <axboe@kernel.dk>
Thu, 9 May 2024 15:20:08 +0000 (09:20 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 14 May 2024 00:19:09 +0000 (18:19 -0600)
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>
34 files changed:
crypto/af_alg.c
crypto/algif_hash.c
drivers/xen/pvcalls-back.c
fs/ocfs2/cluster/tcp.c
include/crypto/if_alg.h
include/linux/net.h
include/net/inet_common.h
include/net/inet_connection_sock.h
include/net/sock.h
net/atm/svc.c
net/ax25/af_ax25.c
net/bluetooth/iso.c
net/bluetooth/l2cap_sock.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/sco.c
net/core/sock.c
net/ipv4/af_inet.c
net/ipv4/inet_connection_sock.c
net/iucv/af_iucv.c
net/llc/af_llc.c
net/mptcp/protocol.c
net/netrom/af_netrom.c
net/nfc/llcp_sock.c
net/phonet/pep.c
net/phonet/socket.c
net/rds/tcp_listen.c
net/rose/af_rose.c
net/sctp/socket.c
net/smc/af_smc.c
net/socket.c
net/tipc/socket.c
net/unix/af_unix.c
net/vmw_vsock/af_vsock.c
net/x25/af_x25.c

index 5bc6d0fa7498df30fdf002ec7bcfb46ed4344e8c..18cfead0081dc2eda9836e8f8370b235cddafbf3 100644 (file)
@@ -407,7 +407,8 @@ unlock:
        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 @@ unlock:
 }
 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 = {
index e24c829d7a0154f0ff016152e6913bff105cd93f..7c7394d46a235f32d2b0c024f1c3d0d84715f3ea 100644 (file)
@@ -223,8 +223,8 @@ unlock:
        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 = {
index d52593466a792c966f1bb40259a447d92ab796be..fd7ed65e0197d70436cf8ac08071611cdfe3a2ea 100644 (file)
@@ -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;
index 960080753d3bda79fa1dbe72e1cb09198570cf18..2b8fa3e782fb6b929ebce53425907ebd80fc01d0 100644 (file)
@@ -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;
 
index 78ecaf5db04c6ab359fd26dea5ed586657b17e08..f7b3b93f3a49a73d2de96027203bc150bbc745d3 100644 (file)
@@ -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);
 
index 15df6d5f27a7badcf0974cc688e6ae269bc41a86..688320b79fcc6d0e64b247ff1d0e1ca37dcaf056 100644 (file)
@@ -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);
index f50a644d87a9871fbed2dfd49d4bde9d3df0fd92..c17a6585d0b0b4a7d85e913468acab7dc5575f46 100644 (file)
@@ -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);
index 20e7b0c0b3d1232fa626e3b4ba97af958ae4be95..7d6b1254c92d539ce097c2a2ecc9ece37e652985 100644 (file)
@@ -250,7 +250,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);
 
index 0450494a1766a0136fa7b446e63c7357afd4a6e6..217079b3e3e82c91a1f4de2895c449f6e3f60934 100644 (file)
@@ -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);
@@ -1804,7 +1810,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);
index 36a814f1fbd16f9f4fe789b65f81a06abc6710ff..f8137ae693b08c9aa600c3a02dc13708eb3b22e1 100644 (file)
@@ -324,8 +324,8 @@ out:
        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;
                        }
index 9169efb2f43aa9151131410496d3de24af1f1ccd..8077cf2ee448038fab65e842785f6d18bf0e4dc4 100644 (file)
@@ -1373,8 +1373,8 @@ out_release:
        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;
@@ -1409,7 +1409,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;
                }
index ef0cc80b4c0cc1ff4043d05c05fc0c429a64a6c2..2a075119d65d970eab3810c0495840c9e4e96ff7 100644 (file)
@@ -1186,7 +1186,7 @@ done:
 }
 
 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;
@@ -1195,7 +1195,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);
 
index 5cc83f906c123ffa7349d26a41c310005920aca5..125dddc77452b8f9ac1f5a9b87917b744095a8e7 100644 (file)
@@ -327,7 +327,7 @@ done:
 }
 
 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);
 
index 29aa07e9db9d7122bac6ac0c6dfcd76765f11cb8..37d63d768afb8c6b304102400b2dafefcc2ee659 100644 (file)
@@ -468,8 +468,8 @@ done:
        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);
 
index e0ad30862ee4142cac48d0538fcec9df6e97b8b2..94c6f2b46279770384872b5f132a9dadd8092cd2 100644 (file)
@@ -647,7 +647,7 @@ done:
 }
 
 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);
 
index 8d6e638b5426daf84ff71d22101252943f9c5466..8629f9aecf91a36cdd17d91371b0480894969f2b 100644 (file)
@@ -3241,8 +3241,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;
 }
index a7bad18bc8b58cb790b8cb131455f5fa4c41097c..de3449e16b89675d322ad05b7677ab5e94ebb54d 100644 (file)
@@ -771,16 +771,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);
index 3b38610958ee4bc3d9296c9b5e5fce6ab5c97c2c..7734d189c66b80d2c8d259de7796463ed6a473f1 100644 (file)
@@ -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 @@ out:
 out_err:
        newsk = NULL;
        req = NULL;
-       *err = error;
+       arg->err = error;
        goto out;
 }
 EXPORT_SYMBOL(inet_csk_accept);
index c951bb9cc2e044249ff7e4f86470b4035d60aeaa..c3b0b610b0aa35e9afbd74148efc6e8bb63b2822 100644 (file)
@@ -795,7 +795,7 @@ done:
 
 /* 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);
index fde1140d899efc7ba02e6bc3998cb857ef30df14..4eb52add7103b0f83d6fe7318abf1d1af533d254 100644 (file)
@@ -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;
index bb8f96f2b86fe03e37c601711b957613c7c1fc13..815ce439183c3b994e43119672bb7062a4891de5 100644 (file)
@@ -3881,11 +3881,10 @@ unlock:
 }
 
 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);
 
@@ -3897,9 +3896,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)) {
@@ -3920,7 +3919,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);
 
@@ -3949,7 +3948,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
index 104a80b75477f60199c69811ff48e65af293297c..6ee148f0e6d0425614518957dac2f58320d46b01 100644 (file)
@@ -772,8 +772,8 @@ out_release:
        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;
                }
index d5344563e525c9bc436d5ad0b84380f0bcae62a8..57a2f97004e1722f90c104c107cc399875403f84 100644 (file)
@@ -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);
index 3dd5f52bc1b58e3f1ee4e235126438c723f1f73c..53a858478e22f0fd12bdf29ffaa9266cd7dec666 100644 (file)
@@ -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;
 }
 
index 1018340d89a7d4619a86ac9667ffaf58f2de83fd..5ce0b3ee5def8471ab1231d32bc16840d842bdbd 100644 (file)
@@ -292,18 +292,17 @@ out:
 }
 
 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);
index 05008ce5c4219f8a23e08cd2a295b217697f5606..d89bd8d0c354569a55a9101702a0b87d65fd52ee 100644 (file)
@@ -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;
 
index ef81d019b20f48d80a81d6eeab60808299f813a0..59050caab65c8b7e49d5d928bcd643ed7b803809 100644 (file)
@@ -919,8 +919,8 @@ out_release:
        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;
                }
index 64196b1dce1d4283107c758cf4b6caa78045cc39..c009383369b2671b1be8c220a9b2082b59209bd2 100644 (file)
@@ -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;
 }
 
index 9389f0cfa374ac55e11afaefdfdcbace42ca1df1..e50a286fd0fb77dfe2644d794ffb11d9db332906 100644 (file)
@@ -2689,7 +2689,7 @@ out:
 }
 
 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);
@@ -2708,7 +2708,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);
@@ -2735,7 +2735,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);
index 01a71ae10c35dce86e97794b3f7699b1de9954dd..6ff5f21d963323f29dd5087263d2e696b8dbcafc 100644 (file)
@@ -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;
index 798397b6811e1b88be3aee4c91abc2df4c46ed38..2d58ecae4e2109d2c589440d5fff708638d4d55a 100644 (file)
@@ -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);
index dc16515417232787a2ff769ec382307d967e1941..26e3b5f1ee46e517c6faf9a451259153e3613bdf 100644 (file)
@@ -755,7 +755,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 *,
@@ -1689,19 +1689,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;
 
@@ -1709,12 +1708,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;
        }
 
@@ -1732,7 +1731,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags,
        return 0;
 
 out:
-       return err;
+       return arg->err;
 }
 
 
index 54ba7316f8085d7e1f7335611b8f88d853342696..4b040285aa78c061d636e1a0a75a59fbe931333b 100644 (file)
@@ -1500,8 +1500,8 @@ out:
        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 &&
index d18d51412cc003b6fd76928754375e0934876bfe..8dda4178497c970d1ae3cac220281b50ceb97d86 100644 (file)
@@ -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;