Skip to content

Commit 5d22fc2

Browse files
committed
mm: remove more IS_ERR_VALUE abuses
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>
1 parent 287980e commit 5d22fc2

6 files changed

Lines changed: 30 additions & 36 deletions

File tree

arch/x86/ia32/ia32_aout.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,12 @@ static struct linux_binfmt aout_format = {
116116
.min_coredump = PAGE_SIZE
117117
};
118118

119-
static unsigned long set_brk(unsigned long start, unsigned long end)
119+
static int set_brk(unsigned long start, unsigned long end)
120120
{
121121
start = PAGE_ALIGN(start);
122122
end = PAGE_ALIGN(end);
123123
if (end <= start)
124-
return start;
124+
return 0;
125125
return vm_brk(start, end - start);
126126
}
127127

@@ -321,7 +321,7 @@ static int load_aout_binary(struct linux_binprm *bprm)
321321

322322
error = vm_brk(text_addr & PAGE_MASK, map_size);
323323

324-
if (error != (text_addr & PAGE_MASK))
324+
if (error)
325325
return error;
326326

327327
error = read_code(bprm->file, text_addr, 32,
@@ -350,7 +350,7 @@ static int load_aout_binary(struct linux_binprm *bprm)
350350

351351
if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) {
352352
error = vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
353-
if (IS_ERR_VALUE(error))
353+
if (error)
354354
return error;
355355

356356
read_code(bprm->file, N_TXTADDR(ex), fd_offset,
@@ -378,7 +378,7 @@ static int load_aout_binary(struct linux_binprm *bprm)
378378

379379
beyond_if:
380380
error = set_brk(current->mm->start_brk, current->mm->brk);
381-
if (IS_ERR_VALUE(error))
381+
if (error)
382382
return error;
383383

384384
set_binfmt(&aout_format);
@@ -441,7 +441,7 @@ static int load_aout_library(struct file *file)
441441
}
442442
#endif
443443
retval = vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
444-
if (IS_ERR_VALUE(retval))
444+
if (retval)
445445
goto out;
446446

447447
read_code(file, start_addr, N_TXTOFF(ex),
@@ -461,9 +461,8 @@ static int load_aout_library(struct file *file)
461461
len = PAGE_ALIGN(ex.a_text + ex.a_data);
462462
bss = ex.a_text + ex.a_data + ex.a_bss;
463463
if (bss > len) {
464-
error = vm_brk(start_addr + len, bss - len);
465-
retval = error;
466-
if (error != start_addr + len)
464+
retval = vm_brk(start_addr + len, bss - len);
465+
if (retval)
467466
goto out;
468467
}
469468
retval = 0;

fs/binfmt_aout.c

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,8 @@ static int set_brk(unsigned long start, unsigned long end)
127127
{
128128
start = PAGE_ALIGN(start);
129129
end = PAGE_ALIGN(end);
130-
if (end > start) {
131-
unsigned long addr;
132-
addr = vm_brk(start, end - start);
133-
if (BAD_ADDR(addr))
134-
return addr;
130+
if (end > start)
131+
return vm_brk(start, end - start);
135132
}
136133
return 0;
137134
}
@@ -275,7 +272,7 @@ static int load_aout_binary(struct linux_binprm * bprm)
275272
map_size = ex.a_text+ex.a_data;
276273
#endif
277274
error = vm_brk(text_addr & PAGE_MASK, map_size);
278-
if (error != (text_addr & PAGE_MASK))
275+
if (error)
279276
return error;
280277

281278
error = read_code(bprm->file, text_addr, pos,
@@ -298,7 +295,7 @@ static int load_aout_binary(struct linux_binprm * bprm)
298295

299296
if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
300297
error = vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
301-
if (IS_ERR_VALUE(error))
298+
if (error)
302299
return error;
303300

304301
read_code(bprm->file, N_TXTADDR(ex), fd_offset,
@@ -382,7 +379,7 @@ static int load_aout_library(struct file *file)
382379
file);
383380
}
384381
retval = vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
385-
if (IS_ERR_VALUE(retval))
382+
if (retval)
386383
goto out;
387384

388385
read_code(file, start_addr, N_TXTOFF(ex),
@@ -402,9 +399,8 @@ static int load_aout_library(struct file *file)
402399
len = PAGE_ALIGN(ex.a_text + ex.a_data);
403400
bss = ex.a_text + ex.a_data + ex.a_bss;
404401
if (bss > len) {
405-
error = vm_brk(start_addr + len, bss - len);
406-
retval = error;
407-
if (error != start_addr + len)
402+
retval = vm_brk(start_addr + len, bss - len);
403+
if (retval)
408404
goto out;
409405
}
410406
retval = 0;

fs/binfmt_elf.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,9 @@ static int set_brk(unsigned long start, unsigned long end)
9696
start = ELF_PAGEALIGN(start);
9797
end = ELF_PAGEALIGN(end);
9898
if (end > start) {
99-
unsigned long addr;
100-
addr = vm_brk(start, end - start);
101-
if (BAD_ADDR(addr))
102-
return addr;
99+
int error = vm_brk(start, end - start);
100+
if (error)
101+
return error;
103102
}
104103
current->mm->start_brk = current->mm->brk = end;
105104
return 0;
@@ -629,7 +628,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
629628

630629
/* Map the last of the bss segment */
631630
error = vm_brk(elf_bss, last_bss - elf_bss);
632-
if (BAD_ADDR(error))
631+
if (error)
633632
goto out;
634633
}
635634

@@ -1178,7 +1177,7 @@ static int load_elf_library(struct file *file)
11781177
bss = eppnt->p_memsz + eppnt->p_vaddr;
11791178
if (bss > len) {
11801179
error = vm_brk(len, bss - len);
1181-
if (BAD_ADDR(error))
1180+
if (error)
11821181
goto out_free_ph;
11831182
}
11841183
error = 0;

include/linux/mm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2018,7 +2018,7 @@ static inline void mm_populate(unsigned long addr, unsigned long len) {}
20182018
#endif
20192019

20202020
/* These take the mm semaphore themselves */
2021-
extern unsigned long __must_check vm_brk(unsigned long, unsigned long);
2021+
extern int __must_check vm_brk(unsigned long, unsigned long);
20222022
extern int vm_munmap(unsigned long, size_t);
20232023
extern unsigned long __must_check vm_mmap(struct file *, unsigned long,
20242024
unsigned long, unsigned long,

mm/mmap.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
168168
return next;
169169
}
170170

171-
static unsigned long do_brk(unsigned long addr, unsigned long len);
171+
static int do_brk(unsigned long addr, unsigned long len);
172172

173173
SYSCALL_DEFINE1(brk, unsigned long, brk)
174174
{
@@ -224,7 +224,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
224224
goto out;
225225

226226
/* Ok, looks good - let it rip. */
227-
if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk)
227+
if (do_brk(oldbrk, newbrk-oldbrk) < 0)
228228
goto out;
229229

230230
set_brk:
@@ -2625,7 +2625,7 @@ static inline void verify_mm_writelocked(struct mm_struct *mm)
26252625
* anonymous maps. eventually we may be able to do some
26262626
* brk-specific accounting here.
26272627
*/
2628-
static unsigned long do_brk(unsigned long addr, unsigned long len)
2628+
static int do_brk(unsigned long addr, unsigned long len)
26292629
{
26302630
struct mm_struct *mm = current->mm;
26312631
struct vm_area_struct *vma, *prev;
@@ -2636,7 +2636,7 @@ static unsigned long do_brk(unsigned long addr, unsigned long len)
26362636

26372637
len = PAGE_ALIGN(len);
26382638
if (!len)
2639-
return addr;
2639+
return 0;
26402640

26412641
flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
26422642

@@ -2703,13 +2703,13 @@ static unsigned long do_brk(unsigned long addr, unsigned long len)
27032703
if (flags & VM_LOCKED)
27042704
mm->locked_vm += (len >> PAGE_SHIFT);
27052705
vma->vm_flags |= VM_SOFTDIRTY;
2706-
return addr;
2706+
return 0;
27072707
}
27082708

2709-
unsigned long vm_brk(unsigned long addr, unsigned long len)
2709+
int vm_brk(unsigned long addr, unsigned long len)
27102710
{
27112711
struct mm_struct *mm = current->mm;
2712-
unsigned long ret;
2712+
int ret;
27132713
bool populate;
27142714

27152715
if (down_write_killable(&mm->mmap_sem))
@@ -2718,7 +2718,7 @@ unsigned long vm_brk(unsigned long addr, unsigned long len)
27182718
ret = do_brk(addr, len);
27192719
populate = ((mm->def_flags & VM_LOCKED) != 0);
27202720
up_write(&mm->mmap_sem);
2721-
if (populate)
2721+
if (populate && !ret)
27222722
mm_populate(addr, len);
27232723
return ret;
27242724
}

mm/nommu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1682,7 +1682,7 @@ void exit_mmap(struct mm_struct *mm)
16821682
}
16831683
}
16841684

1685-
unsigned long vm_brk(unsigned long addr, unsigned long len)
1685+
int vm_brk(unsigned long addr, unsigned long len)
16861686
{
16871687
return -ENOMEM;
16881688
}

0 commit comments

Comments
 (0)