summaryrefslogtreecommitdiff
path: root/net/rxrpc/conn_service.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2016-06-29 14:40:39 +0100
committerDavid Howells <dhowells@redhat.com>2016-07-06 10:49:57 +0100
commitd991b4a32f65076efaf78739c4a46406ca8c7e79 (patch)
treee300115d7a3a8fcd6c35eab1b409b81f6719cedd /net/rxrpc/conn_service.c
parent7877a4a4bdf0d782276f1cba868878aee77718ee (diff)
rxrpc: Move peer lookup from call-accept to new-incoming-conn
Move the lookup of a peer from a call that's being accepted into the function that creates a new incoming connection. This will allow us to avoid incrementing the peer's usage count in some cases in future. Note that I haven't bother to integrate rxrpc_get_addr_from_skb() with rxrpc_extract_addr_from_skb() as I'm going to delete the former in the very near future. Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'net/rxrpc/conn_service.c')
-rw-r--r--net/rxrpc/conn_service.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/net/rxrpc/conn_service.c b/net/rxrpc/conn_service.c
index cdcac50cd1a8..a42b210c40a5 100644
--- a/net/rxrpc/conn_service.c
+++ b/net/rxrpc/conn_service.c
@@ -16,17 +16,24 @@
* get a record of an incoming connection
*/
struct rxrpc_connection *rxrpc_incoming_connection(struct rxrpc_local *local,
- struct rxrpc_peer *peer,
+ struct sockaddr_rxrpc *srx,
struct sk_buff *skb)
{
struct rxrpc_connection *conn, *candidate = NULL;
struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
+ struct rxrpc_peer *peer;
struct rb_node *p, **pp;
const char *new = "old";
u32 epoch, cid;
_enter("");
+ peer = rxrpc_lookup_peer(local, srx, GFP_NOIO);
+ if (!peer) {
+ _debug("no peer");
+ return ERR_PTR(-EBUSY);
+ }
+
ASSERT(sp->hdr.flags & RXRPC_CLIENT_INITIATED);
epoch = sp->hdr.epoch;
@@ -58,6 +65,7 @@ struct rxrpc_connection *rxrpc_incoming_connection(struct rxrpc_local *local,
* redo the search */
candidate = rxrpc_alloc_connection(GFP_NOIO);
if (!candidate) {
+ rxrpc_put_peer(peer);
_leave(" = -ENOMEM");
return ERR_PTR(-ENOMEM);
}
@@ -114,6 +122,7 @@ struct rxrpc_connection *rxrpc_incoming_connection(struct rxrpc_local *local,
success:
_net("CONNECTION %s %d {%x}", new, conn->debug_id, conn->proto.cid);
+ rxrpc_put_peer(peer);
_leave(" = %p {u=%d}", conn, atomic_read(&conn->usage));
return conn;