aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/rpc_pipe.c
diff options
context:
space:
mode:
author\"J. Bruce Fields\ <bfields@citi.umich.edu>2008-12-23 16:08:32 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-12-23 16:08:32 -0500
commitc381060869317b3c84430d4f54965d409cbfe65f (patch)
treeeca752e4fe61fd6e497fede253f83a01a36a365a /net/sunrpc/rpc_pipe.c
parentdb75b3d6b5b0dad29860370618ea94d2726641b4 (diff)
rpc: add an rpc_pipe_open method
We want to transition to a new gssd upcall which is text-based and more easily extensible. To simplify upgrades, as well as testing and debugging, it will help if we can upgrade gssd (to a version which understands the new upcall) without having to choose at boot (or module-load) time whether we want the new or the old upcall. We will do this by providing two different pipes: one named, as currently, after the mechanism (normally "krb5"), and supporting the old upcall. One named "gssd" and supporting the new upcall version. We allow gssd to indicate which version it supports by its choice of which pipe to open. As we have no interest in supporting *simultaneous* use of both versions, we'll forbid opening both pipes at the same time. So, add a new pipe_open callback to the rpc_pipefs api, which the gss code can use to track which pipes have been open, and to refuse opens of incompatible pipes. We only need this to be called on the first open of a given pipe. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/rpc_pipe.c')
-rw-r--r--net/sunrpc/rpc_pipe.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 55b2049834c4..c9b57f47108c 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -169,16 +169,24 @@ static int
169rpc_pipe_open(struct inode *inode, struct file *filp) 169rpc_pipe_open(struct inode *inode, struct file *filp)
170{ 170{
171 struct rpc_inode *rpci = RPC_I(inode); 171 struct rpc_inode *rpci = RPC_I(inode);
172 int first_open;
172 int res = -ENXIO; 173 int res = -ENXIO;
173 174
174 mutex_lock(&inode->i_mutex); 175 mutex_lock(&inode->i_mutex);
175 if (rpci->ops != NULL) { 176 if (rpci->ops == NULL)
176 if (filp->f_mode & FMODE_READ) 177 goto out;
177 rpci->nreaders ++; 178 first_open = rpci->nreaders == 0 && rpci->nwriters == 0;
178 if (filp->f_mode & FMODE_WRITE) 179 if (first_open && rpci->ops->open_pipe) {
179 rpci->nwriters ++; 180 res = rpci->ops->open_pipe(inode);
180 res = 0; 181 if (res)
182 goto out;
181 } 183 }
184 if (filp->f_mode & FMODE_READ)
185 rpci->nreaders++;
186 if (filp->f_mode & FMODE_WRITE)
187 rpci->nwriters++;
188 res = 0;
189out:
182 mutex_unlock(&inode->i_mutex); 190 mutex_unlock(&inode->i_mutex);
183 return res; 191 return res;
184} 192}
@@ -748,7 +756,7 @@ rpc_rmdir(struct dentry *dentry)
748 * @name: name of pipe 756 * @name: name of pipe
749 * @private: private data to associate with the pipe, for the caller's use 757 * @private: private data to associate with the pipe, for the caller's use
750 * @ops: operations defining the behavior of the pipe: upcall, downcall, 758 * @ops: operations defining the behavior of the pipe: upcall, downcall,
751 * release_pipe, and destroy_msg. 759 * release_pipe, open_pipe, and destroy_msg.
752 * @flags: rpc_inode flags 760 * @flags: rpc_inode flags
753 * 761 *
754 * Data is made available for userspace to read by calls to 762 * Data is made available for userspace to read by calls to