diff options
| -rw-r--r-- | include/linux/socket.h | 1 | ||||
| -rw-r--r-- | include/net/net_namespace.h | 1 | ||||
| -rw-r--r-- | net/core/sysctl_net_core.c | 4 | ||||
| -rw-r--r-- | net/socket.c | 8 | 
4 files changed, 8 insertions, 6 deletions
diff --git a/include/linux/socket.h b/include/linux/socket.h index eb5bdd59a64..bd2b30a74e7 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -24,7 +24,6 @@ struct __kernel_sockaddr_storage {  #include <linux/types.h>		/* pid_t			*/  #include <linux/compiler.h>		/* __user			*/ -extern int sysctl_somaxconn;  #ifdef CONFIG_PROC_FS  struct seq_file;  extern void socket_seq_show(struct seq_file *seq); diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index d5936115d97..b62e31fca47 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -39,6 +39,7 @@ struct net {  	/* core sysctls */  	struct ctl_table_header	*sysctl_core_hdr; +	int			sysctl_somaxconn;  	/* List of all packet sockets. */  	rwlock_t		packet_sklist_lock; diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index dc4cf7dda9d..130338f83ae 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c @@ -127,7 +127,7 @@ static struct ctl_table net_core_table[] = {  	{  		.ctl_name	= NET_CORE_SOMAXCONN,  		.procname	= "somaxconn", -		.data		= &sysctl_somaxconn, +		.data		= &init_net.sysctl_somaxconn,  		.maxlen		= sizeof(int),  		.mode		= 0644,  		.proc_handler	= &proc_dointvec @@ -161,6 +161,8 @@ static __net_init int sysctl_core_net_init(struct net *net)  {  	struct ctl_table *tbl, *tmp; +	net->sysctl_somaxconn = SOMAXCONN; +  	tbl = net_core_table;  	if (net != &init_net) {  		tbl = kmemdup(tbl, sizeof(net_core_table), GFP_KERNEL); diff --git a/net/socket.c b/net/socket.c index 9ebca5c695d..7651de00850 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1365,17 +1365,17 @@ asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)   *	ready for listening.   */ -int sysctl_somaxconn __read_mostly = SOMAXCONN; -  asmlinkage long 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) { -		if ((unsigned)backlog > sysctl_somaxconn) -			backlog = sysctl_somaxconn; +		somaxconn = sock->sk->sk_net->sysctl_somaxconn; +		if ((unsigned)backlog > somaxconn) +			backlog = somaxconn;  		err = security_socket_listen(sock, backlog);  		if (!err)  |