Skip to content

Commit bb6aaf7

Browse files
krismanaxboe
authored andcommitted
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]>
1 parent dc2e779 commit bb6aaf7

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

include/linux/socket.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr,
449449
extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
450450
int addrlen);
451451
extern int __sys_listen(int fd, int backlog);
452+
extern int __sys_listen_socket(struct socket *sock, int backlog);
452453
extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
453454
int __user *usockaddr_len);
454455
extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,

net/socket.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,23 +1870,28 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
18701870
* necessary for a listen, and if that works, we mark the socket as
18711871
* ready for listening.
18721872
*/
1873+
int __sys_listen_socket(struct socket *sock, int backlog)
1874+
{
1875+
int somaxconn, err;
1876+
1877+
somaxconn = READ_ONCE(sock_net(sock->sk)->core.sysctl_somaxconn);
1878+
if ((unsigned int)backlog > somaxconn)
1879+
backlog = somaxconn;
1880+
1881+
err = security_socket_listen(sock, backlog);
1882+
if (!err)
1883+
err = READ_ONCE(sock->ops)->listen(sock, backlog);
1884+
return err;
1885+
}
18731886

18741887
int __sys_listen(int fd, int backlog)
18751888
{
18761889
struct socket *sock;
18771890
int err, fput_needed;
1878-
int somaxconn;
18791891

18801892
sock = sockfd_lookup_light(fd, &err, &fput_needed);
18811893
if (sock) {
1882-
somaxconn = READ_ONCE(sock_net(sock->sk)->core.sysctl_somaxconn);
1883-
if ((unsigned int)backlog > somaxconn)
1884-
backlog = somaxconn;
1885-
1886-
err = security_socket_listen(sock, backlog);
1887-
if (!err)
1888-
err = READ_ONCE(sock->ops)->listen(sock, backlog);
1889-
1894+
err = __sys_listen_socket(sock, backlog);
18901895
fput_light(sock->file, fput_needed);
18911896
}
18921897
return err;

0 commit comments

Comments
 (0)