浏览代码

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: Trond Myklebust <Trond.Myklebust@netapp.com>
(cherry picked from a05a57effa71a1f67ccbfc52335c10c8b85f3f6a commit)
Trond Myklebust 19 年之前
父节点
当前提交
8f8e7a50f4
共有 3 个文件被更改,包括 6 次插入11 次删除
  1. 0 1
      fs/nfs/idmap.c
  2. 0 1
      net/sunrpc/auth_gss/auth_gss.c
  3. 6 9
      net/sunrpc/clnt.c

+ 0 - 1
fs/nfs/idmap.c

@@ -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);
 }
 }

+ 0 - 1
net/sunrpc/auth_gss/auth_gss.c

@@ -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);
 
 

+ 6 - 9
net/sunrpc/clnt.c

@@ -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)
 	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)
 		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)
 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;
 }
 }