提交 1b092092 编写于 作者: T Trond Myklebust

SUNRPC: Pass a pointer to struct rpc_xprt to the connect callback

Avoid another RCU dereference by passing the pointer to struct rpc_xprt
from the caller.
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 a4f0835c
...@@ -117,7 +117,7 @@ struct rpc_xprt_ops { ...@@ -117,7 +117,7 @@ struct rpc_xprt_ops {
void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task); void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
void (*rpcbind)(struct rpc_task *task); void (*rpcbind)(struct rpc_task *task);
void (*set_port)(struct rpc_xprt *xprt, unsigned short port); 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_alloc)(struct rpc_task *task, size_t size);
void (*buf_free)(void *buffer); void (*buf_free)(void *buffer);
int (*send_request)(struct rpc_task *task); int (*send_request)(struct rpc_task *task);
......
...@@ -724,7 +724,7 @@ void xprt_connect(struct rpc_task *task) ...@@ -724,7 +724,7 @@ void xprt_connect(struct rpc_task *task)
if (xprt_test_and_set_connecting(xprt)) if (xprt_test_and_set_connecting(xprt))
return; return;
xprt->stat.connect_start = jiffies; xprt->stat.connect_start = jiffies;
xprt->ops->connect(task); xprt->ops->connect(xprt, task);
} }
} }
......
...@@ -426,9 +426,8 @@ xprt_rdma_set_port(struct rpc_xprt *xprt, u16 port) ...@@ -426,9 +426,8 @@ xprt_rdma_set_port(struct rpc_xprt *xprt, u16 port)
} }
static void 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); struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
if (r_xprt->rx_ep.rep_connected != 0) { if (r_xprt->rx_ep.rep_connected != 0) {
......
...@@ -2205,6 +2205,7 @@ static void xs_tcp_setup_socket(struct work_struct *work) ...@@ -2205,6 +2205,7 @@ static void xs_tcp_setup_socket(struct work_struct *work)
/** /**
* xs_connect - connect a socket to a remote endpoint * 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 * @task: address of RPC task that manages state of connect request
* *
* TCP: If the remote end dropped the connection, delay reconnecting. * TCP: If the remote end dropped the connection, delay reconnecting.
...@@ -2216,9 +2217,8 @@ static void xs_tcp_setup_socket(struct work_struct *work) ...@@ -2216,9 +2217,8 @@ static void xs_tcp_setup_socket(struct work_struct *work)
* If a UDP socket connect fails, the delay behavior here prevents * If a UDP socket connect fails, the delay behavior here prevents
* retry floods (hard mounts). * 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); struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) { if (transport->sock != NULL && !RPC_IS_SOFTCONN(task)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册