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

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
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -313,7 +313,9 @@ out:
	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_version *version;
@@ -339,7 +341,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
	clnt = kzalloc(sizeof(*clnt), GFP_KERNEL);
	if (!clnt)
		goto out_err;
	clnt->cl_parent = clnt;
	clnt->cl_parent = parent ? : clnt;

	rcu_assign_pointer(clnt->cl_xprt, xprt);
	clnt->cl_procinfo = version->procs;
@@ -377,6 +379,8 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
	err = rpc_client_register(args, clnt);
	if (err)
		goto out_no_path;
	if (parent)
		atomic_inc(&parent->cl_count);
	return clnt;

out_no_path:
@@ -467,7 +471,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
	if (args->flags & RPC_CLNT_CREATE_NONPRIVPORT)
		xprt->resvport = 0;

	clnt = rpc_new_client(args, xprt);
	clnt = rpc_new_client(args, xprt, NULL);
	if (IS_ERR(clnt))
		return clnt;

@@ -514,15 +518,12 @@ static struct rpc_clnt *__rpc_clone_client(struct rpc_create_args *args,
		goto out_err;
	args->servername = xprt->servername;

	new = rpc_new_client(args, xprt);
	new = rpc_new_client(args, xprt, clnt);
	if (IS_ERR(new)) {
		err = PTR_ERR(new);
		goto out_err;
	}

	atomic_inc(&clnt->cl_count);
	new->cl_parent = clnt;

	/* Turn off autobind on clones */
	new->cl_autobind = 0;
	new->cl_softrtry = clnt->cl_softrtry;