summaryrefslogtreecommitdiffstats
path: root/include/linux/sunrpc
diff options
context:
space:
mode:
authorTrond Myklebust2015-02-09 00:19:25 +0100
committerTrond Myklebust2015-02-09 03:47:29 +0100
commit718ba5b87343df303017585200ee182e937eabfc (patch)
tree445d5bbb8aa4173b00527852b76d1e210fbb78c5 /include/linux/sunrpc
parentSUNRPC: Ensure xs_reset_transport() resets the close connection flags (diff)
downloadkernel-qcow2-linux-718ba5b87343df303017585200ee182e937eabfc.tar.gz
kernel-qcow2-linux-718ba5b87343df303017585200ee182e937eabfc.tar.xz
kernel-qcow2-linux-718ba5b87343df303017585200ee182e937eabfc.zip
SUNRPC: Add helpers to prevent socket create from racing
The socket lock is currently held by the task that is requesting the connection be established. While that is efficient in the case where the connection happens quickly, it is racy in the case where it doesn't. What we really want is for the connect helper to be able to block access to the socket while it is being set up. This patch does so by arranging to transfer the socket lock from the task that is requesting the connect attempt, and then releasing that lock once everything is done. This scheme also gives us automatic protection against collisions with the RPC close code, so we can kill the cancel_delayed_work_sync() call in xs_close(). Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'include/linux/sunrpc')
-rw-r--r--include/linux/sunrpc/xprt.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
index 9d27ac45b909..2926e618dbc6 100644
--- a/include/linux/sunrpc/xprt.h
+++ b/include/linux/sunrpc/xprt.h
@@ -347,6 +347,9 @@ void xprt_force_disconnect(struct rpc_xprt *xprt);
void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);
int xs_swapper(struct rpc_xprt *xprt, int enable);
+bool xprt_lock_connect(struct rpc_xprt *, struct rpc_task *, void *);
+void xprt_unlock_connect(struct rpc_xprt *, void *);
+
/*
* Reserved bit positions in xprt->state
*/