diff options
Diffstat (limited to 'net')
| -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 |
