--- ./fs/pipe.c.pipe2	2010-01-25 14:52:25.000000000 +0300
+++ ./fs/pipe.c	2010-01-25 20:47:57.000000000 +0300
@@ -610,7 +610,7 @@ fail_inode:
 	return NULL;
 }
 
-int do_pipe(int *fd)
+static int do_pipe_flags(int *fd, int flags)
 {
 	struct qstr this;
 	char name[32];
@@ -620,6 +620,9 @@ int do_pipe(int *fd)
 	int error;
 	int i,j;
 
+	if (flags & ~(O_CLOEXEC | O_NONBLOCK))
+		return -EINVAL;
+
 	error = -ENFILE;
 	f1 = get_empty_filp();
 	if (!f1)
@@ -633,12 +636,12 @@ int do_pipe(int *fd)
 	if (!inode)
 		goto close_f12;
 
-	error = get_unused_fd();
+	error = get_unused_fd_flags(flags);
 	if (error < 0)
 		goto close_f12_inode;
 	i = error;
 
-	error = get_unused_fd();
+	error = get_unused_fd_flags(flags);
 	if (error < 0)
 		goto close_f12_inode_i;
 	j = error;
@@ -659,13 +662,13 @@ int do_pipe(int *fd)
 
 	/* read file */
 	f1->f_pos = f2->f_pos = 0;
-	f1->f_flags = O_RDONLY;
+	f1->f_flags = O_RDONLY | (flags & O_NONBLOCK);
 	f1->f_op = &read_pipe_fops;
 	f1->f_mode = FMODE_READ;
 	f1->f_version = 0;
 
 	/* write file */
-	f2->f_flags = O_WRONLY;
+	f2->f_flags = O_WRONLY | (flags & O_NONBLOCK);
 	f2->f_op = &write_pipe_fops;
 	f2->f_mode = FMODE_WRITE;
 	f2->f_version = 0;
@@ -693,8 +696,28 @@ no_files:
 	return error;	
 }
 
+int do_pipe(int *fd)
+{
+	return do_pipe_flags(fd, 0);
+}
 EXPORT_SYMBOL_GPL(do_pipe);
 
+asmlinkage long sys_pipe2(int __user *fildes, int flags)
+{
+	int fd[2];
+	int error;
+
+	error = do_pipe_flags(fd, flags);
+	if (!error) {
+		if (copy_to_user(fildes, fd, sizeof(fd))) {
+			sys_close(fd[0]);
+			sys_close(fd[1]);
+			error = -EFAULT;
+		}
+	}
+	return error;
+}
+
 /*
  * 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
