diff options
author | Ricardo Labiaga <Ricardo.Labiaga@netapp.com> | 2009-04-01 09:23:04 -0400 |
---|---|---|
committer | Benny Halevy <bhalevy@panasas.com> | 2009-06-17 17:11:28 -0400 |
commit | 0d90ba1cd416525c4825c111db862d8b15a02e9b (patch) | |
tree | 1f1571410b2d1b17eb8e503fc3b60450f93e9dee | |
parent | 55ae1aabfb108106dd095de2578ceef1c755a8b8 (diff) |
nfs41: Backchannel callback service helper routines
Executes the backchannel task on the RPC state machine using
the existing open connection previously established by the client.
Signed-off-by: Ricardo Labiaga <ricardo.labiaga@netapp.com>
nfs41: Add bc_svc.o to sunrpc Makefile.
[nfs41: bc_send() does not need to be exported outside RPC module]
[nfs41: xprt_free_bc_request() need not be exported outside RPC module]
Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[Update copyright]
Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
-rw-r--r-- | include/linux/sunrpc/bc_xprt.h | 3 | ||||
-rw-r--r-- | net/sunrpc/Makefile | 2 | ||||
-rw-r--r-- | net/sunrpc/bc_svc.c | 81 | ||||
-rw-r--r-- | net/sunrpc/xprtsock.c | 3 |
4 files changed, 88 insertions, 1 deletions
diff --git a/include/linux/sunrpc/bc_xprt.h b/include/linux/sunrpc/bc_xprt.h index 5965ae4f902d..6508f0dc0eff 100644 --- a/include/linux/sunrpc/bc_xprt.h +++ b/include/linux/sunrpc/bc_xprt.h | |||
@@ -29,12 +29,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
29 | 29 | ||
30 | #include <linux/sunrpc/svcsock.h> | 30 | #include <linux/sunrpc/svcsock.h> |
31 | #include <linux/sunrpc/xprt.h> | 31 | #include <linux/sunrpc/xprt.h> |
32 | #include <linux/sunrpc/sched.h> | ||
32 | 33 | ||
33 | #ifdef CONFIG_NFS_V4_1 | 34 | #ifdef CONFIG_NFS_V4_1 |
34 | struct rpc_rqst *xprt_alloc_bc_request(struct rpc_xprt *xprt); | 35 | struct rpc_rqst *xprt_alloc_bc_request(struct rpc_xprt *xprt); |
35 | void xprt_free_bc_request(struct rpc_rqst *req); | 36 | void xprt_free_bc_request(struct rpc_rqst *req); |
36 | int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs); | 37 | int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs); |
37 | void xprt_destroy_backchannel(struct rpc_xprt *, int max_reqs); | 38 | void xprt_destroy_backchannel(struct rpc_xprt *, int max_reqs); |
39 | void bc_release_request(struct rpc_task *); | ||
40 | int bc_send(struct rpc_rqst *req); | ||
38 | #else /* CONFIG_NFS_V4_1 */ | 41 | #else /* CONFIG_NFS_V4_1 */ |
39 | static inline int xprt_setup_backchannel(struct rpc_xprt *xprt, | 42 | static inline int xprt_setup_backchannel(struct rpc_xprt *xprt, |
40 | unsigned int min_reqs) | 43 | unsigned int min_reqs) |
diff --git a/net/sunrpc/Makefile b/net/sunrpc/Makefile index 4a01f9684b85..db73fd2a3f0e 100644 --- a/net/sunrpc/Makefile +++ b/net/sunrpc/Makefile | |||
@@ -13,6 +13,6 @@ sunrpc-y := clnt.o xprt.o socklib.o xprtsock.o sched.o \ | |||
13 | rpcb_clnt.o timer.o xdr.o \ | 13 | rpcb_clnt.o timer.o xdr.o \ |
14 | sunrpc_syms.o cache.o rpc_pipe.o \ | 14 | sunrpc_syms.o cache.o rpc_pipe.o \ |
15 | svc_xprt.o | 15 | svc_xprt.o |
16 | sunrpc-$(CONFIG_NFS_V4_1) += backchannel_rqst.o | 16 | sunrpc-$(CONFIG_NFS_V4_1) += backchannel_rqst.o bc_svc.o |
17 | sunrpc-$(CONFIG_PROC_FS) += stats.o | 17 | sunrpc-$(CONFIG_PROC_FS) += stats.o |
18 | sunrpc-$(CONFIG_SYSCTL) += sysctl.o | 18 | sunrpc-$(CONFIG_SYSCTL) += sysctl.o |
diff --git a/net/sunrpc/bc_svc.c b/net/sunrpc/bc_svc.c new file mode 100644 index 000000000000..13f214f53120 --- /dev/null +++ b/net/sunrpc/bc_svc.c | |||
@@ -0,0 +1,81 @@ | |||
1 | /****************************************************************************** | ||
2 | |||
3 | (c) 2007 Network Appliance, Inc. All Rights Reserved. | ||
4 | (c) 2009 NetApp. All Rights Reserved. | ||
5 | |||
6 | NetApp provides this source code under the GPL v2 License. | ||
7 | The GPL v2 license is available at | ||
8 | http://opensource.org/licenses/gpl-license.php. | ||
9 | |||
10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
11 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
12 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
13 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | ||
14 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||
15 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
16 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||
17 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||
18 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||
19 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
20 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
21 | |||
22 | ******************************************************************************/ | ||
23 | |||
24 | /* | ||
25 | * The NFSv4.1 callback service helper routines. | ||
26 | * They implement the transport level processing required to send the | ||
27 | * reply over an existing open connection previously established by the client. | ||
28 | */ | ||
29 | |||
30 | #if defined(CONFIG_NFS_V4_1) | ||
31 | |||
32 | #include <linux/module.h> | ||
33 | |||
34 | #include <linux/sunrpc/xprt.h> | ||
35 | #include <linux/sunrpc/sched.h> | ||
36 | #include <linux/sunrpc/bc_xprt.h> | ||
37 | |||
38 | #define RPCDBG_FACILITY RPCDBG_SVCDSP | ||
39 | |||
40 | void bc_release_request(struct rpc_task *task) | ||
41 | { | ||
42 | struct rpc_rqst *req = task->tk_rqstp; | ||
43 | |||
44 | dprintk("RPC: bc_release_request: task= %p\n", task); | ||
45 | |||
46 | /* | ||
47 | * Release this request only if it's a backchannel | ||
48 | * preallocated request | ||
49 | */ | ||
50 | if (!bc_prealloc(req)) | ||
51 | return; | ||
52 | xprt_free_bc_request(req); | ||
53 | } | ||
54 | |||
55 | /* Empty callback ops */ | ||
56 | static const struct rpc_call_ops nfs41_callback_ops = { | ||
57 | }; | ||
58 | |||
59 | |||
60 | /* | ||
61 | * Send the callback reply | ||
62 | */ | ||
63 | int bc_send(struct rpc_rqst *req) | ||
64 | { | ||
65 | struct rpc_task *task; | ||
66 | int ret; | ||
67 | |||
68 | dprintk("RPC: bc_send req= %p\n", req); | ||
69 | task = rpc_run_bc_task(req, &nfs41_callback_ops); | ||
70 | if (IS_ERR(task)) | ||
71 | ret = PTR_ERR(task); | ||
72 | else { | ||
73 | BUG_ON(atomic_read(&task->tk_count) != 1); | ||
74 | ret = task->tk_status; | ||
75 | rpc_put_task(task); | ||
76 | } | ||
77 | return ret; | ||
78 | dprintk("RPC: bc_send ret= %d \n", ret); | ||
79 | } | ||
80 | |||
81 | #endif /* CONFIG_NFS_V4_1 */ | ||
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index e3e3a57116fb..8a721867b601 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -2183,6 +2183,9 @@ static struct rpc_xprt_ops xs_tcp_ops = { | |||
2183 | .buf_free = rpc_free, | 2183 | .buf_free = rpc_free, |
2184 | .send_request = xs_tcp_send_request, | 2184 | .send_request = xs_tcp_send_request, |
2185 | .set_retrans_timeout = xprt_set_retrans_timeout_def, | 2185 | .set_retrans_timeout = xprt_set_retrans_timeout_def, |
2186 | #if defined(CONFIG_NFS_V4_1) | ||
2187 | .release_request = bc_release_request, | ||
2188 | #endif /* CONFIG_NFS_V4_1 */ | ||
2186 | .close = xs_tcp_close, | 2189 | .close = xs_tcp_close, |
2187 | .destroy = xs_destroy, | 2190 | .destroy = xs_destroy, |
2188 | .print_stats = xs_tcp_print_stats, | 2191 | .print_stats = xs_tcp_print_stats, |