diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-12 17:49:50 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-12 17:49:50 -0400 |
commit | 5166701b368caea89d57b14bf41cf39e819dad51 (patch) | |
tree | c73b9d4860809e3afa9359be9d03ba2d8d98a18e /fs/file_table.c | |
parent | 0a7418f5f569512e98789c439198eed4b507cce3 (diff) | |
parent | a786c06d9f2719203c00b3d97b21f9a96980d0b5 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs updates from Al Viro:
"The first vfs pile, with deep apologies for being very late in this
window.
Assorted cleanups and fixes, plus a large preparatory part of iov_iter
work. There's a lot more of that, but it'll probably go into the next
merge window - it *does* shape up nicely, removes a lot of
boilerplate, gets rid of locking inconsistencie between aio_write and
splice_write and I hope to get Kent's direct-io rewrite merged into
the same queue, but some of the stuff after this point is having
(mostly trivial) conflicts with the things already merged into
mainline and with some I want more testing.
This one passes LTP and xfstests without regressions, in addition to
usual beating. BTW, readahead02 in ltp syscalls testsuite has started
giving failures since "mm/readahead.c: fix readahead failure for
memoryless NUMA nodes and limit readahead pages" - might be a false
positive, might be a real regression..."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits)
missing bits of "splice: fix racy pipe->buffers uses"
cifs: fix the race in cifs_writev()
ceph_sync_{,direct_}write: fix an oops on ceph_osdc_new_request() failure
kill generic_file_buffered_write()
ocfs2_file_aio_write(): switch to generic_perform_write()
ceph_aio_write(): switch to generic_perform_write()
xfs_file_buffered_aio_write(): switch to generic_perform_write()
export generic_perform_write(), start getting rid of generic_file_buffer_write()
generic_file_direct_write(): get rid of ppos argument
btrfs_file_aio_write(): get rid of ppos
kill the 5th argument of generic_file_buffered_write()
kill the 4th argument of __generic_file_aio_write()
lustre: don't open-code kernel_recvmsg()
ocfs2: don't open-code kernel_recvmsg()
drbd: don't open-code kernel_recvmsg()
constify blk_rq_map_user_iov() and friends
lustre: switch to kernel_sendmsg()
ocfs2: don't open-code kernel_sendmsg()
take iov_iter stuff to mm/iov_iter.c
process_vm_access: tidy up a bit
...
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 | } |