On 12/26/19 9:04 AM, Tuong Lien Tong wrote: > Hi Ying, > > Actually, the 'done' flag has been set in the particular case (since the > 'sk->sk_state' changed to 'TIPC_DISCONNECTING' after receiving a rejection > of its SYN from server...) and what we want to achieve is the error code > from the 'sock_error(sk)' to be returned to user correctly. > For your code, there is no difference, the function would still return '0' > for the said case.
--- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -2435,7 +2435,7 @@ static int tipc_wait_for_connect(struct socket *sock, long *timeo_p) done = sk_wait_event(sk, timeo_p, sk->sk_state != TIPC_CONNECTING, &wait); remove_wait_queue(sk_sleep(sk), &wait); - } while (!done); + } while (!done || sk->sk_err); return 0; } Sorry, in my understanding, if this case you mentioned above occurs, "done" will be really set to 1, which means "while loop" will exit and then 0 will be returned to 0. This is our current problem. But, if we add "sk->sk_err" as another while statement condition, the while loop will not exit because "sk->sk_err" is not 0. As a consequence, in next loop, sock error code will be returned to user because sock_error() is not 0. > I considered an alternative that: > > done = sk_wait_event(sk, timeo_p, > sk->sk_state != TIPC_CONNECTING, > &wait); > remove_wait_queue(sk_sleep(sk), &wait); > } while (!done); > - return 0; > + return sock_err(sk); > > but this could get more concerns or we should check the socket state at the > return e.g. > return (sk->sk_state != TIPC_ESTABLISHED) ? sock_err(sk) : 0; > > and the fact is that we have this code already in the while statement, so I > have decided to go with the code below. _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion