Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 173677 Details for
Bug 244976
net-fs/nfs-utils - NFS mounts with open files broken after suspend to ram/wake cycle
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
fix replying to tcp resets in sunrpc
sunrcp-respond-promptly-to-server-tcp-resets.patch (text/plain), 4.31 KB, created by
Nick Loeve
on 2008-11-28 18:26:31 UTC
(
hide
)
Description:
fix replying to tcp resets in sunrpc
Filename:
MIME Type:
Creator:
Nick Loeve
Created:
2008-11-28 18:26:31 UTC
Size:
4.31 KB
patch
obsolete
>From: Trond Myklebust <Trond.Myklebust@netapp.com> >Date: Thu, 23 Oct 2008 11:33:59 -0400 >SUNRPC: Respond promptly to server TCP resets > >If the server sends us an RST error while we're in the TCP_ESTABLISHED >state, then that will not result in a state change, and so the RPC client >ends up hanging forever (see >http://bugzilla.kernel.org/show_bug.cgi?id=11154) > >We can intercept the reset by setting up an sk->sk_error_report callback, >which will then allow us to initiate a proper shutdown and retry... > >We also make sure that if the send request receives an ECONNRESET, then we >shutdown too... > >Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> >--- > > net/sunrpc/xprtsock.c | 58 +++++++++++++++++++++++++++++++++++++++++-------- > 1 files changed, 48 insertions(+), 10 deletions(-) > >diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c >index 9a288d5..0a50361 100644 >--- a/net/sunrpc/xprtsock.c >+++ b/net/sunrpc/xprtsock.c >@@ -249,6 +249,7 @@ struct sock_xprt { > void (*old_data_ready)(struct sock *, int); > void (*old_state_change)(struct sock *); > void (*old_write_space)(struct sock *); >+ void (*old_error_report)(struct sock *); > }; > > /* >@@ -698,8 +699,9 @@ static int xs_tcp_send_request(struct rpc_task *task) > case -EAGAIN: > xs_nospace(task); > break; >- case -ECONNREFUSED: > case -ECONNRESET: >+ xs_tcp_shutdown(xprt); >+ case -ECONNREFUSED: > case -ENOTCONN: > case -EPIPE: > status = -ENOTCONN; >@@ -742,6 +744,22 @@ out_release: > xprt_release_xprt(xprt, task); > } > >+static void xs_save_old_callbacks(struct sock_xprt *transport, struct sock *sk) >+{ >+ transport->old_data_ready = sk->sk_data_ready; >+ transport->old_state_change = sk->sk_state_change; >+ transport->old_write_space = sk->sk_write_space; >+ transport->old_error_report = sk->sk_error_report; >+} >+ >+static void xs_restore_old_callbacks(struct sock_xprt *transport, struct sock *sk) >+{ >+ sk->sk_data_ready = transport->old_data_ready; >+ sk->sk_state_change = transport->old_state_change; >+ sk->sk_write_space = transport->old_write_space; >+ sk->sk_error_report = transport->old_error_report; >+} >+ > /** > * xs_close - close a socket > * @xprt: transport >@@ -765,9 +783,8 @@ static void xs_close(struct rpc_xprt *xprt) > transport->sock = NULL; > > sk->sk_user_data = NULL; >- sk->sk_data_ready = transport->old_data_ready; >- sk->sk_state_change = transport->old_state_change; >- sk->sk_write_space = transport->old_write_space; >+ >+ xs_restore_old_callbacks(transport, sk); > write_unlock_bh(&sk->sk_callback_lock); > > sk->sk_no_check = 0; >@@ -1180,6 +1197,28 @@ static void xs_tcp_state_change(struct sock *sk) > } > > /** >+ * xs_tcp_error_report - callback mainly for catching RST events >+ * @sk: socket >+ */ >+static void xs_tcp_error_report(struct sock *sk) >+{ >+ struct rpc_xprt *xprt; >+ >+ read_lock(&sk->sk_callback_lock); >+ if (sk->sk_err != ECONNRESET || sk->sk_state != TCP_ESTABLISHED) >+ goto out; >+ if (!(xprt = xprt_from_sock(sk))) >+ goto out; >+ dprintk("RPC: %s client %p...\n" >+ "RPC: error %d\n", >+ __func__, xprt, sk->sk_err); >+ >+ xprt_force_disconnect(xprt); >+out: >+ read_unlock(&sk->sk_callback_lock); >+} >+ >+/** > * xs_udp_write_space - callback invoked when socket buffer space > * becomes available > * @sk: socket whose state has changed >@@ -1454,10 +1493,9 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) > > write_lock_bh(&sk->sk_callback_lock); > >+ xs_save_old_callbacks(transport, sk); >+ > sk->sk_user_data = xprt; >- transport->old_data_ready = sk->sk_data_ready; >- transport->old_state_change = sk->sk_state_change; >- transport->old_write_space = sk->sk_write_space; > sk->sk_data_ready = xs_udp_data_ready; > sk->sk_write_space = xs_udp_write_space; > sk->sk_no_check = UDP_CSUM_NORCV; >@@ -1589,13 +1627,13 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) > > write_lock_bh(&sk->sk_callback_lock); > >+ xs_save_old_callbacks(transport, sk); >+ > sk->sk_user_data = xprt; >- transport->old_data_ready = sk->sk_data_ready; >- transport->old_state_change = sk->sk_state_change; >- transport->old_write_space = sk->sk_write_space; > sk->sk_data_ready = xs_tcp_data_ready; > sk->sk_state_change = xs_tcp_state_change; > sk->sk_write_space = xs_tcp_write_space; >+ sk->sk_error_report = xs_tcp_error_report; > sk->sk_allocation = GFP_ATOMIC; > > /* socket options */ >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 244976
: 173677 |
173679