blob: e90b9bd99ded58e50214cf55f98a45c4fce7cf3e [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002#ifndef _LINUX_SUNRPC_RPC_PIPE_FS_H
3#define _LINUX_SUNRPC_RPC_PIPE_FS_H
4
5#ifdef __KERNEL__
6
J. Bruce Fields4dceef92009-08-20 17:08:39 -04007#include <linux/workqueue.h>
8
Trond Myklebust6739ffb2013-08-26 15:38:11 -04009struct rpc_pipe_dir_head {
10 struct list_head pdh_entries;
11 struct dentry *pdh_dentry;
12};
13
14struct rpc_pipe_dir_object_ops;
15struct rpc_pipe_dir_object {
16 struct list_head pdo_head;
17 const struct rpc_pipe_dir_object_ops *pdo_ops;
18
19 void *pdo_data;
20};
21
22struct rpc_pipe_dir_object_ops {
23 int (*create)(struct dentry *dir,
24 struct rpc_pipe_dir_object *pdo);
25 void (*destroy)(struct dentry *dir,
26 struct rpc_pipe_dir_object *pdo);
27};
28
Linus Torvalds1da177e2005-04-16 15:20:36 -070029struct rpc_pipe_msg {
30 struct list_head list;
31 void *data;
32 size_t len;
33 size_t copied;
34 int errno;
35};
36
37struct rpc_pipe_ops {
38 ssize_t (*upcall)(struct file *, struct rpc_pipe_msg *, char __user *, size_t);
39 ssize_t (*downcall)(struct file *, const char __user *, size_t);
40 void (*release_pipe)(struct inode *);
\"J. Bruce Fields\c3810602008-12-23 16:08:32 -050041 int (*open_pipe)(struct inode *);
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 void (*destroy_msg)(struct rpc_pipe_msg *);
43};
44
Stanislav Kinsburskyba9e0972011-12-26 15:43:32 +030045struct rpc_pipe {
Linus Torvalds1da177e2005-04-16 15:20:36 -070046 struct list_head pipe;
47 struct list_head in_upcall;
Trond Myklebust6e84c7b2007-06-07 15:31:36 -040048 struct list_head in_downcall;
Linus Torvalds1da177e2005-04-16 15:20:36 -070049 int pipelen;
50 int nreaders;
51 int nwriters;
Linus Torvalds1da177e2005-04-16 15:20:36 -070052#define RPC_PIPE_WAIT_FOR_OPEN 1
53 int flags;
David Howells52bad642006-11-22 14:54:01 +000054 struct delayed_work queue_timeout;
Trond Myklebustb693ba42009-08-09 15:14:15 -040055 const struct rpc_pipe_ops *ops;
Stanislav Kinsbursky766347b2011-12-26 15:43:23 +030056 spinlock_t lock;
Stanislav Kinsburskyc239d832011-12-26 15:44:06 +030057 struct dentry *dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -070058};
59
Stanislav Kinsburskyba9e0972011-12-26 15:43:32 +030060struct rpc_inode {
61 struct inode vfs_inode;
62 void *private;
63 struct rpc_pipe *pipe;
Stanislav Kinsbursky591ad7f2012-02-27 22:05:54 +040064 wait_queue_head_t waitq;
Stanislav Kinsburskyba9e0972011-12-26 15:43:32 +030065};
66
Linus Torvalds1da177e2005-04-16 15:20:36 -070067static inline struct rpc_inode *
68RPC_I(struct inode *inode)
69{
70 return container_of(inode, struct rpc_inode, vfs_inode);
71}
72
Stanislav Kinsburskyeee173252012-01-10 16:13:19 +040073enum {
74 SUNRPC_PIPEFS_NFS_PRIO,
75 SUNRPC_PIPEFS_RPC_PRIO,
76};
77
Stanislav Kinsbursky2d001312011-12-26 15:39:13 +030078extern int rpc_pipefs_notifier_register(struct notifier_block *);
79extern void rpc_pipefs_notifier_unregister(struct notifier_block *);
80
81enum {
82 RPC_PIPEFS_MOUNT,
83 RPC_PIPEFS_UMOUNT,
84};
85
Stanislav Kinsbursky432eb1a2011-12-26 15:39:22 +030086extern struct dentry *rpc_d_lookup_sb(const struct super_block *sb,
87 const unsigned char *dir_name);
Jeff Layton4b9a4452013-11-14 07:25:17 -050088extern int rpc_pipefs_init_net(struct net *net);
89extern void rpc_pipefs_exit_net(struct net *net);
Stanislav Kinsburskyc21a5882011-12-26 15:39:39 +030090extern struct super_block *rpc_get_sb_net(const struct net *net);
91extern void rpc_put_sb_net(const struct net *net);
Stanislav Kinsbursky432eb1a2011-12-26 15:39:22 +030092
Peng Taoc1225152011-09-22 21:50:10 -040093extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *,
94 char __user *, size_t);
Stanislav Kinsburskyd706ed12011-12-26 15:43:49 +030095extern int rpc_queue_upcall(struct rpc_pipe *, struct rpc_pipe_msg *);
Linus Torvalds1da177e2005-04-16 15:20:36 -070096
Trond Myklebust458adb8b2009-08-09 15:14:22 -040097struct rpc_clnt;
Al Viroa95e6912013-07-14 16:43:54 +040098extern struct dentry *rpc_create_client_dir(struct dentry *, const char *, struct rpc_clnt *);
Trond Myklebustc36dcfe12013-08-26 17:44:26 -040099extern int rpc_remove_client_dir(struct rpc_clnt *);
Trond Myklebust6739ffb2013-08-26 15:38:11 -0400100
101extern void rpc_init_pipe_dir_head(struct rpc_pipe_dir_head *pdh);
102extern void rpc_init_pipe_dir_object(struct rpc_pipe_dir_object *pdo,
103 const struct rpc_pipe_dir_object_ops *pdo_ops,
104 void *pdo_data);
105extern int rpc_add_pipe_dir_object(struct net *net,
106 struct rpc_pipe_dir_head *pdh,
107 struct rpc_pipe_dir_object *pdo);
108extern void rpc_remove_pipe_dir_object(struct net *net,
109 struct rpc_pipe_dir_head *pdh,
110 struct rpc_pipe_dir_object *pdo);
Trond Myklebust298fc352013-08-27 16:27:04 -0400111extern struct rpc_pipe_dir_object *rpc_find_or_alloc_pipe_dir_object(
112 struct net *net,
113 struct rpc_pipe_dir_head *pdh,
114 int (*match)(struct rpc_pipe_dir_object *, void *),
115 struct rpc_pipe_dir_object *(*alloc)(void *),
116 void *data);
Trond Myklebust8854e822009-08-09 15:14:30 -0400117
118struct cache_detail;
119extern struct dentry *rpc_create_cache_dir(struct dentry *,
Al Viroa95e6912013-07-14 16:43:54 +0400120 const char *,
Al Viro64f14262011-07-25 00:35:13 -0400121 umode_t umode,
Trond Myklebust8854e822009-08-09 15:14:30 -0400122 struct cache_detail *);
123extern void rpc_remove_cache_dir(struct dentry *);
124
Stanislav Kinsburskyc239d832011-12-26 15:44:06 +0300125struct rpc_pipe *rpc_mkpipe_data(const struct rpc_pipe_ops *ops, int flags);
126void rpc_destroy_pipe_data(struct rpc_pipe *pipe);
127extern struct dentry *rpc_mkpipe_dentry(struct dentry *, const char *, void *,
128 struct rpc_pipe *);
Trond Myklebust5d674762006-07-31 14:11:48 -0700129extern int rpc_unlink(struct dentry *);
Trond Myklebust7531d692007-05-14 17:21:26 -0400130extern int register_rpc_pipefs(void);
131extern void unregister_rpc_pipefs(void);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132
Jeff Layton89f84242013-11-14 07:25:18 -0500133extern bool gssd_running(struct net *net);
134
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135#endif
136#endif