Lines Matching full:pipe

86 	struct rpc_pipe *pipe =  in rpc_timeout_upcall_queue()  local
91 spin_lock(&pipe->lock); in rpc_timeout_upcall_queue()
92 destroy_msg = pipe->ops->destroy_msg; in rpc_timeout_upcall_queue()
93 if (pipe->nreaders == 0) { in rpc_timeout_upcall_queue()
94 list_splice_init(&pipe->pipe, &free_list); in rpc_timeout_upcall_queue()
95 pipe->pipelen = 0; in rpc_timeout_upcall_queue()
97 dentry = dget(pipe->dentry); in rpc_timeout_upcall_queue()
98 spin_unlock(&pipe->lock); in rpc_timeout_upcall_queue()
126 * @pipe: upcall pipe on which to queue given message
135 rpc_queue_upcall(struct rpc_pipe *pipe, struct rpc_pipe_msg *msg) in rpc_queue_upcall() argument
140 spin_lock(&pipe->lock); in rpc_queue_upcall()
141 if (pipe->nreaders) { in rpc_queue_upcall()
142 list_add_tail(&msg->list, &pipe->pipe); in rpc_queue_upcall()
143 pipe->pipelen += msg->len; in rpc_queue_upcall()
145 } else if (pipe->flags & RPC_PIPE_WAIT_FOR_OPEN) { in rpc_queue_upcall()
146 if (list_empty(&pipe->pipe)) in rpc_queue_upcall()
148 &pipe->queue_timeout, in rpc_queue_upcall()
150 list_add_tail(&msg->list, &pipe->pipe); in rpc_queue_upcall()
151 pipe->pipelen += msg->len; in rpc_queue_upcall()
154 dentry = dget(pipe->dentry); in rpc_queue_upcall()
155 spin_unlock(&pipe->lock); in rpc_queue_upcall()
174 struct rpc_pipe *pipe = RPC_I(inode)->pipe; in rpc_close_pipes() local
179 spin_lock(&pipe->lock); in rpc_close_pipes()
180 need_release = pipe->nreaders != 0 || pipe->nwriters != 0; in rpc_close_pipes()
181 pipe->nreaders = 0; in rpc_close_pipes()
182 list_splice_init(&pipe->in_upcall, &free_list); in rpc_close_pipes()
183 list_splice_init(&pipe->pipe, &free_list); in rpc_close_pipes()
184 pipe->pipelen = 0; in rpc_close_pipes()
185 pipe->dentry = NULL; in rpc_close_pipes()
186 spin_unlock(&pipe->lock); in rpc_close_pipes()
187 rpc_purge_list(&RPC_I(inode)->waitq, &free_list, pipe->ops->destroy_msg, -EPIPE); in rpc_close_pipes()
188 pipe->nwriters = 0; in rpc_close_pipes()
189 if (need_release && pipe->ops->release_pipe) in rpc_close_pipes()
190 pipe->ops->release_pipe(inode); in rpc_close_pipes()
191 cancel_delayed_work_sync(&pipe->queue_timeout); in rpc_close_pipes()
193 RPC_I(inode)->pipe = NULL; in rpc_close_pipes()
216 struct rpc_pipe *pipe; in rpc_pipe_open() local
221 pipe = RPC_I(inode)->pipe; in rpc_pipe_open()
222 if (pipe == NULL) in rpc_pipe_open()
224 first_open = pipe->nreaders == 0 && pipe->nwriters == 0; in rpc_pipe_open()
225 if (first_open && pipe->ops->open_pipe) { in rpc_pipe_open()
226 res = pipe->ops->open_pipe(inode); in rpc_pipe_open()
231 pipe->nreaders++; in rpc_pipe_open()
233 pipe->nwriters++; in rpc_pipe_open()
243 struct rpc_pipe *pipe; in rpc_pipe_release() local
248 pipe = RPC_I(inode)->pipe; in rpc_pipe_release()
249 if (pipe == NULL) in rpc_pipe_release()
253 spin_lock(&pipe->lock); in rpc_pipe_release()
256 spin_unlock(&pipe->lock); in rpc_pipe_release()
257 pipe->ops->destroy_msg(msg); in rpc_pipe_release()
260 pipe->nwriters --; in rpc_pipe_release()
262 pipe->nreaders --; in rpc_pipe_release()
263 if (pipe->nreaders == 0) { in rpc_pipe_release()
265 spin_lock(&pipe->lock); in rpc_pipe_release()
266 list_splice_init(&pipe->pipe, &free_list); in rpc_pipe_release()
267 pipe->pipelen = 0; in rpc_pipe_release()
268 spin_unlock(&pipe->lock); in rpc_pipe_release()
270 pipe->ops->destroy_msg, -EAGAIN); in rpc_pipe_release()
273 last_close = pipe->nwriters == 0 && pipe->nreaders == 0; in rpc_pipe_release()
274 if (last_close && pipe->ops->release_pipe) in rpc_pipe_release()
275 pipe->ops->release_pipe(inode); in rpc_pipe_release()
285 struct rpc_pipe *pipe; in rpc_pipe_read() local
290 pipe = RPC_I(inode)->pipe; in rpc_pipe_read()
291 if (pipe == NULL) { in rpc_pipe_read()
297 spin_lock(&pipe->lock); in rpc_pipe_read()
298 if (!list_empty(&pipe->pipe)) { in rpc_pipe_read()
299 msg = list_entry(pipe->pipe.next, in rpc_pipe_read()
302 list_move(&msg->list, &pipe->in_upcall); in rpc_pipe_read()
303 pipe->pipelen -= msg->len; in rpc_pipe_read()
307 spin_unlock(&pipe->lock); in rpc_pipe_read()
312 res = pipe->ops->upcall(filp, msg, buf, len); in rpc_pipe_read()
315 spin_lock(&pipe->lock); in rpc_pipe_read()
317 spin_unlock(&pipe->lock); in rpc_pipe_read()
318 pipe->ops->destroy_msg(msg); in rpc_pipe_read()
333 if (RPC_I(inode)->pipe != NULL) in rpc_pipe_write()
334 res = RPC_I(inode)->pipe->ops->downcall(filp, buf, len); in rpc_pipe_write()
349 if (rpci->pipe == NULL) in rpc_pipe_poll()
351 else if (filp->private_data || !list_empty(&rpci->pipe->pipe)) in rpc_pipe_poll()
361 struct rpc_pipe *pipe; in rpc_pipe_ioctl() local
367 pipe = RPC_I(inode)->pipe; in rpc_pipe_ioctl()
368 if (pipe == NULL) { in rpc_pipe_ioctl()
372 spin_lock(&pipe->lock); in rpc_pipe_ioctl()
373 len = pipe->pipelen; in rpc_pipe_ioctl()
379 spin_unlock(&pipe->lock); in rpc_pipe_ioctl()
489 init_pipe(struct rpc_pipe *pipe) in init_pipe() argument
491 pipe->nreaders = 0; in init_pipe()
492 pipe->nwriters = 0; in init_pipe()
493 INIT_LIST_HEAD(&pipe->in_upcall); in init_pipe()
494 INIT_LIST_HEAD(&pipe->in_downcall); in init_pipe()
495 INIT_LIST_HEAD(&pipe->pipe); in init_pipe()
496 pipe->pipelen = 0; in init_pipe()
497 INIT_DELAYED_WORK(&pipe->queue_timeout, in init_pipe()
499 pipe->ops = NULL; in init_pipe()
500 spin_lock_init(&pipe->lock); in init_pipe()
501 pipe->dentry = NULL; in init_pipe()
504 void rpc_destroy_pipe_data(struct rpc_pipe *pipe) in rpc_destroy_pipe_data() argument
506 kfree(pipe); in rpc_destroy_pipe_data()
512 struct rpc_pipe *pipe; in rpc_mkpipe_data() local
514 pipe = kzalloc(sizeof(struct rpc_pipe), GFP_KERNEL); in rpc_mkpipe_data()
515 if (!pipe) in rpc_mkpipe_data()
517 init_pipe(pipe); in rpc_mkpipe_data()
518 pipe->ops = ops; in rpc_mkpipe_data()
519 pipe->flags = flags; in rpc_mkpipe_data()
520 return pipe; in rpc_mkpipe_data()
621 * @parent: dentry of directory to create new "pipe" in
622 * @name: name of pipe
623 * @private: private data to associate with the pipe, for the caller's use
624 * @pipe: &rpc_pipe containing input parameters
638 void *private, struct rpc_pipe *pipe) in rpc_mkpipe_dentry() argument
647 if (pipe->ops->upcall == NULL) in rpc_mkpipe_dentry()
649 if (pipe->ops->downcall == NULL) in rpc_mkpipe_dentry()
669 rpci->pipe = pipe; in rpc_mkpipe_dentry()
672 pipe->dentry = dentry; in rpc_mkpipe_dentry()
678 pr_warn("%s() failed to create pipe %pd/%s (errno = %d)\n", in rpc_mkpipe_dentry()
685 * rpc_unlink - remove a pipe
686 * @pipe: the pipe to be removed
688 * After this call, lookups will no longer find the pipe, and any
689 * attempts to read or write using preexisting opens of the pipe will
693 rpc_unlink(struct rpc_pipe *pipe) in rpc_unlink() argument
695 if (pipe->dentry) { in rpc_unlink()
696 simple_recursive_removal(pipe->dentry, rpc_close_pipes); in rpc_unlink()
697 pipe->dentry = NULL; in rpc_unlink()
891 * @rpc_client: rpc_client for the pipe
1091 * rpc_gssd_dummy_populate - create a dummy gssd pipe
1093 * @pipe_data: pipe data created when netns is initialized
1095 * Create a dummy set of directories and a pipe that gssd can hold open to
1161 struct rpc_pipe *pipe = sn->gssd_dummy; in gssd_running() local
1163 return pipe->nreaders || pipe->nwriters; in gssd_running()
1229 rpci->pipe = NULL; in init_once()