Lines Matching +full:foo +full:- +full:queue

1 // SPDX-License-Identifier: GPL-2.0-only
72 msg = list_entry(head->next, struct rpc_pipe_msg, list); in rpc_purge_list()
73 list_del_init(&msg->list); in rpc_purge_list()
74 msg->errno = err; in rpc_purge_list()
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()
99 rpc_purge_list(dentry ? &RPC_I(d_inode(dentry))->waitq : NULL, in rpc_timeout_upcall_queue()
100 &free_list, destroy_msg, -ETIMEDOUT); in rpc_timeout_upcall_queue()
107 char *data = (char *)msg->data + msg->copied; in rpc_pipe_generic_upcall()
108 size_t mlen = min(msg->len - msg->copied, buflen); in rpc_pipe_generic_upcall()
113 msg->errno = -EFAULT; in rpc_pipe_generic_upcall()
114 return -EFAULT; in rpc_pipe_generic_upcall()
117 mlen -= left; in rpc_pipe_generic_upcall()
118 msg->copied += mlen; in rpc_pipe_generic_upcall()
119 msg->errno = 0; in rpc_pipe_generic_upcall()
125 * rpc_queue_upcall - queue an upcall message to userspace
126 * @pipe: upcall pipe on which to queue given message
127 * @msg: message to queue
129 * Call with an @inode created by rpc_mkpipe() to queue an upcall.
132 * initialize the fields of @msg (other than @msg->list) appropriately.
137 int res = -EPIPE; in rpc_queue_upcall()
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()
157 wake_up(&RPC_I(d_inode(dentry))->waitq); in rpc_queue_upcall()
167 RPC_I(inode)->private = private; in rpc_inode_setowner()
173 struct rpc_pipe *pipe = RPC_I(inode)->pipe; in rpc_close_pipes()
178 spin_lock(&pipe->lock); in rpc_close_pipes()
179 need_release = pipe->nreaders != 0 || pipe->nwriters != 0; in rpc_close_pipes()
180 pipe->nreaders = 0; in rpc_close_pipes()
181 list_splice_init(&pipe->in_upcall, &free_list); in rpc_close_pipes()
182 list_splice_init(&pipe->pipe, &free_list); in rpc_close_pipes()
183 pipe->pipelen = 0; in rpc_close_pipes()
184 pipe->dentry = NULL; in rpc_close_pipes()
185 spin_unlock(&pipe->lock); in rpc_close_pipes()
186 rpc_purge_list(&RPC_I(inode)->waitq, &free_list, pipe->ops->destroy_msg, -EPIPE); in rpc_close_pipes()
187 pipe->nwriters = 0; in rpc_close_pipes()
188 if (need_release && pipe->ops->release_pipe) in rpc_close_pipes()
189 pipe->ops->release_pipe(inode); in rpc_close_pipes()
190 cancel_delayed_work_sync(&pipe->queue_timeout); in rpc_close_pipes()
192 RPC_I(inode)->pipe = NULL; in rpc_close_pipes()
203 return &rpci->vfs_inode; in rpc_alloc_inode()
217 int res = -ENXIO; in rpc_pipe_open()
220 pipe = RPC_I(inode)->pipe; in rpc_pipe_open()
223 first_open = pipe->nreaders == 0 && pipe->nwriters == 0; in rpc_pipe_open()
224 if (first_open && pipe->ops->open_pipe) { in rpc_pipe_open()
225 res = pipe->ops->open_pipe(inode); in rpc_pipe_open()
229 if (filp->f_mode & FMODE_READ) in rpc_pipe_open()
230 pipe->nreaders++; in rpc_pipe_open()
231 if (filp->f_mode & FMODE_WRITE) in rpc_pipe_open()
232 pipe->nwriters++; in rpc_pipe_open()
247 pipe = RPC_I(inode)->pipe; in rpc_pipe_release()
250 msg = filp->private_data; in rpc_pipe_release()
252 spin_lock(&pipe->lock); in rpc_pipe_release()
253 msg->errno = -EAGAIN; in rpc_pipe_release()
254 list_del_init(&msg->list); in rpc_pipe_release()
255 spin_unlock(&pipe->lock); in rpc_pipe_release()
256 pipe->ops->destroy_msg(msg); in rpc_pipe_release()
258 if (filp->f_mode & FMODE_WRITE) in rpc_pipe_release()
259 pipe->nwriters --; in rpc_pipe_release()
260 if (filp->f_mode & FMODE_READ) { in rpc_pipe_release()
261 pipe->nreaders --; in rpc_pipe_release()
262 if (pipe->nreaders == 0) { in rpc_pipe_release()
264 spin_lock(&pipe->lock); in rpc_pipe_release()
265 list_splice_init(&pipe->pipe, &free_list); in rpc_pipe_release()
266 pipe->pipelen = 0; in rpc_pipe_release()
267 spin_unlock(&pipe->lock); in rpc_pipe_release()
268 rpc_purge_list(&RPC_I(inode)->waitq, &free_list, in rpc_pipe_release()
269 pipe->ops->destroy_msg, -EAGAIN); in rpc_pipe_release()
272 last_close = pipe->nwriters == 0 && pipe->nreaders == 0; in rpc_pipe_release()
273 if (last_close && pipe->ops->release_pipe) in rpc_pipe_release()
274 pipe->ops->release_pipe(inode); in rpc_pipe_release()
289 pipe = RPC_I(inode)->pipe; in rpc_pipe_read()
291 res = -EPIPE; in rpc_pipe_read()
294 msg = filp->private_data; in rpc_pipe_read()
296 spin_lock(&pipe->lock); in rpc_pipe_read()
297 if (!list_empty(&pipe->pipe)) { in rpc_pipe_read()
298 msg = list_entry(pipe->pipe.next, in rpc_pipe_read()
301 list_move(&msg->list, &pipe->in_upcall); in rpc_pipe_read()
302 pipe->pipelen -= msg->len; in rpc_pipe_read()
303 filp->private_data = msg; in rpc_pipe_read()
304 msg->copied = 0; in rpc_pipe_read()
306 spin_unlock(&pipe->lock); in rpc_pipe_read()
310 /* NOTE: it is up to the callback to update msg->copied */ in rpc_pipe_read()
311 res = pipe->ops->upcall(filp, msg, buf, len); in rpc_pipe_read()
312 if (res < 0 || msg->len == msg->copied) { in rpc_pipe_read()
313 filp->private_data = NULL; in rpc_pipe_read()
314 spin_lock(&pipe->lock); in rpc_pipe_read()
315 list_del_init(&msg->list); in rpc_pipe_read()
316 spin_unlock(&pipe->lock); in rpc_pipe_read()
317 pipe->ops->destroy_msg(msg); in rpc_pipe_read()
331 res = -EPIPE; in rpc_pipe_write()
332 if (RPC_I(inode)->pipe != NULL) in rpc_pipe_write()
333 res = RPC_I(inode)->pipe->ops->downcall(filp, buf, len); in rpc_pipe_write()
345 poll_wait(filp, &rpci->waitq, wait); in rpc_pipe_poll()
348 if (rpci->pipe == NULL) in rpc_pipe_poll()
350 else if (filp->private_data || !list_empty(&rpci->pipe->pipe)) in rpc_pipe_poll()
366 pipe = RPC_I(inode)->pipe; in rpc_pipe_ioctl()
369 return -EPIPE; in rpc_pipe_ioctl()
371 spin_lock(&pipe->lock); in rpc_pipe_ioctl()
372 len = pipe->pipelen; in rpc_pipe_ioctl()
373 if (filp->private_data) { in rpc_pipe_ioctl()
375 msg = filp->private_data; in rpc_pipe_ioctl()
376 len += msg->len - msg->copied; in rpc_pipe_ioctl()
378 spin_unlock(&pipe->lock); in rpc_pipe_ioctl()
382 return -EINVAL; in rpc_pipe_ioctl()
400 struct rpc_clnt *clnt = m->private; in rpc_show_info()
404 rcu_dereference(clnt->cl_xprt)->servername); in rpc_show_info()
405 seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_program->name, in rpc_show_info()
406 clnt->cl_prog, clnt->cl_vers); in rpc_show_info()
421 struct seq_file *m = file->private_data; in rpc_info_open()
423 spin_lock(&file->f_path.dentry->d_lock); in rpc_info_open()
424 if (!d_unhashed(file->f_path.dentry)) in rpc_info_open()
425 clnt = RPC_I(inode)->private; in rpc_info_open()
426 if (clnt != NULL && refcount_inc_not_zero(&clnt->cl_count)) { in rpc_info_open()
427 spin_unlock(&file->f_path.dentry->d_lock); in rpc_info_open()
428 m->private = clnt; in rpc_info_open()
430 spin_unlock(&file->f_path.dentry->d_lock); in rpc_info_open()
432 ret = -EINVAL; in rpc_info_open()
441 struct seq_file *m = file->private_data; in rpc_info_release()
442 struct rpc_clnt *clnt = (struct rpc_clnt *)m->private; in rpc_info_release()
473 inode->i_ino = get_next_ino(); in rpc_get_inode()
474 inode->i_mode = mode; in rpc_get_inode()
475 inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode); in rpc_get_inode()
478 inode->i_fop = &simple_dir_operations; in rpc_get_inode()
479 inode->i_op = &simple_dir_inode_operations; in rpc_get_inode()
496 inode = rpc_get_inode(dir->i_sb, mode); in __rpc_create_common()
499 inode->i_ino = iunique(dir->i_sb, 100); in __rpc_create_common()
501 inode->i_fop = i_fop; in __rpc_create_common()
510 return -ENOMEM; in __rpc_create_common()
545 pipe->nreaders = 0; in init_pipe()
546 pipe->nwriters = 0; in init_pipe()
547 INIT_LIST_HEAD(&pipe->in_upcall); in init_pipe()
548 INIT_LIST_HEAD(&pipe->in_downcall); in init_pipe()
549 INIT_LIST_HEAD(&pipe->pipe); in init_pipe()
550 pipe->pipelen = 0; in init_pipe()
551 INIT_DELAYED_WORK(&pipe->queue_timeout, in init_pipe()
553 pipe->ops = NULL; in init_pipe()
554 spin_lock_init(&pipe->lock); in init_pipe()
555 pipe->dentry = NULL; in init_pipe()
570 return ERR_PTR(-ENOMEM); in rpc_mkpipe_data()
572 pipe->ops = ops; in rpc_mkpipe_data()
573 pipe->flags = flags; in rpc_mkpipe_data()
591 rpci->private = private; in __rpc_mkpipe_dentry()
592 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_dentry - make an rpc_pipefs file for kernel<->userspace
794 * @ops->upcall, which will be called with the file pointer,
798 * responses to upcalls. They will result in calls to @msg->downcall.
801 * from the file pointer, via RPC_I(file_inode(file))->private.
811 if (pipe->ops->upcall == NULL) in rpc_mkpipe_dentry()
813 if (pipe->ops->downcall == NULL) in rpc_mkpipe_dentry()
837 * rpc_unlink - remove a pipe
842 * return -EPIPE.
862 * rpc_init_pipe_dir_head - initialise a struct rpc_pipe_dir_head
867 INIT_LIST_HEAD(&pdh->pdh_entries); in rpc_init_pipe_dir_head()
868 pdh->pdh_dentry = NULL; in rpc_init_pipe_dir_head()
873 * rpc_init_pipe_dir_object - initialise a struct rpc_pipe_dir_object
876 * @pdo_data: pointer to caller-defined data
882 INIT_LIST_HEAD(&pdo->pdo_head); in rpc_init_pipe_dir_object()
883 pdo->pdo_ops = pdo_ops; in rpc_init_pipe_dir_object()
884 pdo->pdo_data = pdo_data; in rpc_init_pipe_dir_object()
895 if (pdh->pdh_dentry) in rpc_add_pipe_dir_object_locked()
896 ret = pdo->pdo_ops->create(pdh->pdh_dentry, pdo); in rpc_add_pipe_dir_object_locked()
898 list_add_tail(&pdo->pdo_head, &pdh->pdh_entries); in rpc_add_pipe_dir_object_locked()
907 if (pdh->pdh_dentry) in rpc_remove_pipe_dir_object_locked()
908 pdo->pdo_ops->destroy(pdh->pdh_dentry, pdo); in rpc_remove_pipe_dir_object_locked()
909 list_del_init(&pdo->pdo_head); in rpc_remove_pipe_dir_object_locked()
913 * rpc_add_pipe_dir_object - associate a rpc_pipe_dir_object to a directory
926 if (list_empty(&pdo->pdo_head)) { in rpc_add_pipe_dir_object()
929 mutex_lock(&sn->pipefs_sb_lock); in rpc_add_pipe_dir_object()
931 mutex_unlock(&sn->pipefs_sb_lock); in rpc_add_pipe_dir_object()
938 * rpc_remove_pipe_dir_object - remove a rpc_pipe_dir_object from a directory
949 if (!list_empty(&pdo->pdo_head)) { in rpc_remove_pipe_dir_object()
952 mutex_lock(&sn->pipefs_sb_lock); in rpc_remove_pipe_dir_object()
954 mutex_unlock(&sn->pipefs_sb_lock); in rpc_remove_pipe_dir_object()
978 mutex_lock(&sn->pipefs_sb_lock); in rpc_find_or_alloc_pipe_dir_object()
979 list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) { in rpc_find_or_alloc_pipe_dir_object()
989 mutex_unlock(&sn->pipefs_sb_lock); in rpc_find_or_alloc_pipe_dir_object()
998 struct dentry *dir = pdh->pdh_dentry; in rpc_create_pipe_dir_objects()
1000 list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) in rpc_create_pipe_dir_objects()
1001 pdo->pdo_ops->create(dir, pdo); in rpc_create_pipe_dir_objects()
1008 struct dentry *dir = pdh->pdh_dentry; in rpc_destroy_pipe_dir_objects()
1010 list_for_each_entry(pdo, &pdh->pdh_entries, pdo_head) in rpc_destroy_pipe_dir_objects()
1011 pdo->pdo_ops->destroy(dir, pdo); in rpc_destroy_pipe_dir_objects()
1040 * rpc_create_client_dir - Create a new rpc_client directory in rpc_pipefs
1059 rpc_client->cl_pipedir_objects.pdh_dentry = ret; in rpc_create_client_dir()
1060 rpc_create_pipe_dir_objects(&rpc_client->cl_pipedir_objects); in rpc_create_client_dir()
1066 * rpc_remove_client_dir - Remove a directory created with rpc_create_client_dir()
1071 struct dentry *dentry = rpc_client->cl_pipedir_objects.pdh_dentry; in rpc_remove_client_dir()
1075 rpc_destroy_pipe_dir_objects(&rpc_client->cl_pipedir_objects); in rpc_remove_client_dir()
1076 rpc_client->cl_pipedir_objects.pdh_dentry = NULL; in rpc_remove_client_dir()
1195 return d_hash_and_lookup(sb->s_root, &dir); in rpc_d_lookup_sb()
1203 sn->gssd_dummy = rpc_mkpipe_data(&gssd_dummy_pipe_ops, 0); in rpc_pipefs_init_net()
1204 if (IS_ERR(sn->gssd_dummy)) in rpc_pipefs_init_net()
1205 return PTR_ERR(sn->gssd_dummy); in rpc_pipefs_init_net()
1207 mutex_init(&sn->pipefs_sb_lock); in rpc_pipefs_init_net()
1208 sn->pipe_version = -1; in rpc_pipefs_init_net()
1216 rpc_destroy_pipe_data(sn->gssd_dummy); in rpc_pipefs_exit_net()
1229 mutex_lock(&sn->pipefs_sb_lock); in rpc_get_sb_net()
1230 if (sn->pipefs_sb) in rpc_get_sb_net()
1231 return sn->pipefs_sb; in rpc_get_sb_net()
1232 mutex_unlock(&sn->pipefs_sb_lock); in rpc_get_sb_net()
1241 WARN_ON(sn->pipefs_sb == NULL); in rpc_put_sb_net()
1242 mutex_unlock(&sn->pipefs_sb_lock); in rpc_put_sb_net()
1256 return -EINVAL; in dummy_downcall()
1272 seq_printf(m, "RPC server: %s\n", utsname()->nodename); in rpc_dummy_info_show()
1273 seq_printf(m, "service: foo (1) version 0\n"); in rpc_dummy_info_show()
1290 * rpc_gssd_dummy_populate - create a dummy gssd pipe
1310 return ERR_PTR(-ENOENT); in rpc_gssd_dummy_populate()
1323 pipe_dentry = ERR_PTR(-ENOENT); in rpc_gssd_dummy_populate()
1348 struct dentry *clnt_dir = pipe_dentry->d_parent; in rpc_gssd_dummy_depopulate()
1349 struct dentry *gssd_dir = clnt_dir->d_parent; in rpc_gssd_dummy_depopulate()
1363 struct net *net = sb->s_fs_info; in rpc_fill_super()
1367 sb->s_blocksize = PAGE_SIZE; in rpc_fill_super()
1368 sb->s_blocksize_bits = PAGE_SHIFT; in rpc_fill_super()
1369 sb->s_magic = RPCAUTH_GSSMAGIC; in rpc_fill_super()
1370 sb->s_op = &s_ops; in rpc_fill_super()
1371 sb->s_d_op = &simple_dentry_operations; in rpc_fill_super()
1372 sb->s_time_gran = 1; in rpc_fill_super()
1375 sb->s_root = root = d_make_root(inode); in rpc_fill_super()
1377 return -ENOMEM; in rpc_fill_super()
1379 return -ENOMEM; in rpc_fill_super()
1381 gssd_dentry = rpc_gssd_dummy_populate(root, sn->gssd_dummy); in rpc_fill_super()
1388 net->ns.inum, NET_NAME(net)); in rpc_fill_super()
1389 mutex_lock(&sn->pipefs_sb_lock); in rpc_fill_super()
1390 sn->pipefs_sb = sb; in rpc_fill_super()
1396 mutex_unlock(&sn->pipefs_sb_lock); in rpc_fill_super()
1404 sn->pipefs_sb = NULL; in rpc_fill_super()
1406 mutex_unlock(&sn->pipefs_sb_lock); in rpc_fill_super()
1414 struct rpc_pipe *pipe = sn->gssd_dummy; in gssd_running()
1416 return pipe->nreaders || pipe->nwriters; in gssd_running()
1422 return get_tree_keyed(fc, rpc_fill_super, get_net(fc->net_ns)); in rpc_fs_get_tree()
1427 if (fc->s_fs_info) in rpc_fs_free_fc()
1428 put_net(fc->s_fs_info); in rpc_fs_free_fc()
1438 put_user_ns(fc->user_ns); in rpc_init_fs_context()
1439 fc->user_ns = get_user_ns(fc->net_ns->user_ns); in rpc_init_fs_context()
1440 fc->ops = &rpc_fs_context_ops; in rpc_init_fs_context()
1446 struct net *net = sb->s_fs_info; in rpc_kill_sb()
1449 mutex_lock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1450 if (sn->pipefs_sb != sb) { in rpc_kill_sb()
1451 mutex_unlock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1454 sn->pipefs_sb = NULL; in rpc_kill_sb()
1456 net->ns.inum, NET_NAME(net)); in rpc_kill_sb()
1460 mutex_unlock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1476 init_once(void *foo) in init_once() argument
1478 struct rpc_inode *rpci = (struct rpc_inode *) foo; in init_once()
1480 inode_init_once(&rpci->vfs_inode); in init_once()
1481 rpci->private = NULL; in init_once()
1482 rpci->pipe = NULL; in init_once()
1483 init_waitqueue_head(&rpci->waitq); in init_once()
1496 return -ENOMEM; in register_rpc_pipefs()