Commit 8f8e7a50 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Fix dentry refcounting issues with users of rpc_pipefs



rpc_unlink() and rpc_rmdir() will dput the dentry reference for you.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
(cherry picked from a05a57effa71a1f67ccbfc52335c10c8b85f3f6a commit)
parent 68adb0af
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -131,7 +131,6 @@ nfs_idmap_delete(struct nfs4_client *clp)
	if (!idmap)
		return;
	rpc_unlink(idmap->idmap_dentry);
	dput(idmap->idmap_dentry);
	clp->cl_idmap = NULL;
	kfree(idmap);
}
+0 −1
Original line number Diff line number Diff line
@@ -719,7 +719,6 @@ gss_destroy(struct rpc_auth *auth)

	gss_auth = container_of(auth, struct gss_auth, rpc_auth);
	rpc_unlink(gss_auth->dentry);
	dput(gss_auth->dentry);
	gss_auth->dentry = NULL;
	gss_mech_put(gss_auth->mech);

+6 −9
Original line number Diff line number Diff line
@@ -184,7 +184,6 @@ rpc_new_client(struct rpc_xprt *xprt, char *servname,
out_no_auth:
	if (!IS_ERR(clnt->cl_dentry)) {
		rpc_rmdir(clnt->cl_dentry);
		dput(clnt->cl_dentry);
		rpc_put_mount();
	}
out_no_path:
@@ -251,10 +250,8 @@ 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)) {
	if (!IS_ERR(new->cl_dentry))
		dget(new->cl_dentry);
		rpc_get_mount();
	}
	rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval);
	if (new->cl_auth)
		atomic_inc(&new->cl_auth->au_count);
@@ -317,11 +314,15 @@ rpc_destroy_client(struct rpc_clnt *clnt)
		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))
	if (!IS_ERR(clnt->cl_dentry)) {
		rpc_rmdir(clnt->cl_dentry);
		rpc_put_mount();
	}
	if (clnt->cl_xprt) {
		xprt_destroy(clnt->cl_xprt);
		clnt->cl_xprt = NULL;
@@ -331,10 +332,6 @@ rpc_destroy_client(struct rpc_clnt *clnt)
out_free:
	rpc_free_iostats(clnt->cl_metrics);
	clnt->cl_metrics = NULL;
	if (!IS_ERR(clnt->cl_dentry)) {
		dput(clnt->cl_dentry);
		rpc_put_mount();
	}
	kfree(clnt);
	return 0;
}