Commit 430e285e0817e3e18aadd814bc078d50d8af0cbf
Committed by
Al Viro
1 parent
322ee5b36e
Exists in
master
and in
4 other branches
[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
fs/anon_inodes.c
... | ... | @@ -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); |
fs/file_table.c
... | ... | @@ -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 | { |
fs/pipe.c
... | ... | @@ -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 |