int retval;
        int fds[2];
 
-       retval = do_pipe(fds);
+       retval = do_pipe_flags(fds, 0);
        if (retval)
                goto out;
        if (copy_to_user(fd, fds, sizeof(fds)))
 
        int fd[2];
        int retval;
 
-       retval = do_pipe(fd);
+       retval = do_pipe_flags(fd, 0);
        if (retval)
                goto out;
        retval = fd[0];
 
        int fd[2];
        int error, res;
 
-       error = do_pipe(fd);
+       error = do_pipe_flags(fd, 0);
        if (error) {
                res = error;
                goto out;
 
        int error;
 
        lock_kernel();
-       error = do_pipe(kstack_fildes);
+       error = do_pipe_flags(kstack_fildes, 0);
        unlock_kernel();
        return error;
 }
 
        int fd[2];
        int error;
 
-       error = do_pipe(fd);
+       error = do_pipe_flags(fd, 0);
        if (!error) {
                regs->regs[1] = fd[1];
                return fd[0];
 
        int fd[2];
        int error;
 
-       error = do_pipe(fd);
+       error = do_pipe_flags(fd, 0);
        if (error)
                goto out;
        regs->u_regs[UREG_I1] = fd[1];
 
        int fd[2];
        int error;
 
-       error = do_pipe(fd);
+       error = do_pipe_flags(fd, 0);
        if (error)
                goto out;
        regs->u_regs[UREG_I1] = fd[1];
 
        .quad sys_eventfd2
        .quad sys_epoll_create2
        .quad sys_dup3                  /* 330 */
+       .quad sys_pipe2
 ia32_syscall_end:
 
        int retval;
        int fds[2];
 
-       retval = do_pipe(fds);
+       retval = do_pipe_flags(fds, 0);
        if (retval)
                goto out;
        if (copy_to_user(fd, fds, sizeof(fds)))
 
        .long sys_eventfd2
        .long sys_epoll_create2
        .long sys_dup3                  /* 330 */
+       .long sys_pipe2
 
        int fd[2];
        int error;
 
-       error = do_pipe(fd);
+       error = do_pipe_flags(fd, 0);
        if (!error) {
                if (copy_to_user(userfds, fd, 2 * sizeof(int)))
                        error = -EFAULT;
 
        return f;
 }
 
-int do_pipe(int *fd)
+int do_pipe_flags(int *fd, int flags)
 {
        struct file *fw, *fr;
        int error;
        int fdw, fdr;
 
+       if (flags & ~O_CLOEXEC)
+               return -EINVAL;
+
        fw = create_write_pipe();
        if (IS_ERR(fw))
                return PTR_ERR(fw);
        if (IS_ERR(fr))
                goto err_write_pipe;
 
-       error = get_unused_fd();
+       error = get_unused_fd_flags(flags);
        if (error < 0)
                goto err_read_pipe;
        fdr = error;
 
-       error = get_unused_fd();
+       error = get_unused_fd_flags(flags);
        if (error < 0)
                goto err_fdr;
        fdw = error;
        return error;
 }
 
+int do_pipe(int *fd)
+{
+       return do_pipe_flags(fd, 0);
+}
+
 /*
  * sys_pipe() is the normal C calling standard for creating
  * a pipe. It's not the way Unix traditionally does this, though.
  */
-asmlinkage long __weak sys_pipe(int __user *fildes)
+asmlinkage long __weak sys_pipe2(int __user *fildes, int flags)
 {
        int fd[2];
        int error;
 
-       error = do_pipe(fd);
+       error = do_pipe_flags(fd, flags);
        if (!error) {
                if (copy_to_user(fildes, fd, sizeof(fd))) {
                        sys_close(fd[0]);
        return error;
 }
 
+asmlinkage long __weak sys_pipe(int __user *fildes)
+{
+       return sys_pipe2(fildes, 0);
+}
+
 /*
  * 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
 
 #define __NR_eventfd2          328
 #define __NR_epoll_create2     329
 #define __NR_dup3              330
+#define __NR_pipe2             331
 
 #ifdef __KERNEL__
 
 
 __SYSCALL(__NR_epoll_create2, sys_epoll_create2)
 #define __NR_dup3                              292
 __SYSCALL(__NR_dup3, sys_dup3)
+#define __NR_pipe2                             293
+__SYSCALL(__NR_pipe2, sys_pipe2)
 
 
 #ifndef __NO_STUBS
 
                atomic_inc(&file->f_path.dentry->d_inode->i_writecount);
 }
 extern int do_pipe(int *);
+extern int do_pipe_flags(int *, int);
 extern struct file *create_read_pipe(struct file *f);
 extern struct file *create_write_pipe(void);
 extern void free_write_pipe(struct file *);