1 diff -urN clean/arch/mips/kernel/irixelf.c linux-2.6.5-SLES9_SP1_BRANCH_91/arch/mips/kernel/irixelf.c
2 --- clean/arch/mips/kernel/irixelf.c 2005-01-09 12:25:26.000000000 -0500
3 +++ linux-2.6.5-SLES9_SP1_BRANCH_91/arch/mips/kernel/irixelf.c 2005-01-19 19:29:59.909824951 -0500
8 - do_brk(start, end - start);
9 + do_brk_locked(start, end - start);
13 diff -urN clean/arch/x86_64/ia32/ia32_aout.c linux-2.6.5-SLES9_SP1_BRANCH_91/arch/x86_64/ia32/ia32_aout.c
14 --- clean/arch/x86_64/ia32/ia32_aout.c 2005-01-09 12:25:33.000000000 -0500
15 +++ linux-2.6.5-SLES9_SP1_BRANCH_91/arch/x86_64/ia32/ia32_aout.c 2005-01-19 19:30:50.255145196 -0500
17 start = PAGE_ALIGN(start);
18 end = PAGE_ALIGN(end);
20 - unsigned long addr = do_brk(start, end - start);
21 + unsigned long addr = do_brk_locked(start, end - start);
27 map_size = ex.a_text+ex.a_data;
29 - error = do_brk(text_addr & PAGE_MASK, map_size);
30 + error = do_brk_locked(text_addr & PAGE_MASK, map_size);
31 if (error != (text_addr & PAGE_MASK)) {
32 send_sig(SIGKILL, current, 0);
36 if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
37 loff_t pos = fd_offset;
38 - do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
39 + do_brk_locked(N_TXTADDR(ex), ex.a_text+ex.a_data);
40 bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex),
41 ex.a_text+ex.a_data, &pos);
42 flush_icache_range((unsigned long) N_TXTADDR(ex),
47 - do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
48 + do_brk_locked(start_addr, ex.a_text + ex.a_data + ex.a_bss);
50 file->f_op->read(file, (char *)start_addr,
51 ex.a_text + ex.a_data, &pos);
53 len = PAGE_ALIGN(ex.a_text + ex.a_data);
54 bss = ex.a_text + ex.a_data + ex.a_bss;
56 - error = do_brk(start_addr + len, bss - len);
57 + error = do_brk_locked(start_addr + len, bss - len);
59 if (error != start_addr + len)
61 diff -urN clean/fs/binfmt_aout.c linux-2.6.5-SLES9_SP1_BRANCH_91/fs/binfmt_aout.c
62 --- clean/fs/binfmt_aout.c 2005-01-09 12:25:33.000000000 -0500
63 +++ linux-2.6.5-SLES9_SP1_BRANCH_91/fs/binfmt_aout.c 2005-01-19 19:31:40.480490745 -0500
65 start = PAGE_ALIGN(start);
66 end = PAGE_ALIGN(end);
68 - unsigned long addr = do_brk(start, end - start);
69 + unsigned long addr = do_brk_locked(start, end - start);
74 loff_t pos = fd_offset;
75 /* Fuck me plenty... */
77 - error = do_brk(N_TXTADDR(ex), ex.a_text);
78 + error = do_brk_locked(N_TXTADDR(ex), ex.a_text);
79 bprm->file->f_op->read(bprm->file, (char *) N_TXTADDR(ex),
81 - error = do_brk(N_DATADDR(ex), ex.a_data);
82 + error = do_brk_locked(N_DATADDR(ex), ex.a_data);
83 bprm->file->f_op->read(bprm->file, (char *) N_DATADDR(ex),
87 map_size = ex.a_text+ex.a_data;
90 - error = do_brk(text_addr & PAGE_MASK, map_size);
91 + error = do_brk_locked(text_addr & PAGE_MASK, map_size);
92 if (error != (text_addr & PAGE_MASK)) {
93 send_sig(SIGKILL, current, 0);
97 if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
98 loff_t pos = fd_offset;
99 - do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
100 + do_brk_locked(N_TXTADDR(ex), ex.a_text+ex.a_data);
101 bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex),
102 ex.a_text+ex.a_data, &pos);
103 flush_icache_range((unsigned long) N_TXTADDR(ex),
105 error_time = jiffies;
108 - do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
109 + do_brk_locked(start_addr, ex.a_text + ex.a_data + ex.a_bss);
111 file->f_op->read(file, (char *)start_addr,
112 ex.a_text + ex.a_data, &pos);
114 len = PAGE_ALIGN(ex.a_text + ex.a_data);
115 bss = ex.a_text + ex.a_data + ex.a_bss;
117 - error = do_brk(start_addr + len, bss - len);
118 + error = do_brk_locked(start_addr + len, bss - len);
120 if (error != start_addr + len)
122 diff -urN clean/fs/binfmt_elf.c linux-2.6.5-SLES9_SP1_BRANCH_91/fs/binfmt_elf.c
123 --- clean/fs/binfmt_elf.c 2005-01-09 12:25:33.000000000 -0500
124 +++ linux-2.6.5-SLES9_SP1_BRANCH_91/fs/binfmt_elf.c 2005-01-19 19:29:59.914823791 -0500
126 start = ELF_PAGEALIGN(start);
127 end = ELF_PAGEALIGN(end);
129 - unsigned long addr = do_brk(start, end - start);
130 + unsigned long addr = do_brk_locked(start, end - start);
136 /* Map the last of the bss segment */
137 if (last_bss > elf_bss) {
138 - error = do_brk(elf_bss, last_bss - elf_bss);
139 + error = do_brk_locked(elf_bss, last_bss - elf_bss);
147 - do_brk(0, text_data);
148 + do_brk_locked(0, text_data);
149 if (!interpreter->f_op || !interpreter->f_op->read)
151 if (interpreter->f_op->read(interpreter, addr, text_data, &offset) < 0)
153 flush_icache_range((unsigned long)addr,
154 (unsigned long)addr + text_data);
156 - do_brk(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1),
157 + do_brk_locked(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1),
159 elf_entry = interp_ex->a_entry;
161 @@ -1006,7 +1006,7 @@
162 len = ELF_PAGESTART(elf_phdata->p_filesz + elf_phdata->p_vaddr + ELF_MIN_ALIGN - 1);
163 bss = elf_phdata->p_memsz + elf_phdata->p_vaddr;
165 - do_brk(len, bss - len);
166 + do_brk_locked(len, bss - len);
170 diff -urN clean/include/linux/mm.h linux-2.6.5-SLES9_SP1_BRANCH_91/include/linux/mm.h
171 --- clean/include/linux/mm.h 2005-01-09 12:25:34.000000000 -0500
172 +++ linux-2.6.5-SLES9_SP1_BRANCH_91/include/linux/mm.h 2005-01-19 19:29:59.915823559 -0500
174 extern int do_munmap(struct mm_struct *, unsigned long, size_t);
176 extern unsigned long do_brk(unsigned long, unsigned long);
177 +extern unsigned long do_brk_locked(unsigned long, unsigned long);
179 /* vma merging helpers */
181 diff -urN clean/mm/mmap.c linux-2.6.5-SLES9_SP1_BRANCH_91/mm/mmap.c
182 --- clean/mm/mmap.c 2005-01-09 12:25:34.000000000 -0500
183 +++ linux-2.6.5-SLES9_SP1_BRANCH_91/mm/mmap.c 2005-01-19 19:29:59.917823095 -0500
184 @@ -1658,6 +1658,20 @@
186 EXPORT_SYMBOL(do_brk);
188 +/* locking version of do_brk. */
189 +unsigned long do_brk_locked(unsigned long addr, unsigned long len)
193 + down_write(¤t->mm->mmap_sem);
194 + ret = do_brk(addr, len);
195 + up_write(¤t->mm->mmap_sem);
200 +EXPORT_SYMBOL(do_brk_locked);
202 /* Release all mmaps. */
203 void exit_mmap(struct mm_struct *mm)
205 diff -urN clean/mm/nommu.c linux-2.6.5-SLES9_SP1_BRANCH_91/mm/nommu.c
206 --- clean/mm/nommu.c 2005-01-09 12:25:27.000000000 -0500
207 +++ linux-2.6.5-SLES9_SP1_BRANCH_91/mm/nommu.c 2005-01-19 19:29:59.918822864 -0500
209 return audit_lresult(mm->brk = brk);
212 +unsigned long do_brk_locked(unsigned long addr, unsigned long len)
218 * Combine the mmap "prot" and "flags" argument into one "vm_flags" used
219 * internally. Essentially, translate the "PROT_xxx" and "MAP_xxx" bits