aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/sock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/sock.c')
-rw-r--r--net/core/sock.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/net/core/sock.c b/net/core/sock.c
index a692ef49c9bb..fe96c5d34299 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -583,7 +583,7 @@ static int sock_getbindtodevice(struct sock *sk, char __user *optval,
583 goto out; 583 goto out;
584 584
585retry: 585retry:
586 seq = read_seqbegin(&devnet_rename_seq); 586 seq = read_seqcount_begin(&devnet_rename_seq);
587 rcu_read_lock(); 587 rcu_read_lock();
588 dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if); 588 dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if);
589 ret = -ENODEV; 589 ret = -ENODEV;
@@ -594,7 +594,7 @@ retry:
594 594
595 strcpy(devname, dev->name); 595 strcpy(devname, dev->name);
596 rcu_read_unlock(); 596 rcu_read_unlock();
597 if (read_seqretry(&devnet_rename_seq, seq)) 597 if (read_seqcount_retry(&devnet_rename_seq, seq))
598 goto retry; 598 goto retry;
599 599
600 len = strlen(devname) + 1; 600 len = strlen(devname) + 1;
@@ -665,6 +665,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
665 case SO_REUSEADDR: 665 case SO_REUSEADDR:
666 sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE); 666 sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
667 break; 667 break;
668 case SO_REUSEPORT:
669 sk->sk_reuseport = valbool;
670 break;
668 case SO_TYPE: 671 case SO_TYPE:
669 case SO_PROTOCOL: 672 case SO_PROTOCOL:
670 case SO_DOMAIN: 673 case SO_DOMAIN:
@@ -861,6 +864,13 @@ set_rcvbuf:
861 ret = sk_detach_filter(sk); 864 ret = sk_detach_filter(sk);
862 break; 865 break;
863 866
867 case SO_LOCK_FILTER:
868 if (sock_flag(sk, SOCK_FILTER_LOCKED) && !valbool)
869 ret = -EPERM;
870 else
871 sock_valbool_flag(sk, SOCK_FILTER_LOCKED, valbool);
872 break;
873
864 case SO_PASSSEC: 874 case SO_PASSSEC:
865 if (valbool) 875 if (valbool)
866 set_bit(SOCK_PASSSEC, &sock->flags); 876 set_bit(SOCK_PASSSEC, &sock->flags);
@@ -965,6 +975,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
965 v.val = sk->sk_reuse; 975 v.val = sk->sk_reuse;
966 break; 976 break;
967 977
978 case SO_REUSEPORT:
979 v.val = sk->sk_reuseport;
980 break;
981
968 case SO_KEEPALIVE: 982 case SO_KEEPALIVE:
969 v.val = sock_flag(sk, SOCK_KEEPOPEN); 983 v.val = sock_flag(sk, SOCK_KEEPOPEN);
970 break; 984 break;
@@ -1140,6 +1154,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
1140 1154
1141 goto lenout; 1155 goto lenout;
1142 1156
1157 case SO_LOCK_FILTER:
1158 v.val = sock_flag(sk, SOCK_FILTER_LOCKED);
1159 break;
1160
1143 default: 1161 default:
1144 return -ENOPROTOOPT; 1162 return -ENOPROTOOPT;
1145 } 1163 }
@@ -2212,7 +2230,7 @@ EXPORT_SYMBOL(sk_reset_timer);
2212 2230
2213void sk_stop_timer(struct sock *sk, struct timer_list* timer) 2231void sk_stop_timer(struct sock *sk, struct timer_list* timer)
2214{ 2232{
2215 if (timer_pending(timer) && del_timer(timer)) 2233 if (del_timer(timer))
2216 __sock_put(sk); 2234 __sock_put(sk);
2217} 2235}
2218EXPORT_SYMBOL(sk_stop_timer); 2236EXPORT_SYMBOL(sk_stop_timer);
@@ -2818,7 +2836,7 @@ static const struct file_operations proto_seq_fops = {
2818 2836
2819static __net_init int proto_init_net(struct net *net) 2837static __net_init int proto_init_net(struct net *net)
2820{ 2838{
2821 if (!proc_net_fops_create(net, "protocols", S_IRUGO, &proto_seq_fops)) 2839 if (!proc_create("protocols", S_IRUGO, net->proc_net, &proto_seq_fops))
2822 return -ENOMEM; 2840 return -ENOMEM;
2823 2841
2824 return 0; 2842 return 0;
@@ -2826,7 +2844,7 @@ static __net_init int proto_init_net(struct net *net)
2826 2844
2827static __net_exit void proto_exit_net(struct net *net) 2845static __net_exit void proto_exit_net(struct net *net)
2828{ 2846{
2829 proc_net_remove(net, "protocols"); 2847 remove_proc_entry("protocols", net->proc_net);
2830} 2848}
2831 2849
2832 2850