aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorEric Dumazet <dada1@cosmosbay.com>2008-11-24 00:09:29 -0800
committerDavid S. Miller <davem@davemloft.net>2008-11-24 00:09:29 -0800
commit920de804bca61f88643bc9171bcd06f1a56c6258 (patch)
treefb4c90b4b167a4b7518ea888e99bfd18a7d301fb /net
parent1f87e235e6fb92c2968b52b9191de04f1aff8e77 (diff)
downloadkernel_samsung_espresso10-920de804bca61f88643bc9171bcd06f1a56c6258.zip
kernel_samsung_espresso10-920de804bca61f88643bc9171bcd06f1a56c6258.tar.gz
kernel_samsung_espresso10-920de804bca61f88643bc9171bcd06f1a56c6258.tar.bz2
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>
Diffstat (limited to '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 11fcb87..6a1045d 100644
--- a/net/ipv4/inet_hashtables.c
+++ b/net/ipv4/inet_hashtables.c
@@ -402,9 +402,9 @@ void inet_unhash(struct sock *sk)
spin_lock_bh(lock);
done =__sk_nulls_del_node_init_rcu(sk);
- spin_unlock_bh(lock);
if (done)
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
+ spin_unlock_bh(lock);
}
EXPORT_SYMBOL_GPL(inet_unhash);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index b4870a3..5f94db2 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -872,6 +872,7 @@ static int packet_release(struct socket *sock)
write_lock_bh(&net->packet.sklist_lock);
sk_del_node_init(sk);
+ sock_prot_inuse_add(net, sk->sk_prot, -1);
write_unlock_bh(&net->packet.sklist_lock);
/*
@@ -910,7 +911,6 @@ static int packet_release(struct socket *sock)
skb_queue_purge(&sk->sk_receive_queue);
sk_refcnt_debug_release(sk);
- sock_prot_inuse_add(net, sk->sk_prot, -1);
sock_put(sk);
return 0;
}
@@ -1085,8 +1085,8 @@ static int packet_create(struct net *net, struct socket *sock, int protocol)
write_lock_bh(&net->packet.sklist_lock);
sk_add_node(sk, &net->packet.sklist);
- write_unlock_bh(&net->packet.sklist_lock);
sock_prot_inuse_add(net, &packet_proto, 1);
+ write_unlock_bh(&net->packet.sklist_lock);
return(0);
out:
return err;
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index a45a9f7..3a35a6e 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)
out:
if (sk == NULL)
atomic_dec(&unix_nr_socks);
- else
+ else {
+ local_bh_disable();
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
-
+ local_bh_enable();
+ }
return sk;
}