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

#include <linux/syscalls.h>
#include <linux/init.h>
#include <linux/mm.h>
10
#include <linux/sched/task.h>
L
Linus Torvalds 已提交
11 12
#include <linux/fs.h>
#include <linux/file.h>
A
Al Viro 已提交
13
#include <linux/fdtable.h>
14
#include <linux/capability.h>
L
Linus Torvalds 已提交
15 16 17
#include <linux/dnotify.h>
#include <linux/slab.h>
#include <linux/module.h>
18
#include <linux/pipe_fs_i.h>
L
Linus Torvalds 已提交
19 20
#include <linux/security.h>
#include <linux/ptrace.h>
21
#include <linux/signal.h>
22
#include <linux/rcupdate.h>
23
#include <linux/pid_namespace.h>
24
#include <linux/user_namespace.h>
D
David Herrmann 已提交
25
#include <linux/shmem_fs.h>
26
#include <linux/compat.h>
L
Linus Torvalds 已提交
27 28 29

#include <asm/poll.h>
#include <asm/siginfo.h>
30
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
31

32
#define SETFL_MASK (O_APPEND | O_NONBLOCK | O_NDELAY | O_DIRECT | O_NOATIME)
L
Linus Torvalds 已提交
33 34 35

static int setfl(int fd, struct file * filp, unsigned long arg)
{
A
Al Viro 已提交
36
	struct inode * inode = file_inode(filp);
L
Linus Torvalds 已提交
37 38
	int error = 0;

39 40 41 42 43
	/*
	 * O_APPEND cannot be cleared if the file is marked as append-only
	 * and the file is open for write.
	 */
	if (((arg ^ filp->f_flags) & O_APPEND) && IS_APPEND(inode))
L
Linus Torvalds 已提交
44 45 46 47
		return -EPERM;

	/* O_NOATIME can only be set by the owner or superuser */
	if ((arg & O_NOATIME) && !(filp->f_flags & O_NOATIME))
48
		if (!inode_owner_or_capable(inode))
L
Linus Torvalds 已提交
49 50 51 52 53 54 55
			return -EPERM;

	/* required for strict SunOS emulation */
	if (O_NONBLOCK != O_NDELAY)
	       if (arg & O_NDELAY)
		   arg |= O_NONBLOCK;

56
	/* Pipe packetized mode is controlled by O_DIRECT flag */
A
Al Viro 已提交
57
	if (!S_ISFIFO(inode->i_mode) && (arg & O_DIRECT)) {
L
Linus Torvalds 已提交
58 59 60 61 62
		if (!filp->f_mapping || !filp->f_mapping->a_ops ||
			!filp->f_mapping->a_ops->direct_IO)
				return -EINVAL;
	}

A
Al Viro 已提交
63
	if (filp->f_op->check_flags)
L
Linus Torvalds 已提交
64 65 66 67
		error = filp->f_op->check_flags(arg);
	if (error)
		return error;

68
	/*
69
	 * ->fasync() is responsible for setting the FASYNC bit.
70
	 */
A
Al Viro 已提交
71
	if (((arg ^ filp->f_flags) & FASYNC) && filp->f_op->fasync) {
72 73 74
		error = filp->f_op->fasync(fd, filp, (arg & FASYNC) != 0);
		if (error < 0)
			goto out;
75 76
		if (error > 0)
			error = 0;
L
Linus Torvalds 已提交
77
	}
J
Jonathan Corbet 已提交
78
	spin_lock(&filp->f_lock);
L
Linus Torvalds 已提交
79
	filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK);
J
Jonathan Corbet 已提交
80
	spin_unlock(&filp->f_lock);
81

L
Linus Torvalds 已提交
82 83 84 85
 out:
	return error;
}

86
static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
87
                     int force)
L
Linus Torvalds 已提交
88
{
89
	write_lock_irq(&filp->f_owner.lock);
L
Linus Torvalds 已提交
90
	if (force || !filp->f_owner.pid) {
91 92 93
		put_pid(filp->f_owner.pid);
		filp->f_owner.pid = get_pid(pid);
		filp->f_owner.pid_type = type;
94 95 96 97 98 99

		if (pid) {
			const struct cred *cred = current_cred();
			filp->f_owner.uid = cred->uid;
			filp->f_owner.euid = cred->euid;
		}
L
Linus Torvalds 已提交
100
	}
101
	write_unlock_irq(&filp->f_owner.lock);
L
Linus Torvalds 已提交
102 103
}

104
void __f_setown(struct file *filp, struct pid *pid, enum pid_type type,
105
		int force)
L
Linus Torvalds 已提交
106
{
107
	security_file_set_fowner(filp);
108
	f_modown(filp, pid, type, force);
L
Linus Torvalds 已提交
109
}
110
EXPORT_SYMBOL(__f_setown);
L
Linus Torvalds 已提交
111

112
void f_setown(struct file *filp, unsigned long arg, int force)
113 114 115 116 117 118 119 120 121 122
{
	enum pid_type type;
	struct pid *pid;
	int who = arg;
	type = PIDTYPE_PID;
	if (who < 0) {
		type = PIDTYPE_PGID;
		who = -who;
	}
	rcu_read_lock();
123
	pid = find_vpid(who);
124
	__f_setown(filp, pid, type, force);
125 126
	rcu_read_unlock();
}
L
Linus Torvalds 已提交
127 128 129 130
EXPORT_SYMBOL(f_setown);

void f_delown(struct file *filp)
{
131
	f_modown(filp, NULL, PIDTYPE_PID, 1);
132 133 134 135 136
}

pid_t f_getown(struct file *filp)
{
	pid_t pid;
137
	read_lock(&filp->f_owner.lock);
138
	pid = pid_vnr(filp->f_owner.pid);
139 140
	if (filp->f_owner.pid_type == PIDTYPE_PGID)
		pid = -pid;
141
	read_unlock(&filp->f_owner.lock);
142
	return pid;
L
Linus Torvalds 已提交
143 144
}

P
Peter Zijlstra 已提交
145 146
static int f_setown_ex(struct file *filp, unsigned long arg)
{
A
Al Viro 已提交
147
	struct f_owner_ex __user *owner_p = (void __user *)arg;
P
Peter Zijlstra 已提交
148 149 150 151 152 153 154
	struct f_owner_ex owner;
	struct pid *pid;
	int type;
	int ret;

	ret = copy_from_user(&owner, owner_p, sizeof(owner));
	if (ret)
155
		return -EFAULT;
P
Peter Zijlstra 已提交
156 157 158 159 160 161 162 163 164 165

	switch (owner.type) {
	case F_OWNER_TID:
		type = PIDTYPE_MAX;
		break;

	case F_OWNER_PID:
		type = PIDTYPE_PID;
		break;

166
	case F_OWNER_PGRP:
P
Peter Zijlstra 已提交
167 168 169 170 171 172 173 174 175 176 177 178
		type = PIDTYPE_PGID;
		break;

	default:
		return -EINVAL;
	}

	rcu_read_lock();
	pid = find_vpid(owner.pid);
	if (owner.pid && !pid)
		ret = -ESRCH;
	else
179
		 __f_setown(filp, pid, type, 1);
P
Peter Zijlstra 已提交
180 181 182 183 184 185 186
	rcu_read_unlock();

	return ret;
}

static int f_getown_ex(struct file *filp, unsigned long arg)
{
A
Al Viro 已提交
187
	struct f_owner_ex __user *owner_p = (void __user *)arg;
P
Peter Zijlstra 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
	struct f_owner_ex owner;
	int ret = 0;

	read_lock(&filp->f_owner.lock);
	owner.pid = pid_vnr(filp->f_owner.pid);
	switch (filp->f_owner.pid_type) {
	case PIDTYPE_MAX:
		owner.type = F_OWNER_TID;
		break;

	case PIDTYPE_PID:
		owner.type = F_OWNER_PID;
		break;

	case PIDTYPE_PGID:
203
		owner.type = F_OWNER_PGRP;
P
Peter Zijlstra 已提交
204 205 206 207 208 209 210 211 212
		break;

	default:
		WARN_ON(1);
		ret = -EINVAL;
		break;
	}
	read_unlock(&filp->f_owner.lock);

213
	if (!ret) {
P
Peter Zijlstra 已提交
214
		ret = copy_to_user(owner_p, &owner, sizeof(owner));
215 216 217
		if (ret)
			ret = -EFAULT;
	}
P
Peter Zijlstra 已提交
218 219 220
	return ret;
}

221 222 223 224
#ifdef CONFIG_CHECKPOINT_RESTORE
static int f_getowner_uids(struct file *filp, unsigned long arg)
{
	struct user_namespace *user_ns = current_user_ns();
A
Al Viro 已提交
225
	uid_t __user *dst = (void __user *)arg;
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
	uid_t src[2];
	int err;

	read_lock(&filp->f_owner.lock);
	src[0] = from_kuid(user_ns, filp->f_owner.uid);
	src[1] = from_kuid(user_ns, filp->f_owner.euid);
	read_unlock(&filp->f_owner.lock);

	err  = put_user(src[0], &dst[0]);
	err |= put_user(src[1], &dst[1]);

	return err;
}
#else
static int f_getowner_uids(struct file *filp, unsigned long arg)
{
	return -EINVAL;
}
#endif

L
Linus Torvalds 已提交
246 247 248 249 250 251 252
static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
		struct file *filp)
{
	long err = -EINVAL;

	switch (cmd) {
	case F_DUPFD:
253 254
		err = f_dupfd(arg, filp, 0);
		break;
U
Ulrich Drepper 已提交
255
	case F_DUPFD_CLOEXEC:
A
Al Viro 已提交
256
		err = f_dupfd(arg, filp, O_CLOEXEC);
L
Linus Torvalds 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270
		break;
	case F_GETFD:
		err = get_close_on_exec(fd) ? FD_CLOEXEC : 0;
		break;
	case F_SETFD:
		err = 0;
		set_close_on_exec(fd, arg & FD_CLOEXEC);
		break;
	case F_GETFL:
		err = filp->f_flags;
		break;
	case F_SETFL:
		err = setfl(fd, filp, arg);
		break;
271 272
#if BITS_PER_LONG != 32
	/* 32-bit arches must use fcntl64() */
273
	case F_OFD_GETLK:
274
#endif
L
Linus Torvalds 已提交
275
	case F_GETLK:
276
		err = fcntl_getlk(filp, cmd, (struct flock __user *) arg);
L
Linus Torvalds 已提交
277
		break;
278 279
#if BITS_PER_LONG != 32
	/* 32-bit arches must use fcntl64() */
280 281
	case F_OFD_SETLK:
	case F_OFD_SETLKW:
282 283
#endif
		/* Fallthrough */
L
Linus Torvalds 已提交
284 285
	case F_SETLK:
	case F_SETLKW:
286
		err = fcntl_setlk(fd, filp, cmd, (struct flock __user *) arg);
L
Linus Torvalds 已提交
287 288 289 290 291 292 293 294 295
		break;
	case F_GETOWN:
		/*
		 * XXX If f_owner is a process group, the
		 * negative return value will get converted
		 * into an error.  Oops.  If we keep the
		 * current syscall conventions, the only way
		 * to fix this will be in libc.
		 */
296
		err = f_getown(filp);
L
Linus Torvalds 已提交
297 298 299
		force_successful_syscall_return();
		break;
	case F_SETOWN:
300 301
		f_setown(filp, arg, 1);
		err = 0;
L
Linus Torvalds 已提交
302
		break;
P
Peter Zijlstra 已提交
303 304 305 306 307 308
	case F_GETOWN_EX:
		err = f_getown_ex(filp, arg);
		break;
	case F_SETOWN_EX:
		err = f_setown_ex(filp, arg);
		break;
309 310 311
	case F_GETOWNER_UIDS:
		err = f_getowner_uids(filp, arg);
		break;
L
Linus Torvalds 已提交
312 313 314 315 316
	case F_GETSIG:
		err = filp->f_owner.signum;
		break;
	case F_SETSIG:
		/* arg == 0 restores default behaviour. */
317
		if (!valid_signal(arg)) {
L
Linus Torvalds 已提交
318 319 320 321 322 323 324 325 326 327 328 329 330 331
			break;
		}
		err = 0;
		filp->f_owner.signum = arg;
		break;
	case F_GETLEASE:
		err = fcntl_getlease(filp);
		break;
	case F_SETLEASE:
		err = fcntl_setlease(fd, filp, arg);
		break;
	case F_NOTIFY:
		err = fcntl_dirnotify(fd, filp, arg);
		break;
332 333 334 335
	case F_SETPIPE_SZ:
	case F_GETPIPE_SZ:
		err = pipe_fcntl(filp, cmd, arg);
		break;
D
David Herrmann 已提交
336 337 338 339
	case F_ADD_SEALS:
	case F_GET_SEALS:
		err = shmem_fcntl(filp, cmd, arg);
		break;
L
Linus Torvalds 已提交
340 341 342 343 344 345
	default:
		break;
	}
	return err;
}

346 347 348 349 350 351 352 353 354 355 356 357 358
static int check_fcntl_cmd(unsigned cmd)
{
	switch (cmd) {
	case F_DUPFD:
	case F_DUPFD_CLOEXEC:
	case F_GETFD:
	case F_SETFD:
	case F_GETFL:
		return 1;
	}
	return 0;
}

359
SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
L
Linus Torvalds 已提交
360
{	
361
	struct fd f = fdget_raw(fd);
L
Linus Torvalds 已提交
362 363
	long err = -EBADF;

364
	if (!f.file)
L
Linus Torvalds 已提交
365 366
		goto out;

367
	if (unlikely(f.file->f_mode & FMODE_PATH)) {
368 369
		if (!check_fcntl_cmd(cmd))
			goto out1;
370 371
	}

372
	err = security_file_fcntl(f.file, cmd, arg);
373
	if (!err)
374
		err = do_fcntl(fd, cmd, arg, f.file);
L
Linus Torvalds 已提交
375

376
out1:
377
 	fdput(f);
L
Linus Torvalds 已提交
378 379 380 381 382
out:
	return err;
}

#if BITS_PER_LONG == 32
383 384
SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
		unsigned long, arg)
L
Linus Torvalds 已提交
385
{	
386
	struct fd f = fdget_raw(fd);
387
	long err = -EBADF;
L
Linus Torvalds 已提交
388

389
	if (!f.file)
L
Linus Torvalds 已提交
390 391
		goto out;

392
	if (unlikely(f.file->f_mode & FMODE_PATH)) {
393 394
		if (!check_fcntl_cmd(cmd))
			goto out1;
395 396
	}

397
	err = security_file_fcntl(f.file, cmd, arg);
398 399
	if (err)
		goto out1;
L
Linus Torvalds 已提交
400 401
	
	switch (cmd) {
402
	case F_GETLK64:
403
	case F_OFD_GETLK:
404 405 406 407
		err = fcntl_getlk64(f.file, cmd, (struct flock64 __user *) arg);
		break;
	case F_SETLK64:
	case F_SETLKW64:
408 409
	case F_OFD_SETLK:
	case F_OFD_SETLKW:
410 411 412 413 414 415
		err = fcntl_setlk64(fd, f.file, cmd,
				(struct flock64 __user *) arg);
		break;
	default:
		err = do_fcntl(fd, cmd, arg, f.file);
		break;
L
Linus Torvalds 已提交
416
	}
417
out1:
418
	fdput(f);
L
Linus Torvalds 已提交
419 420 421 422 423
out:
	return err;
}
#endif

424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579
#ifdef CONFIG_COMPAT
static int get_compat_flock(struct flock *kfl, struct compat_flock __user *ufl)
{
	if (!access_ok(VERIFY_READ, ufl, sizeof(*ufl)) ||
	    __get_user(kfl->l_type, &ufl->l_type) ||
	    __get_user(kfl->l_whence, &ufl->l_whence) ||
	    __get_user(kfl->l_start, &ufl->l_start) ||
	    __get_user(kfl->l_len, &ufl->l_len) ||
	    __get_user(kfl->l_pid, &ufl->l_pid))
		return -EFAULT;
	return 0;
}

static int put_compat_flock(struct flock *kfl, struct compat_flock __user *ufl)
{
	if (!access_ok(VERIFY_WRITE, ufl, sizeof(*ufl)) ||
	    __put_user(kfl->l_type, &ufl->l_type) ||
	    __put_user(kfl->l_whence, &ufl->l_whence) ||
	    __put_user(kfl->l_start, &ufl->l_start) ||
	    __put_user(kfl->l_len, &ufl->l_len) ||
	    __put_user(kfl->l_pid, &ufl->l_pid))
		return -EFAULT;
	return 0;
}

#ifndef HAVE_ARCH_GET_COMPAT_FLOCK64
static int get_compat_flock64(struct flock *kfl, struct compat_flock64 __user *ufl)
{
	if (!access_ok(VERIFY_READ, ufl, sizeof(*ufl)) ||
	    __get_user(kfl->l_type, &ufl->l_type) ||
	    __get_user(kfl->l_whence, &ufl->l_whence) ||
	    __get_user(kfl->l_start, &ufl->l_start) ||
	    __get_user(kfl->l_len, &ufl->l_len) ||
	    __get_user(kfl->l_pid, &ufl->l_pid))
		return -EFAULT;
	return 0;
}
#endif

#ifndef HAVE_ARCH_PUT_COMPAT_FLOCK64
static int put_compat_flock64(struct flock *kfl, struct compat_flock64 __user *ufl)
{
	if (!access_ok(VERIFY_WRITE, ufl, sizeof(*ufl)) ||
	    __put_user(kfl->l_type, &ufl->l_type) ||
	    __put_user(kfl->l_whence, &ufl->l_whence) ||
	    __put_user(kfl->l_start, &ufl->l_start) ||
	    __put_user(kfl->l_len, &ufl->l_len) ||
	    __put_user(kfl->l_pid, &ufl->l_pid))
		return -EFAULT;
	return 0;
}
#endif

static unsigned int
convert_fcntl_cmd(unsigned int cmd)
{
	switch (cmd) {
	case F_GETLK64:
		return F_GETLK;
	case F_SETLK64:
		return F_SETLK;
	case F_SETLKW64:
		return F_SETLKW;
	}

	return cmd;
}

COMPAT_SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
		       compat_ulong_t, arg)
{
	mm_segment_t old_fs;
	struct flock f;
	long ret;
	unsigned int conv_cmd;

	switch (cmd) {
	case F_GETLK:
	case F_SETLK:
	case F_SETLKW:
		ret = get_compat_flock(&f, compat_ptr(arg));
		if (ret != 0)
			break;
		old_fs = get_fs();
		set_fs(KERNEL_DS);
		ret = sys_fcntl(fd, cmd, (unsigned long)&f);
		set_fs(old_fs);
		if (cmd == F_GETLK && ret == 0) {
			/* GETLK was successful and we need to return the data...
			 * but it needs to fit in the compat structure.
			 * l_start shouldn't be too big, unless the original
			 * start + end is greater than COMPAT_OFF_T_MAX, in which
			 * case the app was asking for trouble, so we return
			 * -EOVERFLOW in that case.
			 * l_len could be too big, in which case we just truncate it,
			 * and only allow the app to see that part of the conflicting
			 * lock that might make sense to it anyway
			 */

			if (f.l_start > COMPAT_OFF_T_MAX)
				ret = -EOVERFLOW;
			if (f.l_len > COMPAT_OFF_T_MAX)
				f.l_len = COMPAT_OFF_T_MAX;
			if (ret == 0)
				ret = put_compat_flock(&f, compat_ptr(arg));
		}
		break;

	case F_GETLK64:
	case F_SETLK64:
	case F_SETLKW64:
	case F_OFD_GETLK:
	case F_OFD_SETLK:
	case F_OFD_SETLKW:
		ret = get_compat_flock64(&f, compat_ptr(arg));
		if (ret != 0)
			break;
		old_fs = get_fs();
		set_fs(KERNEL_DS);
		conv_cmd = convert_fcntl_cmd(cmd);
		ret = sys_fcntl(fd, conv_cmd, (unsigned long)&f);
		set_fs(old_fs);
		if ((conv_cmd == F_GETLK || conv_cmd == F_OFD_GETLK) && ret == 0) {
			/* need to return lock information - see above for commentary */
			if (f.l_start > COMPAT_LOFF_T_MAX)
				ret = -EOVERFLOW;
			if (f.l_len > COMPAT_LOFF_T_MAX)
				f.l_len = COMPAT_LOFF_T_MAX;
			if (ret == 0)
				ret = put_compat_flock64(&f, compat_ptr(arg));
		}
		break;

	default:
		ret = sys_fcntl(fd, cmd, arg);
		break;
	}
	return ret;
}

COMPAT_SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd,
		       compat_ulong_t, arg)
{
	switch (cmd) {
	case F_GETLK64:
	case F_SETLK64:
	case F_SETLKW64:
	case F_OFD_GETLK:
	case F_OFD_SETLK:
	case F_OFD_SETLKW:
		return -EINVAL;
	}
	return compat_sys_fcntl64(fd, cmd, arg);
}
#endif

L
Linus Torvalds 已提交
580 581
/* Table to convert sigio signal codes into poll band bitmaps */

582
static const long band_table[NSIGPOLL] = {
L
Linus Torvalds 已提交
583 584 585 586 587 588 589 590 591 592 593
	POLLIN | POLLRDNORM,			/* POLL_IN */
	POLLOUT | POLLWRNORM | POLLWRBAND,	/* POLL_OUT */
	POLLIN | POLLRDNORM | POLLMSG,		/* POLL_MSG */
	POLLERR,				/* POLL_ERR */
	POLLPRI | POLLRDBAND,			/* POLL_PRI */
	POLLHUP | POLLERR			/* POLL_HUP */
};

static inline int sigio_perm(struct task_struct *p,
                             struct fown_struct *fown, int sig)
{
594 595 596 597 598
	const struct cred *cred;
	int ret;

	rcu_read_lock();
	cred = __task_cred(p);
599 600 601
	ret = ((uid_eq(fown->euid, GLOBAL_ROOT_UID) ||
		uid_eq(fown->euid, cred->suid) || uid_eq(fown->euid, cred->uid) ||
		uid_eq(fown->uid,  cred->suid) || uid_eq(fown->uid,  cred->uid)) &&
602 603 604
	       !security_file_send_sigiotask(p, fown, sig));
	rcu_read_unlock();
	return ret;
L
Linus Torvalds 已提交
605 606 607
}

static void send_sigio_to_task(struct task_struct *p,
608
			       struct fown_struct *fown,
P
Peter Zijlstra 已提交
609
			       int fd, int reason, int group)
L
Linus Torvalds 已提交
610
{
611 612 613 614 615 616 617
	/*
	 * F_SETSIG can change ->signum lockless in parallel, make
	 * sure we read it once and use the same value throughout.
	 */
	int signum = ACCESS_ONCE(fown->signum);

	if (!sigio_perm(p, fown, signum))
L
Linus Torvalds 已提交
618 619
		return;

620
	switch (signum) {
L
Linus Torvalds 已提交
621 622 623 624 625 626 627 628
		siginfo_t si;
		default:
			/* Queue a rt signal with the appropriate fd as its
			   value.  We use SI_SIGIO as the source, not 
			   SI_KERNEL, since kernel signals always get 
			   delivered even if we can't queue.  Failure to
			   queue in this case _should_ be reported; we fall
			   back to SIGIO in that case. --sct */
629
			si.si_signo = signum;
L
Linus Torvalds 已提交
630 631 632 633 634
			si.si_errno = 0;
		        si.si_code  = reason;
			/* Make sure we are called with one of the POLL_*
			   reasons, otherwise we could leak kernel stack into
			   userspace.  */
635
			BUG_ON((reason & __SI_MASK) != __SI_POLL);
L
Linus Torvalds 已提交
636 637 638 639 640
			if (reason - POLL_IN >= NSIGPOLL)
				si.si_band  = ~0L;
			else
				si.si_band = band_table[reason - POLL_IN];
			si.si_fd    = fd;
P
Peter Zijlstra 已提交
641
			if (!do_send_sig_info(signum, &si, p, group))
L
Linus Torvalds 已提交
642 643 644
				break;
		/* fall-through: fall back on the old plain SIGIO signal */
		case 0:
P
Peter Zijlstra 已提交
645
			do_send_sig_info(SIGIO, SEND_SIG_PRIV, p, group);
L
Linus Torvalds 已提交
646 647 648 649 650 651
	}
}

void send_sigio(struct fown_struct *fown, int fd, int band)
{
	struct task_struct *p;
652 653
	enum pid_type type;
	struct pid *pid;
P
Peter Zijlstra 已提交
654
	int group = 1;
L
Linus Torvalds 已提交
655 656
	
	read_lock(&fown->lock);
P
Peter Zijlstra 已提交
657

658
	type = fown->pid_type;
P
Peter Zijlstra 已提交
659 660 661 662 663
	if (type == PIDTYPE_MAX) {
		group = 0;
		type = PIDTYPE_PID;
	}

L
Linus Torvalds 已提交
664 665 666 667 668
	pid = fown->pid;
	if (!pid)
		goto out_unlock_fown;
	
	read_lock(&tasklist_lock);
669
	do_each_pid_task(pid, type, p) {
P
Peter Zijlstra 已提交
670
		send_sigio_to_task(p, fown, fd, band, group);
671
	} while_each_pid_task(pid, type, p);
L
Linus Torvalds 已提交
672 673 674 675 676 677
	read_unlock(&tasklist_lock);
 out_unlock_fown:
	read_unlock(&fown->lock);
}

static void send_sigurg_to_task(struct task_struct *p,
P
Peter Zijlstra 已提交
678
				struct fown_struct *fown, int group)
L
Linus Torvalds 已提交
679 680
{
	if (sigio_perm(p, fown, SIGURG))
P
Peter Zijlstra 已提交
681
		do_send_sig_info(SIGURG, SEND_SIG_PRIV, p, group);
L
Linus Torvalds 已提交
682 683 684 685 686
}

int send_sigurg(struct fown_struct *fown)
{
	struct task_struct *p;
687 688
	enum pid_type type;
	struct pid *pid;
P
Peter Zijlstra 已提交
689
	int group = 1;
690
	int ret = 0;
L
Linus Torvalds 已提交
691 692
	
	read_lock(&fown->lock);
P
Peter Zijlstra 已提交
693

694
	type = fown->pid_type;
P
Peter Zijlstra 已提交
695 696 697 698 699
	if (type == PIDTYPE_MAX) {
		group = 0;
		type = PIDTYPE_PID;
	}

L
Linus Torvalds 已提交
700 701 702 703 704 705 706
	pid = fown->pid;
	if (!pid)
		goto out_unlock_fown;

	ret = 1;
	
	read_lock(&tasklist_lock);
707
	do_each_pid_task(pid, type, p) {
P
Peter Zijlstra 已提交
708
		send_sigurg_to_task(p, fown, group);
709
	} while_each_pid_task(pid, type, p);
L
Linus Torvalds 已提交
710 711 712 713 714 715
	read_unlock(&tasklist_lock);
 out_unlock_fown:
	read_unlock(&fown->lock);
	return ret;
}

716
static DEFINE_SPINLOCK(fasync_lock);
717
static struct kmem_cache *fasync_cache __read_mostly;
L
Linus Torvalds 已提交
718

719 720 721 722 723 724
static void fasync_free_rcu(struct rcu_head *head)
{
	kmem_cache_free(fasync_cache,
			container_of(head, struct fasync_struct, fa_rcu));
}

L
Linus Torvalds 已提交
725
/*
726 727 728 729 730 731 732
 * Remove a fasync entry. If successfully removed, return
 * positive and clear the FASYNC flag. If no entry exists,
 * do nothing and return 0.
 *
 * NOTE! It is very important that the FASYNC flag always
 * match the state "is the filp on a fasync list".
 *
L
Linus Torvalds 已提交
733
 */
734
int fasync_remove_entry(struct file *filp, struct fasync_struct **fapp)
L
Linus Torvalds 已提交
735 736 737 738
{
	struct fasync_struct *fa, **fp;
	int result = 0;

739
	spin_lock(&filp->f_lock);
740
	spin_lock(&fasync_lock);
741 742 743
	for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
		if (fa->fa_file != filp)
			continue;
744 745 746 747 748

		spin_lock_irq(&fa->fa_lock);
		fa->fa_file = NULL;
		spin_unlock_irq(&fa->fa_lock);

749
		*fp = fa->fa_next;
750
		call_rcu(&fa->fa_rcu, fasync_free_rcu);
751 752 753
		filp->f_flags &= ~FASYNC;
		result = 1;
		break;
L
Linus Torvalds 已提交
754
	}
755
	spin_unlock(&fasync_lock);
756 757 758 759
	spin_unlock(&filp->f_lock);
	return result;
}

760 761 762 763 764
struct fasync_struct *fasync_alloc(void)
{
	return kmem_cache_alloc(fasync_cache, GFP_KERNEL);
}

765
/*
766 767 768
 * NOTE! This can be used only for unused fasync entries:
 * entries that actually got inserted on the fasync list
 * need to be released by rcu - see fasync_remove_entry.
769
 */
770
void fasync_free(struct fasync_struct *new)
771
{
772 773
	kmem_cache_free(fasync_cache, new);
}
774

775 776 777
/*
 * Insert a new entry into the fasync list.  Return the pointer to the
 * old one if we didn't use the new one.
778 779 780
 *
 * NOTE! It is very important that the FASYNC flag always
 * match the state "is the filp on a fasync list".
781 782 783 784
 */
struct fasync_struct *fasync_insert_entry(int fd, struct file *filp, struct fasync_struct **fapp, struct fasync_struct *new)
{
        struct fasync_struct *fa, **fp;
785 786

	spin_lock(&filp->f_lock);
787
	spin_lock(&fasync_lock);
L
Linus Torvalds 已提交
788
	for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
789 790
		if (fa->fa_file != filp)
			continue;
791 792

		spin_lock_irq(&fa->fa_lock);
793
		fa->fa_fd = fd;
794
		spin_unlock_irq(&fa->fa_lock);
795
		goto out;
L
Linus Torvalds 已提交
796 797
	}

798
	spin_lock_init(&new->fa_lock);
799 800 801 802
	new->magic = FASYNC_MAGIC;
	new->fa_file = filp;
	new->fa_fd = fd;
	new->fa_next = *fapp;
803
	rcu_assign_pointer(*fapp, new);
804 805
	filp->f_flags |= FASYNC;

L
Linus Torvalds 已提交
806
out:
807
	spin_unlock(&fasync_lock);
808
	spin_unlock(&filp->f_lock);
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836
	return fa;
}

/*
 * Add a fasync entry. Return negative on error, positive if
 * added, and zero if did nothing but change an existing one.
 */
static int fasync_add_entry(int fd, struct file *filp, struct fasync_struct **fapp)
{
	struct fasync_struct *new;

	new = fasync_alloc();
	if (!new)
		return -ENOMEM;

	/*
	 * fasync_insert_entry() returns the old (update) entry if
	 * it existed.
	 *
	 * So free the (unused) new entry and return 0 to let the
	 * caller know that we didn't add any new fasync entries.
	 */
	if (fasync_insert_entry(fd, filp, fapp, new)) {
		fasync_free(new);
		return 0;
	}

	return 1;
L
Linus Torvalds 已提交
837 838
}

839 840 841 842 843 844 845 846 847 848 849 850 851
/*
 * fasync_helper() is used by almost all character device drivers
 * to set up the fasync queue, and for regular files by the file
 * lease code. It returns negative on error, 0 if it did no changes
 * and positive if it added/deleted the entry.
 */
int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
{
	if (!on)
		return fasync_remove_entry(filp, fapp);
	return fasync_add_entry(fd, filp, fapp);
}

L
Linus Torvalds 已提交
852 853
EXPORT_SYMBOL(fasync_helper);

854 855 856 857
/*
 * rcu_read_lock() is held
 */
static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
L
Linus Torvalds 已提交
858 859
{
	while (fa) {
860
		struct fown_struct *fown;
861 862
		unsigned long flags;

L
Linus Torvalds 已提交
863 864 865 866 867
		if (fa->magic != FASYNC_MAGIC) {
			printk(KERN_ERR "kill_fasync: bad magic number in "
			       "fasync_struct!\n");
			return;
		}
868
		spin_lock_irqsave(&fa->fa_lock, flags);
869 870 871 872 873 874 875 876
		if (fa->fa_file) {
			fown = &fa->fa_file->f_owner;
			/* Don't send SIGURG to processes which have not set a
			   queued signum: SIGURG has its own default signalling
			   mechanism. */
			if (!(sig == SIGURG && fown->signum == 0))
				send_sigio(fown, fa->fa_fd, band);
		}
877
		spin_unlock_irqrestore(&fa->fa_lock, flags);
878
		fa = rcu_dereference(fa->fa_next);
L
Linus Torvalds 已提交
879 880 881 882 883 884 885 886 887
	}
}

void kill_fasync(struct fasync_struct **fp, int sig, int band)
{
	/* First a quick test without locking: usually
	 * the list is empty.
	 */
	if (*fp) {
888 889 890
		rcu_read_lock();
		kill_fasync_rcu(rcu_dereference(*fp), sig, band);
		rcu_read_unlock();
L
Linus Torvalds 已提交
891 892 893 894
	}
}
EXPORT_SYMBOL(kill_fasync);

895
static int __init fcntl_init(void)
L
Linus Torvalds 已提交
896
{
897 898 899 900 901
	/*
	 * Please add new bits here to ensure allocation uniqueness.
	 * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY
	 * is defined as O_NONBLOCK on some platforms and not on others.
	 */
C
Christoph Hellwig 已提交
902 903 904 905
	BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=
		HWEIGHT32(
			(VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) |
			__FMODE_EXEC | __FMODE_NONOTIFY));
906

L
Linus Torvalds 已提交
907
	fasync_cache = kmem_cache_create("fasync_cache",
908
		sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL);
L
Linus Torvalds 已提交
909 910 911
	return 0;
}

912
module_init(fcntl_init)