net: Make sure BHs are disabled in sock_prot_inuse_add()
authorEric Dumazet <dada1@cosmosbay.com>
Mon, 24 Nov 2008 08:09:29 +0000 (00:09 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Nov 2008 08:09:29 +0000 (00:09 -0800)
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>
net/ipv4/inet_hashtables.c
net/packet/af_packet.c
net/unix/af_unix.c

index 11fcb87a1fddff0c7626f2e84d785b9f01398eb5..6a1045da48d21774a78f0466deefed4539005306 100644 (file)
@@ -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);
 
index b4870a34c435a02d46b4e26651e5d0fcc1abfa25..5f94db2f3e9ed410e58f660f3ab3c0468e68ff92 100644 (file)
@@ -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;
index a45a9f7369ed751206f662932051463f6fbf5c52..3a35a6e8bf918aca54689fe945bd7e667fecd973 100644 (file)
@@ -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;
 }