|
@@ -81,7 +81,7 @@ struct gss_auth {
|
|
|
* mechanism (for example, "krb5") and exists for
|
|
|
* backwards-compatibility with older gssd's.
|
|
|
*/
|
|
|
- struct dentry *dentry[2];
|
|
|
+ struct rpc_pipe *pipe[2];
|
|
|
};
|
|
|
|
|
|
/* pipe_version >= 0 if and only if someone has a pipe open. */
|
|
@@ -449,7 +449,7 @@ gss_alloc_msg(struct gss_auth *gss_auth, struct rpc_clnt *clnt,
|
|
|
kfree(gss_msg);
|
|
|
return ERR_PTR(vers);
|
|
|
}
|
|
|
- gss_msg->pipe = RPC_I(gss_auth->dentry[vers]->d_inode)->pipe;
|
|
|
+ gss_msg->pipe = gss_auth->pipe[vers];
|
|
|
INIT_LIST_HEAD(&gss_msg->list);
|
|
|
rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq");
|
|
|
init_waitqueue_head(&gss_msg->waitqueue);
|
|
@@ -799,21 +799,33 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
|
|
|
* that we supported only the old pipe. So we instead create
|
|
|
* the new pipe first.
|
|
|
*/
|
|
|
- gss_auth->dentry[1] = rpc_mkpipe(clnt->cl_path.dentry,
|
|
|
- "gssd",
|
|
|
- clnt, &gss_upcall_ops_v1,
|
|
|
- RPC_PIPE_WAIT_FOR_OPEN);
|
|
|
- if (IS_ERR(gss_auth->dentry[1])) {
|
|
|
- err = PTR_ERR(gss_auth->dentry[1]);
|
|
|
+ gss_auth->pipe[1] = rpc_mkpipe_data(&gss_upcall_ops_v1,
|
|
|
+ RPC_PIPE_WAIT_FOR_OPEN);
|
|
|
+ if (IS_ERR(gss_auth->pipe[1])) {
|
|
|
+ err = PTR_ERR(gss_auth->pipe[1]);
|
|
|
goto err_put_mech;
|
|
|
}
|
|
|
|
|
|
- gss_auth->dentry[0] = rpc_mkpipe(clnt->cl_path.dentry,
|
|
|
- gss_auth->mech->gm_name,
|
|
|
- clnt, &gss_upcall_ops_v0,
|
|
|
- RPC_PIPE_WAIT_FOR_OPEN);
|
|
|
- if (IS_ERR(gss_auth->dentry[0])) {
|
|
|
- err = PTR_ERR(gss_auth->dentry[0]);
|
|
|
+ gss_auth->pipe[0] = rpc_mkpipe_data(&gss_upcall_ops_v0,
|
|
|
+ RPC_PIPE_WAIT_FOR_OPEN);
|
|
|
+ if (IS_ERR(gss_auth->pipe[0])) {
|
|
|
+ err = PTR_ERR(gss_auth->pipe[0]);
|
|
|
+ goto err_destroy_pipe_1;
|
|
|
+ }
|
|
|
+
|
|
|
+ gss_auth->pipe[1]->dentry = rpc_mkpipe_dentry(clnt->cl_path.dentry,
|
|
|
+ "gssd",
|
|
|
+ clnt, gss_auth->pipe[1]);
|
|
|
+ if (IS_ERR(gss_auth->pipe[1]->dentry)) {
|
|
|
+ err = PTR_ERR(gss_auth->pipe[1]->dentry);
|
|
|
+ goto err_destroy_pipe_0;
|
|
|
+ }
|
|
|
+
|
|
|
+ gss_auth->pipe[0]->dentry = rpc_mkpipe_dentry(clnt->cl_path.dentry,
|
|
|
+ gss_auth->mech->gm_name,
|
|
|
+ clnt, gss_auth->pipe[0]);
|
|
|
+ if (IS_ERR(gss_auth->pipe[0]->dentry)) {
|
|
|
+ err = PTR_ERR(gss_auth->pipe[0]->dentry);
|
|
|
goto err_unlink_pipe_1;
|
|
|
}
|
|
|
err = rpcauth_init_credcache(auth);
|
|
@@ -822,9 +834,13 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
|
|
|
|
|
|
return auth;
|
|
|
err_unlink_pipe_0:
|
|
|
- rpc_unlink(gss_auth->dentry[0]);
|
|
|
+ rpc_unlink(gss_auth->pipe[0]->dentry);
|
|
|
err_unlink_pipe_1:
|
|
|
- rpc_unlink(gss_auth->dentry[1]);
|
|
|
+ rpc_unlink(gss_auth->pipe[1]->dentry);
|
|
|
+err_destroy_pipe_0:
|
|
|
+ rpc_destroy_pipe_data(gss_auth->pipe[0]);
|
|
|
+err_destroy_pipe_1:
|
|
|
+ rpc_destroy_pipe_data(gss_auth->pipe[1]);
|
|
|
err_put_mech:
|
|
|
gss_mech_put(gss_auth->mech);
|
|
|
err_free:
|
|
@@ -837,8 +853,10 @@ out_dec:
|
|
|
static void
|
|
|
gss_free(struct gss_auth *gss_auth)
|
|
|
{
|
|
|
- rpc_unlink(gss_auth->dentry[1]);
|
|
|
- rpc_unlink(gss_auth->dentry[0]);
|
|
|
+ rpc_unlink(gss_auth->pipe[0]->dentry);
|
|
|
+ rpc_unlink(gss_auth->pipe[1]->dentry);
|
|
|
+ rpc_destroy_pipe_data(gss_auth->pipe[0]);
|
|
|
+ rpc_destroy_pipe_data(gss_auth->pipe[1]);
|
|
|
gss_mech_put(gss_auth->mech);
|
|
|
|
|
|
kfree(gss_auth);
|