@ -718,7 +718,6 @@ static int xs_tcp_send_request(struct rpc_task *task)
dprintk ( " RPC: sendmsg returned unrecognized error %d \n " ,
- status ) ;
case - ECONNRESET :
xs_tcp_shutdown ( xprt ) ;
case - ECONNREFUSED :
case - ENOTCONN :
case - EADDRINUSE :
@ -774,6 +773,21 @@ static void xs_restore_old_callbacks(struct sock_xprt *transport, struct sock *s
sk - > sk_error_report = transport - > old_error_report ;
}
static void xs_sock_reset_connection_flags ( struct rpc_xprt * xprt )
{
smp_mb__before_atomic ( ) ;
clear_bit ( XPRT_CLOSE_WAIT , & xprt - > state ) ;
clear_bit ( XPRT_CLOSING , & xprt - > state ) ;
smp_mb__after_atomic ( ) ;
}
static void xs_sock_mark_closed ( struct rpc_xprt * xprt )
{
xs_sock_reset_connection_flags ( xprt ) ;
/* Mark transport as closed and wake up all pending tasks */
xprt_disconnect_done ( xprt ) ;
}
/**
* xs_error_report - callback to handle TCP socket state errors
* @ sk : socket
@ -793,6 +807,9 @@ static void xs_error_report(struct sock *sk)
err = - sk - > sk_err ;
if ( err = = 0 )
goto out ;
/* Is this a reset event? */
if ( sk - > sk_state = = TCP_CLOSE )
xs_sock_mark_closed ( xprt ) ;
dprintk ( " RPC: xs_error_report client %p, error=%d... \n " ,
xprt , - err ) ;
trace_rpc_socket_error ( xprt , sk - > sk_socket , err ) ;
@ -801,14 +818,6 @@ static void xs_error_report(struct sock *sk)
read_unlock_bh ( & sk - > sk_callback_lock ) ;
}
static void xs_sock_reset_connection_flags ( struct rpc_xprt * xprt )
{
smp_mb__before_atomic ( ) ;
clear_bit ( XPRT_CLOSE_WAIT , & xprt - > state ) ;
clear_bit ( XPRT_CLOSING , & xprt - > state ) ;
smp_mb__after_atomic ( ) ;
}
static void xs_reset_transport ( struct sock_xprt * transport )
{
struct socket * sock = transport - > sock ;
@ -1421,13 +1430,6 @@ out:
read_unlock_bh ( & sk - > sk_callback_lock ) ;
}
static void xs_sock_mark_closed ( struct rpc_xprt * xprt )
{
xs_sock_reset_connection_flags ( xprt ) ;
/* Mark transport as closed and wake up all pending tasks */
xprt_disconnect_done ( xprt ) ;
}
/**
* xs_tcp_state_change - callback to handle TCP socket state changes
* @ sk : socket whose state has changed