internal.h 6.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11
/* internal.h: internal procfs definitions
 *
 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells (dhowells@redhat.com)
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

12
#include <linux/sched.h>
L
Linus Torvalds 已提交
13
#include <linux/proc_fs.h>
14
struct  ctl_table_header;
L
Linus Torvalds 已提交
15

16
extern struct proc_dir_entry proc_root;
17
#ifdef CONFIG_PROC_SYSCTL
18
extern int proc_sys_init(void);
19
extern void sysctl_head_put(struct ctl_table_header *head);
20 21
#else
static inline void proc_sys_init(void) { }
22
static inline void sysctl_head_put(struct ctl_table_header *head) { }
23
#endif
24 25 26 27 28
#ifdef CONFIG_NET
extern int proc_net_init(void);
#else
static inline int proc_net_init(void) { return 0; }
#endif
29

L
Linus Torvalds 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
struct vmalloc_info {
	unsigned long	used;
	unsigned long	largest_chunk;
};

#ifdef CONFIG_MMU
#define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)
extern void get_vmalloc_info(struct vmalloc_info *vmi);
#else

#define VMALLOC_TOTAL 0UL
#define get_vmalloc_info(vmi)			\
do {						\
	(vmi)->used = 0;			\
	(vmi)->largest_chunk = 0;		\
} while(0)
#endif

48 49 50 51
extern int proc_tid_stat(struct seq_file *m, struct pid_namespace *ns,
				struct pid *pid, struct task_struct *task);
extern int proc_tgid_stat(struct seq_file *m, struct pid_namespace *ns,
				struct pid *pid, struct task_struct *task);
52 53
extern int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
				struct pid *pid, struct task_struct *task);
54 55
extern int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns,
				struct pid *pid, struct task_struct *task);
56
extern loff_t mem_lseek(struct file *file, loff_t offset, int orig);
L
Linus Torvalds 已提交
57

58
extern const struct file_operations proc_tid_children_operations;
59 60 61 62 63 64
extern const struct file_operations proc_pid_maps_operations;
extern const struct file_operations proc_tid_maps_operations;
extern const struct file_operations proc_pid_numa_maps_operations;
extern const struct file_operations proc_tid_numa_maps_operations;
extern const struct file_operations proc_pid_smaps_operations;
extern const struct file_operations proc_tid_smaps_operations;
65
extern const struct file_operations proc_clear_refs_operations;
66
extern const struct file_operations proc_pagemap_operations;
67 68
extern const struct file_operations proc_net_operations;
extern const struct inode_operations proc_net_inode_operations;
69
extern const struct inode_operations proc_pid_link_inode_operations;
70

71 72 73 74 75 76 77 78
struct proc_maps_private {
	struct pid *pid;
	struct task_struct *task;
#ifdef CONFIG_MMU
	struct vm_area_struct *tail_vma;
#endif
};

79
void proc_init_inodecache(void);
80

81
static inline struct pid *proc_pid(struct inode *inode)
82
{
83
	return PROC_I(inode)->pid;
84 85 86
}

static inline struct task_struct *get_proc_task(struct inode *inode)
L
Linus Torvalds 已提交
87
{
88
	return get_pid_task(proc_pid(inode), PIDTYPE_PID);
L
Linus Torvalds 已提交
89 90
}

91
static inline int proc_fd(struct inode *inode)
L
Linus Torvalds 已提交
92
{
93
	return PROC_I(inode)->fd;
L
Linus Torvalds 已提交
94
}
95

96 97 98 99 100 101 102 103 104 105
static inline int task_dumpable(struct task_struct *task)
{
	int dumpable = 0;
	struct mm_struct *mm;

	task_lock(task);
	mm = task->mm;
	if (mm)
		dumpable = get_dumpable(mm);
	task_unlock(task);
106
	if (dumpable == SUID_DUMPABLE_ENABLED)
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
		return 1;
	return 0;
}

static inline int pid_delete_dentry(const struct dentry * dentry)
{
	/* Is the task we represent dead?
	 * If so, then don't put the dentry on the lru list,
	 * kill it immediately.
	 */
	return !proc_pid(dentry->d_inode)->tasks[PIDTYPE_PID].first;
}

static inline unsigned name_to_int(struct dentry *dentry)
{
	const char *name = dentry->d_name.name;
	int len = dentry->d_name.len;
	unsigned n = 0;

	if (len > 1 && *name == '0')
		goto out;
	while (len-- > 0) {
		unsigned c = *name++ - '0';
		if (c > 9)
			goto out;
		if (n >= (~0U-9)/10)
			goto out;
		n *= 10;
		n += c;
	}
	return n;
out:
	return ~0U;
}

142 143 144 145
struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *ino,
		struct dentry *dentry);
int proc_readdir_de(struct proc_dir_entry *de, struct file *filp, void *dirent,
		filldir_t filldir);
A
Alexey Dobriyan 已提交
146 147 148 149 150 151 152

struct pde_opener {
	struct inode *inode;
	struct file *file;
	int (*release)(struct inode *, struct file *);
	struct list_head lh;
};
153
void pde_users_dec(struct proc_dir_entry *pde);
154 155 156

extern spinlock_t proc_subdir_lock;

A
Al Viro 已提交
157
struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, unsigned int);
158 159
int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir);
unsigned long task_vsize(struct mm_struct *);
160 161
unsigned long task_statm(struct mm_struct *,
	unsigned long *, unsigned long *, unsigned long *, unsigned long *);
162 163
void task_mem(struct seq_file *, struct mm_struct *);

164 165 166 167 168 169
static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde)
{
	atomic_inc(&pde->count);
	return pde;
}
void pde_put(struct proc_dir_entry *pde);
170 171

int proc_fill_super(struct super_block *);
A
Alexey Dobriyan 已提交
172
struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
V
Vasiliy Kulikov 已提交
173
int proc_remount(struct super_block *sb, int *flags, char *data);
174 175 176 177 178 179 180 181 182

/*
 * These are generic /proc routines that use the internal
 * "struct proc_dir_entry" tree to traverse the filesystem.
 *
 * The /proc root directory has extended versions to take care
 * of the /proc/<pid> subdirectories.
 */
int proc_readdir(struct file *, void *, filldir_t);
A
Al Viro 已提交
183
struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int);
184 185 186 187 188 189 190 191 192



/* Lookups */
typedef struct dentry *instantiate_t(struct inode *, struct dentry *,
				struct task_struct *, const void *);
int proc_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
	const char *name, int len,
	instantiate_t instantiate, struct task_struct *task, const void *ptr);
193
int pid_revalidate(struct dentry *dentry, unsigned int flags);
194 195 196 197 198 199 200 201
struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *task);
extern const struct dentry_operations pid_dentry_operations;
int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat);
int proc_setattr(struct dentry *dentry, struct iattr *attr);

extern const struct inode_operations proc_ns_dir_inode_operations;
extern const struct file_operations proc_ns_dir_operations;