struct socket;
 struct sock;
 struct sk_buff;
+struct proto_accept_arg;
 
 #define __sockaddr_check_size(size)    \
        BUILD_BUG_ON(((size) > sizeof(struct __kernel_sockaddr_storage)))
 extern int __sys_sendto(int fd, void __user *buff, size_t len,
                        unsigned int flags, struct sockaddr __user *addr,
                        int addr_len);
-extern struct file *do_accept(struct file *file, unsigned file_flags,
+extern struct file *do_accept(struct file *file, struct proto_accept_arg *arg,
                              struct sockaddr __user *upeer_sockaddr,
                              int __user *upeer_addrlen, int flags);
 extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 
 {
        struct io_accept *accept = io_kiocb_to_cmd(req, struct io_accept);
        bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK;
-       unsigned int file_flags = force_nonblock ? O_NONBLOCK : 0;
        bool fixed = !!accept->file_slot;
+       struct proto_accept_arg arg = {
+               .flags = force_nonblock ? O_NONBLOCK : 0,
+       };
        struct file *file;
        int ret, fd;
 
                if (unlikely(fd < 0))
                        return fd;
        }
-       file = do_accept(req->file, file_flags, accept->addr, accept->addr_len,
+       file = do_accept(req->file, &arg, accept->addr, accept->addr_len,
                         accept->flags);
        if (IS_ERR(file)) {
                if (!fixed)
 
        return __sys_listen(fd, backlog);
 }
 
-struct file *do_accept(struct file *file, unsigned file_flags,
+struct file *do_accept(struct file *file, struct proto_accept_arg *arg,
                       struct sockaddr __user *upeer_sockaddr,
                       int __user *upeer_addrlen, int 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);
        if (err)
                goto out_fd;
 
-       arg.flags |= sock->file->f_flags;
-       err = ops->accept(sock, newsock, &arg);
+       arg->flags |= sock->file->f_flags;
+       err = ops->accept(sock, newsock, arg);
        if (err < 0)
                goto out_fd;
 
 static int __sys_accept4_file(struct file *file, struct sockaddr __user *upeer_sockaddr,
                              int __user *upeer_addrlen, int flags)
 {
+       struct proto_accept_arg arg = { };
        struct file *newfile;
        int newfd;
 
        if (unlikely(newfd < 0))
                return newfd;
 
-       newfile = do_accept(file, 0, upeer_sockaddr, upeer_addrlen,
+       newfile = do_accept(file, &arg, upeer_sockaddr, upeer_addrlen,
                            flags);
        if (IS_ERR(newfile)) {
                put_unused_fd(newfd);