lkml.org 
[lkml]   [2009]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 1/2] RxRPC: Don't attempt to reuse aborted connections
Date
Connections that have seen a connection-level abort should not be reused as the
far end will just abort them again; instead a new connection should be made.

Connection-level aborts occur due to such things as authentication failures.

Signed-off-by: David Howells <dhowells@redhat.com>
---

net/rxrpc/ar-connection.c | 10 ++++++++++
net/rxrpc/ar-connevent.c | 7 ++++++-
2 files changed, 16 insertions(+), 1 deletions(-)


diff --git a/net/rxrpc/ar-connection.c b/net/rxrpc/ar-connection.c
index 67e38a0..9f1ce84 100644
--- a/net/rxrpc/ar-connection.c
+++ b/net/rxrpc/ar-connection.c
@@ -444,6 +444,11 @@ int rxrpc_connect_call(struct rxrpc_sock *rx,
conn = list_entry(bundle->avail_conns.next,
struct rxrpc_connection,
bundle_link);
+ if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) {
+ list_del_init(&conn->bundle_link);
+ bundle->num_conns--;
+ continue;
+ }
if (--conn->avail_calls == 0)
list_move(&conn->bundle_link,
&bundle->busy_conns);
@@ -461,6 +466,11 @@ int rxrpc_connect_call(struct rxrpc_sock *rx,
conn = list_entry(bundle->unused_conns.next,
struct rxrpc_connection,
bundle_link);
+ if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) {
+ list_del_init(&conn->bundle_link);
+ bundle->num_conns--;
+ continue;
+ }
ASSERTCMP(conn->avail_calls, ==, RXRPC_MAXCALLS);
conn->avail_calls = RXRPC_MAXCALLS - 1;
ASSERT(conn->channels[0] == NULL &&
diff --git a/net/rxrpc/ar-connevent.c b/net/rxrpc/ar-connevent.c
index dc5cb1e..0505cdc 100644
--- a/net/rxrpc/ar-connevent.c
+++ b/net/rxrpc/ar-connevent.c
@@ -150,11 +150,15 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
u32 serial;
int loop, ret;

- if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED)
+ if (conn->state >= RXRPC_CONN_REMOTELY_ABORTED) {
+ kleave(" = -ECONNABORTED [%u]", conn->state);
return -ECONNABORTED;
+ }

serial = ntohl(sp->hdr.serial);

+ _enter("{%d},{%u,%%%u},", conn->debug_id, sp->hdr.type, serial);
+
switch (sp->hdr.type) {
case RXRPC_PACKET_TYPE_ABORT:
if (skb_copy_bits(skb, 0, &tmp, sizeof(tmp)) < 0)
@@ -199,6 +203,7 @@ static int rxrpc_process_event(struct rxrpc_connection *conn,
return 0;

default:
+ _leave(" = -EPROTO [%u]", sp->hdr.type);
return -EPROTO;
}
}


\
 
 \ /
  Last update: 2009-06-16 22:41    [W:0.045 / U:0.040 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site