tipc: fix broken tipc_poll() function
In commit ae236fb208 ("tipc: receive group membership events via
member socket") we broke the tipc_poll() function by checking the
state of the receive queue before the call to poll_sock_wait(), while
relying that state afterwards, when it might have changed.
We restore this in this commit.
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
471abeabb4
commit
cb4dc41eaa
@@ -714,7 +714,6 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock,
|
|||||||
poll_table *wait)
|
poll_table *wait)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
|
|
||||||
struct tipc_sock *tsk = tipc_sk(sk);
|
struct tipc_sock *tsk = tipc_sk(sk);
|
||||||
struct tipc_group *grp = tsk->group;
|
struct tipc_group *grp = tsk->group;
|
||||||
u32 revents = 0;
|
u32 revents = 0;
|
||||||
@@ -733,7 +732,7 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock,
|
|||||||
/* fall thru' */
|
/* fall thru' */
|
||||||
case TIPC_LISTEN:
|
case TIPC_LISTEN:
|
||||||
case TIPC_CONNECTING:
|
case TIPC_CONNECTING:
|
||||||
if (skb)
|
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||||
revents |= POLLIN | POLLRDNORM;
|
revents |= POLLIN | POLLRDNORM;
|
||||||
break;
|
break;
|
||||||
case TIPC_OPEN:
|
case TIPC_OPEN:
|
||||||
@@ -742,7 +741,7 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock,
|
|||||||
revents |= POLLOUT;
|
revents |= POLLOUT;
|
||||||
if (!tipc_sk_type_connectionless(sk))
|
if (!tipc_sk_type_connectionless(sk))
|
||||||
break;
|
break;
|
||||||
if (!skb)
|
if (skb_queue_empty(&sk->sk_receive_queue))
|
||||||
break;
|
break;
|
||||||
revents |= POLLIN | POLLRDNORM;
|
revents |= POLLIN | POLLRDNORM;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user