diff options
Diffstat (limited to 'fs/file_table.c')
-rw-r--r-- | fs/file_table.c | 43 |
1 files changed, 4 insertions, 39 deletions
diff --git a/fs/file_table.c b/fs/file_table.c index 01071c4d752e..a374f5033e97 100644 --- a/fs/file_table.c +++ b/fs/file_table.c | |||
@@ -52,7 +52,6 @@ static void file_free_rcu(struct rcu_head *head) | |||
52 | static inline void file_free(struct file *f) | 52 | static inline void file_free(struct file *f) |
53 | { | 53 | { |
54 | percpu_counter_dec(&nr_files); | 54 | percpu_counter_dec(&nr_files); |
55 | file_check_state(f); | ||
56 | call_rcu(&f->f_u.fu_rcuhead, file_free_rcu); | 55 | call_rcu(&f->f_u.fu_rcuhead, file_free_rcu); |
57 | } | 56 | } |
58 | 57 | ||
@@ -178,47 +177,12 @@ struct file *alloc_file(struct path *path, fmode_t mode, | |||
178 | file->f_mapping = path->dentry->d_inode->i_mapping; | 177 | file->f_mapping = path->dentry->d_inode->i_mapping; |
179 | file->f_mode = mode; | 178 | file->f_mode = mode; |
180 | file->f_op = fop; | 179 | file->f_op = fop; |
181 | |||
182 | /* | ||
183 | * These mounts don't really matter in practice | ||
184 | * for r/o bind mounts. They aren't userspace- | ||
185 | * visible. We do this for consistency, and so | ||
186 | * that we can do debugging checks at __fput() | ||
187 | */ | ||
188 | if ((mode & FMODE_WRITE) && !special_file(path->dentry->d_inode->i_mode)) { | ||
189 | file_take_write(file); | ||
190 | WARN_ON(mnt_clone_write(path->mnt)); | ||
191 | } | ||
192 | if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) | 180 | if ((mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) |
193 | i_readcount_inc(path->dentry->d_inode); | 181 | i_readcount_inc(path->dentry->d_inode); |
194 | return file; | 182 | return file; |
195 | } | 183 | } |
196 | EXPORT_SYMBOL(alloc_file); | 184 | EXPORT_SYMBOL(alloc_file); |
197 | 185 | ||
198 | /** | ||
199 | * drop_file_write_access - give up ability to write to a file | ||
200 | * @file: the file to which we will stop writing | ||
201 | * | ||
202 | * This is a central place which will give up the ability | ||
203 | * to write to @file, along with access to write through | ||
204 | * its vfsmount. | ||
205 | */ | ||
206 | static void drop_file_write_access(struct file *file) | ||
207 | { | ||
208 | struct vfsmount *mnt = file->f_path.mnt; | ||
209 | struct dentry *dentry = file->f_path.dentry; | ||
210 | struct inode *inode = dentry->d_inode; | ||
211 | |||
212 | put_write_access(inode); | ||
213 | |||
214 | if (special_file(inode->i_mode)) | ||
215 | return; | ||
216 | if (file_check_writeable(file) != 0) | ||
217 | return; | ||
218 | __mnt_drop_write(mnt); | ||
219 | file_release_write(file); | ||
220 | } | ||
221 | |||
222 | /* the real guts of fput() - releasing the last reference to file | 186 | /* the real guts of fput() - releasing the last reference to file |
223 | */ | 187 | */ |
224 | static void __fput(struct file *file) | 188 | static void __fput(struct file *file) |
@@ -253,8 +217,10 @@ static void __fput(struct file *file) | |||
253 | put_pid(file->f_owner.pid); | 217 | put_pid(file->f_owner.pid); |
254 | if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) | 218 | if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) |
255 | i_readcount_dec(inode); | 219 | i_readcount_dec(inode); |
256 | if (file->f_mode & FMODE_WRITE) | 220 | if (file->f_mode & FMODE_WRITER) { |
257 | drop_file_write_access(file); | 221 | put_write_access(inode); |
222 | __mnt_drop_write(mnt); | ||
223 | } | ||
258 | file->f_path.dentry = NULL; | 224 | file->f_path.dentry = NULL; |
259 | file->f_path.mnt = NULL; | 225 | file->f_path.mnt = NULL; |
260 | file->f_inode = NULL; | 226 | file->f_inode = NULL; |
@@ -359,6 +325,5 @@ void __init files_init(unsigned long mempages) | |||
359 | 325 | ||
360 | n = (mempages * (PAGE_SIZE / 1024)) / 10; | 326 | n = (mempages * (PAGE_SIZE / 1024)) / 10; |
361 | files_stat.max_files = max_t(unsigned long, n, NR_FILE); | 327 | files_stat.max_files = max_t(unsigned long, n, NR_FILE); |
362 | files_defer_init(); | ||
363 | percpu_counter_init(&nr_files, 0); | 328 | percpu_counter_init(&nr_files, 0); |
364 | } | 329 | } |