diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-02 23:25:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-02 23:25:04 -0400 |
commit | aab174f0df5d72d31caccf281af5f614fa254578 (patch) | |
tree | 2a172c5009c4ac8755e858593154c258ce7709a0 /mm | |
parent | ca41cc96b2813221b05af57d0355157924de5a07 (diff) | |
parent | 2bd2c1941f141ad780135ccc1cd08ca71a24f10a (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs update from Al Viro:
- big one - consolidation of descriptor-related logics; almost all of
that is moved to fs/file.c
(BTW, I'm seriously tempted to rename the result to fd.c. As it is,
we have a situation when file_table.c is about handling of struct
file and file.c is about handling of descriptor tables; the reasons
are historical - file_table.c used to be about a static array of
struct file we used to have way back).
A lot of stray ends got cleaned up and converted to saner primitives,
disgusting mess in android/binder.c is still disgusting, but at least
doesn't poke so much in descriptor table guts anymore. A bunch of
relatively minor races got fixed in process, plus an ext4 struct file
leak.
- related thing - fget_light() partially unuglified; see fdget() in
there (and yes, it generates the code as good as we used to have).
- also related - bits of Cyrill's procfs stuff that got entangled into
that work; _not_ all of it, just the initial move to fs/proc/fd.c and
switch of fdinfo to seq_file.
- Alex's fs/coredump.c spiltoff - the same story, had been easier to
take that commit than mess with conflicts. The rest is a separate
pile, this was just a mechanical code movement.
- a few misc patches all over the place. Not all for this cycle,
there'll be more (and quite a few currently sit in akpm's tree)."
Fix up trivial conflicts in the android binder driver, and some fairly
simple conflicts due to two different changes to the sock_alloc_file()
interface ("take descriptor handling from sock_alloc_file() to callers"
vs "net: Providing protocol type via system.sockprotoname xattr of
/proc/PID/fd entries" adding a dentry name to the socket)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (72 commits)
MAX_LFS_FILESIZE should be a loff_t
compat: fs: Generic compat_sys_sendfile implementation
fs: push rcu_barrier() from deactivate_locked_super() to filesystems
btrfs: reada_extent doesn't need kref for refcount
coredump: move core dump functionality into its own file
coredump: prevent double-free on an error path in core dumper
usb/gadget: fix misannotations
fcntl: fix misannotations
ceph: don't abuse d_delete() on failure exits
hypfs: ->d_parent is never NULL or negative
vfs: delete surplus inode NULL check
switch simple cases of fget_light to fdget
new helpers: fdget()/fdput()
switch o2hb_region_dev_write() to fget_light()
proc_map_files_readdir(): don't bother with grabbing files
make get_file() return its argument
vhost_set_vring(): turn pollstart/pollstop into bool
switch prctl_set_mm_exe_file() to fget_light()
switch xfs_find_handle() to fget_light()
switch xfs_swapext() to fget_light()
...
Diffstat (limited to 'mm')
-rw-r--r-- | mm/fadvise.c | 34 | ||||
-rw-r--r-- | mm/fremap.c | 3 | ||||
-rw-r--r-- | mm/mmap.c | 3 | ||||
-rw-r--r-- | mm/nommu.c | 6 | ||||
-rw-r--r-- | mm/readahead.c | 14 |
5 files changed, 28 insertions, 32 deletions
diff --git a/mm/fadvise.c b/mm/fadvise.c index 9b75a045dbf4..a47f0f50c89f 100644 --- a/mm/fadvise.c +++ b/mm/fadvise.c | |||
@@ -26,7 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) | 27 | SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) |
28 | { | 28 | { |
29 | struct file *file = fget(fd); | 29 | struct fd f = fdget(fd); |
30 | struct address_space *mapping; | 30 | struct address_space *mapping; |
31 | struct backing_dev_info *bdi; | 31 | struct backing_dev_info *bdi; |
32 | loff_t endbyte; /* inclusive */ | 32 | loff_t endbyte; /* inclusive */ |
@@ -35,15 +35,15 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) | |||
35 | unsigned long nrpages; | 35 | unsigned long nrpages; |
36 | int ret = 0; | 36 | int ret = 0; |
37 | 37 | ||
38 | if (!file) | 38 | if (!f.file) |
39 | return -EBADF; | 39 | return -EBADF; |
40 | 40 | ||
41 | if (S_ISFIFO(file->f_path.dentry->d_inode->i_mode)) { | 41 | if (S_ISFIFO(f.file->f_path.dentry->d_inode->i_mode)) { |
42 | ret = -ESPIPE; | 42 | ret = -ESPIPE; |
43 | goto out; | 43 | goto out; |
44 | } | 44 | } |
45 | 45 | ||
46 | mapping = file->f_mapping; | 46 | mapping = f.file->f_mapping; |
47 | if (!mapping || len < 0) { | 47 | if (!mapping || len < 0) { |
48 | ret = -EINVAL; | 48 | ret = -EINVAL; |
49 | goto out; | 49 | goto out; |
@@ -76,21 +76,21 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) | |||
76 | 76 | ||
77 | switch (advice) { | 77 | switch (advice) { |
78 | case POSIX_FADV_NORMAL: | 78 | case POSIX_FADV_NORMAL: |
79 | file->f_ra.ra_pages = bdi->ra_pages; | 79 | f.file->f_ra.ra_pages = bdi->ra_pages; |
80 | spin_lock(&file->f_lock); | 80 | spin_lock(&f.file->f_lock); |
81 | file->f_mode &= ~FMODE_RANDOM; | 81 | f.file->f_mode &= ~FMODE_RANDOM; |
82 | spin_unlock(&file->f_lock); | 82 | spin_unlock(&f.file->f_lock); |
83 | break; | 83 | break; |
84 | case POSIX_FADV_RANDOM: | 84 | case POSIX_FADV_RANDOM: |
85 | spin_lock(&file->f_lock); | 85 | spin_lock(&f.file->f_lock); |
86 | file->f_mode |= FMODE_RANDOM; | 86 | f.file->f_mode |= FMODE_RANDOM; |
87 | spin_unlock(&file->f_lock); | 87 | spin_unlock(&f.file->f_lock); |
88 | break; | 88 | break; |
89 | case POSIX_FADV_SEQUENTIAL: | 89 | case POSIX_FADV_SEQUENTIAL: |
90 | file->f_ra.ra_pages = bdi->ra_pages * 2; | 90 | f.file->f_ra.ra_pages = bdi->ra_pages * 2; |
91 | spin_lock(&file->f_lock); | 91 | spin_lock(&f.file->f_lock); |
92 | file->f_mode &= ~FMODE_RANDOM; | 92 | f.file->f_mode &= ~FMODE_RANDOM; |
93 | spin_unlock(&file->f_lock); | 93 | spin_unlock(&f.file->f_lock); |
94 | break; | 94 | break; |
95 | case POSIX_FADV_WILLNEED: | 95 | case POSIX_FADV_WILLNEED: |
96 | /* First and last PARTIAL page! */ | 96 | /* First and last PARTIAL page! */ |
@@ -106,7 +106,7 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) | |||
106 | * Ignore return value because fadvise() shall return | 106 | * Ignore return value because fadvise() shall return |
107 | * success even if filesystem can't retrieve a hint, | 107 | * success even if filesystem can't retrieve a hint, |
108 | */ | 108 | */ |
109 | force_page_cache_readahead(mapping, file, start_index, | 109 | force_page_cache_readahead(mapping, f.file, start_index, |
110 | nrpages); | 110 | nrpages); |
111 | break; | 111 | break; |
112 | case POSIX_FADV_NOREUSE: | 112 | case POSIX_FADV_NOREUSE: |
@@ -128,7 +128,7 @@ SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice) | |||
128 | ret = -EINVAL; | 128 | ret = -EINVAL; |
129 | } | 129 | } |
130 | out: | 130 | out: |
131 | fput(file); | 131 | fdput(f); |
132 | return ret; | 132 | return ret; |
133 | } | 133 | } |
134 | #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS | 134 | #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS |
diff --git a/mm/fremap.c b/mm/fremap.c index 9ed4fd432467..048659c0c03d 100644 --- a/mm/fremap.c +++ b/mm/fremap.c | |||
@@ -195,10 +195,9 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size, | |||
195 | */ | 195 | */ |
196 | if (mapping_cap_account_dirty(mapping)) { | 196 | if (mapping_cap_account_dirty(mapping)) { |
197 | unsigned long addr; | 197 | unsigned long addr; |
198 | struct file *file = vma->vm_file; | 198 | struct file *file = get_file(vma->vm_file); |
199 | 199 | ||
200 | flags &= MAP_NONBLOCK; | 200 | flags &= MAP_NONBLOCK; |
201 | get_file(file); | ||
202 | addr = mmap_region(file, start, size, | 201 | addr = mmap_region(file, start, size, |
203 | flags, vma->vm_flags, pgoff); | 202 | flags, vma->vm_flags, pgoff); |
204 | fput(file); | 203 | fput(file); |
@@ -1301,8 +1301,7 @@ munmap_back: | |||
1301 | goto free_vma; | 1301 | goto free_vma; |
1302 | correct_wcount = 1; | 1302 | correct_wcount = 1; |
1303 | } | 1303 | } |
1304 | vma->vm_file = file; | 1304 | vma->vm_file = get_file(file); |
1305 | get_file(file); | ||
1306 | error = file->f_op->mmap(file, vma); | 1305 | error = file->f_op->mmap(file, vma); |
1307 | if (error) | 1306 | if (error) |
1308 | goto unmap_and_free_vma; | 1307 | goto unmap_and_free_vma; |
diff --git a/mm/nommu.c b/mm/nommu.c index d4b0c10872de..dee2ff89fd58 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -1282,10 +1282,8 @@ unsigned long do_mmap_pgoff(struct file *file, | |||
1282 | vma->vm_pgoff = pgoff; | 1282 | vma->vm_pgoff = pgoff; |
1283 | 1283 | ||
1284 | if (file) { | 1284 | if (file) { |
1285 | region->vm_file = file; | 1285 | region->vm_file = get_file(file); |
1286 | get_file(file); | 1286 | vma->vm_file = get_file(file); |
1287 | vma->vm_file = file; | ||
1288 | get_file(file); | ||
1289 | if (vm_flags & VM_EXECUTABLE) { | 1287 | if (vm_flags & VM_EXECUTABLE) { |
1290 | added_exe_file_vma(current->mm); | 1288 | added_exe_file_vma(current->mm); |
1291 | vma->vm_mm = current->mm; | 1289 | vma->vm_mm = current->mm; |
diff --git a/mm/readahead.c b/mm/readahead.c index ea8f8fa21649..7963f2391236 100644 --- a/mm/readahead.c +++ b/mm/readahead.c | |||
@@ -579,19 +579,19 @@ do_readahead(struct address_space *mapping, struct file *filp, | |||
579 | SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count) | 579 | SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count) |
580 | { | 580 | { |
581 | ssize_t ret; | 581 | ssize_t ret; |
582 | struct file *file; | 582 | struct fd f; |
583 | 583 | ||
584 | ret = -EBADF; | 584 | ret = -EBADF; |
585 | file = fget(fd); | 585 | f = fdget(fd); |
586 | if (file) { | 586 | if (f.file) { |
587 | if (file->f_mode & FMODE_READ) { | 587 | if (f.file->f_mode & FMODE_READ) { |
588 | struct address_space *mapping = file->f_mapping; | 588 | struct address_space *mapping = f.file->f_mapping; |
589 | pgoff_t start = offset >> PAGE_CACHE_SHIFT; | 589 | pgoff_t start = offset >> PAGE_CACHE_SHIFT; |
590 | pgoff_t end = (offset + count - 1) >> PAGE_CACHE_SHIFT; | 590 | pgoff_t end = (offset + count - 1) >> PAGE_CACHE_SHIFT; |
591 | unsigned long len = end - start + 1; | 591 | unsigned long len = end - start + 1; |
592 | ret = do_readahead(mapping, file, start, len); | 592 | ret = do_readahead(mapping, f.file, start, len); |
593 | } | 593 | } |
594 | fput(file); | 594 | fdput(f); |
595 | } | 595 | } |
596 | return ret; | 596 | return ret; |
597 | } | 597 | } |