linux/include/linux/sunrpc/rpc_pipe_fs.h
<<
>>
Prefs
   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#ifdef __KERNEL__
   6
   7#include <linux/workqueue.h>
   8
   9struct 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
  29struct 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 *);
  41        int (*open_pipe)(struct inode *);
  42        void (*destroy_msg)(struct rpc_pipe_msg *);
  43};
  44
  45struct rpc_pipe {
  46        struct list_head pipe;
  47        struct list_head in_upcall;
  48        struct list_head in_downcall;
  49        int pipelen;
  50        int nreaders;
  51        int nwriters;
  52#define RPC_PIPE_WAIT_FOR_OPEN  1
  53        int flags;
  54        struct delayed_work queue_timeout;
  55        const struct rpc_pipe_ops *ops;
  56        spinlock_t lock;
  57        struct dentry *dentry;
  58};
  59
  60struct rpc_inode {
  61        struct inode vfs_inode;
  62        void *private;
  63        struct rpc_pipe *pipe;
  64        wait_queue_head_t waitq;
  65};
  66
  67static inline struct rpc_inode *
  68RPC_I(struct inode *inode)
  69{
  70        return container_of(inode, struct rpc_inode, vfs_inode);
  71}
  72
  73enum {
  74        SUNRPC_PIPEFS_NFS_PRIO,
  75        SUNRPC_PIPEFS_RPC_PRIO,
  76};
  77
  78extern 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
  86extern struct dentry *rpc_d_lookup_sb(const struct super_block *sb,
  87                                      const unsigned char *dir_name);
  88extern int rpc_pipefs_init_net(struct net *net);
  89extern void rpc_pipefs_exit_net(struct net *net);
  90extern struct super_block *rpc_get_sb_net(const struct net *net);
  91extern void rpc_put_sb_net(const struct net *net);
  92
  93extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *,
  94                                       char __user *, size_t);
  95extern int rpc_queue_upcall(struct rpc_pipe *, struct rpc_pipe_msg *);
  96
  97struct rpc_clnt;
  98extern struct dentry *rpc_create_client_dir(struct dentry *, const char *, struct rpc_clnt *);
  99extern int rpc_remove_client_dir(struct rpc_clnt *);
 100
 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);
 111extern 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);
 117
 118struct cache_detail;
 119extern struct dentry *rpc_create_cache_dir(struct dentry *,
 120                                           const char *,
 121                                           umode_t umode,
 122                                           struct cache_detail *);
 123extern void rpc_remove_cache_dir(struct dentry *);
 124
 125struct 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 *);
 129extern int rpc_unlink(struct dentry *);
 130extern int register_rpc_pipefs(void);
 131extern void unregister_rpc_pipefs(void);
 132
 133extern bool gssd_running(struct net *net);
 134
 135#endif
 136#endif
 137