net: Make sure BHs are disabled in sock_prot_inuse_add()
authorDavid S. Miller <davem@davemloft.net>
Mon, 24 Nov 2008 01:34:03 +0000 (17:34 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Nov 2008 01:34:03 +0000 (17:34 -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.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/netlink/af_netlink.c
net/sctp/socket.c
net/unix/af_unix.c

index a2071dcfe9e8514cf9aad61aa6308bc596c8b176..c7d76579bf3cbe89c4c8436f87f932a53f519e2e 100644 (file)
@@ -452,7 +452,10 @@ static int netlink_create(struct net *net, struct socket *sock, int protocol)
        if (err < 0)
                goto out_module;
 
+       local_bh_disable();
        sock_prot_inuse_add(net, &netlink_proto, 1);
+       local_bh_enable();
+
        nlk = nlk_sk(sock->sk);
        nlk->module = module;
 out:
index 0c70eff0b757d11365a5b91495979bd53badfd33..f03af84edf63c2073efcfcc3f488d1d2cd15048b 100644 (file)
@@ -3614,7 +3614,11 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk)
 
        SCTP_DBG_OBJCNT_INC(sock);
        atomic_inc(&sctp_sockets_allocated);
+
+       local_bh_disable();
        sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
+       local_bh_enable();
+
        return 0;
 }
 
index e1ca8f744ca5d1fe457d043dcf72a53f6aa98ccb..a45a9f7369ed751206f662932051463f6fbf5c52 100644 (file)
@@ -361,7 +361,9 @@ static void unix_sock_destructor(struct sock *sk)
                unix_release_addr(u->addr);
 
        atomic_dec(&unix_nr_socks);
+       local_bh_disable();
        sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
+       local_bh_enable();
 #ifdef UNIX_REFCNT_DEBUG
        printk(KERN_DEBUG "UNIX %p is destroyed, %d are still alive.\n", sk,
                atomic_read(&unix_nr_socks));