Commit 920de804 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

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: default avatarEric Dumazet <dada1@cosmosbay.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1f87e235
...@@ -402,9 +402,9 @@ void inet_unhash(struct sock *sk) ...@@ -402,9 +402,9 @@ void inet_unhash(struct sock *sk)
spin_lock_bh(lock); spin_lock_bh(lock);
done =__sk_nulls_del_node_init_rcu(sk); done =__sk_nulls_del_node_init_rcu(sk);
spin_unlock_bh(lock);
if (done) if (done)
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
spin_unlock_bh(lock);
} }
EXPORT_SYMBOL_GPL(inet_unhash); EXPORT_SYMBOL_GPL(inet_unhash);
......
...@@ -872,6 +872,7 @@ static int packet_release(struct socket *sock) ...@@ -872,6 +872,7 @@ static int packet_release(struct socket *sock)
write_lock_bh(&net->packet.sklist_lock); write_lock_bh(&net->packet.sklist_lock);
sk_del_node_init(sk); sk_del_node_init(sk);
sock_prot_inuse_add(net, sk->sk_prot, -1);
write_unlock_bh(&net->packet.sklist_lock); write_unlock_bh(&net->packet.sklist_lock);
/* /*
...@@ -910,7 +911,6 @@ static int packet_release(struct socket *sock) ...@@ -910,7 +911,6 @@ static int packet_release(struct socket *sock)
skb_queue_purge(&sk->sk_receive_queue); skb_queue_purge(&sk->sk_receive_queue);
sk_refcnt_debug_release(sk); sk_refcnt_debug_release(sk);
sock_prot_inuse_add(net, sk->sk_prot, -1);
sock_put(sk); sock_put(sk);
return 0; return 0;
} }
...@@ -1085,8 +1085,8 @@ static int packet_create(struct net *net, struct socket *sock, int protocol) ...@@ -1085,8 +1085,8 @@ static int packet_create(struct net *net, struct socket *sock, int protocol)
write_lock_bh(&net->packet.sklist_lock); write_lock_bh(&net->packet.sklist_lock);
sk_add_node(sk, &net->packet.sklist); sk_add_node(sk, &net->packet.sklist);
write_unlock_bh(&net->packet.sklist_lock);
sock_prot_inuse_add(net, &packet_proto, 1); sock_prot_inuse_add(net, &packet_proto, 1);
write_unlock_bh(&net->packet.sklist_lock);
return(0); return(0);
out: out:
return err; return err;
......
...@@ -615,9 +615,11 @@ static struct sock *unix_create1(struct net *net, struct socket *sock) ...@@ -615,9 +615,11 @@ static struct sock *unix_create1(struct net *net, struct socket *sock)
out: out:
if (sk == NULL) if (sk == NULL)
atomic_dec(&unix_nr_socks); atomic_dec(&unix_nr_socks);
else else {
local_bh_disable();
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
local_bh_enable();
}
return sk; return sk;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment