aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-08-20 10:00:26 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-10-01 18:25:35 -0400
commit8e2461444319b8f3fe47b94ea9b5d2e1dd8adadb (patch)
tree6f0bf79be0c107aa419398af2fb4f0ff6bdddbe0 /fs
parent691c457ae635a063e0e4c8551ba4566eab9a17e3 (diff)
NFS: callback service start function introduced
This is just a code move, which from my POW makes code looks better. I.e. now on start we have 3 different stages: 1) Service creation. 2) Service per-net data allocation. 3) Service start. Patch also renames goto label "out_err:" into "err_start:" to reflect new changes. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/callback.c77
1 files changed, 45 insertions, 32 deletions
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index a528cb75121..5d5f9d10cfd 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -217,6 +217,46 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
217} 217}
218#endif /* CONFIG_NFS_V4_1 */ 218#endif /* CONFIG_NFS_V4_1 */
219 219
220static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt,
221 struct svc_serv *serv)
222{
223 struct svc_rqst *rqstp;
224 int (*callback_svc)(void *vrqstp);
225 struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
226 char svc_name[12];
227 int ret;
228 int minorversion_setup;
229
230 nfs_callback_bc_serv(minorversion, xprt, serv);
231
232 minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion,
233 serv, &rqstp, &callback_svc);
234 if (!minorversion_setup) {
235 /* v4.0 callback setup */
236 rqstp = nfs4_callback_up(serv);
237 callback_svc = nfs4_callback_svc;
238 }
239
240 if (IS_ERR(rqstp))
241 return PTR_ERR(rqstp);
242
243 svc_sock_update_bufs(serv);
244
245 sprintf(svc_name, "nfsv4.%u-svc", minorversion);
246 cb_info->serv = serv;
247 cb_info->rqst = rqstp;
248 cb_info->task = kthread_run(callback_svc, cb_info->rqst, svc_name);
249 if (IS_ERR(cb_info->task)) {
250 ret = PTR_ERR(cb_info->task);
251 svc_exit_thread(cb_info->rqst);
252 cb_info->rqst = NULL;
253 cb_info->task = NULL;
254 return PTR_ERR(cb_info->task);
255 }
256 dprintk("nfs_callback_up: service started\n");
257 return 0;
258}
259
220static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct net *net) 260static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct net *net)
221{ 261{
222 int ret; 262 int ret;
@@ -299,12 +339,8 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
299int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt) 339int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
300{ 340{
301 struct svc_serv *serv; 341 struct svc_serv *serv;
302 struct svc_rqst *rqstp;
303 int (*callback_svc)(void *vrqstp);
304 struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; 342 struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
305 char svc_name[12];
306 int ret = 0; 343 int ret = 0;
307 int minorversion_setup;
308 struct net *net = xprt->xprt_net; 344 struct net *net = xprt->xprt_net;
309 345
310 mutex_lock(&nfs_callback_mutex); 346 mutex_lock(&nfs_callback_mutex);
@@ -324,34 +360,10 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
324 if (ret < 0) 360 if (ret < 0)
325 goto err_net; 361 goto err_net;
326 362
327 nfs_callback_bc_serv(minorversion, xprt, serv); 363 ret = nfs_callback_start_svc(minorversion, xprt, serv);
328 364 if (ret < 0)
329 minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion, 365 goto err_start;
330 serv, &rqstp, &callback_svc);
331 if (!minorversion_setup) {
332 /* v4.0 callback setup */
333 rqstp = nfs4_callback_up(serv);
334 callback_svc = nfs4_callback_svc;
335 }
336
337 if (IS_ERR(rqstp)) {
338 ret = PTR_ERR(rqstp);
339 goto out_err;
340 }
341
342 svc_sock_update_bufs(serv);
343 366
344 sprintf(svc_name, "nfsv4.%u-svc", minorversion);
345 cb_info->serv = serv;
346 cb_info->rqst = rqstp;
347 cb_info->task = kthread_run(callback_svc, cb_info->rqst, svc_name);
348 if (IS_ERR(cb_info->task)) {
349 ret = PTR_ERR(cb_info->task);
350 svc_exit_thread(cb_info->rqst);
351 cb_info->rqst = NULL;
352 cb_info->task = NULL;
353 goto out_err;
354 }
355out: 367out:
356 /* 368 /*
357 * svc_create creates the svc_serv with sv_nrthreads == 1, and then 369 * svc_create creates the svc_serv with sv_nrthreads == 1, and then
@@ -363,7 +375,8 @@ out:
363err_create: 375err_create:
364 mutex_unlock(&nfs_callback_mutex); 376 mutex_unlock(&nfs_callback_mutex);
365 return ret; 377 return ret;
366out_err: 378
379err_start:
367 svc_shutdown_net(serv, net); 380 svc_shutdown_net(serv, net);
368err_net: 381err_net:
369 dprintk("NFS: Couldn't create callback socket or server thread; " 382 dprintk("NFS: Couldn't create callback socket or server thread; "