Commit 430e285e0817e3e18aadd814bc078d50d8af0cbf

Authored by Dave Hansen
Committed by Al Viro
1 parent 322ee5b36e

[PATCH] fix up new filp allocators

Some new uses of get_empty_filp() have crept in; switched
to alloc_file() to make sure that pieces of initialization
won't be missing.

We really need to kill get_empty_filp().

[AV] fixed dentry leak on failure exit in anon_inode_getfd()

Cc: Erez Zadok <ezk@cs.sunysb.edu>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: "J Bruce Fields" <bfields@fieldses.org>
Acked-by: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Showing 3 changed files with 23 additions and 20 deletions Side-by-side Diff

... ... @@ -81,13 +81,10 @@
81 81  
82 82 if (IS_ERR(anon_inode_inode))
83 83 return -ENODEV;
84   - file = get_empty_filp();
85   - if (!file)
86   - return -ENFILE;
87 84  
88 85 error = get_unused_fd();
89 86 if (error < 0)
90   - goto err_put_filp;
  87 + return error;
91 88 fd = error;
92 89  
93 90 /*
94 91  
... ... @@ -114,14 +111,15 @@
114 111 dentry->d_flags &= ~DCACHE_UNHASHED;
115 112 d_instantiate(dentry, anon_inode_inode);
116 113  
117   - file->f_path.mnt = mntget(anon_inode_mnt);
118   - file->f_path.dentry = dentry;
  114 + error = -ENFILE;
  115 + file = alloc_file(anon_inode_mnt, dentry,
  116 + FMODE_READ | FMODE_WRITE, fops);
  117 + if (!file)
  118 + goto err_dput;
119 119 file->f_mapping = anon_inode_inode->i_mapping;
120 120  
121 121 file->f_pos = 0;
122 122 file->f_flags = O_RDWR;
123   - file->f_op = fops;
124   - file->f_mode = FMODE_READ | FMODE_WRITE;
125 123 file->f_version = 0;
126 124 file->private_data = priv;
127 125  
128 126  
... ... @@ -132,10 +130,10 @@
132 130 *pfile = file;
133 131 return 0;
134 132  
  133 +err_dput:
  134 + dput(dentry);
135 135 err_put_unused_fd:
136 136 put_unused_fd(fd);
137   -err_put_filp:
138   - put_filp(file);
139 137 return error;
140 138 }
141 139 EXPORT_SYMBOL_GPL(anon_inode_getfd);
... ... @@ -83,6 +83,12 @@
83 83 /* Find an unused file structure and return a pointer to it.
84 84 * Returns NULL, if there are no more free file structures or
85 85 * we run out of memory.
  86 + *
  87 + * Be very careful using this. You are responsible for
  88 + * getting write access to any mount that you might assign
  89 + * to this filp, if it is opened for write. If this is not
  90 + * done, you will imbalance int the mount's writer count
  91 + * and a warning at __fput() time.
86 92 */
87 93 struct file *get_empty_filp(void)
88 94 {
... ... @@ -957,13 +957,10 @@
957 957 struct dentry *dentry;
958 958 struct qstr name = { .name = "" };
959 959  
960   - f = get_empty_filp();
961   - if (!f)
962   - return ERR_PTR(-ENFILE);
963 960 err = -ENFILE;
964 961 inode = get_pipe_inode();
965 962 if (!inode)
966   - goto err_file;
  963 + goto err;
967 964  
968 965 err = -ENOMEM;
969 966 dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &name);
970 967  
971 968  
972 969  
... ... @@ -978,22 +975,24 @@
978 975 */
979 976 dentry->d_flags &= ~DCACHE_UNHASHED;
980 977 d_instantiate(dentry, inode);
981   - f->f_path.mnt = mntget(pipe_mnt);
982   - f->f_path.dentry = dentry;
  978 +
  979 + err = -ENFILE;
  980 + f = alloc_file(pipe_mnt, dentry, FMODE_WRITE, &write_pipe_fops);
  981 + if (!f)
  982 + goto err_dentry;
983 983 f->f_mapping = inode->i_mapping;
984 984  
985 985 f->f_flags = O_WRONLY;
986   - f->f_op = &write_pipe_fops;
987   - f->f_mode = FMODE_WRITE;
988 986 f->f_version = 0;
989 987  
990 988 return f;
991 989  
  990 + err_dentry:
  991 + dput(dentry);
992 992 err_inode:
993 993 free_pipe_info(inode);
994 994 iput(inode);
995   - err_file:
996   - put_filp(f);
  995 + err:
997 996 return ERR_PTR(err);
998 997 }
999 998