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()
399 struct rpc_clnt *clnt = m->private; in rpc_show_info()
403 rcu_dereference(clnt->cl_xprt)->servername); in rpc_show_info()
404 seq_printf(m, "service: %s (%d) version %d\n", clnt->cl_program->name, in rpc_show_info()
405 clnt->cl_prog, clnt->cl_vers); in rpc_show_info()
420 struct seq_file *m = file->private_data; in rpc_info_open()
422 spin_lock(&file->f_path.dentry->d_lock); in rpc_info_open()
423 if (!d_unhashed(file->f_path.dentry)) in rpc_info_open()
424 clnt = RPC_I(inode)->private; in rpc_info_open()
425 if (clnt != NULL && refcount_inc_not_zero(&clnt->cl_count)) { in rpc_info_open()
426 spin_unlock(&file->f_path.dentry->d_lock); in rpc_info_open()
427 m->private = clnt; in rpc_info_open()
429 spin_unlock(&file->f_path.dentry->d_lock); in rpc_info_open()
431 ret = -EINVAL; in rpc_info_open()
440 struct seq_file *m = file->private_data; in rpc_info_release()
441 struct rpc_clnt *clnt = (struct rpc_clnt *)m->private; in rpc_info_release()
472 inode->i_ino = get_next_ino(); in rpc_get_inode()
473 inode->i_mode = mode; in rpc_get_inode()
477 inode->i_fop = &simple_dir_operations; in rpc_get_inode()
478 inode->i_op = &simple_dir_inode_operations; in rpc_get_inode()
495 inode = rpc_get_inode(dir->i_sb, mode); in __rpc_create_common()
498 inode->i_ino = iunique(dir->i_sb, 100); in __rpc_create_common()
500 inode->i_fop = i_fop; in __rpc_create_common()
509 return -ENOMEM; in __rpc_create_common()
544 pipe->nreaders = 0; in init_pipe()
545 pipe->nwriters = 0; in init_pipe()
546 INIT_LIST_HEAD(&pipe->in_upcall); in init_pipe()
547 INIT_LIST_HEAD(&pipe->in_downcall); in init_pipe()
548 INIT_LIST_HEAD(&pipe->pipe); in init_pipe()
549 pipe->pipelen = 0; in init_pipe()
550 INIT_DELAYED_WORK(&pipe->queue_timeout, in init_pipe()
552 pipe->ops = NULL; in init_pipe()
553 spin_lock_init(&pipe->lock); in init_pipe()
554 pipe->dentry = NULL; in init_pipe()
569 return ERR_PTR(-ENOMEM); in rpc_mkpipe_data()
571 pipe->ops = ops; in rpc_mkpipe_data()
572 pipe->flags = flags; in rpc_mkpipe_data()
590 rpci->private = private; in __rpc_mkpipe_dentry()
591 rpci->pipe = pipe; in __rpc_mkpipe_dentry()
638 return ERR_PTR(-ENOMEM); in __rpc_lookup_create_exclusive()
643 return ERR_PTR(-EEXIST); in __rpc_lookup_create_exclusive()
667 switch (d_inode(dentry)->i_mode & S_IFMT) { in __rpc_depopulate()
784 * rpc_mkpipe_dentry - make an rpc_pipefs file for kernel<->userspace
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()
1193 return d_hash_and_lookup(sb->s_root, &QSTR(dir_name)); in rpc_d_lookup_sb()
1201 sn->gssd_dummy = rpc_mkpipe_data(&gssd_dummy_pipe_ops, 0); in rpc_pipefs_init_net()
1202 if (IS_ERR(sn->gssd_dummy)) in rpc_pipefs_init_net()
1203 return PTR_ERR(sn->gssd_dummy); in rpc_pipefs_init_net()
1205 mutex_init(&sn->pipefs_sb_lock); in rpc_pipefs_init_net()
1206 sn->pipe_version = -1; in rpc_pipefs_init_net()
1214 rpc_destroy_pipe_data(sn->gssd_dummy); in rpc_pipefs_exit_net()
1227 mutex_lock(&sn->pipefs_sb_lock); in rpc_get_sb_net()
1228 if (sn->pipefs_sb) in rpc_get_sb_net()
1229 return sn->pipefs_sb; in rpc_get_sb_net()
1230 mutex_unlock(&sn->pipefs_sb_lock); in rpc_get_sb_net()
1239 WARN_ON(sn->pipefs_sb == NULL); in rpc_put_sb_net()
1240 mutex_unlock(&sn->pipefs_sb_lock); in rpc_put_sb_net()
1254 return -EINVAL; in dummy_downcall()
1270 seq_printf(m, "RPC server: %s\n", utsname()->nodename); in rpc_dummy_info_show()
1271 seq_printf(m, "service: foo (1) version 0\n"); in rpc_dummy_info_show()
1288 * rpc_gssd_dummy_populate - create a dummy gssd pipe
1306 return ERR_PTR(-ENOENT); in rpc_gssd_dummy_populate()
1318 pipe_dentry = ERR_PTR(-ENOENT); in rpc_gssd_dummy_populate()
1343 struct dentry *clnt_dir = pipe_dentry->d_parent; in rpc_gssd_dummy_depopulate()
1344 struct dentry *gssd_dir = clnt_dir->d_parent; in rpc_gssd_dummy_depopulate()
1358 struct net *net = sb->s_fs_info; in rpc_fill_super()
1362 sb->s_blocksize = PAGE_SIZE; in rpc_fill_super()
1363 sb->s_blocksize_bits = PAGE_SHIFT; in rpc_fill_super()
1364 sb->s_magic = RPCAUTH_GSSMAGIC; in rpc_fill_super()
1365 sb->s_op = &s_ops; in rpc_fill_super()
1366 sb->s_d_op = &simple_dentry_operations; in rpc_fill_super()
1367 sb->s_time_gran = 1; in rpc_fill_super()
1370 sb->s_root = root = d_make_root(inode); in rpc_fill_super()
1372 return -ENOMEM; in rpc_fill_super()
1374 return -ENOMEM; in rpc_fill_super()
1376 gssd_dentry = rpc_gssd_dummy_populate(root, sn->gssd_dummy); in rpc_fill_super()
1383 net->ns.inum, NET_NAME(net)); in rpc_fill_super()
1384 mutex_lock(&sn->pipefs_sb_lock); in rpc_fill_super()
1385 sn->pipefs_sb = sb; in rpc_fill_super()
1391 mutex_unlock(&sn->pipefs_sb_lock); in rpc_fill_super()
1399 sn->pipefs_sb = NULL; in rpc_fill_super()
1401 mutex_unlock(&sn->pipefs_sb_lock); in rpc_fill_super()
1409 struct rpc_pipe *pipe = sn->gssd_dummy; in gssd_running()
1411 return pipe->nreaders || pipe->nwriters; in gssd_running()
1417 return get_tree_keyed(fc, rpc_fill_super, get_net(fc->net_ns)); in rpc_fs_get_tree()
1422 if (fc->s_fs_info) in rpc_fs_free_fc()
1423 put_net(fc->s_fs_info); in rpc_fs_free_fc()
1433 put_user_ns(fc->user_ns); in rpc_init_fs_context()
1434 fc->user_ns = get_user_ns(fc->net_ns->user_ns); in rpc_init_fs_context()
1435 fc->ops = &rpc_fs_context_ops; in rpc_init_fs_context()
1441 struct net *net = sb->s_fs_info; in rpc_kill_sb()
1444 mutex_lock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1445 if (sn->pipefs_sb != sb) { in rpc_kill_sb()
1446 mutex_unlock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1449 sn->pipefs_sb = NULL; in rpc_kill_sb()
1451 net->ns.inum, NET_NAME(net)); in rpc_kill_sb()
1455 mutex_unlock(&sn->pipefs_sb_lock); in rpc_kill_sb()
1471 init_once(void *foo) in init_once() argument
1473 struct rpc_inode *rpci = (struct rpc_inode *) foo; in init_once()
1475 inode_init_once(&rpci->vfs_inode); in init_once()
1476 rpci->private = NULL; in init_once()
1477 rpci->pipe = NULL; in init_once()
1478 init_waitqueue_head(&rpci->waitq); in init_once()
1491 return -ENOMEM; in register_rpc_pipefs()