Whamcloud - gitweb
land b1_5 onto HEAD
[fs/lustre-release.git] / lustre / kernel_patches / patches / brk-locked-2.6-suse-lnxi.patch
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
4 @@ -128,7 +128,7 @@
5         end = PAGE_ALIGN(end);
6         if (end <= start)
7                 return;
8 -       do_brk(start, end - start);
9 +       do_brk_locked(start, end - start);
10  }
11  
12  
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
16 @@ -114,7 +114,7 @@
17         start = PAGE_ALIGN(start);
18         end = PAGE_ALIGN(end);
19         if (end > start) {
20 -               unsigned long addr = do_brk(start, end - start);
21 +               unsigned long addr = do_brk_locked(start, end - start);
22                 if (BAD_ADDR(addr))
23                         return addr;
24         }
25 @@ -327,7 +327,7 @@
26                 pos = 32;
27                 map_size = ex.a_text+ex.a_data;
28  
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);
33                         return error;
34 @@ -363,7 +363,7 @@
35  
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),
43 @@ -476,7 +476,7 @@
44                 }
45  #endif
46  
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);
49                 
50                 file->f_op->read(file, (char *)start_addr,
51                         ex.a_text + ex.a_data, &pos);
52 @@ -500,7 +500,7 @@
53         len = PAGE_ALIGN(ex.a_text + ex.a_data);
54         bss = ex.a_text + ex.a_data + ex.a_bss;
55         if (bss > len) {
56 -               error = do_brk(start_addr + len, bss - len);
57 +               error = do_brk_locked(start_addr + len, bss - len);
58                 retval = error;
59                 if (error != start_addr + len)
60                         goto out;
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
64 @@ -51,7 +51,7 @@
65         start = PAGE_ALIGN(start);
66         end = PAGE_ALIGN(end);
67         if (end > start) {
68 -               unsigned long addr = do_brk(start, end - start);
69 +               unsigned long addr = do_brk_locked(start, end - start);
70                 if (BAD_ADDR(addr))
71                         return addr;
72         }
73 @@ -323,10 +323,10 @@
74                 loff_t pos = fd_offset;
75                 /* Fuck me plenty... */
76                 /* <AOL></AOL> */
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),
80                           ex.a_text, &pos);
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),
84                           ex.a_data, &pos);
85                 goto beyond_if;
86 @@ -347,7 +347,7 @@
87                 map_size = ex.a_text+ex.a_data;
88  #endif
89  
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);
94                         return error;
95 @@ -381,7 +381,7 @@
96  
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),
104 @@ -486,7 +486,7 @@
105                         error_time = jiffies;
106                 }
107  
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);
110                 
111                 file->f_op->read(file, (char *)start_addr,
112                         ex.a_text + ex.a_data, &pos);
113 @@ -510,7 +510,7 @@
114         len = PAGE_ALIGN(ex.a_text + ex.a_data);
115         bss = ex.a_text + ex.a_data + ex.a_bss;
116         if (bss > len) {
117 -               error = do_brk(start_addr + len, bss - len);
118 +               error = do_brk_locked(start_addr + len, bss - len);
119                 retval = error;
120                 if (error != start_addr + len)
121                         goto out;
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
125 @@ -88,7 +88,7 @@
126         start = ELF_PAGEALIGN(start);
127         end = ELF_PAGEALIGN(end);
128         if (end > start) {
129 -               unsigned long addr = do_brk(start, end - start);
130 +               unsigned long addr = do_brk_locked(start, end - start);
131                 if (BAD_ADDR(addr))
132                         return addr;
133         }
134 @@ -406,7 +406,7 @@
135  
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);
140                 if (BAD_ADDR(error))
141                         goto out_close;
142         }
143 @@ -446,7 +446,7 @@
144                 goto out;
145         }
146  
147 -       do_brk(0, text_data);
148 +       do_brk_locked(0, text_data);
149         if (!interpreter->f_op || !interpreter->f_op->read)
150                 goto out;
151         if (interpreter->f_op->read(interpreter, addr, text_data, &offset) < 0)
152 @@ -454,7 +454,7 @@
153         flush_icache_range((unsigned long)addr,
154                            (unsigned long)addr + text_data);
155  
156 -       do_brk(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1),
157 +       do_brk_locked(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1),
158                 interp_ex->a_bss);
159         elf_entry = interp_ex->a_entry;
160  
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;
164         if (bss > len)
165 -               do_brk(len, bss - len);
166 +               do_brk_locked(len, bss - len);
167         error = 0;
168  
169  out_free_ph:
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
173 @@ -821,6 +821,7 @@
174  extern int do_munmap(struct mm_struct *, unsigned long, size_t);
175  
176  extern unsigned long do_brk(unsigned long, unsigned long);
177 +extern unsigned long do_brk_locked(unsigned long, unsigned long);
178  
179  /* vma merging helpers */
180  static inline void
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 @@
185  
186  EXPORT_SYMBOL(do_brk);
187  
188 +/* locking version of do_brk. */
189 +unsigned long do_brk_locked(unsigned long addr, unsigned long len)
190 +{
191 +       unsigned long ret;
192 +
193 +       down_write(&current->mm->mmap_sem);
194 +       ret = do_brk(addr, len);
195 +       up_write(&current->mm->mmap_sem);
196 +
197 +       return ret;
198 +}
199 +
200 +EXPORT_SYMBOL(do_brk_locked);
201 +
202  /* Release all mmaps. */
203  void exit_mmap(struct mm_struct *mm)
204  {
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
208 @@ -227,6 +227,11 @@
209         return audit_lresult(mm->brk = brk);
210  }
211  
212 +unsigned long do_brk_locked(unsigned long addr, unsigned long len)
213 +{
214 +       return -ENOMEM;
215 +}
216 +
217  /*
218   * Combine the mmap "prot" and "flags" argument into one "vm_flags" used
219   * internally. Essentially, translate the "PROT_xxx" and "MAP_xxx" bits