cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rpc_pipe_fs.h (3741B)


      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
      7struct rpc_pipe_dir_head {
      8	struct list_head pdh_entries;
      9	struct dentry *pdh_dentry;
     10};
     11
     12struct rpc_pipe_dir_object_ops;
     13struct 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
     20struct 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
     27struct rpc_pipe_msg {
     28	struct list_head list;
     29	void *data;
     30	size_t len;
     31	size_t copied;
     32	int errno;
     33};
     34
     35struct 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
     43struct 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
     58struct rpc_inode {
     59	struct inode vfs_inode;
     60	void *private;
     61	struct rpc_pipe *pipe;
     62	wait_queue_head_t waitq;
     63};
     64
     65static inline struct rpc_inode *
     66RPC_I(struct inode *inode)
     67{
     68	return container_of(inode, struct rpc_inode, vfs_inode);
     69}
     70
     71enum {
     72	SUNRPC_PIPEFS_NFS_PRIO,
     73	SUNRPC_PIPEFS_RPC_PRIO,
     74};
     75
     76extern int rpc_pipefs_notifier_register(struct notifier_block *);
     77extern void rpc_pipefs_notifier_unregister(struct notifier_block *);
     78
     79enum {
     80	RPC_PIPEFS_MOUNT,
     81	RPC_PIPEFS_UMOUNT,
     82};
     83
     84extern struct dentry *rpc_d_lookup_sb(const struct super_block *sb,
     85				      const unsigned char *dir_name);
     86extern int rpc_pipefs_init_net(struct net *net);
     87extern void rpc_pipefs_exit_net(struct net *net);
     88extern struct super_block *rpc_get_sb_net(const struct net *net);
     89extern void rpc_put_sb_net(const struct net *net);
     90
     91extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *,
     92				       char __user *, size_t);
     93extern int rpc_queue_upcall(struct rpc_pipe *, struct rpc_pipe_msg *);
     94
     95struct rpc_clnt;
     96extern struct dentry *rpc_create_client_dir(struct dentry *, const char *, struct rpc_clnt *);
     97extern int rpc_remove_client_dir(struct rpc_clnt *);
     98
     99extern void rpc_init_pipe_dir_head(struct rpc_pipe_dir_head *pdh);
    100extern void rpc_init_pipe_dir_object(struct rpc_pipe_dir_object *pdo,
    101		const struct rpc_pipe_dir_object_ops *pdo_ops,
    102		void *pdo_data);
    103extern int rpc_add_pipe_dir_object(struct net *net,
    104		struct rpc_pipe_dir_head *pdh,
    105		struct rpc_pipe_dir_object *pdo);
    106extern void rpc_remove_pipe_dir_object(struct net *net,
    107		struct rpc_pipe_dir_head *pdh,
    108		struct rpc_pipe_dir_object *pdo);
    109extern struct rpc_pipe_dir_object *rpc_find_or_alloc_pipe_dir_object(
    110		struct net *net,
    111		struct rpc_pipe_dir_head *pdh,
    112		int (*match)(struct rpc_pipe_dir_object *, void *),
    113		struct rpc_pipe_dir_object *(*alloc)(void *),
    114		void *data);
    115
    116struct cache_detail;
    117extern struct dentry *rpc_create_cache_dir(struct dentry *,
    118					   const char *,
    119					   umode_t umode,
    120					   struct cache_detail *);
    121extern void rpc_remove_cache_dir(struct dentry *);
    122
    123struct rpc_pipe *rpc_mkpipe_data(const struct rpc_pipe_ops *ops, int flags);
    124void rpc_destroy_pipe_data(struct rpc_pipe *pipe);
    125extern struct dentry *rpc_mkpipe_dentry(struct dentry *, const char *, void *,
    126					struct rpc_pipe *);
    127extern int rpc_unlink(struct dentry *);
    128extern int register_rpc_pipefs(void);
    129extern void unregister_rpc_pipefs(void);
    130
    131extern bool gssd_running(struct net *net);
    132
    133#endif