Acked-by: Jon Maloy <jon.ma...@ericsson.se>

Thanks, Partha.
///jon

> -----Original Message-----
> From: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@gmail.com>
> Sent: 8-May-19 04:52
> To: tipc-discussion@lists.sourceforge.net; Jon Maloy
> <jon.ma...@ericsson.com>; ying....@windriver.com
> Cc: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@gmail.com>
> Subject: [PATCH net v1] tipc: fix hanging clients using poll with EPOLLOUT 
> flag
> 
> commit 517d7c79bdb398 ("tipc: fix hanging poll() for stream sockets")
> introduced a regression for clients using non-blocking sockets.
> After the commit, we send EPOLLOUT event to the client even in
> TIPC_CONNECTING state. This causes the subsequent send() to fail with
> ENOTCONN, as the socket is still not in TIPC_ESTABLISHED state.
> 
> In this commit, we:
> - improve the fix for hanging poll() by replacing sk_data_ready()
>   with sk_state_change() to wake up all clients.
> - revert the faulty updates introduced by commit 517d7c79bdb398
>   ("tipc: fix hanging poll() for stream sockets").
> 
> Fixes: 517d7c79bdb398 ("tipc: fix hanging poll() for stream sockets")
> Signed-off-by: Parthasarathy Bhuvaragan
> <parthasarathy.bhuvara...@gmail.com>
> ---
>  net/tipc/socket.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/net/tipc/socket.c b/net/tipc/socket.c index
> b542f14ed444..2851937f6e32 100644
> --- a/net/tipc/socket.c
> +++ b/net/tipc/socket.c
> @@ -734,11 +734,11 @@ static __poll_t tipc_poll(struct file *file, struct
> socket *sock,
> 
>       switch (sk->sk_state) {
>       case TIPC_ESTABLISHED:
> -     case TIPC_CONNECTING:
>               if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk))
>                       revents |= EPOLLOUT;
>               /* fall through */
>       case TIPC_LISTEN:
> +     case TIPC_CONNECTING:
>               if (!skb_queue_empty(&sk->sk_receive_queue))
>                       revents |= EPOLLIN | EPOLLRDNORM;
>               break;
> @@ -2041,7 +2041,7 @@ static bool tipc_sk_filter_connect(struct tipc_sock
> *tsk, struct sk_buff *skb)
>                       if (msg_data_sz(hdr))
>                               return true;
>                       /* Empty ACK-, - wake up sleeping connect() and
> drop */
> -                     sk->sk_data_ready(sk);
> +                     sk->sk_state_change(sk);
>                       msg_set_dest_droppable(hdr, 1);
>                       return false;
>               }
> --
> 2.21.0



_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to