#include <linux/cache.h>
#include <linux/time.h>
#include <linux/proc_fs.h>
#include <linux/kernel.h>
#include <linux/pid_namespace.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/stat.h>
#include <linux/completion.h>
#include <linux/poll.h>
#include <linux/printk.h>
#include <linux/file.h>
#include <linux/limits.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sysctl.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/mount.h>
#include <linux/bug.h>
#include "internal.h"
static void proc_evict_inode(struct inode *inode)
{ … }
static struct kmem_cache *proc_inode_cachep __ro_after_init;
static struct kmem_cache *pde_opener_cache __ro_after_init;
static struct inode *proc_alloc_inode(struct super_block *sb)
{ … }
static void proc_free_inode(struct inode *inode)
{ … }
static void init_once(void *foo)
{ … }
void __init proc_init_kmemcache(void)
{ … }
void proc_invalidate_siblings_dcache(struct hlist_head *inodes, spinlock_t *lock)
{ … }
static inline const char *hidepid2str(enum proc_hidepid v)
{ … }
static int proc_show_options(struct seq_file *seq, struct dentry *root)
{ … }
const struct super_operations proc_sops = …;
enum { … };
static inline int use_pde(struct proc_dir_entry *pde)
{ … }
static void unuse_pde(struct proc_dir_entry *pde)
{ … }
static void close_pdeo(struct proc_dir_entry *pde, struct pde_opener *pdeo)
__releases(&pde->pde_unload_lock)
{ … }
void proc_entry_rundown(struct proc_dir_entry *de)
{ … }
static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence)
{ … }
static ssize_t proc_reg_read_iter(struct kiocb *iocb, struct iov_iter *iter)
{ … }
static ssize_t pde_read(struct proc_dir_entry *pde, struct file *file, char __user *buf, size_t count, loff_t *ppos)
{ … }
static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{ … }
static ssize_t pde_write(struct proc_dir_entry *pde, struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{ … }
static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{ … }
static __poll_t pde_poll(struct proc_dir_entry *pde, struct file *file, struct poll_table_struct *pts)
{ … }
static __poll_t proc_reg_poll(struct file *file, struct poll_table_struct *pts)
{ … }
static long pde_ioctl(struct proc_dir_entry *pde, struct file *file, unsigned int cmd, unsigned long arg)
{ … }
static long proc_reg_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{ … }
#ifdef CONFIG_COMPAT
static long pde_compat_ioctl(struct proc_dir_entry *pde, struct file *file, unsigned int cmd, unsigned long arg)
{ … }
static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{ … }
#endif
static int pde_mmap(struct proc_dir_entry *pde, struct file *file, struct vm_area_struct *vma)
{ … }
static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma)
{ … }
static unsigned long
pde_get_unmapped_area(struct proc_dir_entry *pde, struct file *file, unsigned long orig_addr,
unsigned long len, unsigned long pgoff,
unsigned long flags)
{ … }
static unsigned long
proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr,
unsigned long len, unsigned long pgoff,
unsigned long flags)
{ … }
static int proc_reg_open(struct inode *inode, struct file *file)
{ … }
static int proc_reg_release(struct inode *inode, struct file *file)
{ … }
static const struct file_operations proc_reg_file_ops = …;
static const struct file_operations proc_iter_file_ops = …;
#ifdef CONFIG_COMPAT
static const struct file_operations proc_reg_file_ops_compat = …;
static const struct file_operations proc_iter_file_ops_compat = …;
#endif
static void proc_put_link(void *p)
{ … }
static const char *proc_get_link(struct dentry *dentry,
struct inode *inode,
struct delayed_call *done)
{ … }
const struct inode_operations proc_link_inode_operations = …;
struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
{ … }