[PATCH] splice: partial write fix
[sfrench/cifs-2.6.git] / fs / pipe.c
index 9a06e8e48e8dfb366a8c08bd387985788391a5d8..ebafde7d6abab948f9fa3a23e71f39360c757c71 100644 (file)
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -16,6 +16,7 @@
 #include <linux/uio.h>
 #include <linux/highmem.h>
 #include <linux/pagemap.h>
+#include <linux/audit.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -935,8 +936,9 @@ struct file *create_write_pipe(void)
 
 void free_write_pipe(struct file *f)
 {
-       mntput(f->f_path.mnt);
+       free_pipe_info(f->f_dentry->d_inode);
        dput(f->f_path.dentry);
+       mntput(f->f_path.mnt);
        put_filp(f);
 }
 
@@ -984,6 +986,10 @@ int do_pipe(int *fd)
                goto err_fdr;
        fdw = error;
 
+       error = audit_fd_pair(fdr, fdw);
+       if (error < 0)
+               goto err_fdw;
+
        fd_install(fdr, fr);
        fd_install(fdw, fw);
        fd[0] = fdr;
@@ -991,9 +997,13 @@ int do_pipe(int *fd)
 
        return 0;
 
+ err_fdw:
+       put_unused_fd(fdw);
  err_fdr:
        put_unused_fd(fdr);
  err_read_pipe:
+       dput(fr->f_dentry);
+       mntput(fr->f_vfsmnt);
        put_filp(fr);
  err_write_pipe:
        free_write_pipe(fw);