if (flags & MSG_OOB)
return -EOPNOTSUPP;
+ lock_sock(sk);
+
skb = skb_recv_datagram(sk, flags, &err);
if (!skb) {
if (sk->sk_shutdown & RCV_SHUTDOWN)
err = 0;
+ release_sock(sk);
return err;
}
skb_free_datagram(sk, skb);
+ release_sock(sk);
+
if (flags & MSG_TRUNC)
copied = skblen;
if (sk->sk_state == BT_LISTEN)
return -EINVAL;
- spin_lock(&sk->sk_receive_queue.lock);
+ lock_sock(sk);
skb = skb_peek(&sk->sk_receive_queue);
amount = skb ? skb->len : 0;
- spin_unlock(&sk->sk_receive_queue.lock);
-
+ release_sock(sk);
err = put_user(amount, (int __user *)arg);
break;