Commit 2dd8ad81e31d0d36a5d448329c646ab43eb17788
Committed by
Linus Torvalds
1 parent
0b173bc4da
Exists in
master
and in
20 other branches
mm: use mm->exe_file instead of first VM_EXECUTABLE vma->vm_file
Some security modules and oprofile still uses VM_EXECUTABLE for retrieving a task's executable file. After this patch they will use mm->exe_file directly. mm->exe_file is protected with mm->mmap_sem, so locking stays the same. Signed-off-by: Konstantin Khlebnikov <khlebnikov@openvz.org> Acked-by: Chris Metcalf <cmetcalf@tilera.com> [arch/tile] Acked-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> [tomoyo] Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Carsten Otte <cotte@de.ibm.com> Cc: Cyrill Gorcunov <gorcunov@openvz.org> Cc: Eric Paris <eparis@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Hugh Dickins <hughd@google.com> Cc: Ingo Molnar <mingo@redhat.com> Acked-by: James Morris <james.l.morris@oracle.com> Cc: Jason Baron <jbaron@redhat.com> Cc: Kentaro Takeda <takedakn@nttdata.co.jp> Cc: Matt Helsley <matthltc@us.ibm.com> Cc: Nick Piggin <npiggin@kernel.dk> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Robert Richter <robert.richter@amd.com> Cc: Suresh Siddha <suresh.b.siddha@intel.com> Cc: Venkatesh Pallipadi <venki@google.com> Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 6 changed files with 19 additions and 57 deletions Side-by-side Diff
arch/powerpc/oprofile/cell/spu_task_sync.c
... | ... | @@ -304,7 +304,7 @@ |
304 | 304 | return cookie; |
305 | 305 | } |
306 | 306 | |
307 | -/* Look up the dcookie for the task's first VM_EXECUTABLE mapping, | |
307 | +/* Look up the dcookie for the task's mm->exe_file, | |
308 | 308 | * which corresponds loosely to "application name". Also, determine |
309 | 309 | * the offset for the SPU ELF object. If computed offset is |
310 | 310 | * non-zero, it implies an embedded SPU object; otherwise, it's a |
... | ... | @@ -321,7 +321,6 @@ |
321 | 321 | { |
322 | 322 | unsigned long app_cookie = 0; |
323 | 323 | unsigned int my_offset = 0; |
324 | - struct file *app = NULL; | |
325 | 324 | struct vm_area_struct *vma; |
326 | 325 | struct mm_struct *mm = spu->mm; |
327 | 326 | |
328 | 327 | |
... | ... | @@ -330,16 +329,10 @@ |
330 | 329 | |
331 | 330 | down_read(&mm->mmap_sem); |
332 | 331 | |
333 | - for (vma = mm->mmap; vma; vma = vma->vm_next) { | |
334 | - if (!vma->vm_file) | |
335 | - continue; | |
336 | - if (!(vma->vm_flags & VM_EXECUTABLE)) | |
337 | - continue; | |
338 | - app_cookie = fast_get_dcookie(&vma->vm_file->f_path); | |
332 | + if (mm->exe_file) { | |
333 | + app_cookie = fast_get_dcookie(&mm->exe_file->f_path); | |
339 | 334 | pr_debug("got dcookie for %s\n", |
340 | - vma->vm_file->f_dentry->d_name.name); | |
341 | - app = vma->vm_file; | |
342 | - break; | |
335 | + mm->exe_file->f_dentry->d_name.name); | |
343 | 336 | } |
344 | 337 | |
345 | 338 | for (vma = mm->mmap; vma; vma = vma->vm_next) { |
arch/tile/mm/elf.c
... | ... | @@ -36,19 +36,14 @@ |
36 | 36 | } while (c); |
37 | 37 | } |
38 | 38 | |
39 | -static int notify_exec(void) | |
39 | +static int notify_exec(struct mm_struct *mm) | |
40 | 40 | { |
41 | 41 | int retval = 0; /* failure */ |
42 | - struct vm_area_struct *vma = current->mm->mmap; | |
43 | - while (vma) { | |
44 | - if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file) | |
45 | - break; | |
46 | - vma = vma->vm_next; | |
47 | - } | |
48 | - if (vma) { | |
42 | + | |
43 | + if (mm->exe_file) { | |
49 | 44 | char *buf = (char *) __get_free_page(GFP_KERNEL); |
50 | 45 | if (buf) { |
51 | - char *path = d_path(&vma->vm_file->f_path, | |
46 | + char *path = d_path(&mm->exe_file->f_path, | |
52 | 47 | buf, PAGE_SIZE); |
53 | 48 | if (!IS_ERR(path)) { |
54 | 49 | sim_notify_exec(path); |
55 | 50 | |
56 | 51 | |
... | ... | @@ -106,15 +101,15 @@ |
106 | 101 | unsigned long vdso_base; |
107 | 102 | int retval = 0; |
108 | 103 | |
104 | + down_write(&mm->mmap_sem); | |
105 | + | |
109 | 106 | /* |
110 | 107 | * Notify the simulator that an exec just occurred. |
111 | 108 | * If we can't find the filename of the mapping, just use |
112 | 109 | * whatever was passed as the linux_binprm filename. |
113 | 110 | */ |
114 | - if (!notify_exec()) | |
111 | + if (!notify_exec(mm)) | |
115 | 112 | sim_notify_exec(bprm->filename); |
116 | - | |
117 | - down_write(&mm->mmap_sem); | |
118 | 113 | |
119 | 114 | /* |
120 | 115 | * MAYWRITE to allow gdb to COW and set breakpoints |
drivers/oprofile/buffer_sync.c
... | ... | @@ -216,7 +216,7 @@ |
216 | 216 | } |
217 | 217 | |
218 | 218 | |
219 | -/* Look up the dcookie for the task's first VM_EXECUTABLE mapping, | |
219 | +/* Look up the dcookie for the task's mm->exe_file, | |
220 | 220 | * which corresponds loosely to "application name". This is |
221 | 221 | * not strictly necessary but allows oprofile to associate |
222 | 222 | * shared-library samples with particular applications |
223 | 223 | |
224 | 224 | |
... | ... | @@ -224,21 +224,10 @@ |
224 | 224 | static unsigned long get_exec_dcookie(struct mm_struct *mm) |
225 | 225 | { |
226 | 226 | unsigned long cookie = NO_COOKIE; |
227 | - struct vm_area_struct *vma; | |
228 | 227 | |
229 | - if (!mm) | |
230 | - goto out; | |
228 | + if (mm && mm->exe_file) | |
229 | + cookie = fast_get_dcookie(&mm->exe_file->f_path); | |
231 | 230 | |
232 | - for (vma = mm->mmap; vma; vma = vma->vm_next) { | |
233 | - if (!vma->vm_file) | |
234 | - continue; | |
235 | - if (!(vma->vm_flags & VM_EXECUTABLE)) | |
236 | - continue; | |
237 | - cookie = fast_get_dcookie(&vma->vm_file->f_path); | |
238 | - break; | |
239 | - } | |
240 | - | |
241 | -out: | |
242 | 231 | return cookie; |
243 | 232 | } |
244 | 233 |
kernel/auditsc.c
... | ... | @@ -1151,7 +1151,6 @@ |
1151 | 1151 | const struct cred *cred; |
1152 | 1152 | char name[sizeof(tsk->comm)]; |
1153 | 1153 | struct mm_struct *mm = tsk->mm; |
1154 | - struct vm_area_struct *vma; | |
1155 | 1154 | char *tty; |
1156 | 1155 | |
1157 | 1156 | if (!ab) |
... | ... | @@ -1191,16 +1190,8 @@ |
1191 | 1190 | |
1192 | 1191 | if (mm) { |
1193 | 1192 | down_read(&mm->mmap_sem); |
1194 | - vma = mm->mmap; | |
1195 | - while (vma) { | |
1196 | - if ((vma->vm_flags & VM_EXECUTABLE) && | |
1197 | - vma->vm_file) { | |
1198 | - audit_log_d_path(ab, " exe=", | |
1199 | - &vma->vm_file->f_path); | |
1200 | - break; | |
1201 | - } | |
1202 | - vma = vma->vm_next; | |
1203 | - } | |
1193 | + if (mm->exe_file) | |
1194 | + audit_log_d_path(ab, " exe=", &mm->exe_file->f_path); | |
1204 | 1195 | up_read(&mm->mmap_sem); |
1205 | 1196 | } |
1206 | 1197 | audit_log_task_context(ab); |
kernel/fork.c
... | ... | @@ -656,8 +656,7 @@ |
656 | 656 | { |
657 | 657 | struct file *exe_file; |
658 | 658 | |
659 | - /* We need mmap_sem to protect against races with removal of | |
660 | - * VM_EXECUTABLE vmas */ | |
659 | + /* We need mmap_sem to protect against races with removal of exe_file */ | |
661 | 660 | down_read(&mm->mmap_sem); |
662 | 661 | exe_file = mm->exe_file; |
663 | 662 | if (exe_file) |
security/tomoyo/util.c
... | ... | @@ -949,18 +949,13 @@ |
949 | 949 | const char *tomoyo_get_exe(void) |
950 | 950 | { |
951 | 951 | struct mm_struct *mm = current->mm; |
952 | - struct vm_area_struct *vma; | |
953 | 952 | const char *cp = NULL; |
954 | 953 | |
955 | 954 | if (!mm) |
956 | 955 | return NULL; |
957 | 956 | down_read(&mm->mmap_sem); |
958 | - for (vma = mm->mmap; vma; vma = vma->vm_next) { | |
959 | - if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file) { | |
960 | - cp = tomoyo_realpath_from_path(&vma->vm_file->f_path); | |
961 | - break; | |
962 | - } | |
963 | - } | |
957 | + if (mm->exe_file) | |
958 | + cp = tomoyo_realpath_from_path(&mm->exe_file->f_path); | |
964 | 959 | up_read(&mm->mmap_sem); |
965 | 960 | return cp; |
966 | 961 | } |