Lines Matching +full:foo +full:- +full:queue
70 msg = list_entry(head->next, struct rpc_pipe_msg, list); in rpc_purge_list()
71 list_del_init(&msg->list); in rpc_purge_list()
72 msg->errno = err; in rpc_purge_list()
89 spin_lock(&pipe->lock); in rpc_timeout_upcall_queue()
90 destroy_msg = pipe->ops->destroy_msg; in rpc_timeout_upcall_queue()
91 if (pipe->nreaders == 0) { in rpc_timeout_upcall_queue()
92 list_splice_init(&pipe->pipe, &free_list); in rpc_timeout_upcall_queue()
93 pipe->pipelen = 0; in rpc_timeout_upcall_queue()
95 dentry = dget(pipe->dentry); in rpc_timeout_upcall_queue()
96 spin_unlock(&pipe->lock); in rpc_timeout_upcall_queue()
97 rpc_purge_list(dentry ? &RPC_I(d_inode(dentry))->waitq : NULL, in rpc_timeout_upcall_queue()
98 &free_list, destroy_msg, -ETIMEDOUT); in rpc_timeout_upcall_queue()
105 char *data = (char *)msg->data + msg->copied; in rpc_pipe_generic_upcall()
106 size_t mlen = min(msg->len - msg->copied, buflen); in rpc_pipe_generic_upcall()
111 msg->errno = -EFAULT; in rpc_pipe_generic_upcall()
112 return -EFAULT; in rpc_pipe_generic_upcall()
115 mlen -= left; in rpc_pipe_generic_upcall()
116 msg->copied += mlen; in rpc_pipe_generic_upcall()
117 msg->errno = 0; in rpc_pipe_generic_upcall()
123 * rpc_queue_upcall - queue an upcall message to userspace
124 * @pipe: upcall pipe on which to queue given message
125 * @msg: message to queue
127 * Call with an @inode created by rpc_mkpipe() to queue an upcall.
130 * initialize the fields of @msg (other than @msg->list) appropriately.
135 int res = -EPIPE; in rpc_queue_upcall()
138 spin_lock(&pipe->lock); in rpc_queue_upcall()
139 if (pipe->nreaders) { in rpc_queue_upcall()
140 list_add_tail(&msg->list, &pipe->pipe); in rpc_queue_upcall()
141 pipe->pipelen += msg->len; in rpc_queue_upcall()
143 } else if (pipe->flags & RPC_PIPE_WAIT_FOR_OPEN) { in rpc_queue_upcall()
144 if (list_empty(&pipe->pipe)) in rpc_queue_upcall()
146 &pipe->queue_timeout, in rpc_queue_upcall()
148 list_add_tail(&msg->list, &pipe->pipe); in rpc_queue_upcall()
149 pipe->pipelen += msg->len; in rpc_queue_upcall()
152 dentry = dget(pipe->dentry); in rpc_queue_upcall()
153 spin_unlock(&pipe->lock); in rpc_queue_upcall()
155 wake_up(&RPC_I(d_inode(dentry))->waitq); in rpc_queue_upcall()
165 RPC_I(inode)->private = private; in rpc_inode_setowner()
171 struct rpc_pipe *pipe = RPC_I(inode)->pipe; in rpc_close_pipes()
176 spin_lock(&pipe->lock); in rpc_close_pipes()
177 need_release = pipe->nreaders != 0 || pipe->nwriters != 0; in rpc_close_pipes()
178 pipe->nreaders = 0; in rpc_close_pipes()
179 list_splice_init(&pipe->in_upcall, &free_list); in rpc_close_pipes()
180 list_splice_init(&pipe->pipe, &free_list); in rpc_close_pipes()
181 pipe->pipelen = 0; in rpc_close_pipes()
182 pipe->dentry = NULL; in rpc_close_pipes()
183 spin_unlock(&pipe->lock); in rpc_close_pipes()
184 rpc_purge_list(&RPC_I(inode)->waitq, &free_list, pipe->ops->destroy_msg, -EPIPE); in rpc_close_pipes()
185 pipe->nwriters = 0; in rpc_close_pipes()
186 if (need_release && pipe->ops->release_pipe) in rpc_close_pipes()
187 pipe->ops->release_pipe(inode); in rpc_close_pipes()
188 cancel_delayed_work_sync(&pipe->queue_timeout); in rpc_close_pipes()
190 RPC_I(inode)->pipe = NULL; in rpc_close_pipes()
201 return &rpci->vfs_inode; in rpc_alloc_inode()
214 call_rcu(&inode->i_rcu, rpc_i_callback); in rpc_destroy_inode()
222 int res = -ENXIO; in rpc_pipe_open()
225 pipe = RPC_I(inode)->pipe; in rpc_pipe_open()
228 first_open = pipe->nreaders == 0 && pipe->nwriters == 0; in rpc_pipe_open()
229 if (first_open && pipe->ops->open_pipe) { in rpc_pipe_open()
230 res = pipe->ops->open_pipe(inode); in rpc_pipe_open()
234 if (filp->f_mode & FMODE_READ) in rpc_pipe_open()
235 pipe->nreaders++; in rpc_pipe_open()
236 if (filp->f_mode & FMODE_WRITE) in rpc_pipe_open()
237 pipe->nwriters++; in rpc_pipe_open()
252 pipe = RPC_I(inode)->pipe; in rpc_pipe_release()
255 msg = filp->private_data; in rpc_pipe_release()
257 spin_lock(&pipe->lock); in rpc_pipe_release()
258 msg->errno = -EAGAIN; in rpc_pipe_release()
259 list_del_init(&msg->list); in rpc_pipe_release()
260 spin_unlock(&pipe->lock); in rpc_pipe_release()
261 pipe->ops->destroy_msg(msg); in rpc_pipe_release()
263 if (filp->f_mode & FMODE_WRITE) in rpc_pipe_release()
264 pipe->nwriters --; in rpc_pipe_release()
265 if (filp->f_mode & FMODE_READ) { in rpc_pipe_release()
266 pipe->nreaders --; in rpc_pipe_release()
267 if (pipe->nreaders == 0) { in rpc_pipe_release()
269 spin_lock(&pipe->lock); in rpc_pipe_release()
270 list_splice_init(&pipe->pipe, &free_list); in rpc_pipe_release()
271 pipe->pipelen = 0; in rpc_pipe_release()
272 spin_unlock(&pipe->lock); in rpc_pipe_release()
273 rpc_purge_list(&RPC_I(inode)->waitq, &free_list, in rpc_pipe_release()
274 pipe->ops->destroy_msg, -EAGAIN); in rpc_pipe_release()
277 last_close = pipe->nwriters == 0 && pipe->nreaders == 0; in rpc_pipe_release()
278 if (last_close && pipe->ops->release_pipe) in rpc_pipe_release()
279 pipe->ops->release_pipe(inode); in rpc_pipe_release()
294 pipe = RPC_I(inode)->pipe; in rpc_pipe_read()
296 res = -EPIPE; in rpc_pipe_read()
299 msg = filp->private_data; in rpc_pipe_read()
301 spin_lock(&pipe->lock); in rpc_pipe_read()
302 if (!list_empty(&pipe->pipe)) { in rpc_pipe_read()
303 msg = list_entry(pipe->pipe.next, in rpc_pipe_read()
306 list_move(&msg->list, &pipe->in_upcall); in rpc_pipe_read()
307 pipe->pipelen -= msg->len; in rpc_pipe_read()
308 filp->private_data = msg; in rpc_pipe_read()
309 msg->copied = 0; in rpc_pipe_read()
311 spin_unlock(&pipe->lock); in rpc_pipe_read()
315 /* NOTE: it is up to the callback to update msg->copied */ in rpc_pipe_read()
316 res = pipe->ops->upcall(filp, msg, buf, len); in rpc_pipe_read()
317 if (res < 0 || msg->len == msg->copied) { in rpc_pipe_read()
318 filp->private_data = NULL; in rpc_pipe_read()
319 spin_lock(&pipe->lock); in rpc_pipe_read()
320 list_del_init(&msg->list); in rpc_pipe_read()
321 spin_unlock(&pipe->lock); in rpc_pipe_read()
322 pipe->ops->destroy_msg(msg); in rpc_pipe_read()
336 res = -EPIPE; in rpc_pipe_write()
337 if (RPC_I(inode)->pipe != NULL) in rpc_pipe_write()
338 res = RPC_I(inode)->pipe->ops->downcall(filp, buf, len); in rpc_pipe_write()
350 poll_wait(filp, &rpci->waitq, wait); in rpc_pipe_poll()
353 if (rpci->pipe == NULL) in rpc_pipe_poll()
355 else if (filp->private_data || !list_empty(&rpci->pipe->pipe)) in rpc_pipe_poll()
371 pipe = RPC_I(inode)->pipe; in rpc_pipe_ioctl()
374 return -EPIPE; in rpc_pipe_ioctl()
376 spin_lock(&pipe->lock); in rpc_pipe_ioctl()
377 len = pipe->pipelen; in rpc_pipe_ioctl()
378 if (filp->private_data) { in rpc_pipe_ioctl()
380 msg = filp->private_data; in rpc_pipe_ioctl()
381 len += msg->len - msg->copied; in rpc_pipe_ioctl()
383 spin_unlock(&pipe->lock); in rpc_pipe_ioctl()
387 return -EINVAL; in rpc_pipe_ioctl()
405 struct rpc_clnt *clnt = m->private; in rpc_show_info()
409 rcu_dereference(clnt->cl_xprt)->servername); in rpc_show_info()
410 seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_program->name, in rpc_show_info()
411 clnt->cl_prog, clnt->cl_vers); in rpc_show_info()
426 struct seq_file *m = file->private_data; in rpc_info_open()
428 spin_lock(&file->f_path.dentry->d_lock); in rpc_info_open()
429 if (!d_unhashed(file->f_path.dentry)) in rpc_info_open()
430 clnt = RPC_I(inode)->private; in rpc_info_open()
431 if (clnt != NULL && atomic_inc_not_zero(&clnt->cl_count)) { in rpc_info_open()
432 spin_unlock(&file->f_path.dentry->d_lock); in rpc_info_open()
433 m->private = clnt; in rpc_info_open()
435 spin_unlock(&file->f_path.dentry->d_lock); in rpc_info_open()
437 ret = -EINVAL; in rpc_info_open()
446 struct seq_file *m = file->private_data; in rpc_info_release()
447 struct rpc_clnt *clnt = (struct rpc_clnt *)m->private; in rpc_info_release()
478 inode->i_ino = get_next_ino(); in rpc_get_inode()
479 inode->i_mode = mode; in rpc_get_inode()
480 inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode); in rpc_get_inode()
483 inode->i_fop = &simple_dir_operations; in rpc_get_inode()
484 inode->i_op = &simple_dir_inode_operations; in rpc_get_inode()
500 inode = rpc_get_inode(dir->i_sb, mode); in __rpc_create_common()
503 inode->i_ino = iunique(dir->i_sb, 100); in __rpc_create_common()
505 inode->i_fop = i_fop; in __rpc_create_common()
514 return -ENOMEM; in __rpc_create_common()
549 pipe->nreaders = 0; in init_pipe()
550 pipe->nwriters = 0; in init_pipe()
551 INIT_LIST_HEAD(&pipe->in_upcall); in init_pipe()
552 INIT_LIST_HEAD(&pipe->in_downcall); in init_pipe()
553 INIT_LIST_HEAD(&pipe->pipe); in init_pipe()
554 pipe->pipelen = 0; in init_pipe()
555 INIT_DELAYED_WORK(&pipe->queue_timeout, in init_pipe()
557 pipe->ops = NULL; in init_pipe()
558 spin_lock_init(&pipe->lock); in init_pipe()
559 pipe->dentry = NULL; in init_pipe()
574 return ERR_PTR(-ENOMEM); in rpc_mkpipe_data()
576 pipe->ops = ops; in rpc_mkpipe_data()
577 pipe->flags = flags; in rpc_mkpipe_data()
595 rpci->private = private; in __rpc_mkpipe_dentry()
596 rpci->pipe = pipe; in __rpc_mkpipe_dentry()
639 return ERR_PTR(-ENOMEM); in __rpc_lookup_create_exclusive()
644 return ERR_PTR(-EEXIST); in __rpc_lookup_create_exclusive()
668 switch (d_inode(dentry)->i_mode & S_IFMT) { in __rpc_depopulate()
785 * rpc_mkpipe - make an rpc_pipefs file for kernel<->userspace communication
793 * @ops->upcall, which will be called with the file pointer,
797 * responses to upcalls. They will result in calls to @msg->downcall.
800 * from the file pointer, via RPC_I(file_inode(file))->private.
810 if (pipe->ops->upcall == NULL) in rpc_mkpipe_dentry()
812 if (pipe->ops->downcall == NULL) in rpc_mkpipe_dentry()
836 * rpc_unlink - remove a pipe
841 * return -EPIPE.
861 * rpc_init_pipe_dir_head - initialise a struct rpc_pipe_dir_head
866 INIT_LIST_HEAD(&pdh->pdh_entries); in rpc_init_pipe_dir_head()
867 pdh->pdh_dentry = NULL; in rpc_init_pipe_dir_head()
872 * rpc_init_pipe_dir_object - initialise a struct rpc_pipe_dir_object
875 * @pdo_data: pointer to caller-defined data
881 INIT_LIST_HEAD(&pdo->pdo_head); in rpc_init_pipe_dir_object()
882 pdo->pdo_ops = pdo_ops; in rpc_init_pipe_dir_object()
883 pdo->pdo_data = pdo_data; in rpc_init_pipe_dir_object()
894 if (pdh->pdh_dentry) in rpc_add_pipe_dir_object_locked()
895 ret = pdo->pdo_ops->create(pdh->pdh_dentry, pdo); in rpc_add_pipe_dir_object_locked()
897 list_add_tail(&pdo->pdo_head, &pdh->pdh_entries); in rpc_add_pipe_dir_object_locked()
906 if (pdh->pdh_dentry) in rpc_remove_pipe_dir_object_locked()
907 pdo->pdo_ops->destroy(pdh->pdh_dentry, pdo); in rpc_remove_pipe_dir_object_locked()
908 list_del_init(&pdo->pdo_head); in rpc_remove_pipe_dir_object_locked()
912 * rpc_add_pipe_dir_object - associate a rpc_pipe_dir_object to a directory
925 if (list_empty(&pdo->pdo_head)) { in rpc_add_pipe_dir_object()
928 mutex_lock(&sn->pipefs_sb_lock); in rpc_add_pipe_dir_object()
930 mutex_unlock(&sn->pipefs_sb_lock); in rpc_add_pipe_dir_object()
937 * rpc_remove_pipe_dir_object - remove a rpc_pipe_dir_object from a directory
948 if (!list_empty(&pdo->pdo_head)) { in rpc_remove_pipe_dir_object()
951 mutex_lock(&sn->pipefs_sb_lock); in rpc_remove_pipe_dir_object()
953 mutex_unlock(&sn->pipefs_sb_lock); in rpc_remove_pipe_dir_object()
977 mutex_lock(&sn->pipefs_sb_lock); in rpc_find_or_alloc_pipe_dir_object()
978 list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) { in rpc_find_or_alloc_pipe_dir_object()
988 mutex_unlock(&sn->pipefs_sb_lock); in rpc_find_or_alloc_pipe_dir_object()
997 struct dentry *dir = pdh->pdh_dentry; in rpc_create_pipe_dir_objects()
999 list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) in rpc_create_pipe_dir_objects()
1000 pdo->pdo_ops->create(dir, pdo); in rpc_create_pipe_dir_objects()
1007 struct dentry *dir = pdh->pdh_dentry; in rpc_destroy_pipe_dir_objects()
1009 list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) in rpc_destroy_pipe_dir_objects()
1010 pdo->pdo_ops->destroy(dir, pdo); in rpc_destroy_pipe_dir_objects()
1039 * rpc_create_client_dir - Create a new rpc_client directory in rpc_pipefs
1058 rpc_client->cl_pipedir_objects.pdh_dentry = ret; in rpc_create_client_dir()
1059 rpc_create_pipe_dir_objects(&rpc_client->cl_pipedir_objects); in rpc_create_client_dir()
1065 * rpc_remove_client_dir - Remove a directory created with rpc_create_client_dir()
1070 struct dentry *dentry = rpc_client->cl_pipedir_objects.pdh_dentry; in rpc_remove_client_dir()
1074 rpc_destroy_pipe_dir_objects(&rpc_client->cl_pipedir_objects); in rpc_remove_client_dir()
1075 rpc_client->cl_pipedir_objects.pdh_dentry = NULL; in rpc_remove_client_dir()
1194 return d_hash_and_lookup(sb->s_root, &dir); in rpc_d_lookup_sb()
1202 sn->gssd_dummy = rpc_mkpipe_data(&gssd_dummy_pipe_ops, 0); in rpc_pipefs_init_net()
1203 if (IS_ERR(sn->gssd_dummy)) in rpc_pipefs_init_net()
1204 return PTR_ERR(sn->gssd_dummy); in rpc_pipefs_init_net()
1206 mutex_init(&sn->pipefs_sb_lock); in rpc_pipefs_init_net()
1207 sn->pipe_version = -1; in rpc_pipefs_init_net()
1215 rpc_destroy_pipe_data(sn->gssd_dummy); in rpc_pipefs_exit_net()
1228 mutex_lock(&sn->pipefs_sb_lock); in rpc_get_sb_net()
1229 if (sn->pipefs_sb) in rpc_get_sb_net()
1230 return sn->pipefs_sb; in rpc_get_sb_net()
1231 mutex_unlock(&sn->pipefs_sb_lock); in rpc_get_sb_net()
1240 WARN_ON(sn->pipefs_sb == NULL); in rpc_put_sb_net()
1241 mutex_unlock(&sn->pipefs_sb_lock); in rpc_put_sb_net()
1255 return -EINVAL; in dummy_downcall()
1271 seq_printf(m, "RPC server: %s\n", utsname()->nodename); in rpc_show_dummy_info()
1272 seq_printf(m, "service: foo (1) version 0\n"); in rpc_show_dummy_info()
1302 * rpc_gssd_dummy_populate - create a dummy gssd pipe
1322 return ERR_PTR(-ENOENT); in rpc_gssd_dummy_populate()
1335 pipe_dentry = ERR_PTR(-ENOENT); in rpc_gssd_dummy_populate()
1360 struct dentry *clnt_dir = pipe_dentry->d_parent; in rpc_gssd_dummy_depopulate()
1361 struct dentry *gssd_dir = clnt_dir->d_parent; in rpc_gssd_dummy_depopulate()
1375 struct net *net = get_net(sb->s_fs_info); in rpc_fill_super()
1379 sb->s_blocksize = PAGE_SIZE; in rpc_fill_super()
1380 sb->s_blocksize_bits = PAGE_SHIFT; in rpc_fill_super()
1381 sb->s_magic = RPCAUTH_GSSMAGIC; in rpc_fill_super()
1382 sb->s_op = &s_ops; in rpc_fill_super()
1383 sb->s_d_op = &simple_dentry_operations; in rpc_fill_super()
1384 sb->s_time_gran = 1; in rpc_fill_super()
1387 sb->s_root = root = d_make_root(inode); in rpc_fill_super()
1389 return -ENOMEM; in rpc_fill_super()
1391 return -ENOMEM; in rpc_fill_super()
1393 gssd_dentry = rpc_gssd_dummy_populate(root, sn->gssd_dummy); in rpc_fill_super()
1400 net->ns.inum, NET_NAME(net)); in rpc_fill_super()
1401 mutex_lock(&sn->pipefs_sb_lock); in rpc_fill_super()
1402 sn->pipefs_sb = sb; in rpc_fill_super()
1408 mutex_unlock(&sn->pipefs_sb_lock); in rpc_fill_super()
1416 sn->pipefs_sb = NULL; in rpc_fill_super()
1418 mutex_unlock(&sn->pipefs_sb_lock); in rpc_fill_super()
1426 struct rpc_pipe *pipe = sn->gssd_dummy; in gssd_running()
1428 return pipe->nreaders || pipe->nwriters; in gssd_running()
1436 struct net *net = current->nsproxy->net_ns; in rpc_mount()
1437 return mount_ns(fs_type, flags, data, net, net->user_ns, rpc_fill_super); in rpc_mount()
1442 struct net *net = sb->s_fs_info; in rpc_kill_sb()
1445 mutex_lock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1446 if (sn->pipefs_sb != sb) { in rpc_kill_sb()
1447 mutex_unlock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1450 sn->pipefs_sb = NULL; in rpc_kill_sb()
1452 net->ns.inum, NET_NAME(net)); in rpc_kill_sb()
1456 mutex_unlock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1472 init_once(void *foo) in init_once() argument
1474 struct rpc_inode *rpci = (struct rpc_inode *) foo; in init_once()
1476 inode_init_once(&rpci->vfs_inode); in init_once()
1477 rpci->private = NULL; in init_once()
1478 rpci->pipe = NULL; in init_once()
1479 init_waitqueue_head(&rpci->waitq); in init_once()
1492 return -ENOMEM; in register_rpc_pipefs()