|
@@ -2317,10 +2317,13 @@ static int packet_release(struct socket *sock)
|
|
|
net = sock_net(sk);
|
|
|
po = pkt_sk(sk);
|
|
|
|
|
|
- spin_lock_bh(&net->packet.sklist_lock);
|
|
|
+ mutex_lock(&net->packet.sklist_lock);
|
|
|
sk_del_node_init_rcu(sk);
|
|
|
+ mutex_unlock(&net->packet.sklist_lock);
|
|
|
+
|
|
|
+ preempt_disable();
|
|
|
sock_prot_inuse_add(net, sk->sk_prot, -1);
|
|
|
- spin_unlock_bh(&net->packet.sklist_lock);
|
|
|
+ preempt_enable();
|
|
|
|
|
|
spin_lock(&po->bind_lock);
|
|
|
unregister_prot_hook(sk, false);
|
|
@@ -2519,10 +2522,13 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
|
|
|
register_prot_hook(sk);
|
|
|
}
|
|
|
|
|
|
- spin_lock_bh(&net->packet.sklist_lock);
|
|
|
+ mutex_lock(&net->packet.sklist_lock);
|
|
|
sk_add_node_rcu(sk, &net->packet.sklist);
|
|
|
+ mutex_unlock(&net->packet.sklist_lock);
|
|
|
+
|
|
|
+ preempt_disable();
|
|
|
sock_prot_inuse_add(net, &packet_proto, 1);
|
|
|
- spin_unlock_bh(&net->packet.sklist_lock);
|
|
|
+ preempt_enable();
|
|
|
|
|
|
return 0;
|
|
|
out:
|
|
@@ -3775,7 +3781,7 @@ static const struct file_operations packet_seq_fops = {
|
|
|
|
|
|
static int __net_init packet_net_init(struct net *net)
|
|
|
{
|
|
|
- spin_lock_init(&net->packet.sklist_lock);
|
|
|
+ mutex_init(&net->packet.sklist_lock);
|
|
|
INIT_HLIST_HEAD(&net->packet.sklist);
|
|
|
|
|
|
if (!proc_net_fops_create(net, "packet", 0, &packet_seq_fops))
|