internal.h 6.2 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
#include <linux/binfmts.h>
15
struct  ctl_table_header;
16
struct  mempolicy;
L
Linus Torvalds 已提交
17

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

L
Linus Torvalds 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
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

51 52 53 54
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);
55 56
extern int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
				struct pid *pid, struct task_struct *task);
57 58
extern int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns,
				struct pid *pid, struct task_struct *task);
59
extern loff_t mem_lseek(struct file *file, loff_t offset, int orig);
L
Linus Torvalds 已提交
60

61
extern const struct file_operations proc_tid_children_operations;
62 63 64 65 66 67
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;
68
extern const struct file_operations proc_clear_refs_operations;
69
extern const struct file_operations proc_pagemap_operations;
70 71
extern const struct file_operations proc_net_operations;
extern const struct inode_operations proc_net_inode_operations;
72
extern const struct inode_operations proc_pid_link_inode_operations;
73

74 75 76 77 78 79
struct proc_maps_private {
	struct pid *pid;
	struct task_struct *task;
#ifdef CONFIG_MMU
	struct vm_area_struct *tail_vma;
#endif
80 81 82
#ifdef CONFIG_NUMA
	struct mempolicy *task_mempolicy;
#endif
83 84
};

85
void proc_init_inodecache(void);
86

87
static inline struct pid *proc_pid(struct inode *inode)
88
{
89
	return PROC_I(inode)->pid;
90 91 92
}

static inline struct task_struct *get_proc_task(struct inode *inode)
L
Linus Torvalds 已提交
93
{
94
	return get_pid_task(proc_pid(inode), PIDTYPE_PID);
L
Linus Torvalds 已提交
95 96
}

97
static inline int proc_fd(struct inode *inode)
L
Linus Torvalds 已提交
98
{
99
	return PROC_I(inode)->fd;
L
Linus Torvalds 已提交
100
}
101

102 103 104 105 106 107 108 109 110 111
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);
112
	if (dumpable == SUID_DUMP_USER)
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 142 143 144 145 146 147
		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;
}

148 149 150 151
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 已提交
152 153 154 155 156 157 158

struct pde_opener {
	struct inode *inode;
	struct file *file;
	int (*release)(struct inode *, struct file *);
	struct list_head lh;
};
159
void pde_users_dec(struct proc_dir_entry *pde);
160 161 162

extern spinlock_t proc_subdir_lock;

A
Al Viro 已提交
163
struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, unsigned int);
164 165
int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir);
unsigned long task_vsize(struct mm_struct *);
166 167
unsigned long task_statm(struct mm_struct *,
	unsigned long *, unsigned long *, unsigned long *, unsigned long *);
168 169
void task_mem(struct seq_file *, struct mm_struct *);

170 171 172 173 174 175
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);
176 177

int proc_fill_super(struct super_block *);
A
Alexey Dobriyan 已提交
178
struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
V
Vasiliy Kulikov 已提交
179
int proc_remount(struct super_block *sb, int *flags, char *data);
180 181 182 183 184 185 186 187 188

/*
 * 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 已提交
189
struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int);
190 191 192 193 194 195 196 197 198



/* 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);
199
int pid_revalidate(struct dentry *dentry, unsigned int flags);
200 201 202 203 204 205 206 207
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;

208
extern int proc_setup_self(struct super_block *);