summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)
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 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)
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 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)
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;
}