aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/rpc_pipe.c
diff options
context:
space:
mode:
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