sdp_auto_moderation(ssk);
release_sock(sk);
- sdp_dbg_data(sk, "recvmsg finished. ret = %d\n", err);
+ sdp_dbg_data(sk, "recvmsg finished. ret = %d\n", err);
return err;
recv_urg:
static unsigned int sdp_poll(struct file *file, struct socket *socket,
struct poll_table_struct *wait)
{
- unsigned int mask;
- struct sock *sk = socket->sk;
- struct sdp_sock *ssk = sdp_sk(sk);
+ unsigned int mask;
+ struct sock *sk = socket->sk;
sdp_dbg_data(sk, "%s\n", __func__);
- if (sk->sk_state == TCP_ESTABLISHED) {
- sdp_prf(sk, NULL, "polling");
- if (poll_recv_cq(sk)) {
- sdp_arm_rx_cq(sk);
- }
- }
+ lock_sock(sk);
+ if (sk->sk_state == TCP_ESTABLISHED) {
+ sdp_prf(sk, NULL, "polling");
+ if (poll_recv_cq(sk))
+ sdp_arm_rx_cq(sk);
+ }
mask = datagram_poll(file, socket, wait);
/*
/* TODO: Slightly ugly: it would be nicer if there was function
* like datagram_poll that didn't include poll_wait,
* then we could reverse the order. */
- if (sk->sk_state == TCP_LISTEN)
- return sdp_listen_poll(sk);
+ if (sk->sk_state == TCP_LISTEN) {
+ mask = sdp_listen_poll(sk);
+ goto out;
+ }
- if (ssk->urg_data & TCP_URG_VALID)
+ if (sdp_sk(sk)->urg_data & TCP_URG_VALID)
mask |= POLLPRI;
+out:
+ release_sock(sk);
return mask;
}