internal.h 6.1 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;
15
struct  mempolicy;
L
Linus Torvalds 已提交
16

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

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

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

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

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

83
void proc_init_inodecache(void);
84

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

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

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

100 101 102 103 104 105 106 107 108 109
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);
110
	if (dumpable == SUID_DUMPABLE_ENABLED)
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 142 143 144 145
		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;
}

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

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

extern spinlock_t proc_subdir_lock;

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

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

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

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



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