pipe.c 26.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 *  linux/fs/pipe.c
 *
 *  Copyright (C) 1991, 1992, 1999  Linus Torvalds
 */

#include <linux/mm.h>
#include <linux/file.h>
#include <linux/poll.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
14
#include <linux/log2.h>
L
Linus Torvalds 已提交
15 16 17 18
#include <linux/mount.h>
#include <linux/pipe_fs_i.h>
#include <linux/uio.h>
#include <linux/highmem.h>
19
#include <linux/pagemap.h>
A
Al Viro 已提交
20
#include <linux/audit.h>
21
#include <linux/syscalls.h>
L
Linus Torvalds 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

#include <asm/uaccess.h>
#include <asm/ioctls.h>

/*
 * We use a start+len construction, which provides full use of the 
 * allocated memory.
 * -- Florian Coosmann (FGC)
 * 
 * Reads with count = 0 should always return 0.
 * -- Julian Bradfield 1999-06-07.
 *
 * FIFOs and Pipes now generate SIGIO for both readers and writers.
 * -- Jeremy Elson <jelson@circlemud.org> 2001-08-16
 *
 * pipe_read & write cleanup
 * -- Manfred Spraul <manfred@colorfullife.com> 2002-05-09
 */

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass)
{
	if (pipe->inode)
		mutex_lock_nested(&pipe->inode->i_mutex, subclass);
}

void pipe_lock(struct pipe_inode_info *pipe)
{
	/*
	 * pipe_lock() nests non-pipe inode locks (for writing to a file)
	 */
	pipe_lock_nested(pipe, I_MUTEX_PARENT);
}
EXPORT_SYMBOL(pipe_lock);

void pipe_unlock(struct pipe_inode_info *pipe)
{
	if (pipe->inode)
		mutex_unlock(&pipe->inode->i_mutex);
}
EXPORT_SYMBOL(pipe_unlock);

void pipe_double_lock(struct pipe_inode_info *pipe1,
		      struct pipe_inode_info *pipe2)
{
	BUG_ON(pipe1 == pipe2);

	if (pipe1 < pipe2) {
		pipe_lock_nested(pipe1, I_MUTEX_PARENT);
		pipe_lock_nested(pipe2, I_MUTEX_CHILD);
	} else {
72 73
		pipe_lock_nested(pipe2, I_MUTEX_PARENT);
		pipe_lock_nested(pipe1, I_MUTEX_CHILD);
74 75 76
	}
}

L
Linus Torvalds 已提交
77
/* Drop the inode semaphore and wait for a pipe event, atomically */
78
void pipe_wait(struct pipe_inode_info *pipe)
L
Linus Torvalds 已提交
79 80 81
{
	DEFINE_WAIT(wait);

I
Ingo Molnar 已提交
82 83 84 85
	/*
	 * Pipes are system-local resources, so sleeping on them
	 * is considered a noninteractive wait:
	 */
86
	prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE);
87
	pipe_unlock(pipe);
L
Linus Torvalds 已提交
88
	schedule();
89
	finish_wait(&pipe->wait, &wait);
90
	pipe_lock(pipe);
L
Linus Torvalds 已提交
91 92
}

93
static int
94 95
pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len,
			int atomic)
L
Linus Torvalds 已提交
96 97 98 99 100 101 102 103
{
	unsigned long copy;

	while (len > 0) {
		while (!iov->iov_len)
			iov++;
		copy = min_t(unsigned long, len, iov->iov_len);

104 105 106 107 108 109 110
		if (atomic) {
			if (__copy_from_user_inatomic(to, iov->iov_base, copy))
				return -EFAULT;
		} else {
			if (copy_from_user(to, iov->iov_base, copy))
				return -EFAULT;
		}
L
Linus Torvalds 已提交
111 112 113 114 115 116 117 118
		to += copy;
		len -= copy;
		iov->iov_base += copy;
		iov->iov_len -= copy;
	}
	return 0;
}

119
static int
120 121
pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len,
		      int atomic)
L
Linus Torvalds 已提交
122 123 124 125 126 127 128 129
{
	unsigned long copy;

	while (len > 0) {
		while (!iov->iov_len)
			iov++;
		copy = min_t(unsigned long, len, iov->iov_len);

130 131 132 133 134 135 136
		if (atomic) {
			if (__copy_to_user_inatomic(iov->iov_base, from, copy))
				return -EFAULT;
		} else {
			if (copy_to_user(iov->iov_base, from, copy))
				return -EFAULT;
		}
L
Linus Torvalds 已提交
137 138 139 140 141 142 143 144
		from += copy;
		len -= copy;
		iov->iov_base += copy;
		iov->iov_len -= copy;
	}
	return 0;
}

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
/*
 * Attempt to pre-fault in the user memory, so we can use atomic copies.
 * Returns the number of bytes not faulted in.
 */
static int iov_fault_in_pages_write(struct iovec *iov, unsigned long len)
{
	while (!iov->iov_len)
		iov++;

	while (len > 0) {
		unsigned long this_len;

		this_len = min_t(unsigned long, len, iov->iov_len);
		if (fault_in_pages_writeable(iov->iov_base, this_len))
			break;

		len -= this_len;
		iov++;
	}

	return len;
}

/*
 * Pre-fault in the user memory, so we can use atomic copies.
 */
static void iov_fault_in_pages_read(struct iovec *iov, unsigned long len)
{
	while (!iov->iov_len)
		iov++;

	while (len > 0) {
		unsigned long this_len;

		this_len = min_t(unsigned long, len, iov->iov_len);
		fault_in_pages_readable(iov->iov_base, this_len);
		len -= this_len;
		iov++;
	}
}

186 187
static void anon_pipe_buf_release(struct pipe_inode_info *pipe,
				  struct pipe_buffer *buf)
L
Linus Torvalds 已提交
188 189 190
{
	struct page *page = buf->page;

191 192 193
	/*
	 * If nobody else uses this page, and we don't already have a
	 * temporary page, let's keep track of it as a one-deep
194
	 * allocation cache. (Otherwise just release our reference to it)
195
	 */
196
	if (page_count(page) == 1 && !pipe->tmp_page)
197
		pipe->tmp_page = page;
198 199
	else
		page_cache_release(page);
L
Linus Torvalds 已提交
200 201
}

202 203 204 205 206 207 208 209
/**
 * generic_pipe_buf_map - virtually map a pipe buffer
 * @pipe:	the pipe that the buffer belongs to
 * @buf:	the buffer that should be mapped
 * @atomic:	whether to use an atomic map
 *
 * Description:
 *	This function returns a kernel virtual address mapping for the
210
 *	pipe_buffer passed in @buf. If @atomic is set, an atomic map is provided
211 212 213 214 215
 *	and the caller has to be careful not to fault before calling
 *	the unmap function.
 *
 *	Note that this function occupies KM_USER0 if @atomic != 0.
 */
216
void *generic_pipe_buf_map(struct pipe_inode_info *pipe,
217
			   struct pipe_buffer *buf, int atomic)
L
Linus Torvalds 已提交
218
{
219 220 221 222 223
	if (atomic) {
		buf->flags |= PIPE_BUF_FLAG_ATOMIC;
		return kmap_atomic(buf->page, KM_USER0);
	}

L
Linus Torvalds 已提交
224 225 226
	return kmap(buf->page);
}

227 228 229 230 231 232 233 234 235
/**
 * generic_pipe_buf_unmap - unmap a previously mapped pipe buffer
 * @pipe:	the pipe that the buffer belongs to
 * @buf:	the buffer that should be unmapped
 * @map_data:	the data that the mapping function returned
 *
 * Description:
 *	This function undoes the mapping that ->map() provided.
 */
236
void generic_pipe_buf_unmap(struct pipe_inode_info *pipe,
237
			    struct pipe_buffer *buf, void *map_data)
L
Linus Torvalds 已提交
238
{
239 240 241 242 243
	if (buf->flags & PIPE_BUF_FLAG_ATOMIC) {
		buf->flags &= ~PIPE_BUF_FLAG_ATOMIC;
		kunmap_atomic(map_data, KM_USER0);
	} else
		kunmap(buf->page);
L
Linus Torvalds 已提交
244 245
}

246
/**
247
 * generic_pipe_buf_steal - attempt to take ownership of a &pipe_buffer
248 249 250 251
 * @pipe:	the pipe that the buffer belongs to
 * @buf:	the buffer to attempt to steal
 *
 * Description:
252
 *	This function attempts to steal the &struct page attached to
253 254
 *	@buf. If successful, this function returns 0 and returns with
 *	the page locked. The caller may then reuse the page for whatever
255
 *	he wishes; the typical use is insertion into a different file
256 257
 *	page cache.
 */
258 259
int generic_pipe_buf_steal(struct pipe_inode_info *pipe,
			   struct pipe_buffer *buf)
260
{
261 262
	struct page *page = buf->page;

263 264 265 266 267
	/*
	 * A reference of one is golden, that means that the owner of this
	 * page is the only one holding a reference to it. lock the page
	 * and return OK.
	 */
268 269 270 271 272 273
	if (page_count(page) == 1) {
		lock_page(page);
		return 0;
	}

	return 1;
274 275
}

276
/**
277
 * generic_pipe_buf_get - get a reference to a &struct pipe_buffer
278 279 280 281 282 283 284 285 286
 * @pipe:	the pipe that the buffer belongs to
 * @buf:	the buffer to get a reference to
 *
 * Description:
 *	This function grabs an extra reference to @buf. It's used in
 *	in the tee() system call, when we duplicate the buffers in one
 *	pipe into another.
 */
void generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
287 288 289 290
{
	page_cache_get(buf->page);
}

291 292
/**
 * generic_pipe_buf_confirm - verify contents of the pipe buffer
R
Randy Dunlap 已提交
293
 * @info:	the pipe that the buffer belongs to
294 295 296 297 298 299
 * @buf:	the buffer to confirm
 *
 * Description:
 *	This function does nothing, because the generic pipe code uses
 *	pages that are always good when inserted into the pipe.
 */
300 301
int generic_pipe_buf_confirm(struct pipe_inode_info *info,
			     struct pipe_buffer *buf)
302 303 304 305
{
	return 0;
}

306 307 308 309 310 311 312 313 314 315 316 317 318 319
/**
 * generic_pipe_buf_release - put a reference to a &struct pipe_buffer
 * @pipe:	the pipe that the buffer belongs to
 * @buf:	the buffer to put a reference to
 *
 * Description:
 *	This function releases a reference to @buf.
 */
void generic_pipe_buf_release(struct pipe_inode_info *pipe,
			      struct pipe_buffer *buf)
{
	page_cache_release(buf->page);
}

320
static const struct pipe_buf_operations anon_pipe_buf_ops = {
L
Linus Torvalds 已提交
321
	.can_merge = 1,
322 323
	.map = generic_pipe_buf_map,
	.unmap = generic_pipe_buf_unmap,
324
	.confirm = generic_pipe_buf_confirm,
L
Linus Torvalds 已提交
325
	.release = anon_pipe_buf_release,
326
	.steal = generic_pipe_buf_steal,
327
	.get = generic_pipe_buf_get,
L
Linus Torvalds 已提交
328 329 330
};

static ssize_t
331 332
pipe_read(struct kiocb *iocb, const struct iovec *_iov,
	   unsigned long nr_segs, loff_t pos)
L
Linus Torvalds 已提交
333
{
334
	struct file *filp = iocb->ki_filp;
335
	struct inode *inode = filp->f_path.dentry->d_inode;
336
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
337 338 339 340 341 342 343 344 345 346 347 348
	int do_wakeup;
	ssize_t ret;
	struct iovec *iov = (struct iovec *)_iov;
	size_t total_len;

	total_len = iov_length(iov, nr_segs);
	/* Null read succeeds. */
	if (unlikely(total_len == 0))
		return 0;

	do_wakeup = 0;
	ret = 0;
349
	mutex_lock(&inode->i_mutex);
350
	pipe = inode->i_pipe;
L
Linus Torvalds 已提交
351
	for (;;) {
352
		int bufs = pipe->nrbufs;
L
Linus Torvalds 已提交
353
		if (bufs) {
354 355
			int curbuf = pipe->curbuf;
			struct pipe_buffer *buf = pipe->bufs + curbuf;
356
			const struct pipe_buf_operations *ops = buf->ops;
L
Linus Torvalds 已提交
357 358
			void *addr;
			size_t chars = buf->len;
359
			int error, atomic;
L
Linus Torvalds 已提交
360 361 362 363

			if (chars > total_len)
				chars = total_len;

364
			error = ops->confirm(pipe, buf);
365
			if (error) {
366
				if (!ret)
367
					error = ret;
368 369
				break;
			}
370

371 372 373 374 375
			atomic = !iov_fault_in_pages_write(iov, chars);
redo:
			addr = ops->map(pipe, buf, atomic);
			error = pipe_iov_copy_to_user(iov, addr + buf->offset, chars, atomic);
			ops->unmap(pipe, buf, addr);
L
Linus Torvalds 已提交
376
			if (unlikely(error)) {
377 378 379 380 381 382 383
				/*
				 * Just retry with the slow path if we failed.
				 */
				if (atomic) {
					atomic = 0;
					goto redo;
				}
384
				if (!ret)
385
					ret = error;
L
Linus Torvalds 已提交
386 387 388 389 390 391 392
				break;
			}
			ret += chars;
			buf->offset += chars;
			buf->len -= chars;
			if (!buf->len) {
				buf->ops = NULL;
393
				ops->release(pipe, buf);
394
				curbuf = (curbuf + 1) & (pipe->buffers - 1);
395 396
				pipe->curbuf = curbuf;
				pipe->nrbufs = --bufs;
L
Linus Torvalds 已提交
397 398 399 400 401 402 403 404
				do_wakeup = 1;
			}
			total_len -= chars;
			if (!total_len)
				break;	/* common path: read succeeded */
		}
		if (bufs)	/* More to do? */
			continue;
405
		if (!pipe->writers)
L
Linus Torvalds 已提交
406
			break;
407
		if (!pipe->waiting_writers) {
L
Linus Torvalds 已提交
408 409 410 411 412 413 414 415 416 417 418 419 420
			/* syscall merging: Usually we must not sleep
			 * if O_NONBLOCK is set, or if we got some data.
			 * But if a writer sleeps in kernel space, then
			 * we can wait for that data without violating POSIX.
			 */
			if (ret)
				break;
			if (filp->f_flags & O_NONBLOCK) {
				ret = -EAGAIN;
				break;
			}
		}
		if (signal_pending(current)) {
421 422
			if (!ret)
				ret = -ERESTARTSYS;
L
Linus Torvalds 已提交
423 424 425
			break;
		}
		if (do_wakeup) {
426 427
			wake_up_interruptible_sync(&pipe->wait);
 			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
L
Linus Torvalds 已提交
428
		}
429
		pipe_wait(pipe);
L
Linus Torvalds 已提交
430
	}
431
	mutex_unlock(&inode->i_mutex);
432 433

	/* Signal writers asynchronously that there is more room. */
L
Linus Torvalds 已提交
434
	if (do_wakeup) {
I
Ingo Molnar 已提交
435
		wake_up_interruptible_sync(&pipe->wait);
436
		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
L
Linus Torvalds 已提交
437 438 439 440 441 442 443
	}
	if (ret > 0)
		file_accessed(filp);
	return ret;
}

static ssize_t
444 445
pipe_write(struct kiocb *iocb, const struct iovec *_iov,
	    unsigned long nr_segs, loff_t ppos)
L
Linus Torvalds 已提交
446
{
447
	struct file *filp = iocb->ki_filp;
448
	struct inode *inode = filp->f_path.dentry->d_inode;
449
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
450 451 452 453 454 455 456 457 458 459 460 461 462
	ssize_t ret;
	int do_wakeup;
	struct iovec *iov = (struct iovec *)_iov;
	size_t total_len;
	ssize_t chars;

	total_len = iov_length(iov, nr_segs);
	/* Null write succeeds. */
	if (unlikely(total_len == 0))
		return 0;

	do_wakeup = 0;
	ret = 0;
463
	mutex_lock(&inode->i_mutex);
464
	pipe = inode->i_pipe;
L
Linus Torvalds 已提交
465

466
	if (!pipe->readers) {
L
Linus Torvalds 已提交
467 468 469 470 471 472 473
		send_sig(SIGPIPE, current, 0);
		ret = -EPIPE;
		goto out;
	}

	/* We try to merge small writes */
	chars = total_len & (PAGE_SIZE-1); /* size of the last buffer */
474
	if (pipe->nrbufs && chars != 0) {
475
		int lastbuf = (pipe->curbuf + pipe->nrbufs - 1) &
476
							(pipe->buffers - 1);
477
		struct pipe_buffer *buf = pipe->bufs + lastbuf;
478
		const struct pipe_buf_operations *ops = buf->ops;
L
Linus Torvalds 已提交
479
		int offset = buf->offset + buf->len;
480

L
Linus Torvalds 已提交
481
		if (ops->can_merge && offset + chars <= PAGE_SIZE) {
482
			int error, atomic = 1;
483 484
			void *addr;

485
			error = ops->confirm(pipe, buf);
486
			if (error)
487
				goto out;
488

489 490 491
			iov_fault_in_pages_read(iov, chars);
redo1:
			addr = ops->map(pipe, buf, atomic);
492
			error = pipe_iov_copy_from_user(offset + addr, iov,
493 494
							chars, atomic);
			ops->unmap(pipe, buf, addr);
L
Linus Torvalds 已提交
495 496
			ret = error;
			do_wakeup = 1;
497 498 499 500 501
			if (error) {
				if (atomic) {
					atomic = 0;
					goto redo1;
				}
L
Linus Torvalds 已提交
502
				goto out;
503
			}
L
Linus Torvalds 已提交
504 505 506 507 508 509 510 511 512 513
			buf->len += chars;
			total_len -= chars;
			ret = chars;
			if (!total_len)
				goto out;
		}
	}

	for (;;) {
		int bufs;
514

515
		if (!pipe->readers) {
L
Linus Torvalds 已提交
516
			send_sig(SIGPIPE, current, 0);
517 518
			if (!ret)
				ret = -EPIPE;
L
Linus Torvalds 已提交
519 520
			break;
		}
521
		bufs = pipe->nrbufs;
522 523
		if (bufs < pipe->buffers) {
			int newbuf = (pipe->curbuf + bufs) & (pipe->buffers-1);
524 525
			struct pipe_buffer *buf = pipe->bufs + newbuf;
			struct page *page = pipe->tmp_page;
526 527
			char *src;
			int error, atomic = 1;
L
Linus Torvalds 已提交
528 529 530 531 532 533 534

			if (!page) {
				page = alloc_page(GFP_HIGHUSER);
				if (unlikely(!page)) {
					ret = ret ? : -ENOMEM;
					break;
				}
535
				pipe->tmp_page = page;
L
Linus Torvalds 已提交
536
			}
537
			/* Always wake up, even if the copy fails. Otherwise
L
Linus Torvalds 已提交
538 539 540 541 542 543 544 545 546
			 * we lock up (O_NONBLOCK-)readers that sleep due to
			 * syscall merging.
			 * FIXME! Is this really true?
			 */
			do_wakeup = 1;
			chars = PAGE_SIZE;
			if (chars > total_len)
				chars = total_len;

547 548 549 550 551 552 553 554 555 556 557 558 559 560
			iov_fault_in_pages_read(iov, chars);
redo2:
			if (atomic)
				src = kmap_atomic(page, KM_USER0);
			else
				src = kmap(page);

			error = pipe_iov_copy_from_user(src, iov, chars,
							atomic);
			if (atomic)
				kunmap_atomic(src, KM_USER0);
			else
				kunmap(page);

L
Linus Torvalds 已提交
561
			if (unlikely(error)) {
562 563 564 565
				if (atomic) {
					atomic = 0;
					goto redo2;
				}
566
				if (!ret)
567
					ret = error;
L
Linus Torvalds 已提交
568 569 570 571 572 573 574 575 576
				break;
			}
			ret += chars;

			/* Insert it into the buffer array */
			buf->page = page;
			buf->ops = &anon_pipe_buf_ops;
			buf->offset = 0;
			buf->len = chars;
577 578
			pipe->nrbufs = ++bufs;
			pipe->tmp_page = NULL;
L
Linus Torvalds 已提交
579 580 581 582 583

			total_len -= chars;
			if (!total_len)
				break;
		}
584
		if (bufs < pipe->buffers)
L
Linus Torvalds 已提交
585 586
			continue;
		if (filp->f_flags & O_NONBLOCK) {
587 588
			if (!ret)
				ret = -EAGAIN;
L
Linus Torvalds 已提交
589 590 591
			break;
		}
		if (signal_pending(current)) {
592 593
			if (!ret)
				ret = -ERESTARTSYS;
L
Linus Torvalds 已提交
594 595 596
			break;
		}
		if (do_wakeup) {
597 598
			wake_up_interruptible_sync(&pipe->wait);
			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
L
Linus Torvalds 已提交
599 600
			do_wakeup = 0;
		}
601 602 603
		pipe->waiting_writers++;
		pipe_wait(pipe);
		pipe->waiting_writers--;
L
Linus Torvalds 已提交
604 605
	}
out:
606
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
607
	if (do_wakeup) {
I
Ingo Molnar 已提交
608
		wake_up_interruptible_sync(&pipe->wait);
609
		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
L
Linus Torvalds 已提交
610 611
	}
	if (ret > 0)
612
		file_update_time(filp);
L
Linus Torvalds 已提交
613 614 615 616 617 618 619 620 621 622
	return ret;
}

static ssize_t
bad_pipe_r(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
{
	return -EBADF;
}

static ssize_t
623 624
bad_pipe_w(struct file *filp, const char __user *buf, size_t count,
	   loff_t *ppos)
L
Linus Torvalds 已提交
625 626 627 628
{
	return -EBADF;
}

629
static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
630
{
631
	struct inode *inode = filp->f_path.dentry->d_inode;
632
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
633 634 635 636
	int count, buf, nrbufs;

	switch (cmd) {
		case FIONREAD:
637
			mutex_lock(&inode->i_mutex);
638
			pipe = inode->i_pipe;
L
Linus Torvalds 已提交
639
			count = 0;
640 641
			buf = pipe->curbuf;
			nrbufs = pipe->nrbufs;
L
Linus Torvalds 已提交
642
			while (--nrbufs >= 0) {
643
				count += pipe->bufs[buf].len;
644
				buf = (buf+1) & (pipe->buffers - 1);
L
Linus Torvalds 已提交
645
			}
646
			mutex_unlock(&inode->i_mutex);
647

L
Linus Torvalds 已提交
648 649 650 651 652 653 654 655 656 657 658
			return put_user(count, (int __user *)arg);
		default:
			return -EINVAL;
	}
}

/* No kernel lock held - fine */
static unsigned int
pipe_poll(struct file *filp, poll_table *wait)
{
	unsigned int mask;
659
	struct inode *inode = filp->f_path.dentry->d_inode;
660
	struct pipe_inode_info *pipe = inode->i_pipe;
L
Linus Torvalds 已提交
661 662
	int nrbufs;

663
	poll_wait(filp, &pipe->wait, wait);
L
Linus Torvalds 已提交
664 665

	/* Reading only -- no need for acquiring the semaphore.  */
666
	nrbufs = pipe->nrbufs;
L
Linus Torvalds 已提交
667 668 669
	mask = 0;
	if (filp->f_mode & FMODE_READ) {
		mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
670
		if (!pipe->writers && filp->f_version != pipe->w_counter)
L
Linus Torvalds 已提交
671 672 673 674
			mask |= POLLHUP;
	}

	if (filp->f_mode & FMODE_WRITE) {
675
		mask |= (nrbufs < pipe->buffers) ? POLLOUT | POLLWRNORM : 0;
676 677 678 679
		/*
		 * Most Unices do not set POLLERR for FIFOs but on Linux they
		 * behave exactly like pipes for poll().
		 */
680
		if (!pipe->readers)
L
Linus Torvalds 已提交
681 682 683 684 685 686 687 688 689
			mask |= POLLERR;
	}

	return mask;
}

static int
pipe_release(struct inode *inode, int decr, int decw)
{
690 691
	struct pipe_inode_info *pipe;

692
	mutex_lock(&inode->i_mutex);
693 694 695
	pipe = inode->i_pipe;
	pipe->readers -= decr;
	pipe->writers -= decw;
696

697
	if (!pipe->readers && !pipe->writers) {
L
Linus Torvalds 已提交
698 699
		free_pipe_info(inode);
	} else {
I
Ingo Molnar 已提交
700
		wake_up_interruptible_sync(&pipe->wait);
701 702
		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
L
Linus Torvalds 已提交
703
	}
704
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
705 706 707 708 709 710 711

	return 0;
}

static int
pipe_read_fasync(int fd, struct file *filp, int on)
{
712
	struct inode *inode = filp->f_path.dentry->d_inode;
L
Linus Torvalds 已提交
713 714
	int retval;

715 716 717
	mutex_lock(&inode->i_mutex);
	retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_readers);
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
718

719
	return retval;
L
Linus Torvalds 已提交
720 721 722 723 724 725
}


static int
pipe_write_fasync(int fd, struct file *filp, int on)
{
726
	struct inode *inode = filp->f_path.dentry->d_inode;
L
Linus Torvalds 已提交
727 728
	int retval;

729 730 731
	mutex_lock(&inode->i_mutex);
	retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_writers);
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
732

733
	return retval;
L
Linus Torvalds 已提交
734 735 736 737 738 739
}


static int
pipe_rdwr_fasync(int fd, struct file *filp, int on)
{
740
	struct inode *inode = filp->f_path.dentry->d_inode;
741
	struct pipe_inode_info *pipe = inode->i_pipe;
L
Linus Torvalds 已提交
742 743
	int retval;

744
	mutex_lock(&inode->i_mutex);
745
	retval = fasync_helper(fd, filp, on, &pipe->fasync_readers);
746
	if (retval >= 0) {
747
		retval = fasync_helper(fd, filp, on, &pipe->fasync_writers);
748 749 750
		if (retval < 0) /* this can happen only if on == T */
			fasync_helper(-1, filp, 0, &pipe->fasync_readers);
	}
751
	mutex_unlock(&inode->i_mutex);
752
	return retval;
L
Linus Torvalds 已提交
753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
}


static int
pipe_read_release(struct inode *inode, struct file *filp)
{
	return pipe_release(inode, 1, 0);
}

static int
pipe_write_release(struct inode *inode, struct file *filp)
{
	return pipe_release(inode, 0, 1);
}

static int
pipe_rdwr_release(struct inode *inode, struct file *filp)
{
	int decr, decw;

	decr = (filp->f_mode & FMODE_READ) != 0;
	decw = (filp->f_mode & FMODE_WRITE) != 0;
	return pipe_release(inode, decr, decw);
}

static int
pipe_read_open(struct inode *inode, struct file *filp)
{
E
Earl Chew 已提交
781 782
	int ret = -ENOENT;

783
	mutex_lock(&inode->i_mutex);
E
Earl Chew 已提交
784 785 786 787 788 789

	if (inode->i_pipe) {
		ret = 0;
		inode->i_pipe->readers++;
	}

790
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
791

E
Earl Chew 已提交
792
	return ret;
L
Linus Torvalds 已提交
793 794 795 796 797
}

static int
pipe_write_open(struct inode *inode, struct file *filp)
{
E
Earl Chew 已提交
798 799
	int ret = -ENOENT;

800
	mutex_lock(&inode->i_mutex);
E
Earl Chew 已提交
801 802 803 804 805 806

	if (inode->i_pipe) {
		ret = 0;
		inode->i_pipe->writers++;
	}

807
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
808

E
Earl Chew 已提交
809
	return ret;
L
Linus Torvalds 已提交
810 811 812 813 814
}

static int
pipe_rdwr_open(struct inode *inode, struct file *filp)
{
E
Earl Chew 已提交
815 816
	int ret = -ENOENT;

817
	mutex_lock(&inode->i_mutex);
E
Earl Chew 已提交
818 819 820 821 822 823 824 825 826

	if (inode->i_pipe) {
		ret = 0;
		if (filp->f_mode & FMODE_READ)
			inode->i_pipe->readers++;
		if (filp->f_mode & FMODE_WRITE)
			inode->i_pipe->writers++;
	}

827
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
828

E
Earl Chew 已提交
829
	return ret;
L
Linus Torvalds 已提交
830 831 832 833 834
}

/*
 * The file_operations structs are not static because they
 * are also used in linux/fs/fifo.c to do operations on FIFOs.
835 836
 *
 * Pipes reuse fifos' file_operations structs.
L
Linus Torvalds 已提交
837
 */
838
const struct file_operations read_pipefifo_fops = {
L
Linus Torvalds 已提交
839
	.llseek		= no_llseek,
840 841
	.read		= do_sync_read,
	.aio_read	= pipe_read,
L
Linus Torvalds 已提交
842 843
	.write		= bad_pipe_w,
	.poll		= pipe_poll,
844
	.unlocked_ioctl	= pipe_ioctl,
L
Linus Torvalds 已提交
845 846 847 848 849
	.open		= pipe_read_open,
	.release	= pipe_read_release,
	.fasync		= pipe_read_fasync,
};

850
const struct file_operations write_pipefifo_fops = {
L
Linus Torvalds 已提交
851 852
	.llseek		= no_llseek,
	.read		= bad_pipe_r,
853 854
	.write		= do_sync_write,
	.aio_write	= pipe_write,
L
Linus Torvalds 已提交
855
	.poll		= pipe_poll,
856
	.unlocked_ioctl	= pipe_ioctl,
L
Linus Torvalds 已提交
857 858 859 860 861
	.open		= pipe_write_open,
	.release	= pipe_write_release,
	.fasync		= pipe_write_fasync,
};

862
const struct file_operations rdwr_pipefifo_fops = {
L
Linus Torvalds 已提交
863
	.llseek		= no_llseek,
864 865 866 867
	.read		= do_sync_read,
	.aio_read	= pipe_read,
	.write		= do_sync_write,
	.aio_write	= pipe_write,
L
Linus Torvalds 已提交
868
	.poll		= pipe_poll,
869
	.unlocked_ioctl	= pipe_ioctl,
L
Linus Torvalds 已提交
870 871 872 873 874
	.open		= pipe_rdwr_open,
	.release	= pipe_rdwr_release,
	.fasync		= pipe_rdwr_fasync,
};

875 876
struct pipe_inode_info * alloc_pipe_info(struct inode *inode)
{
877
	struct pipe_inode_info *pipe;
878

879 880
	pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL);
	if (pipe) {
881 882 883 884 885 886 887 888 889
		pipe->bufs = kzalloc(sizeof(struct pipe_buffer) * PIPE_DEF_BUFFERS, GFP_KERNEL);
		if (pipe->bufs) {
			init_waitqueue_head(&pipe->wait);
			pipe->r_counter = pipe->w_counter = 1;
			pipe->inode = inode;
			pipe->buffers = PIPE_DEF_BUFFERS;
			return pipe;
		}
		kfree(pipe);
890 891
	}

892
	return NULL;
893 894
}

895
void __free_pipe_info(struct pipe_inode_info *pipe)
L
Linus Torvalds 已提交
896 897 898
{
	int i;

899
	for (i = 0; i < pipe->buffers; i++) {
900
		struct pipe_buffer *buf = pipe->bufs + i;
L
Linus Torvalds 已提交
901
		if (buf->ops)
902
			buf->ops->release(pipe, buf);
L
Linus Torvalds 已提交
903
	}
904 905
	if (pipe->tmp_page)
		__free_page(pipe->tmp_page);
906
	kfree(pipe->bufs);
907
	kfree(pipe);
L
Linus Torvalds 已提交
908 909
}

910 911 912 913 914 915
void free_pipe_info(struct inode *inode)
{
	__free_pipe_info(inode->i_pipe);
	inode->i_pipe = NULL;
}

916
static struct vfsmount *pipe_mnt __read_mostly;
917

918 919 920 921 922 923 924 925 926
/*
 * pipefs_dname() is called from d_path().
 */
static char *pipefs_dname(struct dentry *dentry, char *buffer, int buflen)
{
	return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]",
				dentry->d_inode->i_ino);
}

A
Al Viro 已提交
927
static const struct dentry_operations pipefs_dentry_operations = {
928
	.d_dname	= pipefs_dname,
L
Linus Torvalds 已提交
929 930 931 932 933
};

static struct inode * get_pipe_inode(void)
{
	struct inode *inode = new_inode(pipe_mnt->mnt_sb);
934
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
935 936 937 938

	if (!inode)
		goto fail_inode;

939 940
	pipe = alloc_pipe_info(inode);
	if (!pipe)
L
Linus Torvalds 已提交
941
		goto fail_iput;
942
	inode->i_pipe = pipe;
943

944
	pipe->readers = pipe->writers = 1;
945
	inode->i_fop = &rdwr_pipefifo_fops;
L
Linus Torvalds 已提交
946 947 948 949 950 951 952 953 954

	/*
	 * Mark the inode dirty from the very beginning,
	 * that way it will never be moved to the dirty
	 * list because "mark_inode_dirty()" will think
	 * that it already _is_ on the dirty list.
	 */
	inode->i_state = I_DIRTY;
	inode->i_mode = S_IFIFO | S_IRUSR | S_IWUSR;
955 956
	inode->i_uid = current_fsuid();
	inode->i_gid = current_fsgid();
L
Linus Torvalds 已提交
957
	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
958

L
Linus Torvalds 已提交
959 960 961 962
	return inode;

fail_iput:
	iput(inode);
963

L
Linus Torvalds 已提交
964 965 966 967
fail_inode:
	return NULL;
}

968
struct file *create_write_pipe(int flags)
L
Linus Torvalds 已提交
969
{
A
Andi Kleen 已提交
970 971 972
	int err;
	struct inode *inode;
	struct file *f;
973
	struct path path;
974
	struct qstr name = { .name = "" };
L
Linus Torvalds 已提交
975

A
Andi Kleen 已提交
976
	err = -ENFILE;
L
Linus Torvalds 已提交
977 978
	inode = get_pipe_inode();
	if (!inode)
D
Dave Hansen 已提交
979
		goto err;
L
Linus Torvalds 已提交
980

A
Andi Kleen 已提交
981
	err = -ENOMEM;
982 983
	path.dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &name);
	if (!path.dentry)
A
Andi Kleen 已提交
984
		goto err_inode;
985
	path.mnt = mntget(pipe_mnt);
986

987 988
	path.dentry->d_op = &pipefs_dentry_operations;
	d_instantiate(path.dentry, inode);
D
Dave Hansen 已提交
989 990

	err = -ENFILE;
991
	f = alloc_file(&path, FMODE_WRITE, &write_pipefifo_fops);
D
Dave Hansen 已提交
992 993
	if (!f)
		goto err_dentry;
A
Andi Kleen 已提交
994
	f->f_mapping = inode->i_mapping;
995

996
	f->f_flags = O_WRONLY | (flags & O_NONBLOCK);
A
Andi Kleen 已提交
997 998 999
	f->f_version = 0;

	return f;
L
Linus Torvalds 已提交
1000

D
Dave Hansen 已提交
1001
 err_dentry:
1002
	free_pipe_info(inode);
1003
	path_put(&path);
1004 1005
	return ERR_PTR(err);

A
Andi Kleen 已提交
1006
 err_inode:
L
Linus Torvalds 已提交
1007 1008
	free_pipe_info(inode);
	iput(inode);
D
Dave Hansen 已提交
1009
 err:
A
Andi Kleen 已提交
1010 1011 1012 1013 1014
	return ERR_PTR(err);
}

void free_write_pipe(struct file *f)
{
1015
	free_pipe_info(f->f_dentry->d_inode);
1016
	path_put(&f->f_path);
A
Andi Kleen 已提交
1017 1018 1019
	put_filp(f);
}

1020
struct file *create_read_pipe(struct file *wrf, int flags)
A
Andi Kleen 已提交
1021
{
1022 1023 1024
	/* Grab pipe from the writer */
	struct file *f = alloc_file(&wrf->f_path, FMODE_READ,
				    &read_pipefifo_fops);
A
Andi Kleen 已提交
1025 1026 1027
	if (!f)
		return ERR_PTR(-ENFILE);

1028
	path_get(&wrf->f_path);
1029
	f->f_flags = O_RDONLY | (flags & O_NONBLOCK);
A
Andi Kleen 已提交
1030 1031 1032 1033

	return f;
}

U
Ulrich Drepper 已提交
1034
int do_pipe_flags(int *fd, int flags)
A
Andi Kleen 已提交
1035 1036 1037 1038 1039
{
	struct file *fw, *fr;
	int error;
	int fdw, fdr;

1040
	if (flags & ~(O_CLOEXEC | O_NONBLOCK))
U
Ulrich Drepper 已提交
1041 1042
		return -EINVAL;

1043
	fw = create_write_pipe(flags);
A
Andi Kleen 已提交
1044 1045
	if (IS_ERR(fw))
		return PTR_ERR(fw);
1046
	fr = create_read_pipe(fw, flags);
A
Andi Kleen 已提交
1047 1048 1049 1050
	error = PTR_ERR(fr);
	if (IS_ERR(fr))
		goto err_write_pipe;

U
Ulrich Drepper 已提交
1051
	error = get_unused_fd_flags(flags);
A
Andi Kleen 已提交
1052 1053 1054 1055
	if (error < 0)
		goto err_read_pipe;
	fdr = error;

U
Ulrich Drepper 已提交
1056
	error = get_unused_fd_flags(flags);
A
Andi Kleen 已提交
1057 1058 1059 1060
	if (error < 0)
		goto err_fdr;
	fdw = error;

A
Al Viro 已提交
1061
	audit_fd_pair(fdr, fdw);
A
Andi Kleen 已提交
1062 1063 1064 1065 1066 1067 1068 1069 1070 1071
	fd_install(fdr, fr);
	fd_install(fdw, fw);
	fd[0] = fdr;
	fd[1] = fdw;

	return 0;

 err_fdr:
	put_unused_fd(fdr);
 err_read_pipe:
1072
	path_put(&fr->f_path);
A
Andi Kleen 已提交
1073 1074 1075 1076
	put_filp(fr);
 err_write_pipe:
	free_write_pipe(fw);
	return error;
L
Linus Torvalds 已提交
1077 1078
}

1079 1080 1081 1082
/*
 * sys_pipe() is the normal C calling standard for creating
 * a pipe. It's not the way Unix traditionally does this, though.
 */
1083
SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags)
1084 1085 1086 1087
{
	int fd[2];
	int error;

U
Ulrich Drepper 已提交
1088
	error = do_pipe_flags(fd, flags);
1089
	if (!error) {
1090 1091 1092
		if (copy_to_user(fildes, fd, sizeof(fd))) {
			sys_close(fd[0]);
			sys_close(fd[1]);
1093
			error = -EFAULT;
1094
		}
1095 1096 1097 1098
	}
	return error;
}

1099
SYSCALL_DEFINE1(pipe, int __user *, fildes)
U
Ulrich Drepper 已提交
1100 1101 1102 1103
{
	return sys_pipe2(fildes, 0);
}

1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178
/*
 * Allocate a new array of pipe buffers and copy the info over. Returns the
 * pipe size if successful, or return -ERROR on error.
 */
static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long arg)
{
	struct pipe_buffer *bufs;

	/*
	 * Must be a power-of-2 currently
	 */
	if (!is_power_of_2(arg))
		return -EINVAL;

	/*
	 * We can shrink the pipe, if arg >= pipe->nrbufs. Since we don't
	 * expect a lot of shrink+grow operations, just free and allocate
	 * again like we would do for growing. If the pipe currently
	 * contains more buffers than arg, then return busy.
	 */
	if (arg < pipe->nrbufs)
		return -EBUSY;

	bufs = kcalloc(arg, sizeof(struct pipe_buffer), GFP_KERNEL);
	if (unlikely(!bufs))
		return -ENOMEM;

	/*
	 * The pipe array wraps around, so just start the new one at zero
	 * and adjust the indexes.
	 */
	if (pipe->nrbufs) {
		const unsigned int tail = pipe->nrbufs & (pipe->buffers - 1);
		const unsigned int head = pipe->nrbufs - tail;

		if (head)
			memcpy(bufs, pipe->bufs + pipe->curbuf, head * sizeof(struct pipe_buffer));
		if (tail)
			memcpy(bufs + head, pipe->bufs + pipe->curbuf, tail * sizeof(struct pipe_buffer));
	}

	pipe->curbuf = 0;
	kfree(pipe->bufs);
	pipe->bufs = bufs;
	pipe->buffers = arg;
	return arg;
}

long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
{
	struct pipe_inode_info *pipe;
	long ret;

	pipe = file->f_path.dentry->d_inode->i_pipe;
	if (!pipe)
		return -EBADF;

	mutex_lock(&pipe->inode->i_mutex);

	switch (cmd) {
	case F_SETPIPE_SZ:
		ret = pipe_set_size(pipe, arg);
		break;
	case F_GETPIPE_SZ:
		ret = pipe->buffers;
		break;
	default:
		ret = -EINVAL;
		break;
	}

	mutex_unlock(&pipe->inode->i_mutex);
	return ret;
}

L
Linus Torvalds 已提交
1179 1180 1181 1182 1183 1184
/*
 * pipefs should _never_ be mounted by userland - too much of security hassle,
 * no real gain from having the whole whorehouse mounted. So we don't need
 * any operations on the root directory. However, we need a non-trivial
 * d_name - pipe: will go nicely and kill the special-casing in procfs.
 */
1185 1186 1187
static int pipefs_get_sb(struct file_system_type *fs_type,
			 int flags, const char *dev_name, void *data,
			 struct vfsmount *mnt)
L
Linus Torvalds 已提交
1188
{
1189
	return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC, mnt);
L
Linus Torvalds 已提交
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
}

static struct file_system_type pipe_fs_type = {
	.name		= "pipefs",
	.get_sb		= pipefs_get_sb,
	.kill_sb	= kill_anon_super,
};

static int __init init_pipe_fs(void)
{
	int err = register_filesystem(&pipe_fs_type);
1201

L
Linus Torvalds 已提交
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219
	if (!err) {
		pipe_mnt = kern_mount(&pipe_fs_type);
		if (IS_ERR(pipe_mnt)) {
			err = PTR_ERR(pipe_mnt);
			unregister_filesystem(&pipe_fs_type);
		}
	}
	return err;
}

static void __exit exit_pipe_fs(void)
{
	unregister_filesystem(&pipe_fs_type);
	mntput(pipe_mnt);
}

fs_initcall(init_pipe_fs);
module_exit(exit_pipe_fs);