Commit 280ebcf9 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: rpcauth_create needs to know about rpc_clnt clone status

Ensure that we set rpc_clnt->cl_parent before calling rpc_client_register
so that rpcauth_create can find any existing RPCSEC_GSS caches for this
transport.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent eb6dc19d
...@@ -313,7 +313,9 @@ static int rpc_client_register(const struct rpc_create_args *args, ...@@ -313,7 +313,9 @@ static int rpc_client_register(const struct rpc_create_args *args,
return err; return err;
} }
static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt) static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args,
struct rpc_xprt *xprt,
struct rpc_clnt *parent)
{ {
const struct rpc_program *program = args->program; const struct rpc_program *program = args->program;
const struct rpc_version *version; const struct rpc_version *version;
...@@ -339,7 +341,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru ...@@ -339,7 +341,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
clnt = kzalloc(sizeof(*clnt), GFP_KERNEL); clnt = kzalloc(sizeof(*clnt), GFP_KERNEL);
if (!clnt) if (!clnt)
goto out_err; goto out_err;
clnt->cl_parent = clnt; clnt->cl_parent = parent ? : clnt;
rcu_assign_pointer(clnt->cl_xprt, xprt); rcu_assign_pointer(clnt->cl_xprt, xprt);
clnt->cl_procinfo = version->procs; clnt->cl_procinfo = version->procs;
...@@ -377,6 +379,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru ...@@ -377,6 +379,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
err = rpc_client_register(args, clnt); err = rpc_client_register(args, clnt);
if (err) if (err)
goto out_no_path; goto out_no_path;
if (parent)
atomic_inc(&parent->cl_count);
return clnt; return clnt;
out_no_path: out_no_path:
...@@ -467,7 +471,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) ...@@ -467,7 +471,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT) if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT)
xprt->resvport = 0; xprt->resvport = 0;
clnt = rpc_new_client(args, xprt); clnt = rpc_new_client(args, xprt, NULL);
if (IS_ERR(clnt)) if (IS_ERR(clnt))
return clnt; return clnt;
...@@ -514,15 +518,12 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args, ...@@ -514,15 +518,12 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args,
goto out_err; goto out_err;
args->servername = xprt->servername; args->servername = xprt->servername;
new = rpc_new_client(args, xprt); new = rpc_new_client(args, xprt, clnt);
if (IS_ERR(new)) { if (IS_ERR(new)) {
err = PTR_ERR(new); err = PTR_ERR(new);
goto out_err; goto out_err;
} }
atomic_inc(&clnt->cl_count);
new->cl_parent = clnt;
/* Turn off autobind on clones */ /* Turn off autobind on clones */
new->cl_autobind = 0; new->cl_autobind = 0;
new->cl_softrtry = clnt->cl_softrtry; new->cl_softrtry = clnt->cl_softrtry;
......
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