inode.c 11.3 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9
/*
 *  linux/fs/proc/inode.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

#include <linux/time.h>
#include <linux/proc_fs.h>
#include <linux/kernel.h>
V
Vasiliy Kulikov 已提交
10
#include <linux/pid_namespace.h>
L
Linus Torvalds 已提交
11 12 13
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/stat.h>
14
#include <linux/completion.h>
15
#include <linux/poll.h>
A
Andrew Morton 已提交
16
#include <linux/printk.h>
L
Linus Torvalds 已提交
17 18 19 20
#include <linux/file.h>
#include <linux/limits.h>
#include <linux/init.h>
#include <linux/module.h>
A
Al Viro 已提交
21
#include <linux/sysctl.h>
V
Vasiliy Kulikov 已提交
22
#include <linux/seq_file.h>
23
#include <linux/slab.h>
V
Vasiliy Kulikov 已提交
24
#include <linux/mount.h>
25
#include <linux/magic.h>
L
Linus Torvalds 已提交
26 27 28

#include <asm/uaccess.h>

29
#include "internal.h"
L
Linus Torvalds 已提交
30

A
Al Viro 已提交
31
static void proc_evict_inode(struct inode *inode)
L
Linus Torvalds 已提交
32 33
{
	struct proc_dir_entry *de;
A
Al Viro 已提交
34
	struct ctl_table_header *head;
35
	const struct proc_ns_operations *ns_ops;
36
	void *ns;
L
Linus Torvalds 已提交
37

38
	truncate_inode_pages(&inode->i_data, 0);
39
	clear_inode(inode);
40

41
	/* Stop tracking associated processes */
42
	put_pid(PROC_I(inode)->pid);
L
Linus Torvalds 已提交
43 44 45

	/* Let go of any associated proc directory entry */
	de = PROC_I(inode)->pde;
46
	if (de)
47
		pde_put(de);
A
Al Viro 已提交
48 49 50 51 52
	head = PROC_I(inode)->sysctl;
	if (head) {
		rcu_assign_pointer(PROC_I(inode)->sysctl, NULL);
		sysctl_head_put(head);
	}
53
	/* Release any associated namespace */
54 55
	ns_ops = PROC_I(inode)->ns.ns_ops;
	ns = PROC_I(inode)->ns.ns;
56 57
	if (ns_ops && ns)
		ns_ops->put(ns);
L
Linus Torvalds 已提交
58 59
}

60
static struct kmem_cache * proc_inode_cachep;
L
Linus Torvalds 已提交
61 62 63 64 65 66

static struct inode *proc_alloc_inode(struct super_block *sb)
{
	struct proc_inode *ei;
	struct inode *inode;

67
	ei = (struct proc_inode *)kmem_cache_alloc(proc_inode_cachep, GFP_KERNEL);
L
Linus Torvalds 已提交
68 69
	if (!ei)
		return NULL;
70
	ei->pid = NULL;
71
	ei->fd = 0;
L
Linus Torvalds 已提交
72 73
	ei->op.proc_get_link = NULL;
	ei->pde = NULL;
A
Al Viro 已提交
74 75
	ei->sysctl = NULL;
	ei->sysctl_entry = NULL;
76 77
	ei->ns.ns = NULL;
	ei->ns.ns_ops = NULL;
L
Linus Torvalds 已提交
78 79 80 81 82
	inode = &ei->vfs_inode;
	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
	return inode;
}

N
Nick Piggin 已提交
83
static void proc_i_callback(struct rcu_head *head)
L
Linus Torvalds 已提交
84
{
N
Nick Piggin 已提交
85
	struct inode *inode = container_of(head, struct inode, i_rcu);
L
Linus Torvalds 已提交
86 87 88
	kmem_cache_free(proc_inode_cachep, PROC_I(inode));
}

N
Nick Piggin 已提交
89 90 91 92 93
static void proc_destroy_inode(struct inode *inode)
{
	call_rcu(&inode->i_rcu, proc_i_callback);
}

94
static void init_once(void *foo)
L
Linus Torvalds 已提交
95 96 97
{
	struct proc_inode *ei = (struct proc_inode *) foo;

C
Christoph Lameter 已提交
98
	inode_init_once(&ei->vfs_inode);
L
Linus Torvalds 已提交
99
}
100

101
void __init proc_init_inodecache(void)
L
Linus Torvalds 已提交
102 103 104
{
	proc_inode_cachep = kmem_cache_create("proc_inode_cache",
					     sizeof(struct proc_inode),
105
					     0, (SLAB_RECLAIM_ACCOUNT|
106
						SLAB_MEM_SPREAD|SLAB_PANIC),
107
					     init_once);
L
Linus Torvalds 已提交
108 109
}

V
Vasiliy Kulikov 已提交
110 111
static int proc_show_options(struct seq_file *seq, struct dentry *root)
{
112 113 114
	struct super_block *sb = root->d_sb;
	struct pid_namespace *pid = sb->s_fs_info;

115 116
	if (!gid_eq(pid->pid_gid, GLOBAL_ROOT_GID))
		seq_printf(seq, ",gid=%u", from_kgid_munged(&init_user_ns, pid->pid_gid));
117 118 119
	if (pid->hide_pid != 0)
		seq_printf(seq, ",hidepid=%u", pid->hide_pid);

V
Vasiliy Kulikov 已提交
120 121 122
	return 0;
}

123
static const struct super_operations proc_sops = {
L
Linus Torvalds 已提交
124 125 126
	.alloc_inode	= proc_alloc_inode,
	.destroy_inode	= proc_destroy_inode,
	.drop_inode	= generic_delete_inode,
A
Al Viro 已提交
127
	.evict_inode	= proc_evict_inode,
L
Linus Torvalds 已提交
128
	.statfs		= simple_statfs,
V
Vasiliy Kulikov 已提交
129 130
	.remount_fs	= proc_remount,
	.show_options	= proc_show_options,
L
Linus Torvalds 已提交
131 132
};

133 134 135 136
enum {BIAS = -1U<<31};

static inline int use_pde(struct proc_dir_entry *pde)
{
A
Al Viro 已提交
137
	return atomic_inc_unless_negative(&pde->in_use);
A
Alexey Dobriyan 已提交
138 139
}

140
static void unuse_pde(struct proc_dir_entry *pde)
A
Alexey Dobriyan 已提交
141
{
A
Al Viro 已提交
142 143
	if (atomic_dec_return(&pde->in_use) == BIAS)
		complete(pde->pde_unload_completion);
144 145
}

146 147 148
/* pde is locked */
static void close_pdeo(struct proc_dir_entry *pde, struct pde_opener *pdeo)
{
A
Al Viro 已提交
149
	if (pdeo->closing) {
150
		/* somebody else is doing that, just wait */
A
Al Viro 已提交
151 152
		DECLARE_COMPLETION_ONSTACK(c);
		pdeo->c = &c;
153
		spin_unlock(&pde->pde_unload_lock);
A
Al Viro 已提交
154
		wait_for_completion(&c);
155 156 157
		spin_lock(&pde->pde_unload_lock);
	} else {
		struct file *file;
A
Al Viro 已提交
158
		pdeo->closing = 1;
159 160 161 162 163
		spin_unlock(&pde->pde_unload_lock);
		file = pdeo->file;
		pde->proc_fops->release(file_inode(file), file);
		spin_lock(&pde->pde_unload_lock);
		list_del_init(&pdeo->lh);
A
Al Viro 已提交
164 165
		if (pdeo->c)
			complete(pdeo->c);
166
		kfree(pdeo);
A
Al Viro 已提交
167
	}
168 169
}

170
void proc_entry_rundown(struct proc_dir_entry *de)
171
{
A
Al Viro 已提交
172
	DECLARE_COMPLETION_ONSTACK(c);
173
	/* Wait until all existing callers into module are done. */
A
Al Viro 已提交
174 175 176
	de->pde_unload_completion = &c;
	if (atomic_add_return(BIAS, &de->in_use) != BIAS)
		wait_for_completion(&c);
177

A
Al Viro 已提交
178
	spin_lock(&de->pde_unload_lock);
179 180 181
	while (!list_empty(&de->pde_openers)) {
		struct pde_opener *pdeo;
		pdeo = list_first_entry(&de->pde_openers, struct pde_opener, lh);
182
		close_pdeo(de, pdeo);
183 184
	}
	spin_unlock(&de->pde_unload_lock);
185 186
}

187 188 189 190 191 192 193 194 195 196 197 198
static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence)
{
	struct proc_dir_entry *pde = PDE(file_inode(file));
	loff_t rv = -EINVAL;
	if (use_pde(pde)) {
		loff_t (*llseek)(struct file *, loff_t, int);
		llseek = pde->proc_fops->llseek;
		if (!llseek)
			llseek = default_llseek;
		rv = llseek(file, offset, whence);
		unuse_pde(pde);
	}
199 200 201
	return rv;
}

202
static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
203
{
204
	ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
A
Al Viro 已提交
205
	struct proc_dir_entry *pde = PDE(file_inode(file));
206
	ssize_t rv = -EIO;
207 208 209 210 211
	if (use_pde(pde)) {
		read = pde->proc_fops->read;
		if (read)
			rv = read(file, buf, count, ppos);
		unuse_pde(pde);
212
	}
213 214
	return rv;
}
215

216 217 218 219 220 221 222 223 224 225 226
static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
	ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);
	struct proc_dir_entry *pde = PDE(file_inode(file));
	ssize_t rv = -EIO;
	if (use_pde(pde)) {
		write = pde->proc_fops->write;
		if (write)
			rv = write(file, buf, count, ppos);
		unuse_pde(pde);
	}
227 228 229 230 231
	return rv;
}

static unsigned int proc_reg_poll(struct file *file, struct poll_table_struct *pts)
{
A
Al Viro 已提交
232
	struct proc_dir_entry *pde = PDE(file_inode(file));
233
	unsigned int rv = DEFAULT_POLLMASK;
234
	unsigned int (*poll)(struct file *, struct poll_table_struct *);
235 236 237 238 239
	if (use_pde(pde)) {
		poll = pde->proc_fops->poll;
		if (poll)
			rv = poll(file, pts);
		unuse_pde(pde);
240 241 242 243 244 245
	}
	return rv;
}

static long proc_reg_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
A
Al Viro 已提交
246
	struct proc_dir_entry *pde = PDE(file_inode(file));
247
	long rv = -ENOTTY;
248
	long (*ioctl)(struct file *, unsigned int, unsigned long);
249 250 251 252 253
	if (use_pde(pde)) {
		ioctl = pde->proc_fops->unlocked_ioctl;
		if (ioctl)
			rv = ioctl(file, cmd, arg);
		unuse_pde(pde);
254 255 256 257 258 259 260
	}
	return rv;
}

#ifdef CONFIG_COMPAT
static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
A
Al Viro 已提交
261
	struct proc_dir_entry *pde = PDE(file_inode(file));
262 263
	long rv = -ENOTTY;
	long (*compat_ioctl)(struct file *, unsigned int, unsigned long);
264 265 266 267 268
	if (use_pde(pde)) {
		compat_ioctl = pde->proc_fops->compat_ioctl;
		if (compat_ioctl)
			rv = compat_ioctl(file, cmd, arg);
		unuse_pde(pde);
269 270 271 272 273 274 275
	}
	return rv;
}
#endif

static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma)
{
A
Al Viro 已提交
276
	struct proc_dir_entry *pde = PDE(file_inode(file));
277 278
	int rv = -EIO;
	int (*mmap)(struct file *, struct vm_area_struct *);
279 280 281 282 283
	if (use_pde(pde)) {
		mmap = pde->proc_fops->mmap;
		if (mmap)
			rv = mmap(file, vma);
		unuse_pde(pde);
284 285 286 287
	}
	return rv;
}

288 289 290
static unsigned long proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr, unsigned long len, unsigned long pgoff, unsigned long flags)
{
	struct proc_dir_entry *pde = PDE(file_inode(file));
291
	unsigned long rv = -EIO;
292
	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long) = NULL;
293
	if (use_pde(pde)) {
294 295 296 297 298
#ifdef CONFIG_MMU
		get_unmapped_area = current->mm->get_unmapped_area;
#endif
		if (pde->proc_fops->get_unmapped_area)
			get_unmapped_area = pde->proc_fops->get_unmapped_area;
299 300 301 302 303 304 305
		if (get_unmapped_area)
			rv = get_unmapped_area(file, orig_addr, len, pgoff, flags);
		unuse_pde(pde);
	}
	return rv;
}

306 307 308 309 310
static int proc_reg_open(struct inode *inode, struct file *file)
{
	struct proc_dir_entry *pde = PDE(inode);
	int rv = 0;
	int (*open)(struct inode *, struct file *);
A
Alexey Dobriyan 已提交
311 312 313 314 315 316 317 318 319 320 321 322 323
	int (*release)(struct inode *, struct file *);
	struct pde_opener *pdeo;

	/*
	 * What for, you ask? Well, we can have open, rmmod, remove_proc_entry
	 * sequence. ->release won't be called because ->proc_fops will be
	 * cleared. Depending on complexity of ->release, consequences vary.
	 *
	 * We can't wait for mercy when close will be done for real, it's
	 * deadlockable: rmmod foo </proc/foo . So, we're going to do ->release
	 * by hand in remove_proc_entry(). For this, save opener's credentials
	 * for later.
	 */
A
Al Viro 已提交
324
	pdeo = kzalloc(sizeof(struct pde_opener), GFP_KERNEL);
A
Alexey Dobriyan 已提交
325 326
	if (!pdeo)
		return -ENOMEM;
327

328
	if (!use_pde(pde)) {
A
Alexey Dobriyan 已提交
329
		kfree(pdeo);
330
		return -ENOENT;
331 332
	}
	open = pde->proc_fops->open;
A
Alexey Dobriyan 已提交
333
	release = pde->proc_fops->release;
334 335 336 337

	if (open)
		rv = open(inode, file);

A
Alexey Dobriyan 已提交
338 339 340 341
	if (rv == 0 && release) {
		/* To know what to release. */
		pdeo->file = file;
		/* Strictly for "too late" ->release in proc_reg_release(). */
A
Al Viro 已提交
342
		spin_lock(&pde->pde_unload_lock);
A
Alexey Dobriyan 已提交
343
		list_add(&pdeo->lh, &pde->pde_openers);
A
Al Viro 已提交
344
		spin_unlock(&pde->pde_unload_lock);
A
Alexey Dobriyan 已提交
345 346
	} else
		kfree(pdeo);
A
Al Viro 已提交
347 348

	unuse_pde(pde);
349 350 351 352 353 354
	return rv;
}

static int proc_reg_release(struct inode *inode, struct file *file)
{
	struct proc_dir_entry *pde = PDE(inode);
A
Alexey Dobriyan 已提交
355
	struct pde_opener *pdeo;
356
	spin_lock(&pde->pde_unload_lock);
357 358 359 360 361
	list_for_each_entry(pdeo, &pde->pde_openers, lh) {
		if (pdeo->file == file) {
			close_pdeo(pde, pdeo);
			break;
		}
A
Alexey Dobriyan 已提交
362
	}
363
	spin_unlock(&pde->pde_unload_lock);
364
	return 0;
365 366 367 368 369 370 371 372 373 374 375 376
}

static const struct file_operations proc_reg_file_ops = {
	.llseek		= proc_reg_llseek,
	.read		= proc_reg_read,
	.write		= proc_reg_write,
	.poll		= proc_reg_poll,
	.unlocked_ioctl	= proc_reg_unlocked_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl	= proc_reg_compat_ioctl,
#endif
	.mmap		= proc_reg_mmap,
377
	.get_unmapped_area = proc_reg_get_unmapped_area,
378 379 380 381
	.open		= proc_reg_open,
	.release	= proc_reg_release,
};

382 383 384 385 386 387 388 389
#ifdef CONFIG_COMPAT
static const struct file_operations proc_reg_file_ops_no_compat = {
	.llseek		= proc_reg_llseek,
	.read		= proc_reg_read,
	.write		= proc_reg_write,
	.poll		= proc_reg_poll,
	.unlocked_ioctl	= proc_reg_unlocked_ioctl,
	.mmap		= proc_reg_mmap,
390
	.get_unmapped_area = proc_reg_get_unmapped_area,
391 392 393 394 395
	.open		= proc_reg_open,
	.release	= proc_reg_release,
};
#endif

A
Alexey Dobriyan 已提交
396
struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
L
Linus Torvalds 已提交
397
{
398
	struct inode *inode = new_inode_pseudo(sb);
L
Linus Torvalds 已提交
399

400 401
	if (inode) {
		inode->i_ino = de->low_ino;
402 403
		inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
		PROC_I(inode)->pde = de;
404 405 406 407 408 409 410 411 412

		if (de->mode) {
			inode->i_mode = de->mode;
			inode->i_uid = de->uid;
			inode->i_gid = de->gid;
		}
		if (de->size)
			inode->i_size = de->size;
		if (de->nlink)
M
Miklos Szeredi 已提交
413
			set_nlink(inode, de->nlink);
414 415
		WARN_ON(!de->proc_iops);
		inode->i_op = de->proc_iops;
416 417
		if (de->proc_fops) {
			if (S_ISREG(inode->i_mode)) {
418
#ifdef CONFIG_COMPAT
419 420 421 422
				if (!de->proc_fops->compat_ioctl)
					inode->i_fop =
						&proc_reg_file_ops_no_compat;
				else
423
#endif
424 425 426
					inode->i_fop = &proc_reg_file_ops;
			} else {
				inode->i_fop = de->proc_fops;
427
			}
428
		}
429
	} else
430
	       pde_put(de);
L
Linus Torvalds 已提交
431
	return inode;
432
}
L
Linus Torvalds 已提交
433

434
int proc_fill_super(struct super_block *s)
L
Linus Torvalds 已提交
435
{
436 437
	struct inode *root_inode;

438
	s->s_flags |= MS_NODIRATIME | MS_NOSUID | MS_NOEXEC;
L
Linus Torvalds 已提交
439 440 441 442 443 444
	s->s_blocksize = 1024;
	s->s_blocksize_bits = 10;
	s->s_magic = PROC_SUPER_MAGIC;
	s->s_op = &proc_sops;
	s->s_time_gran = 1;
	
445
	pde_get(&proc_root);
446 447
	root_inode = proc_get_inode(s, &proc_root);
	if (!root_inode) {
A
Andrew Morton 已提交
448
		pr_err("proc_fill_super: get root inode failed\n");
449 450
		return -ENOMEM;
	}
L
Linus Torvalds 已提交
451

452 453
	s->s_root = d_make_root(root_inode);
	if (!s->s_root) {
A
Andrew Morton 已提交
454
		pr_err("proc_fill_super: allocate dentry failed\n");
455 456 457
		return -ENOMEM;
	}

458
	return proc_setup_self(s);
L
Linus Torvalds 已提交
459
}