Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 333162
b: refs/heads/master
c: 8e24614
h: refs/heads/master
v: v3
  • Loading branch information
Stanislav Kinsbursky authored and Trond Myklebust committed Oct 1, 2012
1 parent 5c62cca commit 483ca6d
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 33 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 691c457ae635a063e0e4c8551ba4566eab9a17e3
refs/heads/master: 8e2461444319b8f3fe47b94ea9b5d2e1dd8adadb
77 changes: 45 additions & 32 deletions trunk/fs/nfs/callback.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,46 @@ static inline void nfs_callback_bc_serv(u32 minorversion, struct rpc_xprt *xprt,
}
#endif /* CONFIG_NFS_V4_1 */

static int nfs_callback_start_svc(int minorversion, struct rpc_xprt *xprt,
struct svc_serv *serv)
{
struct svc_rqst *rqstp;
int (*callback_svc)(void *vrqstp);
struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
char svc_name[12];
int ret;
int minorversion_setup;

nfs_callback_bc_serv(minorversion, xprt, serv);

minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion,
serv, &rqstp, &callback_svc);
if (!minorversion_setup) {
/* v4.0 callback setup */
rqstp = nfs4_callback_up(serv);
callback_svc = nfs4_callback_svc;
}

if (IS_ERR(rqstp))
return PTR_ERR(rqstp);

svc_sock_update_bufs(serv);

sprintf(svc_name, "nfsv4.%u-svc", minorversion);
cb_info->serv = serv;
cb_info->rqst = rqstp;
cb_info->task = kthread_run(callback_svc, cb_info->rqst, svc_name);
if (IS_ERR(cb_info->task)) {
ret = PTR_ERR(cb_info->task);
svc_exit_thread(cb_info->rqst);
cb_info->rqst = NULL;
cb_info->task = NULL;
return PTR_ERR(cb_info->task);
}
dprintk("nfs_callback_up: service started\n");
return 0;
}

static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct net *net)
{
int ret;
Expand Down Expand Up @@ -299,12 +339,8 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
{
struct svc_serv *serv;
struct svc_rqst *rqstp;
int (*callback_svc)(void *vrqstp);
struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
char svc_name[12];
int ret = 0;
int minorversion_setup;
struct net *net = xprt->xprt_net;

mutex_lock(&nfs_callback_mutex);
Expand All @@ -324,34 +360,10 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
if (ret < 0)
goto err_net;

nfs_callback_bc_serv(minorversion, xprt, serv);

minorversion_setup = nfs_minorversion_callback_svc_setup(minorversion,
serv, &rqstp, &callback_svc);
if (!minorversion_setup) {
/* v4.0 callback setup */
rqstp = nfs4_callback_up(serv);
callback_svc = nfs4_callback_svc;
}

if (IS_ERR(rqstp)) {
ret = PTR_ERR(rqstp);
goto out_err;
}

svc_sock_update_bufs(serv);
ret = nfs_callback_start_svc(minorversion, xprt, serv);
if (ret < 0)
goto err_start;

sprintf(svc_name, "nfsv4.%u-svc", minorversion);
cb_info->serv = serv;
cb_info->rqst = rqstp;
cb_info->task = kthread_run(callback_svc, cb_info->rqst, svc_name);
if (IS_ERR(cb_info->task)) {
ret = PTR_ERR(cb_info->task);
svc_exit_thread(cb_info->rqst);
cb_info->rqst = NULL;
cb_info->task = NULL;
goto out_err;
}
out:
/*
* svc_create creates the svc_serv with sv_nrthreads == 1, and then
Expand All @@ -363,7 +375,8 @@ int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
err_create:
mutex_unlock(&nfs_callback_mutex);
return ret;
out_err:

err_start:
svc_shutdown_net(serv, net);
err_net:
dprintk("NFS: Couldn't create callback socket or server thread; "
Expand Down

0 comments on commit 483ca6d

Please sign in to comment.