diff options
author | \"J. Bruce Fields\ <bfields@citi.umich.edu> | 2008-12-23 16:08:32 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-12-23 16:08:32 -0500 |
commit | c381060869317b3c84430d4f54965d409cbfe65f (patch) | |
tree | eca752e4fe61fd6e497fede253f83a01a36a365a /net/sunrpc | |
parent | db75b3d6b5b0dad29860370618ea94d2726641b4 (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')
-rw-r--r-- | net/sunrpc/rpc_pipe.c | 22 |
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 | |||
169 | rpc_pipe_open(struct inode *inode, struct file *filp) | 169 | rpc_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; | ||
189 | out: | ||
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 |