Annotation of /trunk/kernel26-magellan/patches-2.6.25-r5/0108-2.6.25.9-all-fixes.patch
Parent Directory | Revision Log
Revision 677 -
(hide annotations)
(download)
Wed Sep 10 21:27:27 2008 UTC (16 years ago) by niro
File size: 14607 byte(s)
Wed Sep 10 21:27:27 2008 UTC (16 years ago) by niro
File size: 14607 byte(s)
2.6.25-magellan-r5: - updated to linux-2.6.25.17
1 | niro | 677 | diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c |
2 | index d3437c4..e3b2185 100644 | ||
3 | --- a/arch/powerpc/kernel/vdso.c | ||
4 | +++ b/arch/powerpc/kernel/vdso.c | ||
5 | @@ -141,7 +141,7 @@ static void dump_one_vdso_page(struct page *pg, struct page *upg) | ||
6 | printk("kpg: %p (c:%d,f:%08lx)", __va(page_to_pfn(pg) << PAGE_SHIFT), | ||
7 | page_count(pg), | ||
8 | pg->flags); | ||
9 | - if (upg/* && pg != upg*/) { | ||
10 | + if (upg && !IS_ERR(upg) /* && pg != upg*/) { | ||
11 | printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg) | ||
12 | << PAGE_SHIFT), | ||
13 | page_count(upg), | ||
14 | diff --git a/arch/x86/kernel/setup_32.c b/arch/x86/kernel/setup_32.c | ||
15 | index 2b3e5d4..9ac056b 100644 | ||
16 | --- a/arch/x86/kernel/setup_32.c | ||
17 | +++ b/arch/x86/kernel/setup_32.c | ||
18 | @@ -483,10 +483,16 @@ static void __init reserve_crashkernel(void) | ||
19 | (unsigned long)(crash_size >> 20), | ||
20 | (unsigned long)(crash_base >> 20), | ||
21 | (unsigned long)(total_mem >> 20)); | ||
22 | + | ||
23 | + if (reserve_bootmem(crash_base, crash_size, | ||
24 | + BOOTMEM_EXCLUSIVE) < 0) { | ||
25 | + printk(KERN_INFO "crashkernel reservation " | ||
26 | + "failed - memory is in use\n"); | ||
27 | + return; | ||
28 | + } | ||
29 | + | ||
30 | crashk_res.start = crash_base; | ||
31 | crashk_res.end = crash_base + crash_size - 1; | ||
32 | - reserve_bootmem(crash_base, crash_size, | ||
33 | - BOOTMEM_DEFAULT); | ||
34 | } else | ||
35 | printk(KERN_INFO "crashkernel reservation failed - " | ||
36 | "you have to specify a base address\n"); | ||
37 | diff --git a/drivers/hwmon/adt7473.c b/drivers/hwmon/adt7473.c | ||
38 | index 9587869..8396e0f 100644 | ||
39 | --- a/drivers/hwmon/adt7473.c | ||
40 | +++ b/drivers/hwmon/adt7473.c | ||
41 | @@ -309,6 +309,9 @@ no_sensor_update: | ||
42 | ADT7473_REG_PWM_BHVR(i)); | ||
43 | } | ||
44 | |||
45 | + i = i2c_smbus_read_byte_data(client, ADT7473_REG_CFG4); | ||
46 | + data->max_duty_at_overheat = !!(i & ADT7473_CFG4_MAX_DUTY_AT_OVT); | ||
47 | + | ||
48 | data->limits_last_updated = local_jiffies; | ||
49 | data->limits_valid = 1; | ||
50 | |||
51 | diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c | ||
52 | index 182fe6a..30bdd50 100644 | ||
53 | --- a/drivers/hwmon/lm85.c | ||
54 | +++ b/drivers/hwmon/lm85.c | ||
55 | @@ -192,7 +192,7 @@ static int RANGE_TO_REG( int range ) | ||
56 | { | ||
57 | int i; | ||
58 | |||
59 | - if ( range < lm85_range_map[0] ) { | ||
60 | + if (range <= lm85_range_map[0]) { | ||
61 | return 0 ; | ||
62 | } else if ( range > lm85_range_map[15] ) { | ||
63 | return 15 ; | ||
64 | diff --git a/drivers/net/atl1/atl1_hw.c b/drivers/net/atl1/atl1_hw.c | ||
65 | index 9d3bd22..a965f68 100644 | ||
66 | --- a/drivers/net/atl1/atl1_hw.c | ||
67 | +++ b/drivers/net/atl1/atl1_hw.c | ||
68 | @@ -250,7 +250,6 @@ static int atl1_get_permanent_address(struct atl1_hw *hw) | ||
69 | memcpy(hw->perm_mac_addr, eth_addr, ETH_ALEN); | ||
70 | return 0; | ||
71 | } | ||
72 | - return 1; | ||
73 | } | ||
74 | |||
75 | /* see if SPI FLAGS exist ? */ | ||
76 | diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c | ||
77 | index 6483d10..2b756ef 100644 | ||
78 | --- a/drivers/watchdog/hpwdt.c | ||
79 | +++ b/drivers/watchdog/hpwdt.c | ||
80 | @@ -140,49 +140,52 @@ static struct pci_device_id hpwdt_devices[] = { | ||
81 | }; | ||
82 | MODULE_DEVICE_TABLE(pci, hpwdt_devices); | ||
83 | |||
84 | +extern asmlinkage void asminline_call(struct cmn_registers *pi86Regs, unsigned long *pRomEntry); | ||
85 | + | ||
86 | #ifndef CONFIG_X86_64 | ||
87 | /* --32 Bit Bios------------------------------------------------------------ */ | ||
88 | |||
89 | #define HPWDT_ARCH 32 | ||
90 | |||
91 | -static void asminline_call(struct cmn_registers *pi86Regs, | ||
92 | - unsigned long *pRomEntry) | ||
93 | -{ | ||
94 | - asm("pushl %ebp \n\t" | ||
95 | - "movl %esp, %ebp \n\t" | ||
96 | - "pusha \n\t" | ||
97 | - "pushf \n\t" | ||
98 | - "push %es \n\t" | ||
99 | - "push %ds \n\t" | ||
100 | - "pop %es \n\t" | ||
101 | - "movl 8(%ebp),%eax \n\t" | ||
102 | - "movl 4(%eax),%ebx \n\t" | ||
103 | - "movl 8(%eax),%ecx \n\t" | ||
104 | - "movl 12(%eax),%edx \n\t" | ||
105 | - "movl 16(%eax),%esi \n\t" | ||
106 | - "movl 20(%eax),%edi \n\t" | ||
107 | - "movl (%eax),%eax \n\t" | ||
108 | - "push %cs \n\t" | ||
109 | - "call *12(%ebp) \n\t" | ||
110 | - "pushf \n\t" | ||
111 | - "pushl %eax \n\t" | ||
112 | - "movl 8(%ebp),%eax \n\t" | ||
113 | - "movl %ebx,4(%eax) \n\t" | ||
114 | - "movl %ecx,8(%eax) \n\t" | ||
115 | - "movl %edx,12(%eax) \n\t" | ||
116 | - "movl %esi,16(%eax) \n\t" | ||
117 | - "movl %edi,20(%eax) \n\t" | ||
118 | - "movw %ds,24(%eax) \n\t" | ||
119 | - "movw %es,26(%eax) \n\t" | ||
120 | - "popl %ebx \n\t" | ||
121 | - "movl %ebx,(%eax) \n\t" | ||
122 | - "popl %ebx \n\t" | ||
123 | - "movl %ebx,28(%eax) \n\t" | ||
124 | - "pop %es \n\t" | ||
125 | - "popf \n\t" | ||
126 | - "popa \n\t" | ||
127 | - "leave \n\t" "ret"); | ||
128 | -} | ||
129 | +asm(".text \n\t" | ||
130 | + ".align 4 \n" | ||
131 | + "asminline_call: \n\t" | ||
132 | + "pushl %ebp \n\t" | ||
133 | + "movl %esp, %ebp \n\t" | ||
134 | + "pusha \n\t" | ||
135 | + "pushf \n\t" | ||
136 | + "push %es \n\t" | ||
137 | + "push %ds \n\t" | ||
138 | + "pop %es \n\t" | ||
139 | + "movl 8(%ebp),%eax \n\t" | ||
140 | + "movl 4(%eax),%ebx \n\t" | ||
141 | + "movl 8(%eax),%ecx \n\t" | ||
142 | + "movl 12(%eax),%edx \n\t" | ||
143 | + "movl 16(%eax),%esi \n\t" | ||
144 | + "movl 20(%eax),%edi \n\t" | ||
145 | + "movl (%eax),%eax \n\t" | ||
146 | + "push %cs \n\t" | ||
147 | + "call *12(%ebp) \n\t" | ||
148 | + "pushf \n\t" | ||
149 | + "pushl %eax \n\t" | ||
150 | + "movl 8(%ebp),%eax \n\t" | ||
151 | + "movl %ebx,4(%eax) \n\t" | ||
152 | + "movl %ecx,8(%eax) \n\t" | ||
153 | + "movl %edx,12(%eax) \n\t" | ||
154 | + "movl %esi,16(%eax) \n\t" | ||
155 | + "movl %edi,20(%eax) \n\t" | ||
156 | + "movw %ds,24(%eax) \n\t" | ||
157 | + "movw %es,26(%eax) \n\t" | ||
158 | + "popl %ebx \n\t" | ||
159 | + "movl %ebx,(%eax) \n\t" | ||
160 | + "popl %ebx \n\t" | ||
161 | + "movl %ebx,28(%eax) \n\t" | ||
162 | + "pop %es \n\t" | ||
163 | + "popf \n\t" | ||
164 | + "popa \n\t" | ||
165 | + "leave \n\t" | ||
166 | + "ret \n\t" | ||
167 | + ".previous"); | ||
168 | |||
169 | /* | ||
170 | * cru_detect | ||
171 | @@ -333,43 +336,44 @@ static int __devinit detect_cru_service(void) | ||
172 | |||
173 | #define HPWDT_ARCH 64 | ||
174 | |||
175 | -static void asminline_call(struct cmn_registers *pi86Regs, | ||
176 | - unsigned long *pRomEntry) | ||
177 | -{ | ||
178 | - asm("pushq %rbp \n\t" | ||
179 | - "movq %rsp, %rbp \n\t" | ||
180 | - "pushq %rax \n\t" | ||
181 | - "pushq %rbx \n\t" | ||
182 | - "pushq %rdx \n\t" | ||
183 | - "pushq %r12 \n\t" | ||
184 | - "pushq %r9 \n\t" | ||
185 | - "movq %rsi, %r12 \n\t" | ||
186 | - "movq %rdi, %r9 \n\t" | ||
187 | - "movl 4(%r9),%ebx \n\t" | ||
188 | - "movl 8(%r9),%ecx \n\t" | ||
189 | - "movl 12(%r9),%edx \n\t" | ||
190 | - "movl 16(%r9),%esi \n\t" | ||
191 | - "movl 20(%r9),%edi \n\t" | ||
192 | - "movl (%r9),%eax \n\t" | ||
193 | - "call *%r12 \n\t" | ||
194 | - "pushfq \n\t" | ||
195 | - "popq %r12 \n\t" | ||
196 | - "popfq \n\t" | ||
197 | - "movl %eax, (%r9) \n\t" | ||
198 | - "movl %ebx, 4(%r9) \n\t" | ||
199 | - "movl %ecx, 8(%r9) \n\t" | ||
200 | - "movl %edx, 12(%r9) \n\t" | ||
201 | - "movl %esi, 16(%r9) \n\t" | ||
202 | - "movl %edi, 20(%r9) \n\t" | ||
203 | - "movq %r12, %rax \n\t" | ||
204 | - "movl %eax, 28(%r9) \n\t" | ||
205 | - "popq %r9 \n\t" | ||
206 | - "popq %r12 \n\t" | ||
207 | - "popq %rdx \n\t" | ||
208 | - "popq %rbx \n\t" | ||
209 | - "popq %rax \n\t" | ||
210 | - "leave \n\t" "ret"); | ||
211 | -} | ||
212 | +asm(".text \n\t" | ||
213 | + ".align 4 \n" | ||
214 | + "asminline_call: \n\t" | ||
215 | + "pushq %rbp \n\t" | ||
216 | + "movq %rsp, %rbp \n\t" | ||
217 | + "pushq %rax \n\t" | ||
218 | + "pushq %rbx \n\t" | ||
219 | + "pushq %rdx \n\t" | ||
220 | + "pushq %r12 \n\t" | ||
221 | + "pushq %r9 \n\t" | ||
222 | + "movq %rsi, %r12 \n\t" | ||
223 | + "movq %rdi, %r9 \n\t" | ||
224 | + "movl 4(%r9),%ebx \n\t" | ||
225 | + "movl 8(%r9),%ecx \n\t" | ||
226 | + "movl 12(%r9),%edx \n\t" | ||
227 | + "movl 16(%r9),%esi \n\t" | ||
228 | + "movl 20(%r9),%edi \n\t" | ||
229 | + "movl (%r9),%eax \n\t" | ||
230 | + "call *%r12 \n\t" | ||
231 | + "pushfq \n\t" | ||
232 | + "popq %r12 \n\t" | ||
233 | + "popfq \n\t" | ||
234 | + "movl %eax, (%r9) \n\t" | ||
235 | + "movl %ebx, 4(%r9) \n\t" | ||
236 | + "movl %ecx, 8(%r9) \n\t" | ||
237 | + "movl %edx, 12(%r9) \n\t" | ||
238 | + "movl %esi, 16(%r9) \n\t" | ||
239 | + "movl %edi, 20(%r9) \n\t" | ||
240 | + "movq %r12, %rax \n\t" | ||
241 | + "movl %eax, 28(%r9) \n\t" | ||
242 | + "popq %r9 \n\t" | ||
243 | + "popq %r12 \n\t" | ||
244 | + "popq %rdx \n\t" | ||
245 | + "popq %rbx \n\t" | ||
246 | + "popq %rax \n\t" | ||
247 | + "leave \n\t" | ||
248 | + "ret \n\t" | ||
249 | + ".previous"); | ||
250 | |||
251 | /* | ||
252 | * dmi_find_cru | ||
253 | diff --git a/include/asm-x86/page_32.h b/include/asm-x86/page_32.h | ||
254 | index 5f7257f..8f8085b 100644 | ||
255 | --- a/include/asm-x86/page_32.h | ||
256 | +++ b/include/asm-x86/page_32.h | ||
257 | @@ -14,7 +14,8 @@ | ||
258 | #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) | ||
259 | |||
260 | #ifdef CONFIG_X86_PAE | ||
261 | -#define __PHYSICAL_MASK_SHIFT 36 | ||
262 | +/* 44=32+12, the limit we can fit into an unsigned long pfn */ | ||
263 | +#define __PHYSICAL_MASK_SHIFT 44 | ||
264 | #define __VIRTUAL_MASK_SHIFT 32 | ||
265 | #define PAGETABLE_LEVELS 3 | ||
266 | |||
267 | diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h | ||
268 | index 4e4e340..db3d837 100644 | ||
269 | --- a/include/linux/bootmem.h | ||
270 | +++ b/include/linux/bootmem.h | ||
271 | @@ -94,7 +94,7 @@ extern unsigned long init_bootmem_node(pg_data_t *pgdat, | ||
272 | unsigned long freepfn, | ||
273 | unsigned long startpfn, | ||
274 | unsigned long endpfn); | ||
275 | -extern void reserve_bootmem_node(pg_data_t *pgdat, | ||
276 | +extern int reserve_bootmem_node(pg_data_t *pgdat, | ||
277 | unsigned long physaddr, | ||
278 | unsigned long size, | ||
279 | int flags); | ||
280 | diff --git a/mm/bootmem.c b/mm/bootmem.c | ||
281 | index 2ccea70..8bb58da 100644 | ||
282 | --- a/mm/bootmem.c | ||
283 | +++ b/mm/bootmem.c | ||
284 | @@ -398,10 +398,10 @@ unsigned long __init init_bootmem_node(pg_data_t *pgdat, unsigned long freepfn, | ||
285 | return init_bootmem_core(pgdat, freepfn, startpfn, endpfn); | ||
286 | } | ||
287 | |||
288 | -void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, | ||
289 | +int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, | ||
290 | unsigned long size, int flags) | ||
291 | { | ||
292 | - reserve_bootmem_core(pgdat->bdata, physaddr, size, flags); | ||
293 | + return reserve_bootmem_core(pgdat->bdata, physaddr, size, flags); | ||
294 | } | ||
295 | |||
296 | void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr, | ||
297 | diff --git a/mm/memory.c b/mm/memory.c | ||
298 | index 0d14d1e..df84668 100644 | ||
299 | --- a/mm/memory.c | ||
300 | +++ b/mm/memory.c | ||
301 | @@ -943,17 +943,15 @@ struct page *follow_page(struct vm_area_struct *vma, unsigned long address, | ||
302 | } | ||
303 | |||
304 | ptep = pte_offset_map_lock(mm, pmd, address, &ptl); | ||
305 | - if (!ptep) | ||
306 | - goto out; | ||
307 | |||
308 | pte = *ptep; | ||
309 | if (!pte_present(pte)) | ||
310 | - goto unlock; | ||
311 | + goto no_page; | ||
312 | if ((flags & FOLL_WRITE) && !pte_write(pte)) | ||
313 | goto unlock; | ||
314 | page = vm_normal_page(vma, address, pte); | ||
315 | if (unlikely(!page)) | ||
316 | - goto unlock; | ||
317 | + goto bad_page; | ||
318 | |||
319 | if (flags & FOLL_GET) | ||
320 | get_page(page); | ||
321 | @@ -968,6 +966,15 @@ unlock: | ||
322 | out: | ||
323 | return page; | ||
324 | |||
325 | +bad_page: | ||
326 | + pte_unmap_unlock(ptep, ptl); | ||
327 | + return ERR_PTR(-EFAULT); | ||
328 | + | ||
329 | +no_page: | ||
330 | + pte_unmap_unlock(ptep, ptl); | ||
331 | + if (!pte_none(pte)) | ||
332 | + return page; | ||
333 | + /* Fall through to ZERO_PAGE handling */ | ||
334 | no_page_table: | ||
335 | /* | ||
336 | * When core dumping an enormous anonymous area that nobody | ||
337 | @@ -982,6 +989,26 @@ no_page_table: | ||
338 | return page; | ||
339 | } | ||
340 | |||
341 | +/* Can we do the FOLL_ANON optimization? */ | ||
342 | +static inline int use_zero_page(struct vm_area_struct *vma) | ||
343 | +{ | ||
344 | + /* | ||
345 | + * We don't want to optimize FOLL_ANON for make_pages_present() | ||
346 | + * when it tries to page in a VM_LOCKED region. As to VM_SHARED, | ||
347 | + * we want to get the page from the page tables to make sure | ||
348 | + * that we serialize and update with any other user of that | ||
349 | + * mapping. | ||
350 | + */ | ||
351 | + if (vma->vm_flags & (VM_LOCKED | VM_SHARED)) | ||
352 | + return 0; | ||
353 | + /* | ||
354 | + * And if we have a fault or a nopfn routine, it's not an | ||
355 | + * anonymous region. | ||
356 | + */ | ||
357 | + return !vma->vm_ops || | ||
358 | + (!vma->vm_ops->fault && !vma->vm_ops->nopfn); | ||
359 | +} | ||
360 | + | ||
361 | int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | ||
362 | unsigned long start, int len, int write, int force, | ||
363 | struct page **pages, struct vm_area_struct **vmas) | ||
364 | @@ -1056,9 +1083,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | ||
365 | foll_flags = FOLL_TOUCH; | ||
366 | if (pages) | ||
367 | foll_flags |= FOLL_GET; | ||
368 | - if (!write && !(vma->vm_flags & VM_LOCKED) && | ||
369 | - (!vma->vm_ops || (!vma->vm_ops->nopage && | ||
370 | - !vma->vm_ops->fault))) | ||
371 | + if (!write && use_zero_page(vma)) | ||
372 | foll_flags |= FOLL_ANON; | ||
373 | |||
374 | do { | ||
375 | @@ -1104,6 +1129,8 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | ||
376 | |||
377 | cond_resched(); | ||
378 | } | ||
379 | + if (IS_ERR(page)) | ||
380 | + return i ? i : PTR_ERR(page); | ||
381 | if (pages) { | ||
382 | pages[i] = page; | ||
383 | |||
384 | diff --git a/mm/migrate.c b/mm/migrate.c | ||
385 | index 4e0eccc..6acc815 100644 | ||
386 | --- a/mm/migrate.c | ||
387 | +++ b/mm/migrate.c | ||
388 | @@ -858,6 +858,11 @@ static int do_move_pages(struct mm_struct *mm, struct page_to_node *pm, | ||
389 | goto set_status; | ||
390 | |||
391 | page = follow_page(vma, pp->addr, FOLL_GET); | ||
392 | + | ||
393 | + err = PTR_ERR(page); | ||
394 | + if (IS_ERR(page)) | ||
395 | + goto set_status; | ||
396 | + | ||
397 | err = -ENOENT; | ||
398 | if (!page) | ||
399 | goto set_status; | ||
400 | @@ -921,6 +926,11 @@ static int do_pages_stat(struct mm_struct *mm, struct page_to_node *pm) | ||
401 | goto set_status; | ||
402 | |||
403 | page = follow_page(vma, pm->addr, 0); | ||
404 | + | ||
405 | + err = PTR_ERR(page); | ||
406 | + if (IS_ERR(page)) | ||
407 | + goto set_status; | ||
408 | + | ||
409 | err = -ENOENT; | ||
410 | /* Use PageReserved to check for zero page */ | ||
411 | if (!page || PageReserved(page)) | ||
412 | diff --git a/net/sctp/socket.c b/net/sctp/socket.c | ||
413 | index 998e63a..2d42260 100644 | ||
414 | --- a/net/sctp/socket.c | ||
415 | +++ b/net/sctp/socket.c | ||
416 | @@ -4421,7 +4421,9 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len, | ||
417 | if (copy_from_user(&getaddrs, optval, len)) | ||
418 | return -EFAULT; | ||
419 | |||
420 | - if (getaddrs.addr_num <= 0) return -EINVAL; | ||
421 | + if (getaddrs.addr_num <= 0 || | ||
422 | + getaddrs.addr_num >= (INT_MAX / sizeof(union sctp_addr))) | ||
423 | + return -EINVAL; | ||
424 | /* | ||
425 | * For UDP-style sockets, id specifies the association to query. | ||
426 | * If the id field is set to the value '0' then the locally bound |