+ struct qstr name = { .name = "" };
+
+ err = -ENFILE;
+ inode = get_pipe_inode();
+ if (!inode)
+ goto err;
+
+ err = -ENOMEM;
+ dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &name);
+ if (!dentry)
+ goto err_inode;
+
+ dentry->d_op = &pipefs_dentry_operations;
+ /*
+ * We dont want to publish this dentry into global dentry hash table.
+ * We pretend dentry is already hashed, by unsetting DCACHE_UNHASHED
+ * This permits a working /proc/$pid/fd/XXX on pipes
+ */
+ dentry->d_flags &= ~DCACHE_UNHASHED;
+ d_instantiate(dentry, inode);
+
+ err = -ENFILE;
+ f = alloc_file(pipe_mnt, dentry, FMODE_WRITE, &write_pipefifo_fops);
+ if (!f)
+ goto err_dentry;
+ f->f_mapping = inode->i_mapping;
+
+ f->f_flags = O_WRONLY | (flags & O_NONBLOCK);
+ f->f_version = 0;
+
+ return f;
+
+ err_dentry:
+ free_pipe_info(inode);
+ dput(dentry);
+ return ERR_PTR(err);
+
+ err_inode:
+ free_pipe_info(inode);
+ iput(inode);
+ err:
+ return ERR_PTR(err);
+}
+
+void free_write_pipe(struct file *f)
+{
+ free_pipe_info(f->f_dentry->d_inode);
+ path_put(&f->f_path);
+ put_filp(f);
+}
+
+struct file *create_read_pipe(struct file *wrf, int flags)
+{
+ struct file *f = get_empty_filp();
+ if (!f)
+ return ERR_PTR(-ENFILE);
+
+ /* Grab pipe from the writer */
+ f->f_path = wrf->f_path;
+ path_get(&wrf->f_path);
+ f->f_mapping = wrf->f_path.dentry->d_inode->i_mapping;
+
+ f->f_pos = 0;
+ f->f_flags = O_RDONLY | (flags & O_NONBLOCK);
+ f->f_op = &read_pipefifo_fops;
+ f->f_mode = FMODE_READ;
+ f->f_version = 0;
+
+ return f;
+}
+
+int do_pipe_flags(int *fd, int flags)
+{
+ struct file *fw, *fr;