SUNRPC: Pass a pointer to struct rpc_xprt to the connect callback
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 8 Jan 2013 14:26:49 +0000 (09:26 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 1 Feb 2013 15:13:47 +0000 (10:13 -0500)
Avoid another RCU dereference by passing the pointer to struct rpc_xprt
from the caller.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
include/linux/sunrpc/xprt.h
net/sunrpc/xprt.c
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtsock.c

index 951cb9b7d02b9167982135a6245972c18605f1a0..7dd598a5c9aad795ca2a6028a5848e81c0a88f75 100644 (file)
@@ -117,7 +117,7 @@ struct rpc_xprt_ops {
        void            (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
        void            (*rpcbind)(struct rpc_task *task);
        void            (*set_port)(struct rpc_xprt *xprt, unsigned short port);
-       void            (*connect)(struct rpc_task *task);
+       void            (*connect)(struct rpc_xprt *xprt, struct rpc_task *task);
        void *          (*buf_alloc)(struct rpc_task *task, size_t size);
        void            (*buf_free)(void *buffer);
        int             (*send_request)(struct rpc_task *task);
index 738ad59628cdb656bbd12656c9a22343c67be6d6..774025109e2f681f1934b586ed7b6974e9138408 100644 (file)
@@ -724,7 +724,7 @@ void xprt_connect(struct rpc_task *task)
                if (xprt_test_and_set_connecting(xprt))
                        return;
                xprt->stat.connect_start = jiffies;
-               xprt->ops->connect(task);
+               xprt->ops->connect(xprt, task);
        }
 }
 
index b357c528d29ca185118904f8ef292a577fa4d187..d0074289708e6a38b161ed43820f33d7489d747f 100644 (file)
@@ -426,9 +426,8 @@ xprt_rdma_set_port(struct rpc_xprt *xprt, u16 port)
 }
 
 static void
-xprt_rdma_connect(struct rpc_task *task)
+xprt_rdma_connect(struct rpc_xprt *xprt, struct rpc_task *task)
 {
-       struct rpc_xprt *xprt = (struct rpc_xprt *)task->tk_xprt;
        struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
 
        if (r_xprt->rx_ep.rep_connected != 0) {
index 25838901c97f050d926831fb27d927d116946aee..1897181d743827328308e99094f2fe097bfd1856 100644 (file)
@@ -2205,6 +2205,7 @@ out:
 
 /**
  * xs_connect - connect a socket to a remote endpoint
+ * @xprt: pointer to transport structure
  * @task: address of RPC task that manages state of connect request
  *
  * TCP: If the remote end dropped the connection, delay reconnecting.
@@ -2216,9 +2217,8 @@ out:
  * If a UDP socket connect fails, the delay behavior here prevents
  * retry floods (hard mounts).
  */
-static void xs_connect(struct rpc_task *task)
+static void xs_connect(struct rpc_xprt *xprt, struct rpc_task *task)
 {
-       struct rpc_xprt *xprt = task->tk_xprt;
        struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
 
        if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) {