Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e32a5d9 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Give cloned RPC clients their own rpc_pipefs directory

parent 23bf85ba
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ struct rpc_clnt {
	struct dentry *		cl_dentry;	/* inode */
	struct rpc_clnt *	cl_parent;	/* Points to parent of clones */
	struct rpc_rtt		cl_rtt_default;
	struct rpc_program *	cl_program;
	char			cl_inline_name[32];
};

+13 −10
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ static struct rpc_clnt * rpc_new_client(struct rpc_xprt *xprt, char *servname, s
	err = -ENOMEM;
	if (clnt->cl_metrics == NULL)
		goto out_no_stats;
	clnt->cl_program  = program;

	if (!xprt_bound(clnt->cl_xprt))
		clnt->cl_autobind = 1;
@@ -257,6 +258,7 @@ struct rpc_clnt *
rpc_clone_client(struct rpc_clnt *clnt)
{
	struct rpc_clnt *new;
	int err = -ENOMEM;

	new = kmemdup(clnt, sizeof(*new), GFP_KERNEL);
	if (!new)
@@ -266,6 +268,9 @@ rpc_clone_client(struct rpc_clnt *clnt)
	new->cl_metrics = rpc_alloc_iostats(clnt);
	if (new->cl_metrics == NULL)
		goto out_no_stats;
	err = rpc_setup_pipedir(new, clnt->cl_program->pipe_dir_name);
	if (err != 0)
		goto out_no_path;
	new->cl_parent = clnt;
	atomic_inc(&clnt->cl_count);
	new->cl_xprt = xprt_get(clnt->cl_xprt);
@@ -273,17 +278,17 @@ rpc_clone_client(struct rpc_clnt *clnt)
	new->cl_autobind = 0;
	new->cl_oneshot = 0;
	new->cl_dead = 0;
	if (!IS_ERR(new->cl_dentry))
		dget(new->cl_dentry);
	rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval);
	if (new->cl_auth)
		atomic_inc(&new->cl_auth->au_count);
	return new;
out_no_path:
	rpc_free_iostats(new->cl_metrics);
out_no_stats:
	kfree(new);
out_no_clnt:
	printk(KERN_INFO "RPC: out of memory in %s\n", __FUNCTION__);
	return ERR_PTR(-ENOMEM);
	dprintk("RPC: %s returned error %d\n", __FUNCTION__, err);
	return ERR_PTR(err);
}

/*
@@ -336,16 +341,14 @@ rpc_destroy_client(struct rpc_clnt *clnt)
		rpcauth_destroy(clnt->cl_auth);
		clnt->cl_auth = NULL;
	}
	if (clnt->cl_parent != clnt) {
		if (!IS_ERR(clnt->cl_dentry))
			dput(clnt->cl_dentry);
		rpc_destroy_client(clnt->cl_parent);
		goto out_free;
	}
	if (!IS_ERR(clnt->cl_dentry)) {
		rpc_rmdir(clnt->cl_dentry);
		rpc_put_mount();
	}
	if (clnt->cl_parent != clnt) {
		rpc_destroy_client(clnt->cl_parent);
		goto out_free;
	}
	if (clnt->cl_server != clnt->cl_inline_name)
		kfree(clnt->cl_server);
out_free: