mm: remove more IS_ERR_VALUE abuses
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 27 May 2016 22:57:31 +0000 (15:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 27 May 2016 22:57:31 +0000 (15:57 -0700)
The do_brk() and vm_brk() return value was "unsigned long" and returned
the starting address on success, and an error value on failure.  The
reasons are entirely historical, and go back to it basically behaving
like the mmap() interface does.

However, nobody actually wanted that interface, and it causes totally
pointless IS_ERR_VALUE() confusion.

What every single caller actually wants is just the simpler integer
return of zero for success and negative error number on failure.

So just convert to that much clearer and more common calling convention,
and get rid of all the IS_ERR_VALUE() uses wrt vm_brk().

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/ia32/ia32_aout.c
fs/binfmt_aout.c
fs/binfmt_elf.c
include/linux/mm.h
mm/mmap.c
mm/nommu.c

index f5e737ff002215f8ae22dd98520a7e7249762cd9..cb26f18d43af3ad01f24514dd43f0748e8839b63 100644 (file)
@@ -116,12 +116,12 @@ static struct linux_binfmt aout_format = {
        .min_coredump   = PAGE_SIZE
 };
 
-static unsigned long set_brk(unsigned long start, unsigned long end)
+static int set_brk(unsigned long start, unsigned long end)
 {
        start = PAGE_ALIGN(start);
        end = PAGE_ALIGN(end);
        if (end <= start)
-               return start;
+               return 0;
        return vm_brk(start, end - start);
 }
 
@@ -321,7 +321,7 @@ static int load_aout_binary(struct linux_binprm *bprm)
 
                error = vm_brk(text_addr & PAGE_MASK, map_size);
 
-               if (error != (text_addr & PAGE_MASK))
+               if (error)
                        return error;
 
                error = read_code(bprm->file, text_addr, 32,
@@ -350,7 +350,7 @@ static int load_aout_binary(struct linux_binprm *bprm)
 
                if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) {
                        error = vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
-                       if (IS_ERR_VALUE(error))
+                       if (error)
                                return error;
 
                        read_code(bprm->file, N_TXTADDR(ex), fd_offset,
@@ -378,7 +378,7 @@ static int load_aout_binary(struct linux_binprm *bprm)
 
 beyond_if:
        error = set_brk(current->mm->start_brk, current->mm->brk);
-       if (IS_ERR_VALUE(error))
+       if (error)
                return error;
 
        set_binfmt(&aout_format);
@@ -441,7 +441,7 @@ static int load_aout_library(struct file *file)
                }
 #endif
                retval = vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
-               if (IS_ERR_VALUE(retval))
+               if (retval)
                        goto out;
 
                read_code(file, start_addr, N_TXTOFF(ex),
@@ -461,9 +461,8 @@ static int load_aout_library(struct file *file)
        len = PAGE_ALIGN(ex.a_text + ex.a_data);
        bss = ex.a_text + ex.a_data + ex.a_bss;
        if (bss > len) {
-               error = vm_brk(start_addr + len, bss - len);
-               retval = error;
-               if (error != start_addr + len)
+               retval = vm_brk(start_addr + len, bss - len);
+               if (retval)
                        goto out;
        }
        retval = 0;
index 2fab9f130e51d624546054865bbcdea65935b866..64b331ae34283c310edf987cb543f80618b697ad 100644 (file)
@@ -127,11 +127,8 @@ static int set_brk(unsigned long start, unsigned long end)
 {
        start = PAGE_ALIGN(start);
        end = PAGE_ALIGN(end);
-       if (end > start) {
-               unsigned long addr;
-               addr = vm_brk(start, end - start);
-               if (BAD_ADDR(addr))
-                       return addr;
+       if (end > start)
+               return vm_brk(start, end - start);
        }
        return 0;
 }
@@ -275,7 +272,7 @@ static int load_aout_binary(struct linux_binprm * bprm)
                map_size = ex.a_text+ex.a_data;
 #endif
                error = vm_brk(text_addr & PAGE_MASK, map_size);
-               if (error != (text_addr & PAGE_MASK))
+               if (error)
                        return error;
 
                error = read_code(bprm->file, text_addr, pos,
@@ -298,7 +295,7 @@ static int load_aout_binary(struct linux_binprm * bprm)
 
                if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
                        error = vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
-                       if (IS_ERR_VALUE(error))
+                       if (error)
                                return error;
 
                        read_code(bprm->file, N_TXTADDR(ex), fd_offset,
@@ -382,7 +379,7 @@ static int load_aout_library(struct file *file)
                               file);
                }
                retval = vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
-               if (IS_ERR_VALUE(retval))
+               if (retval)
                        goto out;
 
                read_code(file, start_addr, N_TXTOFF(ex),
@@ -402,9 +399,8 @@ static int load_aout_library(struct file *file)
        len = PAGE_ALIGN(ex.a_text + ex.a_data);
        bss = ex.a_text + ex.a_data + ex.a_bss;
        if (bss > len) {
-               error = vm_brk(start_addr + len, bss - len);
-               retval = error;
-               if (error != start_addr + len)
+               retval = vm_brk(start_addr + len, bss - len);
+               if (retval)
                        goto out;
        }
        retval = 0;
index 938fc4ede764b42c23b217c213ff29d09b22c501..e158b22ef32f16d2fcf61c29fbf6d15a65581c1e 100644 (file)
@@ -96,10 +96,9 @@ static int set_brk(unsigned long start, unsigned long end)
        start = ELF_PAGEALIGN(start);
        end = ELF_PAGEALIGN(end);
        if (end > start) {
-               unsigned long addr;
-               addr = vm_brk(start, end - start);
-               if (BAD_ADDR(addr))
-                       return addr;
+               int error = vm_brk(start, end - start);
+               if (error)
+                       return error;
        }
        current->mm->start_brk = current->mm->brk = end;
        return 0;
@@ -629,7 +628,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
 
                /* Map the last of the bss segment */
                error = vm_brk(elf_bss, last_bss - elf_bss);
-               if (BAD_ADDR(error))
+               if (error)
                        goto out;
        }
 
@@ -1178,7 +1177,7 @@ static int load_elf_library(struct file *file)
        bss = eppnt->p_memsz + eppnt->p_vaddr;
        if (bss > len) {
                error = vm_brk(len, bss - len);
-               if (BAD_ADDR(error))
+               if (error)
                        goto out_free_ph;
        }
        error = 0;
index a00ec816233ae8247cb8a409cb7a5546fe231e0e..5df5feb49575cd66c17d574b7431ed5ee60e7ec3 100644 (file)
@@ -2018,7 +2018,7 @@ static inline void mm_populate(unsigned long addr, unsigned long len) {}
 #endif
 
 /* These take the mm semaphore themselves */
-extern unsigned long __must_check vm_brk(unsigned long, unsigned long);
+extern int __must_check vm_brk(unsigned long, unsigned long);
 extern int vm_munmap(unsigned long, size_t);
 extern unsigned long __must_check vm_mmap(struct file *, unsigned long,
         unsigned long, unsigned long,
index d3d9a94ca03119919bc36629c6656b43cf6db44d..de2c1769cc68d6de4744307ee45201a2f2c35cc4 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -168,7 +168,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
        return next;
 }
 
-static unsigned long do_brk(unsigned long addr, unsigned long len);
+static int do_brk(unsigned long addr, unsigned long len);
 
 SYSCALL_DEFINE1(brk, unsigned long, brk)
 {
@@ -224,7 +224,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
                goto out;
 
        /* Ok, looks good - let it rip. */
-       if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk)
+       if (do_brk(oldbrk, newbrk-oldbrk) < 0)
                goto out;
 
 set_brk:
@@ -2625,7 +2625,7 @@ static inline void verify_mm_writelocked(struct mm_struct *mm)
  *  anonymous maps.  eventually we may be able to do some
  *  brk-specific accounting here.
  */
-static unsigned long do_brk(unsigned long addr, unsigned long len)
+static int do_brk(unsigned long addr, unsigned long len)
 {
        struct mm_struct *mm = current->mm;
        struct vm_area_struct *vma, *prev;
@@ -2636,7 +2636,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len)
 
        len = PAGE_ALIGN(len);
        if (!len)
-               return addr;
+               return 0;
 
        flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
 
@@ -2703,13 +2703,13 @@ out:
        if (flags & VM_LOCKED)
                mm->locked_vm += (len >> PAGE_SHIFT);
        vma->vm_flags |= VM_SOFTDIRTY;
-       return addr;
+       return 0;
 }
 
-unsigned long vm_brk(unsigned long addr, unsigned long len)
+int vm_brk(unsigned long addr, unsigned long len)
 {
        struct mm_struct *mm = current->mm;
-       unsigned long ret;
+       int ret;
        bool populate;
 
        if (down_write_killable(&mm->mmap_sem))
@@ -2718,7 +2718,7 @@ unsigned long vm_brk(unsigned long addr, unsigned long len)
        ret = do_brk(addr, len);
        populate = ((mm->def_flags & VM_LOCKED) != 0);
        up_write(&mm->mmap_sem);
-       if (populate)
+       if (populate && !ret)
                mm_populate(addr, len);
        return ret;
 }
index c8bd59a03c71563b73c146d35e00550b8119d4c0..c2e58880207faa268e32541cdb68f7d0e7f6f9b2 100644 (file)
@@ -1682,7 +1682,7 @@ void exit_mmap(struct mm_struct *mm)
        }
 }
 
-unsigned long vm_brk(unsigned long addr, unsigned long len)
+int vm_brk(unsigned long addr, unsigned long len)
 {
        return -ENOMEM;
 }