aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <dada1@cosmosbay.com>2008-11-24 03:09:29 -0500
committerDavid S. Miller <davem@davemloft.net>2008-11-24 03:09:29 -0500
commit920de804bca61f88643bc9171bcd06f1a56c6258 (patch)
treefb4c90b4b167a4b7518ea888e99bfd18a7d301fb
parent1f87e235e6fb92c2968b52b9191de04f1aff8e77 (diff)
net: Make sure BHs are disabled in sock_prot_inuse_add()
The rule of calling sock_prot_inuse_add() is that BHs must be disabled. Some new calls were added where this was not true and this tiggers warnings as reported by Ilpo. Fix this by adding explicit BH disabling around those call sites, or moving sock_prot_inuse_add() call inside an existing BH disabled section. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/ipv4/inet_hashtables.c2
-rw-r--r--net/packet/af_packet.c4
-rw-r--r--net/unix/af_unix.c6
3 files changed, 7 insertions, 5 deletions
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c
index 11fcb87a1fdd..6a1045da48d2 100644
--- a/net/ipv4/inet_hashtables.c
+++ b/net/ipv4/inet_hashtables.c
@@ -402,9 +402,9 @@ void inet_unhash(struct sock *sk)
402 402
403 spin_lock_bh(lock); 403 spin_lock_bh(lock);
404 done =__sk_nulls_del_node_init_rcu(sk); 404 done =__sk_nulls_del_node_init_rcu(sk);
405 spin_unlock_bh(lock);
406 if (done) 405 if (done)
407 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); 406 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
407 spin_unlock_bh(lock);
408} 408}
409EXPORT_SYMBOL_GPL(inet_unhash); 409EXPORT_SYMBOL_GPL(inet_unhash);
410 410
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index b4870a34c435..5f94db2f3e9e 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -872,6 +872,7 @@ static int packet_release(struct socket *sock)
872 872
873 write_lock_bh(&net->packet.sklist_lock); 873 write_lock_bh(&net->packet.sklist_lock);
874 sk_del_node_init(sk); 874 sk_del_node_init(sk);
875 sock_prot_inuse_add(net, sk->sk_prot, -1);
875 write_unlock_bh(&net->packet.sklist_lock); 876 write_unlock_bh(&net->packet.sklist_lock);
876 877
877 /* 878 /*
@@ -910,7 +911,6 @@ static int packet_release(struct socket *sock)
910 skb_queue_purge(&sk->sk_receive_queue); 911 skb_queue_purge(&sk->sk_receive_queue);
911 sk_refcnt_debug_release(sk); 912 sk_refcnt_debug_release(sk);
912 913
913 sock_prot_inuse_add(net, sk->sk_prot, -1);
914 sock_put(sk); 914 sock_put(sk);
915 return 0; 915 return 0;
916} 916}
@@ -1085,8 +1085,8 @@ static int packet_create(struct net *net, struct socket *sock, int protocol)
1085 1085
1086 write_lock_bh(&net->packet.sklist_lock); 1086 write_lock_bh(&net->packet.sklist_lock);
1087 sk_add_node(sk, &net->packet.sklist); 1087 sk_add_node(sk, &net->packet.sklist);
1088 write_unlock_bh(&net->packet.sklist_lock);
1089 sock_prot_inuse_add(net, &packet_proto, 1); 1088 sock_prot_inuse_add(net, &packet_proto, 1);
1089 write_unlock_bh(&net->packet.sklist_lock);
1090 return(0); 1090 return(0);
1091out: 1091out:
1092 return err; 1092 return err;
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index a45a9f7369ed..3a35a6e8bf91 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -615,9 +615,11 @@ static struct sock *unix_create1(struct net *net, struct socket *sock)
615out: 615out:
616 if (sk == NULL) 616 if (sk == NULL)
617 atomic_dec(&unix_nr_socks); 617 atomic_dec(&unix_nr_socks);
618 else 618 else {
619 local_bh_disable();
619 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); 620 sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
620 621 local_bh_enable();
622 }
621 return sk; 623 return sk;
622} 624}
623 625