aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Labiaga <Ricardo.Labiaga@netapp.com>2009-04-01 09:22:58 -0400
committerBenny Halevy <bhalevy@panasas.com>2009-06-17 16:06:13 -0400
commit56632b5bff5af10eb12d7e9499b5ffcadcb7a7b2 (patch)
tree41632f7d033a791e1925a84f14488efcb9c0dd83
parent7146851376861fe55c7a48ac8fc1354a5fff6cd0 (diff)
nfs41: client callback structures
Adds new list of rpc_xprt structures, and a readers/writers lock to protect the list. The list is used to preallocate resources for the backchannel during backchannel requests. Callbacks are not expected to cause significant latency, so only one callback will be allowed at this time. It also adds a pointer to the NFS callback service so that requests can be directed to it for processing. New callback members added to svc_serv. The NFSv4.1 callback service will sleep on the svc_serv->svc_cb_waitq until new callback requests arrive. The request will be queued in svc_serv->svc_cb_list. This patch adds this list, the sleep queue and spinlock to svc_serv. [nfs41: NFSv4.1 callback support] Signed-off-by: Ricardo Labiaga <ricardo.labiaga@netapp.com> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
-rw-r--r--include/linux/sunrpc/svc.h8
-rw-r--r--include/linux/sunrpc/xprt.h22
2 files changed, 30 insertions, 0 deletions
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 2a30775959e9..4a8afbd62007 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -96,6 +96,14 @@ struct svc_serv {
96 svc_thread_fn sv_function; /* main function for threads */ 96 svc_thread_fn sv_function; /* main function for threads */
97 unsigned int sv_drc_max_pages; /* Total pages for DRC */ 97 unsigned int sv_drc_max_pages; /* Total pages for DRC */
98 unsigned int sv_drc_pages_used;/* DRC pages used */ 98 unsigned int sv_drc_pages_used;/* DRC pages used */
99#if defined(CONFIG_NFS_V4_1)
100 struct list_head sv_cb_list; /* queue for callback requests
101 * that arrive over the same
102 * connection */
103 spinlock_t sv_cb_lock; /* protects the svc_cb_list */
104 wait_queue_head_t sv_cb_waitq; /* sleep here if there are no
105 * entries in the svc_cb_list */
106#endif /* CONFIG_NFS_V4_1 */
99}; 107};
100 108
101/* 109/*
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
index 08afe43118f4..703af7ebf6cf 100644
--- a/include/linux/sunrpc/xprt.h
+++ b/include/linux/sunrpc/xprt.h
@@ -97,6 +97,12 @@ struct rpc_rqst {
97 97
98 unsigned long rq_xtime; /* when transmitted */ 98 unsigned long rq_xtime; /* when transmitted */
99 int rq_ntrans; 99 int rq_ntrans;
100
101#if defined(CONFIG_NFS_V4_1)
102 struct list_head rq_bc_list; /* Callback service list */
103 unsigned long rq_bc_pa_state; /* Backchannel prealloc state */
104 struct list_head rq_bc_pa_list; /* Backchannel prealloc list */
105#endif /* CONFIG_NFS_V4_1 */
100}; 106};
101#define rq_svec rq_snd_buf.head 107#define rq_svec rq_snd_buf.head
102#define rq_slen rq_snd_buf.len 108#define rq_slen rq_snd_buf.len
@@ -174,6 +180,14 @@ struct rpc_xprt {
174 spinlock_t reserve_lock; /* lock slot table */ 180 spinlock_t reserve_lock; /* lock slot table */
175 u32 xid; /* Next XID value to use */ 181 u32 xid; /* Next XID value to use */
176 struct rpc_task * snd_task; /* Task blocked in send */ 182 struct rpc_task * snd_task; /* Task blocked in send */
183#if defined(CONFIG_NFS_V4_1)
184 struct svc_serv *bc_serv; /* The RPC service which will */
185 /* process the callback */
186 spinlock_t bc_pa_lock; /* Protects the preallocated
187 * items */
188 struct list_head bc_pa_list; /* List of preallocated
189 * backchannel rpc_rqst's */
190#endif /* CONFIG_NFS_V4_1 */
177 struct list_head recv; 191 struct list_head recv;
178 192
179 struct { 193 struct {
@@ -192,6 +206,14 @@ struct rpc_xprt {
192 const char *address_strings[RPC_DISPLAY_MAX]; 206 const char *address_strings[RPC_DISPLAY_MAX];
193}; 207};
194 208
209#if defined(CONFIG_NFS_V4_1)
210/*
211 * Backchannel flags
212 */
213#define RPC_BC_PA_IN_USE 0x0001 /* Preallocated backchannel */
214 /* buffer in use */
215#endif /* CONFIG_NFS_V4_1 */
216
195struct xprt_create { 217struct xprt_create {
196 int ident; /* XPRT_TRANSPORT identifier */ 218 int ident; /* XPRT_TRANSPORT identifier */
197 struct sockaddr * srcaddr; /* optional local address */ 219 struct sockaddr * srcaddr; /* optional local address */