1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _LINUX_SUNRPC_RPC_PIPE_FS_H
3  #define _LINUX_SUNRPC_RPC_PIPE_FS_H
4  
5  #include <linux/workqueue.h>
6  
7  struct rpc_pipe_dir_head {
8  	struct list_head pdh_entries;
9  	struct dentry *pdh_dentry;
10  };
11  
12  struct rpc_pipe_dir_object_ops;
13  struct rpc_pipe_dir_object {
14  	struct list_head pdo_head;
15  	const struct rpc_pipe_dir_object_ops *pdo_ops;
16  
17  	void *pdo_data;
18  };
19  
20  struct rpc_pipe_dir_object_ops {
21  	int (*create)(struct dentry *dir,
22  			struct rpc_pipe_dir_object *pdo);
23  	void (*destroy)(struct dentry *dir,
24  			struct rpc_pipe_dir_object *pdo);
25  };
26  
27  struct rpc_pipe_msg {
28  	struct list_head list;
29  	void *data;
30  	size_t len;
31  	size_t copied;
32  	int errno;
33  };
34  
35  struct rpc_pipe_ops {
36  	ssize_t (*upcall)(struct file *, struct rpc_pipe_msg *, char __user *, size_t);
37  	ssize_t (*downcall)(struct file *, const char __user *, size_t);
38  	void (*release_pipe)(struct inode *);
39  	int (*open_pipe)(struct inode *);
40  	void (*destroy_msg)(struct rpc_pipe_msg *);
41  };
42  
43  struct rpc_pipe {
44  	struct list_head pipe;
45  	struct list_head in_upcall;
46  	struct list_head in_downcall;
47  	int pipelen;
48  	int nreaders;
49  	int nwriters;
50  #define RPC_PIPE_WAIT_FOR_OPEN	1
51  	int flags;
52  	struct delayed_work queue_timeout;
53  	const struct rpc_pipe_ops *ops;
54  	spinlock_t lock;
55  	struct dentry *dentry;
56  };
57  
58  struct rpc_inode {
59  	struct inode vfs_inode;
60  	void *private;
61  	struct rpc_pipe *pipe;
62  	wait_queue_head_t waitq;
63  };
64  
65  static inline struct rpc_inode *
RPC_I(struct inode * inode)66  RPC_I(struct inode *inode)
67  {
68  	return container_of(inode, struct rpc_inode, vfs_inode);
69  }
70  
71  enum {
72  	SUNRPC_PIPEFS_NFS_PRIO,
73  	SUNRPC_PIPEFS_RPC_PRIO,
74  };
75  
76  extern int rpc_pipefs_notifier_register(struct notifier_block *);
77  extern void rpc_pipefs_notifier_unregister(struct notifier_block *);
78  
79  enum {
80  	RPC_PIPEFS_MOUNT,
81  	RPC_PIPEFS_UMOUNT,
82  };
83  
84  extern struct dentry *rpc_d_lookup_sb(const struct super_block *sb,
85  				      const unsigned char *dir_name);
86  extern int rpc_pipefs_init_net(struct net *net);
87  extern void rpc_pipefs_exit_net(struct net *net);
88  extern struct super_block *rpc_get_sb_net(const struct net *net);
89  extern void rpc_put_sb_net(const struct net *net);
90  
91  extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *,
92  				       char __user *, size_t);
93  extern int rpc_queue_upcall(struct rpc_pipe *, struct rpc_pipe_msg *);
94  
95  /* returns true if the msg is in-flight, i.e., already eaten by the peer */
rpc_msg_is_inflight(const struct rpc_pipe_msg * msg)96  static inline bool rpc_msg_is_inflight(const struct rpc_pipe_msg *msg) {
97  	return (msg->copied != 0 && list_empty(&msg->list));
98  }
99  
100  struct rpc_clnt;
101  extern struct dentry *rpc_create_client_dir(struct dentry *, const char *, struct rpc_clnt *);
102  extern int rpc_remove_client_dir(struct rpc_clnt *);
103  
104  extern void rpc_init_pipe_dir_head(struct rpc_pipe_dir_head *pdh);
105  extern void rpc_init_pipe_dir_object(struct rpc_pipe_dir_object *pdo,
106  		const struct rpc_pipe_dir_object_ops *pdo_ops,
107  		void *pdo_data);
108  extern int rpc_add_pipe_dir_object(struct net *net,
109  		struct rpc_pipe_dir_head *pdh,
110  		struct rpc_pipe_dir_object *pdo);
111  extern void rpc_remove_pipe_dir_object(struct net *net,
112  		struct rpc_pipe_dir_head *pdh,
113  		struct rpc_pipe_dir_object *pdo);
114  extern struct rpc_pipe_dir_object *rpc_find_or_alloc_pipe_dir_object(
115  		struct net *net,
116  		struct rpc_pipe_dir_head *pdh,
117  		int (*match)(struct rpc_pipe_dir_object *, void *),
118  		struct rpc_pipe_dir_object *(*alloc)(void *),
119  		void *data);
120  
121  struct cache_detail;
122  extern struct dentry *rpc_create_cache_dir(struct dentry *,
123  					   const char *,
124  					   umode_t umode,
125  					   struct cache_detail *);
126  extern void rpc_remove_cache_dir(struct dentry *);
127  
128  struct rpc_pipe *rpc_mkpipe_data(const struct rpc_pipe_ops *ops, int flags);
129  void rpc_destroy_pipe_data(struct rpc_pipe *pipe);
130  extern struct dentry *rpc_mkpipe_dentry(struct dentry *, const char *, void *,
131  					struct rpc_pipe *);
132  extern int rpc_unlink(struct dentry *);
133  extern int register_rpc_pipefs(void);
134  extern void unregister_rpc_pipefs(void);
135  
136  extern bool gssd_running(struct net *net);
137  
138  #endif
139