mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-29 21:33:00 +01:00
net: Split a __sys_listen helper for io_uring
io_uring holds a reference to the file and maintains a sockaddr_storage address. Similarly to what was done to __sys_connect_file, split an internal helper for __sys_listen in preparation to support an io_uring listen command. Reviewed-by: Jens Axboe <[email protected]> Signed-off-by: Gabriel Krisman Bertazi <[email protected]> Reviewed-by: Kuniyuki Iwashima <[email protected]> Acked-by: Jakub Kicinski <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
1 parent
dc2e779794
commit
bb6aaf7366
2 files changed
+15
-9
No files matched your search
@@ -449,6 +449,7 @@ extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr,
|
||||
extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
|
||||
int addrlen);
|
||||
extern int __sys_listen(int fd, int backlog);
|
||||
extern int __sys_listen_socket(struct socket *sock, int backlog);
|
||||
extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
|
||||
int __user *usockaddr_len);
|
||||
extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
|
||||
|
||||
+14
-9
@@ -1870,23 +1870,28 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
|
||||
* necessary for a listen, and if that works, we mark the socket as
|
||||
* ready for listening.
|
||||
*/
|
||||
int __sys_listen_socket(struct socket *sock, int backlog)
|
||||
{
|
||||
int somaxconn, err;
|
||||
|
||||
somaxconn = READ_ONCE(sock_net(sock->sk)->core.sysctl_somaxconn);
|
||||
if ((unsigned int)backlog > somaxconn)
|
||||
backlog = somaxconn;
|
||||
|
||||
err = security_socket_listen(sock, backlog);
|
||||
if (!err)
|
||||
err = READ_ONCE(sock->ops)->listen(sock, backlog);
|
||||
return err;
|
||||
}
|
||||
|
||||
int __sys_listen(int fd, int backlog)
|
||||
{
|
||||
struct socket *sock;
|
||||
int err, fput_needed;
|
||||
int somaxconn;
|
||||
|
||||
sock = sockfd_lookup_light(fd, &err, &fput_needed);
|
||||
if (sock) {
|
||||
somaxconn = READ_ONCE(sock_net(sock->sk)->core.sysctl_somaxconn);
|
||||
if ((unsigned int)backlog > somaxconn)
|
||||
backlog = somaxconn;
|
||||
|
||||
err = security_socket_listen(sock, backlog);
|
||||
if (!err)
|
||||
err = READ_ONCE(sock->ops)->listen(sock, backlog);
|
||||
|
||||
err = __sys_listen_socket(sock, backlog);
|
||||
fput_light(sock->file, fput_needed);
|
||||
}
|
||||
return err;
|
||||
|
||||
Reference in new issue
Block a user