aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-08-20 10:00:21 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-10-01 18:25:29 -0400
commit691c457ae635a063e0e4c8551ba4566eab9a17e3 (patch)
treedeb020038dbf6f9c0bb5c76c7ba46053a0266192 /fs/nfs
parentc946556b8749beb357e2d2860e7dac757972dd3d (diff)
NFS: callback up - transport backchannel cleanup
No need to assign transports backchannel server explicitly in nfs41_callback_up() - there is nfs_callback_bc_serv() function for this. By using it, nfs4_callback_up() and nfs41_callback_up() can be called without transport argument. Note: service have to be passed to nfs_callback_bc_serv() instead of callback, since callback link can be uninitialized. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/callback.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index a53b4e53d5dd..a528cb75121e 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -104,7 +104,7 @@ nfs4_callback_svc(void *vrqstp)
104 * Prepare to bring up the NFSv4 callback service 104 * Prepare to bring up the NFSv4 callback service
105 */ 105 */
106static struct svc_rqst * 106static struct svc_rqst *
107nfs4_callback_up(struct svc_serv *serv, struct rpc_xprt *xprt) 107nfs4_callback_up(struct svc_serv *serv)
108{ 108{
109 return svc_prepare_thread(serv, &serv->sv_pools[0], NUMA_NO_NODE); 109 return svc_prepare_thread(serv, &serv->sv_pools[0], NUMA_NO_NODE);
110} 110}
@@ -160,16 +160,10 @@ nfs41_callback_svc(void *vrqstp)
160 * Bring up the NFSv4.1 callback service 160 * Bring up the NFSv4.1 callback service
161 */ 161 */
162static struct svc_rqst * 162static struct svc_rqst *
163nfs41_callback_up(struct svc_serv *serv, struct rpc_xprt *xprt) 163nfs41_callback_up(struct svc_serv *serv)
164{ 164{
165 struct svc_rqst *rqstp; 165 struct svc_rqst *rqstp;
166 166
167 /*
168 * Save the svc_serv in the transport so that it can
169 * be referenced when the session backchannel is initialized
170 */
171 xprt->bc_serv = serv;
172
173 INIT_LIST_HEAD(&serv->sv_cb_list); 167 INIT_LIST_HEAD(&serv->sv_cb_list);
174 spin_lock_init(&serv->sv_cb_lock); 168 spin_lock_init(&serv->sv_cb_lock);
175 init_waitqueue_head(&serv->sv_cb_waitq); 169 init_waitqueue_head(&serv->sv_cb_waitq);
@@ -184,21 +178,25 @@ nfs41_callback_up(struct svc_serv *serv, struct rpc_xprt *xprt)
184} 178}
185 179
186static inline int nfs_minorversion_callback_svc_setup(u32 minorversion, 180static inline int nfs_minorversion_callback_svc_setup(u32 minorversion,
187 struct svc_serv *serv, struct rpc_xprt *xprt, 181 struct svc_serv *serv,
188 struct svc_rqst **rqstpp, int (**callback_svc)(void *vrqstp)) 182 struct svc_rqst **rqstpp, int (**callback_svc)(void *vrqstp))
189{ 183{
190 if (minorversion) { 184 if (minorversion) {
191 *rqstpp = nfs41_callback_up(serv, xprt); 185 *rqstpp = nfs41_callback_up(serv);
192 *callback_svc = nfs41_callback_svc; 186 *callback_svc = nfs41_callback_svc;
193 } 187 }
194 return minorversion; 188 return minorversion;
195} 189}
196 190
197static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, 191static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
198 struct nfs_callback_data *cb_info) 192 struct svc_serv *serv)
199{ 193{
200 if (minorversion) 194 if (minorversion)
201 xprt->bc_serv = cb_info->serv; 195 /*
196 * Save the svc_serv in the transport so that it can
197 * be referenced when the session backchannel is initialized
198 */
199 xprt->bc_serv = serv;
202} 200}
203#else 201#else
204static int nfs41_callback_up_net(struct svc_serv *serv, struct net *net) 202static int nfs41_callback_up_net(struct svc_serv *serv, struct net *net)
@@ -207,14 +205,14 @@ static int nfs41_callback_up_net(struct svc_serv *serv, struct net *net)
207} 205}
208 206
209static inline int nfs_minorversion_callback_svc_setup(u32 minorversion, 207static inline int nfs_minorversion_callback_svc_setup(u32 minorversion,
210 struct svc_serv *serv, struct rpc_xprt *xprt, 208 struct svc_serv *serv,
211 struct svc_rqst **rqstpp, int (**callback_svc)(void *vrqstp)) 209 struct svc_rqst **rqstpp, int (**callback_svc)(void *vrqstp))
212{ 210{
213 return 0; 211 return 0;
214} 212}
215 213
216static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt, 214static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
217 struct nfs_callback_data *cb_info) 215 struct svc_serv *serv)
218{ 216{
219} 217}
220#endif /* CONFIG_NFS_V4_1 */ 218#endif /* CONFIG_NFS_V4_1 */
@@ -318,7 +316,7 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
318 } 316 }
319 317
320 if (cb_info->users++ || cb_info->task != NULL) { 318 if (cb_info->users++ || cb_info->task != NULL) {
321 nfs_callback_bc_serv(minorversion, xprt, cb_info); 319 nfs_callback_bc_serv(minorversion, xprt, serv);
322 goto out; 320 goto out;
323 } 321 }
324 322
@@ -326,11 +324,13 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
326 if (ret < 0) 324 if (ret < 0)
327 goto err_net; 325 goto err_net;
328 326
327 nfs_callback_bc_serv(minorversion, xprt, serv);
328
329 minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion, 329 minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion,
330 serv, xprt, &rqstp, &callback_svc); 330 serv, &rqstp, &callback_svc);
331 if (!minorversion_setup) { 331 if (!minorversion_setup) {
332 /* v4.0 callback setup */ 332 /* v4.0 callback setup */
333 rqstp = nfs4_callback_up(serv, xprt); 333 rqstp = nfs4_callback_up(serv);
334 callback_svc = nfs4_callback_svc; 334 callback_svc = nfs4_callback_svc;
335 } 335 }
336 336