Commit 71468513 authored by Benny Halevy's avatar Benny Halevy

nfs41: minorversion support for nfs4_{init,destroy}_callback

move nfs4_init_callback into nfs4_init_client_minor_version
and nfs4_destroy_callback into nfs4_clear_client_minor_version

as these need to happen also when auto-negotiating the minorversion
once the callback service for nfs41 becomes different than for nfs4.0
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[nfs41: Fix checkpatch warning]
Signed-off-by: default avatarRicardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[Type check arguments of nfs_callback_up]
Signed-off-by: default avatarRicardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
[nfs41: Backchannel: Remove FIXME comment]
Signed-off-by: default avatarRicardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
parent 9bdaa86d
...@@ -59,7 +59,7 @@ module_param_call(callback_tcpport, param_set_port, param_get_int, ...@@ -59,7 +59,7 @@ module_param_call(callback_tcpport, param_set_port, param_get_int,
* This is the callback kernel thread. * This is the callback kernel thread.
*/ */
static int static int
nfs_callback_svc(void *vrqstp) nfs4_callback_svc(void *vrqstp)
{ {
int err, preverr = 0; int err, preverr = 0;
struct svc_rqst *rqstp = vrqstp; struct svc_rqst *rqstp = vrqstp;
...@@ -97,20 +97,12 @@ nfs_callback_svc(void *vrqstp) ...@@ -97,20 +97,12 @@ nfs_callback_svc(void *vrqstp)
} }
/* /*
* Bring up the callback thread if it is not already up. * Prepare to bring up the NFSv4 callback service
*/ */
int nfs_callback_up(void) struct svc_rqst *
nfs4_callback_up(struct svc_serv *serv)
{ {
struct svc_serv *serv = NULL; int ret;
int ret = 0;
mutex_lock(&nfs_callback_mutex);
if (nfs_callback_info.users++ || nfs_callback_info.task != NULL)
goto out;
serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, NULL);
ret = -ENOMEM;
if (!serv)
goto out_err;
ret = svc_create_xprt(serv, "tcp", PF_INET, ret = svc_create_xprt(serv, "tcp", PF_INET,
nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS); nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS);
...@@ -131,18 +123,53 @@ int nfs_callback_up(void) ...@@ -131,18 +123,53 @@ int nfs_callback_up(void)
goto out_err; goto out_err;
#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
nfs_callback_info.rqst = svc_prepare_thread(serv, &serv->sv_pools[0]); return svc_prepare_thread(serv, &serv->sv_pools[0]);
if (IS_ERR(nfs_callback_info.rqst)) {
ret = PTR_ERR(nfs_callback_info.rqst); out_err:
nfs_callback_info.rqst = NULL; if (ret == 0)
ret = -ENOMEM;
return ERR_PTR(ret);
}
/*
* Bring up the callback thread if it is not already up.
*/
int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt)
{
struct svc_serv *serv = NULL;
struct svc_rqst *rqstp;
int (*callback_svc)(void *vrqstp);
char svc_name[12];
int ret = 0;
mutex_lock(&nfs_callback_mutex);
if (nfs_callback_info.users++ || nfs_callback_info.task != NULL)
goto out;
serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, NULL);
if (!serv) {
ret = -ENOMEM;
goto out_err;
}
if (!minorversion) {
rqstp = nfs4_callback_up(serv);
callback_svc = nfs4_callback_svc;
} else {
BUG(); /* for now */
}
if (IS_ERR(rqstp)) {
ret = PTR_ERR(rqstp);
goto out_err; goto out_err;
} }
svc_sock_update_bufs(serv); svc_sock_update_bufs(serv);
nfs_callback_info.task = kthread_run(nfs_callback_svc, sprintf(svc_name, "nfsv4.%u-svc", minorversion);
nfs_callback_info.rqst = rqstp;
nfs_callback_info.task = kthread_run(callback_svc,
nfs_callback_info.rqst, nfs_callback_info.rqst,
"nfsv4-svc"); svc_name);
if (IS_ERR(nfs_callback_info.task)) { if (IS_ERR(nfs_callback_info.task)) {
ret = PTR_ERR(nfs_callback_info.task); ret = PTR_ERR(nfs_callback_info.task);
svc_exit_thread(nfs_callback_info.rqst); svc_exit_thread(nfs_callback_info.rqst);
......
...@@ -63,7 +63,7 @@ extern __be32 nfs4_callback_getattr(struct cb_getattrargs *args, struct cb_getat ...@@ -63,7 +63,7 @@ extern __be32 nfs4_callback_getattr(struct cb_getattrargs *args, struct cb_getat
extern __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy); extern __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy);
#ifdef CONFIG_NFS_V4 #ifdef CONFIG_NFS_V4
extern int nfs_callback_up(void); extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt);
extern void nfs_callback_down(void); extern void nfs_callback_down(void);
#else #else
#define nfs_callback_up() (0) #define nfs_callback_up() (0)
......
...@@ -47,9 +47,6 @@ ...@@ -47,9 +47,6 @@
#include "internal.h" #include "internal.h"
#include "fscache.h" #include "fscache.h"
static int nfs4_init_callback(struct nfs_client *);
static void nfs4_destroy_callback(struct nfs_client *);
#define NFSDBG_FACILITY NFSDBG_CLIENT #define NFSDBG_FACILITY NFSDBG_CLIENT
static DEFINE_SPINLOCK(nfs_client_lock); static DEFINE_SPINLOCK(nfs_client_lock);
...@@ -124,9 +121,6 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ ...@@ -124,9 +121,6 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_
clp->rpc_ops = cl_init->rpc_ops; clp->rpc_ops = cl_init->rpc_ops;
if (nfs4_init_callback(clp) < 0)
goto error_2;
atomic_set(&clp->cl_count, 1); atomic_set(&clp->cl_count, 1);
clp->cl_cons_state = NFS_CS_INITING; clp->cl_cons_state = NFS_CS_INITING;
...@@ -136,7 +130,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ ...@@ -136,7 +130,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_
if (cl_init->hostname) { if (cl_init->hostname) {
clp->cl_hostname = kstrdup(cl_init->hostname, GFP_KERNEL); clp->cl_hostname = kstrdup(cl_init->hostname, GFP_KERNEL);
if (!clp->cl_hostname) if (!clp->cl_hostname)
goto error_3; goto error_cleanup;
} }
INIT_LIST_HEAD(&clp->cl_superblocks); INIT_LIST_HEAD(&clp->cl_superblocks);
...@@ -161,9 +155,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ ...@@ -161,9 +155,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_
return clp; return clp;
error_3: error_cleanup:
nfs4_destroy_callback(clp);
error_2:
kfree(clp); kfree(clp);
error_0: error_0:
return NULL; return NULL;
...@@ -207,6 +199,8 @@ static void nfs4_clear_client_minor_version(struct nfs_client *clp) ...@@ -207,6 +199,8 @@ static void nfs4_clear_client_minor_version(struct nfs_client *clp)
clp->cl_call_sync = _nfs4_call_sync; clp->cl_call_sync = _nfs4_call_sync;
#endif /* CONFIG_NFS_V4_1 */ #endif /* CONFIG_NFS_V4_1 */
nfs4_destroy_callback(clp);
} }
/* /*
...@@ -225,8 +219,6 @@ static void nfs_free_client(struct nfs_client *clp) ...@@ -225,8 +219,6 @@ static void nfs_free_client(struct nfs_client *clp)
if (!IS_ERR(clp->cl_rpcclient)) if (!IS_ERR(clp->cl_rpcclient))
rpc_shutdown_client(clp->cl_rpcclient); rpc_shutdown_client(clp->cl_rpcclient);
nfs4_destroy_callback(clp);
if (clp->cl_machine_cred != NULL) if (clp->cl_machine_cred != NULL)
put_rpccred(clp->cl_machine_cred); put_rpccred(clp->cl_machine_cred);
...@@ -1104,7 +1096,8 @@ static int nfs4_init_callback(struct nfs_client *clp) ...@@ -1104,7 +1096,8 @@ static int nfs4_init_callback(struct nfs_client *clp)
int error; int error;
if (clp->rpc_ops->version == 4) { if (clp->rpc_ops->version == 4) {
error = nfs_callback_up(); error = nfs_callback_up(clp->cl_minorversion,
clp->cl_rpcclient->cl_xprt);
if (error < 0) { if (error < 0) {
dprintk("%s: failed to start callback. Error = %d\n", dprintk("%s: failed to start callback. Error = %d\n",
__func__, error); __func__, error);
...@@ -1139,7 +1132,7 @@ static int nfs4_init_client_minor_version(struct nfs_client *clp) ...@@ -1139,7 +1132,7 @@ static int nfs4_init_client_minor_version(struct nfs_client *clp)
} }
#endif /* CONFIG_NFS_V4_1 */ #endif /* CONFIG_NFS_V4_1 */
return 0; return nfs4_init_callback(clp);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment