diff options
Diffstat (limited to 'net/core/sock.c')
| -rw-r--r-- | net/core/sock.c | 30 | 
1 files changed, 25 insertions, 5 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index a692ef49c9bb..b261a7977746 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -186,8 +186,10 @@ void mem_cgroup_sockets_destroy(struct mem_cgroup *memcg)  static struct lock_class_key af_family_keys[AF_MAX];  static struct lock_class_key af_family_slock_keys[AF_MAX]; +#if defined(CONFIG_MEMCG_KMEM)  struct static_key memcg_socket_limit_enabled;  EXPORT_SYMBOL(memcg_socket_limit_enabled); +#endif  /*   * Make lock validator output more readable. (we pre-construct these @@ -583,7 +585,7 @@ static int sock_getbindtodevice(struct sock *sk, char __user *optval,  		goto out;  retry: -	seq = read_seqbegin(&devnet_rename_seq); +	seq = read_seqcount_begin(&devnet_rename_seq);  	rcu_read_lock();  	dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if);  	ret = -ENODEV; @@ -594,7 +596,7 @@ retry:  	strcpy(devname, dev->name);  	rcu_read_unlock(); -	if (read_seqretry(&devnet_rename_seq, seq)) +	if (read_seqcount_retry(&devnet_rename_seq, seq))  		goto retry;  	len = strlen(devname) + 1; @@ -665,6 +667,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,  	case SO_REUSEADDR:  		sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);  		break; +	case SO_REUSEPORT: +		sk->sk_reuseport = valbool; +		break;  	case SO_TYPE:  	case SO_PROTOCOL:  	case SO_DOMAIN: @@ -861,6 +866,13 @@ set_rcvbuf:  		ret = sk_detach_filter(sk);  		break; +	case SO_LOCK_FILTER: +		if (sock_flag(sk, SOCK_FILTER_LOCKED) && !valbool) +			ret = -EPERM; +		else +			sock_valbool_flag(sk, SOCK_FILTER_LOCKED, valbool); +		break; +  	case SO_PASSSEC:  		if (valbool)  			set_bit(SOCK_PASSSEC, &sock->flags); @@ -965,6 +977,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,  		v.val = sk->sk_reuse;  		break; +	case SO_REUSEPORT: +		v.val = sk->sk_reuseport; +		break; +  	case SO_KEEPALIVE:  		v.val = sock_flag(sk, SOCK_KEEPOPEN);  		break; @@ -1140,6 +1156,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,  		goto lenout; +	case SO_LOCK_FILTER: +		v.val = sock_flag(sk, SOCK_FILTER_LOCKED); +		break; +  	default:  		return -ENOPROTOOPT;  	} @@ -2212,7 +2232,7 @@ EXPORT_SYMBOL(sk_reset_timer);  void sk_stop_timer(struct sock *sk, struct timer_list* timer)  { -	if (timer_pending(timer) && del_timer(timer)) +	if (del_timer(timer))  		__sock_put(sk);  }  EXPORT_SYMBOL(sk_stop_timer); @@ -2818,7 +2838,7 @@ static const struct file_operations proto_seq_fops = {  static __net_init int proto_init_net(struct net *net)  { -	if (!proc_net_fops_create(net, "protocols", S_IRUGO, &proto_seq_fops)) +	if (!proc_create("protocols", S_IRUGO, net->proc_net, &proto_seq_fops))  		return -ENOMEM;  	return 0; @@ -2826,7 +2846,7 @@ static __net_init int proto_init_net(struct net *net)  static __net_exit void proto_exit_net(struct net *net)  { -	proc_net_remove(net, "protocols"); +	remove_proc_entry("protocols", net->proc_net);  }  |