aboutsummaryrefslogtreecommitdiffstats
path: root/fs/binfmt_aout.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-04-20 20:13:58 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-04-20 20:29:13 -0400
commit6be5ceb02e98eaf6cfc4f8b12a896d04023f340d (patch)
treef34de1392300bbf63549f4eeb20f7606d6f7b1f9 /fs/binfmt_aout.c
parenta46ef99d80817a167477ed1c8b4d90ee0c2e726f (diff)
VM: add "vm_mmap()" helper function
This continues the theme started with vm_brk() and vm_munmap(): vm_mmap() does the same thing as do_mmap(), but additionally does the required VM locking. This uninlines (and rewrites it to be clearer) do_mmap(), which sadly duplicates it in mm/mmap.c and mm/nommu.c. But that way we don't have to export our internal do_mmap_pgoff() function. Some day we hopefully don't have to export do_mmap() either, if all modular users can become the simpler vm_mmap() instead. We're actually very close to that already, with the notable exception of the (broken) use in i810, and a couple of stragglers in binfmt_elf. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/binfmt_aout.c')
-rw-r--r--fs/binfmt_aout.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c
index 88527492b917..d146e181d10d 100644
--- a/fs/binfmt_aout.c
+++ b/fs/binfmt_aout.c
@@ -319,24 +319,20 @@ static int load_aout_binary(struct linux_binprm * bprm, struct pt_regs * regs)
319 goto beyond_if; 319 goto beyond_if;
320 } 320 }
321 321
322 down_write(&current->mm->mmap_sem); 322 error = vm_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
323 error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
324 PROT_READ | PROT_EXEC, 323 PROT_READ | PROT_EXEC,
325 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, 324 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
326 fd_offset); 325 fd_offset);
327 up_write(&current->mm->mmap_sem);
328 326
329 if (error != N_TXTADDR(ex)) { 327 if (error != N_TXTADDR(ex)) {
330 send_sig(SIGKILL, current, 0); 328 send_sig(SIGKILL, current, 0);
331 return error; 329 return error;
332 } 330 }
333 331
334 down_write(&current->mm->mmap_sem); 332 error = vm_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
335 error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
336 PROT_READ | PROT_WRITE | PROT_EXEC, 333 PROT_READ | PROT_WRITE | PROT_EXEC,
337 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE, 334 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_EXECUTABLE,
338 fd_offset + ex.a_text); 335 fd_offset + ex.a_text);
339 up_write(&current->mm->mmap_sem);
340 if (error != N_DATADDR(ex)) { 336 if (error != N_DATADDR(ex)) {
341 send_sig(SIGKILL, current, 0); 337 send_sig(SIGKILL, current, 0);
342 return error; 338 return error;
@@ -417,12 +413,10 @@ static int load_aout_library(struct file *file)
417 goto out; 413 goto out;
418 } 414 }
419 /* Now use mmap to map the library into memory. */ 415 /* Now use mmap to map the library into memory. */
420 down_write(&current->mm->mmap_sem); 416 error = vm_mmap(file, start_addr, ex.a_text + ex.a_data,
421 error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
422 PROT_READ | PROT_WRITE | PROT_EXEC, 417 PROT_READ | PROT_WRITE | PROT_EXEC,
423 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE, 418 MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE,
424 N_TXTOFF(ex)); 419 N_TXTOFF(ex));
425 up_write(&current->mm->mmap_sem);
426 retval = error; 420 retval = error;
427 if (error != start_addr) 421 if (error != start_addr)
428 goto out; 422 goto out;