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

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
...@@ -131,7 +131,6 @@ nfs_idmap_delete(struct nfs4_client *clp) ...@@ -131,7 +131,6 @@ nfs_idmap_delete(struct nfs4_client *clp)
if (!idmap) if (!idmap)
return; return;
rpc_unlink(idmap->idmap_dentry); rpc_unlink(idmap->idmap_dentry);
dput(idmap->idmap_dentry);
clp->cl_idmap = NULL; clp->cl_idmap = NULL;
kfree(idmap); kfree(idmap);
} }
......
...@@ -719,7 +719,6 @@ gss_destroy(struct rpc_auth *auth) ...@@ -719,7 +719,6 @@ gss_destroy(struct rpc_auth *auth)
gss_auth = container_of(auth, struct gss_auth, rpc_auth); gss_auth = container_of(auth, struct gss_auth, rpc_auth);
rpc_unlink(gss_auth->dentry); rpc_unlink(gss_auth->dentry);
dput(gss_auth->dentry);
gss_auth->dentry = NULL; gss_auth->dentry = NULL;
gss_mech_put(gss_auth->mech); gss_mech_put(gss_auth->mech);
......
...@@ -184,7 +184,6 @@ rpc_new_client(struct rpc_xprt *xprt, char *servname, ...@@ -184,7 +184,6 @@ rpc_new_client(struct rpc_xprt *xprt, char *servname,
out_no_auth: out_no_auth:
if (!IS_ERR(clnt->cl_dentry)) { if (!IS_ERR(clnt->cl_dentry)) {
rpc_rmdir(clnt->cl_dentry); rpc_rmdir(clnt->cl_dentry);
dput(clnt->cl_dentry);
rpc_put_mount(); rpc_put_mount();
} }
out_no_path: out_no_path:
...@@ -251,10 +250,8 @@ rpc_clone_client(struct rpc_clnt *clnt) ...@@ -251,10 +250,8 @@ rpc_clone_client(struct rpc_clnt *clnt)
new->cl_autobind = 0; new->cl_autobind = 0;
new->cl_oneshot = 0; new->cl_oneshot = 0;
new->cl_dead = 0; new->cl_dead = 0;
if (!IS_ERR(new->cl_dentry)) { if (!IS_ERR(new->cl_dentry))
dget(new->cl_dentry); dget(new->cl_dentry);
rpc_get_mount();
}
rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval); rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval);
if (new->cl_auth) if (new->cl_auth)
atomic_inc(&new->cl_auth->au_count); atomic_inc(&new->cl_auth->au_count);
...@@ -317,11 +314,15 @@ rpc_destroy_client(struct rpc_clnt *clnt) ...@@ -317,11 +314,15 @@ rpc_destroy_client(struct rpc_clnt *clnt)
clnt->cl_auth = NULL; clnt->cl_auth = NULL;
} }
if (clnt->cl_parent != clnt) { if (clnt->cl_parent != clnt) {
if (!IS_ERR(clnt->cl_dentry))
dput(clnt->cl_dentry);
rpc_destroy_client(clnt->cl_parent); rpc_destroy_client(clnt->cl_parent);
goto out_free; goto out_free;
} }
if (!IS_ERR(clnt->cl_dentry)) if (!IS_ERR(clnt->cl_dentry)) {
rpc_rmdir(clnt->cl_dentry); rpc_rmdir(clnt->cl_dentry);
rpc_put_mount();
}
if (clnt->cl_xprt) { if (clnt->cl_xprt) {
xprt_destroy(clnt->cl_xprt); xprt_destroy(clnt->cl_xprt);
clnt->cl_xprt = NULL; clnt->cl_xprt = NULL;
...@@ -331,10 +332,6 @@ rpc_destroy_client(struct rpc_clnt *clnt) ...@@ -331,10 +332,6 @@ rpc_destroy_client(struct rpc_clnt *clnt)
out_free: out_free:
rpc_free_iostats(clnt->cl_metrics); rpc_free_iostats(clnt->cl_metrics);
clnt->cl_metrics = NULL; clnt->cl_metrics = NULL;
if (!IS_ERR(clnt->cl_dentry)) {
dput(clnt->cl_dentry);
rpc_put_mount();
}
kfree(clnt); kfree(clnt);
return 0; return 0;
} }
......
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