Commit bb6aaf73 authored by Gabriel Krisman Bertazi's avatar Gabriel Krisman Bertazi Committed by Jens Axboe
Browse files

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: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarGabriel Krisman Bertazi <krisman@suse.de>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Acked-by: default avatarJakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/r/20240614163047.31581-2-krisman@suse.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent dc2e7797
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -1870,15 +1870,10 @@ 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(int fd, int backlog)
int __sys_listen_socket(struct socket *sock, int backlog)
{
	struct socket *sock;
	int err, fput_needed;
	int somaxconn;
	int somaxconn, err;

	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;
@@ -1886,7 +1881,17 @@ int __sys_listen(int fd, int backlog)
	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;

	sock = sockfd_lookup_light(fd, &err, &fput_needed);
	if (sock) {
		err = __sys_listen_socket(sock, backlog);
		fput_light(sock->file, fput_needed);
	}
	return err;