pipe.c 27.2 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>
22
#include <linux/fcntl.h>
L
Linus Torvalds 已提交
23 24 25 26

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

27 28 29 30 31 32
/*
 * The max size that a non-root user is allowed to grow the pipe. Can
 * be set by root in /proc/sys/fs/pipe-max-pages
 */
unsigned int pipe_max_pages = PIPE_DEF_BUFFERS * 16;

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

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
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 {
79 80
		pipe_lock_nested(pipe2, I_MUTEX_PARENT);
		pipe_lock_nested(pipe1, I_MUTEX_CHILD);
81 82 83
	}
}

L
Linus Torvalds 已提交
84
/* Drop the inode semaphore and wait for a pipe event, atomically */
85
void pipe_wait(struct pipe_inode_info *pipe)
L
Linus Torvalds 已提交
86 87 88
{
	DEFINE_WAIT(wait);

I
Ingo Molnar 已提交
89 90 91 92
	/*
	 * Pipes are system-local resources, so sleeping on them
	 * is considered a noninteractive wait:
	 */
93
	prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE);
94
	pipe_unlock(pipe);
L
Linus Torvalds 已提交
95
	schedule();
96
	finish_wait(&pipe->wait, &wait);
97
	pipe_lock(pipe);
L
Linus Torvalds 已提交
98 99
}

100
static int
101 102
pipe_iov_copy_from_user(void *to, struct iovec *iov, unsigned long len,
			int atomic)
L
Linus Torvalds 已提交
103 104 105 106 107 108 109 110
{
	unsigned long copy;

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

111 112 113 114 115 116 117
		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 已提交
118 119 120 121 122 123 124 125
		to += copy;
		len -= copy;
		iov->iov_base += copy;
		iov->iov_len -= copy;
	}
	return 0;
}

126
static int
127 128
pipe_iov_copy_to_user(struct iovec *iov, const void *from, unsigned long len,
		      int atomic)
L
Linus Torvalds 已提交
129 130 131 132 133 134 135 136
{
	unsigned long copy;

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

137 138 139 140 141 142 143
		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 已提交
144 145 146 147 148 149 150 151
		from += copy;
		len -= copy;
		iov->iov_base += copy;
		iov->iov_len -= copy;
	}
	return 0;
}

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 186 187 188 189 190 191 192
/*
 * 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++;
	}
}

193 194
static void anon_pipe_buf_release(struct pipe_inode_info *pipe,
				  struct pipe_buffer *buf)
L
Linus Torvalds 已提交
195 196 197
{
	struct page *page = buf->page;

198 199 200
	/*
	 * 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
201
	 * allocation cache. (Otherwise just release our reference to it)
202
	 */
203
	if (page_count(page) == 1 && !pipe->tmp_page)
204
		pipe->tmp_page = page;
205 206
	else
		page_cache_release(page);
L
Linus Torvalds 已提交
207 208
}

209 210 211 212 213 214 215 216
/**
 * 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
217
 *	pipe_buffer passed in @buf. If @atomic is set, an atomic map is provided
218 219 220 221 222
 *	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.
 */
223
void *generic_pipe_buf_map(struct pipe_inode_info *pipe,
224
			   struct pipe_buffer *buf, int atomic)
L
Linus Torvalds 已提交
225
{
226 227 228 229 230
	if (atomic) {
		buf->flags |= PIPE_BUF_FLAG_ATOMIC;
		return kmap_atomic(buf->page, KM_USER0);
	}

L
Linus Torvalds 已提交
231 232
	return kmap(buf->page);
}
233
EXPORT_SYMBOL(generic_pipe_buf_map);
L
Linus Torvalds 已提交
234

235 236 237 238 239 240 241 242 243
/**
 * 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.
 */
244
void generic_pipe_buf_unmap(struct pipe_inode_info *pipe,
245
			    struct pipe_buffer *buf, void *map_data)
L
Linus Torvalds 已提交
246
{
247 248 249 250 251
	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 已提交
252
}
253
EXPORT_SYMBOL(generic_pipe_buf_unmap);
L
Linus Torvalds 已提交
254

255
/**
256
 * generic_pipe_buf_steal - attempt to take ownership of a &pipe_buffer
257 258 259 260
 * @pipe:	the pipe that the buffer belongs to
 * @buf:	the buffer to attempt to steal
 *
 * Description:
261
 *	This function attempts to steal the &struct page attached to
262 263
 *	@buf. If successful, this function returns 0 and returns with
 *	the page locked. The caller may then reuse the page for whatever
264
 *	he wishes; the typical use is insertion into a different file
265 266
 *	page cache.
 */
267 268
int generic_pipe_buf_steal(struct pipe_inode_info *pipe,
			   struct pipe_buffer *buf)
269
{
270 271
	struct page *page = buf->page;

272 273 274 275 276
	/*
	 * 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.
	 */
277 278 279 280 281 282
	if (page_count(page) == 1) {
		lock_page(page);
		return 0;
	}

	return 1;
283
}
284
EXPORT_SYMBOL(generic_pipe_buf_steal);
285

286
/**
287
 * generic_pipe_buf_get - get a reference to a &struct pipe_buffer
288 289 290 291 292 293 294 295 296
 * @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)
297 298 299
{
	page_cache_get(buf->page);
}
300
EXPORT_SYMBOL(generic_pipe_buf_get);
301

302 303
/**
 * generic_pipe_buf_confirm - verify contents of the pipe buffer
R
Randy Dunlap 已提交
304
 * @info:	the pipe that the buffer belongs to
305 306 307 308 309 310
 * @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.
 */
311 312
int generic_pipe_buf_confirm(struct pipe_inode_info *info,
			     struct pipe_buffer *buf)
313 314 315
{
	return 0;
}
316
EXPORT_SYMBOL(generic_pipe_buf_confirm);
317

318 319 320 321 322 323 324 325 326 327 328 329 330
/**
 * 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);
}
331
EXPORT_SYMBOL(generic_pipe_buf_release);
332

333
static const struct pipe_buf_operations anon_pipe_buf_ops = {
L
Linus Torvalds 已提交
334
	.can_merge = 1,
335 336
	.map = generic_pipe_buf_map,
	.unmap = generic_pipe_buf_unmap,
337
	.confirm = generic_pipe_buf_confirm,
L
Linus Torvalds 已提交
338
	.release = anon_pipe_buf_release,
339
	.steal = generic_pipe_buf_steal,
340
	.get = generic_pipe_buf_get,
L
Linus Torvalds 已提交
341 342 343
};

static ssize_t
344 345
pipe_read(struct kiocb *iocb, const struct iovec *_iov,
	   unsigned long nr_segs, loff_t pos)
L
Linus Torvalds 已提交
346
{
347
	struct file *filp = iocb->ki_filp;
348
	struct inode *inode = filp->f_path.dentry->d_inode;
349
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
350 351 352 353 354 355 356 357 358 359 360 361
	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;
362
	mutex_lock(&inode->i_mutex);
363
	pipe = inode->i_pipe;
L
Linus Torvalds 已提交
364
	for (;;) {
365
		int bufs = pipe->nrbufs;
L
Linus Torvalds 已提交
366
		if (bufs) {
367 368
			int curbuf = pipe->curbuf;
			struct pipe_buffer *buf = pipe->bufs + curbuf;
369
			const struct pipe_buf_operations *ops = buf->ops;
L
Linus Torvalds 已提交
370 371
			void *addr;
			size_t chars = buf->len;
372
			int error, atomic;
L
Linus Torvalds 已提交
373 374 375 376

			if (chars > total_len)
				chars = total_len;

377
			error = ops->confirm(pipe, buf);
378
			if (error) {
379
				if (!ret)
380
					error = ret;
381 382
				break;
			}
383

384 385 386 387 388
			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 已提交
389
			if (unlikely(error)) {
390 391 392 393 394 395 396
				/*
				 * Just retry with the slow path if we failed.
				 */
				if (atomic) {
					atomic = 0;
					goto redo;
				}
397
				if (!ret)
398
					ret = error;
L
Linus Torvalds 已提交
399 400 401 402 403 404 405
				break;
			}
			ret += chars;
			buf->offset += chars;
			buf->len -= chars;
			if (!buf->len) {
				buf->ops = NULL;
406
				ops->release(pipe, buf);
407
				curbuf = (curbuf + 1) & (pipe->buffers - 1);
408 409
				pipe->curbuf = curbuf;
				pipe->nrbufs = --bufs;
L
Linus Torvalds 已提交
410 411 412 413 414 415 416 417
				do_wakeup = 1;
			}
			total_len -= chars;
			if (!total_len)
				break;	/* common path: read succeeded */
		}
		if (bufs)	/* More to do? */
			continue;
418
		if (!pipe->writers)
L
Linus Torvalds 已提交
419
			break;
420
		if (!pipe->waiting_writers) {
L
Linus Torvalds 已提交
421 422 423 424 425 426 427 428 429 430 431 432 433
			/* 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)) {
434 435
			if (!ret)
				ret = -ERESTARTSYS;
L
Linus Torvalds 已提交
436 437 438
			break;
		}
		if (do_wakeup) {
439 440
			wake_up_interruptible_sync(&pipe->wait);
 			kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
L
Linus Torvalds 已提交
441
		}
442
		pipe_wait(pipe);
L
Linus Torvalds 已提交
443
	}
444
	mutex_unlock(&inode->i_mutex);
445 446

	/* Signal writers asynchronously that there is more room. */
L
Linus Torvalds 已提交
447
	if (do_wakeup) {
I
Ingo Molnar 已提交
448
		wake_up_interruptible_sync(&pipe->wait);
449
		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
L
Linus Torvalds 已提交
450 451 452 453 454 455 456
	}
	if (ret > 0)
		file_accessed(filp);
	return ret;
}

static ssize_t
457 458
pipe_write(struct kiocb *iocb, const struct iovec *_iov,
	    unsigned long nr_segs, loff_t ppos)
L
Linus Torvalds 已提交
459
{
460
	struct file *filp = iocb->ki_filp;
461
	struct inode *inode = filp->f_path.dentry->d_inode;
462
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
463 464 465 466 467 468 469 470 471 472 473 474 475
	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;
476
	mutex_lock(&inode->i_mutex);
477
	pipe = inode->i_pipe;
L
Linus Torvalds 已提交
478

479
	if (!pipe->readers) {
L
Linus Torvalds 已提交
480 481 482 483 484 485 486
		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 */
487
	if (pipe->nrbufs && chars != 0) {
488
		int lastbuf = (pipe->curbuf + pipe->nrbufs - 1) &
489
							(pipe->buffers - 1);
490
		struct pipe_buffer *buf = pipe->bufs + lastbuf;
491
		const struct pipe_buf_operations *ops = buf->ops;
L
Linus Torvalds 已提交
492
		int offset = buf->offset + buf->len;
493

L
Linus Torvalds 已提交
494
		if (ops->can_merge && offset + chars <= PAGE_SIZE) {
495
			int error, atomic = 1;
496 497
			void *addr;

498
			error = ops->confirm(pipe, buf);
499
			if (error)
500
				goto out;
501

502 503 504
			iov_fault_in_pages_read(iov, chars);
redo1:
			addr = ops->map(pipe, buf, atomic);
505
			error = pipe_iov_copy_from_user(offset + addr, iov,
506 507
							chars, atomic);
			ops->unmap(pipe, buf, addr);
L
Linus Torvalds 已提交
508 509
			ret = error;
			do_wakeup = 1;
510 511 512 513 514
			if (error) {
				if (atomic) {
					atomic = 0;
					goto redo1;
				}
L
Linus Torvalds 已提交
515
				goto out;
516
			}
L
Linus Torvalds 已提交
517 518 519 520 521 522 523 524 525 526
			buf->len += chars;
			total_len -= chars;
			ret = chars;
			if (!total_len)
				goto out;
		}
	}

	for (;;) {
		int bufs;
527

528
		if (!pipe->readers) {
L
Linus Torvalds 已提交
529
			send_sig(SIGPIPE, current, 0);
530 531
			if (!ret)
				ret = -EPIPE;
L
Linus Torvalds 已提交
532 533
			break;
		}
534
		bufs = pipe->nrbufs;
535 536
		if (bufs < pipe->buffers) {
			int newbuf = (pipe->curbuf + bufs) & (pipe->buffers-1);
537 538
			struct pipe_buffer *buf = pipe->bufs + newbuf;
			struct page *page = pipe->tmp_page;
539 540
			char *src;
			int error, atomic = 1;
L
Linus Torvalds 已提交
541 542 543 544 545 546 547

			if (!page) {
				page = alloc_page(GFP_HIGHUSER);
				if (unlikely(!page)) {
					ret = ret ? : -ENOMEM;
					break;
				}
548
				pipe->tmp_page = page;
L
Linus Torvalds 已提交
549
			}
550
			/* Always wake up, even if the copy fails. Otherwise
L
Linus Torvalds 已提交
551 552 553 554 555 556 557 558 559
			 * 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;

560 561 562 563 564 565 566 567 568 569 570 571 572 573
			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 已提交
574
			if (unlikely(error)) {
575 576 577 578
				if (atomic) {
					atomic = 0;
					goto redo2;
				}
579
				if (!ret)
580
					ret = error;
L
Linus Torvalds 已提交
581 582 583 584 585 586 587 588 589
				break;
			}
			ret += chars;

			/* Insert it into the buffer array */
			buf->page = page;
			buf->ops = &anon_pipe_buf_ops;
			buf->offset = 0;
			buf->len = chars;
590 591
			pipe->nrbufs = ++bufs;
			pipe->tmp_page = NULL;
L
Linus Torvalds 已提交
592 593 594 595 596

			total_len -= chars;
			if (!total_len)
				break;
		}
597
		if (bufs < pipe->buffers)
L
Linus Torvalds 已提交
598 599
			continue;
		if (filp->f_flags & O_NONBLOCK) {
600 601
			if (!ret)
				ret = -EAGAIN;
L
Linus Torvalds 已提交
602 603 604
			break;
		}
		if (signal_pending(current)) {
605 606
			if (!ret)
				ret = -ERESTARTSYS;
L
Linus Torvalds 已提交
607 608 609
			break;
		}
		if (do_wakeup) {
610 611
			wake_up_interruptible_sync(&pipe->wait);
			kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
L
Linus Torvalds 已提交
612 613
			do_wakeup = 0;
		}
614 615 616
		pipe->waiting_writers++;
		pipe_wait(pipe);
		pipe->waiting_writers--;
L
Linus Torvalds 已提交
617 618
	}
out:
619
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
620
	if (do_wakeup) {
I
Ingo Molnar 已提交
621
		wake_up_interruptible_sync(&pipe->wait);
622
		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
L
Linus Torvalds 已提交
623 624
	}
	if (ret > 0)
625
		file_update_time(filp);
L
Linus Torvalds 已提交
626 627 628 629 630 631 632 633 634 635
	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
636 637
bad_pipe_w(struct file *filp, const char __user *buf, size_t count,
	   loff_t *ppos)
L
Linus Torvalds 已提交
638 639 640 641
{
	return -EBADF;
}

642
static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
643
{
644
	struct inode *inode = filp->f_path.dentry->d_inode;
645
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
646 647 648 649
	int count, buf, nrbufs;

	switch (cmd) {
		case FIONREAD:
650
			mutex_lock(&inode->i_mutex);
651
			pipe = inode->i_pipe;
L
Linus Torvalds 已提交
652
			count = 0;
653 654
			buf = pipe->curbuf;
			nrbufs = pipe->nrbufs;
L
Linus Torvalds 已提交
655
			while (--nrbufs >= 0) {
656
				count += pipe->bufs[buf].len;
657
				buf = (buf+1) & (pipe->buffers - 1);
L
Linus Torvalds 已提交
658
			}
659
			mutex_unlock(&inode->i_mutex);
660

L
Linus Torvalds 已提交
661 662 663 664 665 666 667 668 669 670 671
			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;
672
	struct inode *inode = filp->f_path.dentry->d_inode;
673
	struct pipe_inode_info *pipe = inode->i_pipe;
L
Linus Torvalds 已提交
674 675
	int nrbufs;

676
	poll_wait(filp, &pipe->wait, wait);
L
Linus Torvalds 已提交
677 678

	/* Reading only -- no need for acquiring the semaphore.  */
679
	nrbufs = pipe->nrbufs;
L
Linus Torvalds 已提交
680 681 682
	mask = 0;
	if (filp->f_mode & FMODE_READ) {
		mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
683
		if (!pipe->writers && filp->f_version != pipe->w_counter)
L
Linus Torvalds 已提交
684 685 686 687
			mask |= POLLHUP;
	}

	if (filp->f_mode & FMODE_WRITE) {
688
		mask |= (nrbufs < pipe->buffers) ? POLLOUT | POLLWRNORM : 0;
689 690 691 692
		/*
		 * Most Unices do not set POLLERR for FIFOs but on Linux they
		 * behave exactly like pipes for poll().
		 */
693
		if (!pipe->readers)
L
Linus Torvalds 已提交
694 695 696 697 698 699 700 701 702
			mask |= POLLERR;
	}

	return mask;
}

static int
pipe_release(struct inode *inode, int decr, int decw)
{
703 704
	struct pipe_inode_info *pipe;

705
	mutex_lock(&inode->i_mutex);
706 707 708
	pipe = inode->i_pipe;
	pipe->readers -= decr;
	pipe->writers -= decw;
709

710
	if (!pipe->readers && !pipe->writers) {
L
Linus Torvalds 已提交
711 712
		free_pipe_info(inode);
	} else {
I
Ingo Molnar 已提交
713
		wake_up_interruptible_sync(&pipe->wait);
714 715
		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
L
Linus Torvalds 已提交
716
	}
717
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
718 719 720 721 722 723 724

	return 0;
}

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

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

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


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

742 743 744
	mutex_lock(&inode->i_mutex);
	retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_writers);
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
745

746
	return retval;
L
Linus Torvalds 已提交
747 748 749 750 751 752
}


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

757
	mutex_lock(&inode->i_mutex);
758
	retval = fasync_helper(fd, filp, on, &pipe->fasync_readers);
759
	if (retval >= 0) {
760
		retval = fasync_helper(fd, filp, on, &pipe->fasync_writers);
761 762 763
		if (retval < 0) /* this can happen only if on == T */
			fasync_helper(-1, filp, 0, &pipe->fasync_readers);
	}
764
	mutex_unlock(&inode->i_mutex);
765
	return retval;
L
Linus Torvalds 已提交
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
}


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 已提交
794 795
	int ret = -ENOENT;

796
	mutex_lock(&inode->i_mutex);
E
Earl Chew 已提交
797 798 799 800 801 802

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

803
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
804

E
Earl Chew 已提交
805
	return ret;
L
Linus Torvalds 已提交
806 807 808 809 810
}

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

813
	mutex_lock(&inode->i_mutex);
E
Earl Chew 已提交
814 815 816 817 818 819

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

820
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
821

E
Earl Chew 已提交
822
	return ret;
L
Linus Torvalds 已提交
823 824 825 826 827
}

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

830
	mutex_lock(&inode->i_mutex);
E
Earl Chew 已提交
831 832 833 834 835 836 837 838 839

	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++;
	}

840
	mutex_unlock(&inode->i_mutex);
L
Linus Torvalds 已提交
841

E
Earl Chew 已提交
842
	return ret;
L
Linus Torvalds 已提交
843 844 845 846 847
}

/*
 * The file_operations structs are not static because they
 * are also used in linux/fs/fifo.c to do operations on FIFOs.
848 849
 *
 * Pipes reuse fifos' file_operations structs.
L
Linus Torvalds 已提交
850
 */
851
const struct file_operations read_pipefifo_fops = {
L
Linus Torvalds 已提交
852
	.llseek		= no_llseek,
853 854
	.read		= do_sync_read,
	.aio_read	= pipe_read,
L
Linus Torvalds 已提交
855 856
	.write		= bad_pipe_w,
	.poll		= pipe_poll,
857
	.unlocked_ioctl	= pipe_ioctl,
L
Linus Torvalds 已提交
858 859 860 861 862
	.open		= pipe_read_open,
	.release	= pipe_read_release,
	.fasync		= pipe_read_fasync,
};

863
const struct file_operations write_pipefifo_fops = {
L
Linus Torvalds 已提交
864 865
	.llseek		= no_llseek,
	.read		= bad_pipe_r,
866 867
	.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_write_open,
	.release	= pipe_write_release,
	.fasync		= pipe_write_fasync,
};

875
const struct file_operations rdwr_pipefifo_fops = {
L
Linus Torvalds 已提交
876
	.llseek		= no_llseek,
877 878 879 880
	.read		= do_sync_read,
	.aio_read	= pipe_read,
	.write		= do_sync_write,
	.aio_write	= pipe_write,
L
Linus Torvalds 已提交
881
	.poll		= pipe_poll,
882
	.unlocked_ioctl	= pipe_ioctl,
L
Linus Torvalds 已提交
883 884 885 886 887
	.open		= pipe_rdwr_open,
	.release	= pipe_rdwr_release,
	.fasync		= pipe_rdwr_fasync,
};

888 889
struct pipe_inode_info * alloc_pipe_info(struct inode *inode)
{
890
	struct pipe_inode_info *pipe;
891

892 893
	pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL);
	if (pipe) {
894 895 896 897 898 899 900 901 902
		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);
903 904
	}

905
	return NULL;
906 907
}

908
void __free_pipe_info(struct pipe_inode_info *pipe)
L
Linus Torvalds 已提交
909 910 911
{
	int i;

912
	for (i = 0; i < pipe->buffers; i++) {
913
		struct pipe_buffer *buf = pipe->bufs + i;
L
Linus Torvalds 已提交
914
		if (buf->ops)
915
			buf->ops->release(pipe, buf);
L
Linus Torvalds 已提交
916
	}
917 918
	if (pipe->tmp_page)
		__free_page(pipe->tmp_page);
919
	kfree(pipe->bufs);
920
	kfree(pipe);
L
Linus Torvalds 已提交
921 922
}

923 924 925 926 927 928
void free_pipe_info(struct inode *inode)
{
	__free_pipe_info(inode->i_pipe);
	inode->i_pipe = NULL;
}

929
static struct vfsmount *pipe_mnt __read_mostly;
930

931 932 933 934 935 936 937 938 939
/*
 * 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 已提交
940
static const struct dentry_operations pipefs_dentry_operations = {
941
	.d_dname	= pipefs_dname,
L
Linus Torvalds 已提交
942 943 944 945 946
};

static struct inode * get_pipe_inode(void)
{
	struct inode *inode = new_inode(pipe_mnt->mnt_sb);
947
	struct pipe_inode_info *pipe;
L
Linus Torvalds 已提交
948 949 950 951

	if (!inode)
		goto fail_inode;

952 953
	pipe = alloc_pipe_info(inode);
	if (!pipe)
L
Linus Torvalds 已提交
954
		goto fail_iput;
955
	inode->i_pipe = pipe;
956

957
	pipe->readers = pipe->writers = 1;
958
	inode->i_fop = &rdwr_pipefifo_fops;
L
Linus Torvalds 已提交
959 960 961 962 963 964 965 966 967

	/*
	 * 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;
968 969
	inode->i_uid = current_fsuid();
	inode->i_gid = current_fsgid();
L
Linus Torvalds 已提交
970
	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
971

L
Linus Torvalds 已提交
972 973 974 975
	return inode;

fail_iput:
	iput(inode);
976

L
Linus Torvalds 已提交
977 978 979 980
fail_inode:
	return NULL;
}

981
struct file *create_write_pipe(int flags)
L
Linus Torvalds 已提交
982
{
A
Andi Kleen 已提交
983 984 985
	int err;
	struct inode *inode;
	struct file *f;
986
	struct path path;
987
	struct qstr name = { .name = "" };
L
Linus Torvalds 已提交
988

A
Andi Kleen 已提交
989
	err = -ENFILE;
L
Linus Torvalds 已提交
990 991
	inode = get_pipe_inode();
	if (!inode)
D
Dave Hansen 已提交
992
		goto err;
L
Linus Torvalds 已提交
993

A
Andi Kleen 已提交
994
	err = -ENOMEM;
995 996
	path.dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &name);
	if (!path.dentry)
A
Andi Kleen 已提交
997
		goto err_inode;
998
	path.mnt = mntget(pipe_mnt);
999

1000 1001
	path.dentry->d_op = &pipefs_dentry_operations;
	d_instantiate(path.dentry, inode);
D
Dave Hansen 已提交
1002 1003

	err = -ENFILE;
1004
	f = alloc_file(&path, FMODE_WRITE, &write_pipefifo_fops);
D
Dave Hansen 已提交
1005 1006
	if (!f)
		goto err_dentry;
A
Andi Kleen 已提交
1007
	f->f_mapping = inode->i_mapping;
1008

1009
	f->f_flags = O_WRONLY | (flags & O_NONBLOCK);
A
Andi Kleen 已提交
1010 1011 1012
	f->f_version = 0;

	return f;
L
Linus Torvalds 已提交
1013

D
Dave Hansen 已提交
1014
 err_dentry:
1015
	free_pipe_info(inode);
1016
	path_put(&path);
1017 1018
	return ERR_PTR(err);

A
Andi Kleen 已提交
1019
 err_inode:
L
Linus Torvalds 已提交
1020 1021
	free_pipe_info(inode);
	iput(inode);
D
Dave Hansen 已提交
1022
 err:
A
Andi Kleen 已提交
1023 1024 1025 1026 1027
	return ERR_PTR(err);
}

void free_write_pipe(struct file *f)
{
1028
	free_pipe_info(f->f_dentry->d_inode);
1029
	path_put(&f->f_path);
A
Andi Kleen 已提交
1030 1031 1032
	put_filp(f);
}

1033
struct file *create_read_pipe(struct file *wrf, int flags)
A
Andi Kleen 已提交
1034
{
1035 1036 1037
	/* Grab pipe from the writer */
	struct file *f = alloc_file(&wrf->f_path, FMODE_READ,
				    &read_pipefifo_fops);
A
Andi Kleen 已提交
1038 1039 1040
	if (!f)
		return ERR_PTR(-ENFILE);

1041
	path_get(&wrf->f_path);
1042
	f->f_flags = O_RDONLY | (flags & O_NONBLOCK);
A
Andi Kleen 已提交
1043 1044 1045 1046

	return f;
}

U
Ulrich Drepper 已提交
1047
int do_pipe_flags(int *fd, int flags)
A
Andi Kleen 已提交
1048 1049 1050 1051 1052
{
	struct file *fw, *fr;
	int error;
	int fdw, fdr;

1053
	if (flags & ~(O_CLOEXEC | O_NONBLOCK))
U
Ulrich Drepper 已提交
1054 1055
		return -EINVAL;

1056
	fw = create_write_pipe(flags);
A
Andi Kleen 已提交
1057 1058
	if (IS_ERR(fw))
		return PTR_ERR(fw);
1059
	fr = create_read_pipe(fw, flags);
A
Andi Kleen 已提交
1060 1061 1062 1063
	error = PTR_ERR(fr);
	if (IS_ERR(fr))
		goto err_write_pipe;

U
Ulrich Drepper 已提交
1064
	error = get_unused_fd_flags(flags);
A
Andi Kleen 已提交
1065 1066 1067 1068
	if (error < 0)
		goto err_read_pipe;
	fdr = error;

U
Ulrich Drepper 已提交
1069
	error = get_unused_fd_flags(flags);
A
Andi Kleen 已提交
1070 1071 1072 1073
	if (error < 0)
		goto err_fdr;
	fdw = error;

A
Al Viro 已提交
1074
	audit_fd_pair(fdr, fdw);
A
Andi Kleen 已提交
1075 1076 1077 1078 1079 1080 1081 1082 1083 1084
	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:
1085
	path_put(&fr->f_path);
A
Andi Kleen 已提交
1086 1087 1088 1089
	put_filp(fr);
 err_write_pipe:
	free_write_pipe(fw);
	return error;
L
Linus Torvalds 已提交
1090 1091
}

1092 1093 1094 1095
/*
 * sys_pipe() is the normal C calling standard for creating
 * a pipe. It's not the way Unix traditionally does this, though.
 */
1096
SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags)
1097 1098 1099 1100
{
	int fd[2];
	int error;

U
Ulrich Drepper 已提交
1101
	error = do_pipe_flags(fd, flags);
1102
	if (!error) {
1103 1104 1105
		if (copy_to_user(fildes, fd, sizeof(fd))) {
			sys_close(fd[0]);
			sys_close(fd[1]);
1106
			error = -EFAULT;
1107
		}
1108 1109 1110 1111
	}
	return error;
}

1112
SYSCALL_DEFINE1(pipe, int __user *, fildes)
U
Ulrich Drepper 已提交
1113 1114 1115 1116
{
	return sys_pipe2(fildes, 0);
}

1117 1118 1119 1120
/*
 * Allocate a new array of pipe buffers and copy the info over. Returns the
 * pipe size if successful, or return -ERROR on error.
 */
1121
static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long nr_pages)
1122 1123 1124 1125 1126 1127 1128 1129 1130
{
	struct pipe_buffer *bufs;

	/*
	 * 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.
	 */
1131
	if (nr_pages < pipe->nrbufs)
1132 1133
		return -EBUSY;

1134
	bufs = kcalloc(nr_pages, sizeof(struct pipe_buffer), GFP_KERNEL);
1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
	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;
1155 1156
	pipe->buffers = nr_pages;
	return nr_pages * PAGE_SIZE;
1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
}

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) {
1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
	case F_SETPIPE_SZ: {
		unsigned long nr_pages;

		/*
		 * Currently the array must be a power-of-2 size, so adjust
		 * upwards if needed.
		 */
		nr_pages = (arg + PAGE_SIZE - 1) >> PAGE_SHIFT;
		nr_pages = roundup_pow_of_two(nr_pages);

1181
		if (!capable(CAP_SYS_RESOURCE) && nr_pages > pipe_max_pages) {
1182
			ret = -EPERM;
J
Julia Lawall 已提交
1183
			goto out;
1184
		} else if (nr_pages < 1) {
J
Julia Lawall 已提交
1185 1186 1187
			ret = -EINVAL;
			goto out;
		}
1188 1189
		ret = pipe_set_size(pipe, arg);
		break;
1190
		}
1191
	case F_GETPIPE_SZ:
1192
		ret = pipe->buffers * PAGE_SIZE;
1193 1194 1195 1196 1197 1198
		break;
	default:
		ret = -EINVAL;
		break;
	}

J
Julia Lawall 已提交
1199
out:
1200 1201 1202 1203
	mutex_unlock(&pipe->inode->i_mutex);
	return ret;
}

L
Linus Torvalds 已提交
1204 1205 1206 1207 1208 1209
/*
 * 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.
 */
1210 1211 1212
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 已提交
1213
{
1214
	return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC, mnt);
L
Linus Torvalds 已提交
1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225
}

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);
1226

L
Linus Torvalds 已提交
1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244
	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);