Contents of /trunk/kernel26-magellan/patches-2.6.16-r12/0100-2.6.16-patch-2.6.16.11_fixed
Parent Directory | Revision Log
Revision 72 -
(show annotations)
(download)
Mon Jun 5 09:25:38 2006 UTC (18 years, 3 months ago) by niro
File size: 119006 byte(s)
Mon Jun 5 09:25:38 2006 UTC (18 years, 3 months ago) by niro
File size: 119006 byte(s)
ver bump to 2.6.16-r12: - updated to linux-2.6.16.19 - updated to ck11
1 | diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c |
2 | index b4e5f8f..45308bd 100644 |
3 | --- a/arch/alpha/kernel/setup.c |
4 | +++ b/arch/alpha/kernel/setup.c |
5 | @@ -24,6 +24,7 @@ #include <linux/delay.h> |
6 | #include <linux/config.h> /* CONFIG_ALPHA_LCA etc */ |
7 | #include <linux/mc146818rtc.h> |
8 | #include <linux/console.h> |
9 | +#include <linux/cpu.h> |
10 | #include <linux/errno.h> |
11 | #include <linux/init.h> |
12 | #include <linux/string.h> |
13 | @@ -477,6 +478,22 @@ #undef PFN_DOWN |
14 | #undef PFN_PHYS |
15 | #undef PFN_MAX |
16 | |
17 | +static int __init |
18 | +register_cpus(void) |
19 | +{ |
20 | + int i; |
21 | + |
22 | + for_each_possible_cpu(i) { |
23 | + struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL); |
24 | + if (!p) |
25 | + return -ENOMEM; |
26 | + register_cpu(p, i, NULL); |
27 | + } |
28 | + return 0; |
29 | +} |
30 | + |
31 | +arch_initcall(register_cpus); |
32 | + |
33 | void __init |
34 | setup_arch(char **cmdline_p) |
35 | { |
36 | diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c |
37 | index 02c2db0..1852554 100644 |
38 | --- a/arch/alpha/kernel/smp.c |
39 | +++ b/arch/alpha/kernel/smp.c |
40 | @@ -439,7 +439,7 @@ setup_smp(void) |
41 | if ((cpu->flags & 0x1cc) == 0x1cc) { |
42 | smp_num_probed++; |
43 | /* Assume here that "whami" == index */ |
44 | - cpu_set(i, cpu_possible_map); |
45 | + cpu_set(i, cpu_present_mask); |
46 | cpu->pal_revision = boot_cpu_palrev; |
47 | } |
48 | |
49 | @@ -450,9 +450,8 @@ setup_smp(void) |
50 | } |
51 | } else { |
52 | smp_num_probed = 1; |
53 | - cpu_set(boot_cpuid, cpu_possible_map); |
54 | + cpu_set(boot_cpuid, cpu_present_mask); |
55 | } |
56 | - cpu_present_mask = cpumask_of_cpu(boot_cpuid); |
57 | |
58 | printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", |
59 | smp_num_probed, cpu_possible_map.bits[0]); |
60 | @@ -488,9 +487,8 @@ void __devinit |
61 | smp_prepare_boot_cpu(void) |
62 | { |
63 | /* |
64 | - * Mark the boot cpu (current cpu) as both present and online |
65 | + * Mark the boot cpu (current cpu) as online |
66 | */ |
67 | - cpu_set(smp_processor_id(), cpu_present_mask); |
68 | cpu_set(smp_processor_id(), cpu_online_map); |
69 | } |
70 | |
71 | diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c |
72 | index 05312a8..558d2d2 100644 |
73 | --- a/arch/i386/kernel/apm.c |
74 | +++ b/arch/i386/kernel/apm.c |
75 | @@ -1081,7 +1081,7 @@ static int apm_console_blank(int blank) |
76 | break; |
77 | } |
78 | |
79 | - if (error == APM_NOT_ENGAGED && state != APM_STATE_READY) { |
80 | + if (error == APM_NOT_ENGAGED) { |
81 | static int tried; |
82 | int eng_error; |
83 | if (tried++ == 0) { |
84 | diff --git a/arch/i386/kernel/cpu/amd.c b/arch/i386/kernel/cpu/amd.c |
85 | index 0810f81..d2d50cb 100644 |
86 | --- a/arch/i386/kernel/cpu/amd.c |
87 | +++ b/arch/i386/kernel/cpu/amd.c |
88 | @@ -207,6 +207,8 @@ #define CBAR_KEY (0X000000CB) |
89 | set_bit(X86_FEATURE_K7, c->x86_capability); |
90 | break; |
91 | } |
92 | + if (c->x86 >= 6) |
93 | + set_bit(X86_FEATURE_FXSAVE_LEAK, c->x86_capability); |
94 | |
95 | display_cacheinfo(c); |
96 | |
97 | diff --git a/arch/i386/kernel/cpu/cpufreq/Kconfig b/arch/i386/kernel/cpu/cpufreq/Kconfig |
98 | index 26892d2..16f2e35 100644 |
99 | --- a/arch/i386/kernel/cpu/cpufreq/Kconfig |
100 | +++ b/arch/i386/kernel/cpu/cpufreq/Kconfig |
101 | @@ -203,6 +203,7 @@ config X86_LONGRUN |
102 | config X86_LONGHAUL |
103 | tristate "VIA Cyrix III Longhaul" |
104 | select CPU_FREQ_TABLE |
105 | + depends on BROKEN |
106 | help |
107 | This adds the CPUFreq driver for VIA Samuel/CyrixIII, |
108 | VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T |
109 | diff --git a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c |
110 | index cc73a7a..ebe1848 100644 |
111 | --- a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c |
112 | +++ b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c |
113 | @@ -244,7 +244,7 @@ #endif |
114 | for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) { |
115 | if ((i<2) && (has_N44_O17_errata[policy->cpu])) |
116 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
117 | - else if (has_N60_errata[policy->cpu] && p4clockmod_table[i].frequency < 2000000) |
118 | + else if (has_N60_errata[policy->cpu] && ((stock_freq * i)/8) < 2000000) |
119 | p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
120 | else |
121 | p4clockmod_table[i].frequency = (stock_freq * i)/8; |
122 | diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c |
123 | index 28cc5d5..cfc4276 100644 |
124 | --- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c |
125 | +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c |
126 | @@ -75,7 +75,9 @@ static int speedstep_smi_ownership (void |
127 | __asm__ __volatile__( |
128 | "out %%al, (%%dx)\n" |
129 | : "=D" (result) |
130 | - : "a" (command), "b" (function), "c" (0), "d" (smi_port), "D" (0), "S" (magic) |
131 | + : "a" (command), "b" (function), "c" (0), "d" (smi_port), |
132 | + "D" (0), "S" (magic) |
133 | + : "memory" |
134 | ); |
135 | |
136 | dprintk("result is %x\n", result); |
137 | diff --git a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c |
138 | index 6a93d75..ca2a0cb 100644 |
139 | --- a/arch/i386/kernel/dmi_scan.c |
140 | +++ b/arch/i386/kernel/dmi_scan.c |
141 | @@ -106,7 +106,7 @@ static void __init dmi_save_devices(stru |
142 | struct dmi_device *dev; |
143 | |
144 | for (i = 0; i < count; i++) { |
145 | - char *d = ((char *) dm) + (i * 2); |
146 | + char *d = (char *)(dm + 1) + (i * 2); |
147 | |
148 | /* Skip disabled device */ |
149 | if ((*d & 0x80) == 0) |
150 | diff --git a/arch/m32r/kernel/m32r_ksyms.c b/arch/m32r/kernel/m32r_ksyms.c |
151 | index be8b711..6000950 100644 |
152 | --- a/arch/m32r/kernel/m32r_ksyms.c |
153 | +++ b/arch/m32r/kernel/m32r_ksyms.c |
154 | @@ -38,10 +38,6 @@ EXPORT_SYMBOL(__udelay); |
155 | EXPORT_SYMBOL(__delay); |
156 | EXPORT_SYMBOL(__const_udelay); |
157 | |
158 | -EXPORT_SYMBOL(__get_user_1); |
159 | -EXPORT_SYMBOL(__get_user_2); |
160 | -EXPORT_SYMBOL(__get_user_4); |
161 | - |
162 | EXPORT_SYMBOL(strpbrk); |
163 | EXPORT_SYMBOL(strstr); |
164 | |
165 | diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c |
166 | index d742037..542ed93 100644 |
167 | --- a/arch/m32r/kernel/setup.c |
168 | +++ b/arch/m32r/kernel/setup.c |
169 | @@ -9,6 +9,7 @@ |
170 | |
171 | #include <linux/config.h> |
172 | #include <linux/init.h> |
173 | +#include <linux/kernel.h> |
174 | #include <linux/stddef.h> |
175 | #include <linux/fs.h> |
176 | #include <linux/sched.h> |
177 | @@ -218,8 +219,6 @@ #else /* CONFIG_DISCONTIGMEM */ |
178 | extern unsigned long setup_memory(void); |
179 | #endif /* CONFIG_DISCONTIGMEM */ |
180 | |
181 | -#define M32R_PCC_PCATCR 0x00ef7014 /* will move to m32r.h */ |
182 | - |
183 | void __init setup_arch(char **cmdline_p) |
184 | { |
185 | ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); |
186 | @@ -268,15 +267,14 @@ #endif /* CONFIG_DISCONTIGMEM */ |
187 | paging_init(); |
188 | } |
189 | |
190 | -static struct cpu cpu[NR_CPUS]; |
191 | +static struct cpu cpu_devices[NR_CPUS]; |
192 | |
193 | static int __init topology_init(void) |
194 | { |
195 | - int cpu_id; |
196 | + int i; |
197 | |
198 | - for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++) |
199 | - if (cpu_possible(cpu_id)) |
200 | - register_cpu(&cpu[cpu_id], cpu_id, NULL); |
201 | + for_each_present_cpu(i) |
202 | + register_cpu(&cpu_devices[i], i, NULL); |
203 | |
204 | return 0; |
205 | } |
206 | diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c |
207 | index d7ec16e..840b434 100644 |
208 | --- a/arch/m32r/kernel/smpboot.c |
209 | +++ b/arch/m32r/kernel/smpboot.c |
210 | @@ -39,8 +39,10 @@ |
211 | * Martin J. Bligh : Added support for multi-quad systems |
212 | */ |
213 | |
214 | +#include <linux/module.h> |
215 | #include <linux/config.h> |
216 | #include <linux/init.h> |
217 | +#include <linux/kernel.h> |
218 | #include <linux/mm.h> |
219 | #include <linux/smp_lock.h> |
220 | #include <linux/irq.h> |
221 | @@ -72,11 +74,15 @@ physid_mask_t phys_cpu_present_map; |
222 | |
223 | /* Bitmask of currently online CPUs */ |
224 | cpumask_t cpu_online_map; |
225 | +EXPORT_SYMBOL(cpu_online_map); |
226 | |
227 | cpumask_t cpu_bootout_map; |
228 | cpumask_t cpu_bootin_map; |
229 | -cpumask_t cpu_callout_map; |
230 | static cpumask_t cpu_callin_map; |
231 | +cpumask_t cpu_callout_map; |
232 | +EXPORT_SYMBOL(cpu_callout_map); |
233 | +cpumask_t cpu_possible_map = CPU_MASK_ALL; |
234 | +EXPORT_SYMBOL(cpu_possible_map); |
235 | |
236 | /* Per CPU bogomips and other parameters */ |
237 | struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned; |
238 | @@ -110,7 +116,6 @@ static unsigned int calibration_result; |
239 | |
240 | void smp_prepare_boot_cpu(void); |
241 | void smp_prepare_cpus(unsigned int); |
242 | -static void smp_tune_scheduling(void); |
243 | static void init_ipi_lock(void); |
244 | static void do_boot_cpu(int); |
245 | int __cpu_up(unsigned int); |
246 | @@ -177,6 +182,9 @@ void __init smp_prepare_cpus(unsigned in |
247 | } |
248 | for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++) |
249 | physid_set(phys_id, phys_cpu_present_map); |
250 | +#ifndef CONFIG_HOTPLUG_CPU |
251 | + cpu_present_map = cpu_possible_map; |
252 | +#endif |
253 | |
254 | show_mp_info(nr_cpu); |
255 | |
256 | @@ -186,7 +194,6 @@ void __init smp_prepare_cpus(unsigned in |
257 | * Setup boot CPU information |
258 | */ |
259 | smp_store_cpu_info(0); /* Final full version of the data */ |
260 | - smp_tune_scheduling(); |
261 | |
262 | /* |
263 | * If SMP should be disabled, then really disable it! |
264 | @@ -230,11 +237,6 @@ smp_done: |
265 | Dprintk("Boot done.\n"); |
266 | } |
267 | |
268 | -static void __init smp_tune_scheduling(void) |
269 | -{ |
270 | - /* Nothing to do. */ |
271 | -} |
272 | - |
273 | /* |
274 | * init_ipi_lock : Initialize IPI locks. |
275 | */ |
276 | @@ -629,4 +631,3 @@ static void __init unmap_cpu_to_physid(i |
277 | physid_2_cpu[phys_id] = -1; |
278 | cpu_2_physid[cpu_id] = -1; |
279 | } |
280 | - |
281 | diff --git a/arch/m32r/lib/Makefile b/arch/m32r/lib/Makefile |
282 | index e632d10..d16b4e4 100644 |
283 | --- a/arch/m32r/lib/Makefile |
284 | +++ b/arch/m32r/lib/Makefile |
285 | @@ -2,6 +2,6 @@ # |
286 | # Makefile for M32R-specific library files.. |
287 | # |
288 | |
289 | -lib-y := checksum.o ashxdi3.o memset.o memcpy.o getuser.o \ |
290 | - putuser.o delay.o strlen.o usercopy.o csum_partial_copy.o |
291 | +lib-y := checksum.o ashxdi3.o memset.o memcpy.o \ |
292 | + delay.o strlen.o usercopy.o csum_partial_copy.o |
293 | |
294 | diff --git a/arch/m32r/lib/getuser.S b/arch/m32r/lib/getuser.S |
295 | deleted file mode 100644 |
296 | index 58a0db0..0000000 |
297 | --- a/arch/m32r/lib/getuser.S |
298 | +++ /dev/null |
299 | @@ -1,88 +0,0 @@ |
300 | -/* |
301 | - * __get_user functions. |
302 | - * |
303 | - * (C) Copyright 2001 Hirokazu Takata |
304 | - * |
305 | - * These functions have a non-standard call interface |
306 | - * to make them more efficient, especially as they |
307 | - * return an error value in addition to the "real" |
308 | - * return value. |
309 | - */ |
310 | - |
311 | -#include <linux/config.h> |
312 | - |
313 | -/* |
314 | - * __get_user_X |
315 | - * |
316 | - * Inputs: r0 contains the address |
317 | - * |
318 | - * Outputs: r0 is error code (0 or -EFAULT) |
319 | - * r1 contains zero-extended value |
320 | - * |
321 | - * These functions should not modify any other registers, |
322 | - * as they get called from within inline assembly. |
323 | - */ |
324 | - |
325 | -#ifdef CONFIG_ISA_DUAL_ISSUE |
326 | - |
327 | - .text |
328 | - .balign 4 |
329 | - .globl __get_user_1 |
330 | -__get_user_1: |
331 | -1: ldub r1, @r0 || ldi r0, #0 |
332 | - jmp r14 |
333 | - |
334 | - .balign 4 |
335 | - .globl __get_user_2 |
336 | -__get_user_2: |
337 | -2: lduh r1, @r0 || ldi r0, #0 |
338 | - jmp r14 |
339 | - |
340 | - .balign 4 |
341 | - .globl __get_user_4 |
342 | -__get_user_4: |
343 | -3: ld r1, @r0 || ldi r0, #0 |
344 | - jmp r14 |
345 | - |
346 | -bad_get_user: |
347 | - ldi r1, #0 || ldi r0, #-14 |
348 | - jmp r14 |
349 | - |
350 | -#else /* not CONFIG_ISA_DUAL_ISSUE */ |
351 | - |
352 | - .text |
353 | - .balign 4 |
354 | - .globl __get_user_1 |
355 | -__get_user_1: |
356 | -1: ldub r1, @r0 |
357 | - ldi r0, #0 |
358 | - jmp r14 |
359 | - |
360 | - .balign 4 |
361 | - .globl __get_user_2 |
362 | -__get_user_2: |
363 | -2: lduh r1, @r0 |
364 | - ldi r0, #0 |
365 | - jmp r14 |
366 | - |
367 | - .balign 4 |
368 | - .globl __get_user_4 |
369 | -__get_user_4: |
370 | -3: ld r1, @r0 |
371 | - ldi r0, #0 |
372 | - jmp r14 |
373 | - |
374 | -bad_get_user: |
375 | - ldi r1, #0 |
376 | - ldi r0, #-14 |
377 | - jmp r14 |
378 | - |
379 | -#endif /* not CONFIG_ISA_DUAL_ISSUE */ |
380 | - |
381 | -.section __ex_table,"a" |
382 | - .long 1b,bad_get_user |
383 | - .long 2b,bad_get_user |
384 | - .long 3b,bad_get_user |
385 | -.previous |
386 | - |
387 | - .end |
388 | diff --git a/arch/m32r/lib/putuser.S b/arch/m32r/lib/putuser.S |
389 | deleted file mode 100644 |
390 | index 218154c..0000000 |
391 | --- a/arch/m32r/lib/putuser.S |
392 | +++ /dev/null |
393 | @@ -1,84 +0,0 @@ |
394 | -/* |
395 | - * __put_user functions. |
396 | - * |
397 | - * (C) Copyright 1998 Linus Torvalds |
398 | - * (C) Copyright 2001 Hirokazu Takata |
399 | - * |
400 | - * These functions have a non-standard call interface |
401 | - * to make them more efficient. |
402 | - */ |
403 | - |
404 | -#include <linux/config.h> |
405 | - |
406 | -/* |
407 | - * __put_user_X |
408 | - * |
409 | - * Inputs: r0 contains the address |
410 | - * r1 contains the value |
411 | - * |
412 | - * Outputs: r0 is error code (0 or -EFAULT) |
413 | - * r1 is corrupted (will contain "current_task"). |
414 | - * |
415 | - * These functions should not modify any other registers, |
416 | - * as they get called from within inline assembly. |
417 | - */ |
418 | - |
419 | -#ifdef CONFIG_ISA_DUAL_ISSUE |
420 | - |
421 | - .text |
422 | - .balign 4 |
423 | - .globl __put_user_1 |
424 | -__put_user_1: |
425 | -1: stb r1, @r0 || ldi r0, #0 |
426 | - jmp r14 |
427 | - |
428 | - .balign 4 |
429 | - .globl __put_user_2 |
430 | -__put_user_2: |
431 | -2: sth r1, @r0 || ldi r0, #0 |
432 | - jmp r14 |
433 | - |
434 | - .balign 4 |
435 | - .globl __put_user_4 |
436 | -__put_user_4: |
437 | -3: st r1, @r0 || ldi r0, #0 |
438 | - jmp r14 |
439 | - |
440 | -bad_put_user: |
441 | - ldi r0, #-14 || jmp r14 |
442 | - |
443 | -#else /* not CONFIG_ISA_DUAL_ISSUE */ |
444 | - |
445 | - .text |
446 | - .balign 4 |
447 | - .globl __put_user_1 |
448 | -__put_user_1: |
449 | -1: stb r1, @r0 |
450 | - ldi r0, #0 |
451 | - jmp r14 |
452 | - |
453 | - .balign 4 |
454 | - .globl __put_user_2 |
455 | -__put_user_2: |
456 | -2: sth r1, @r0 |
457 | - ldi r0, #0 |
458 | - jmp r14 |
459 | - |
460 | - .balign 4 |
461 | - .globl __put_user_4 |
462 | -__put_user_4: |
463 | -3: st r1, @r0 |
464 | - ldi r0, #0 |
465 | - jmp r14 |
466 | - |
467 | -bad_put_user: |
468 | - ldi r0, #-14 |
469 | - jmp r14 |
470 | - |
471 | -#endif /* not CONFIG_ISA_DUAL_ISSUE */ |
472 | - |
473 | -.section __ex_table,"a" |
474 | - .long 1b,bad_put_user |
475 | - .long 2b,bad_put_user |
476 | - .long 3b,bad_put_user |
477 | -.previous |
478 | diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c |
479 | index ba92bab..4c4449b 100644 |
480 | --- a/arch/powerpc/kernel/pci_64.c |
481 | +++ b/arch/powerpc/kernel/pci_64.c |
482 | @@ -78,6 +78,7 @@ int global_phb_number; /* Global phb co |
483 | |
484 | /* Cached ISA bridge dev. */ |
485 | struct pci_dev *ppc64_isabridge_dev = NULL; |
486 | +EXPORT_SYMBOL_GPL(ppc64_isabridge_dev); |
487 | |
488 | static void fixup_broken_pcnet32(struct pci_dev* dev) |
489 | { |
490 | diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c |
491 | index f96c49b..abd758f 100644 |
492 | --- a/arch/powerpc/kernel/setup_64.c |
493 | +++ b/arch/powerpc/kernel/setup_64.c |
494 | @@ -256,12 +256,10 @@ #endif |
495 | /* |
496 | * Initialize stab / SLB management except on iSeries |
497 | */ |
498 | - if (!firmware_has_feature(FW_FEATURE_ISERIES)) { |
499 | - if (cpu_has_feature(CPU_FTR_SLB)) |
500 | - slb_initialize(); |
501 | - else |
502 | - stab_initialize(lpaca->stab_real); |
503 | - } |
504 | + if (cpu_has_feature(CPU_FTR_SLB)) |
505 | + slb_initialize(); |
506 | + else if (!firmware_has_feature(FW_FEATURE_ISERIES)) |
507 | + stab_initialize(lpaca->stab_real); |
508 | |
509 | DBG(" <- early_setup()\n"); |
510 | } |
511 | diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c |
512 | index 4324f8a..096dfdc 100644 |
513 | --- a/arch/powerpc/kernel/signal_64.c |
514 | +++ b/arch/powerpc/kernel/signal_64.c |
515 | @@ -213,7 +213,7 @@ static inline void __user * get_sigframe |
516 | /* Default to using normal stack */ |
517 | newsp = regs->gpr[1]; |
518 | |
519 | - if (ka->sa.sa_flags & SA_ONSTACK) { |
520 | + if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size) { |
521 | if (! on_sig_stack(regs->gpr[1])) |
522 | newsp = (current->sas_ss_sp + current->sas_ss_size); |
523 | } |
524 | diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S |
525 | index 7c10e90..ab6e44d 100644 |
526 | --- a/arch/x86_64/kernel/entry.S |
527 | +++ b/arch/x86_64/kernel/entry.S |
528 | @@ -180,6 +180,10 @@ rff_trace: |
529 | * |
530 | * XXX if we had a free scratch register we could save the RSP into the stack frame |
531 | * and report it properly in ps. Unfortunately we haven't. |
532 | + * |
533 | + * When user can change the frames always force IRET. That is because |
534 | + * it deals with uncanonical addresses better. SYSRET has trouble |
535 | + * with them due to bugs in both AMD and Intel CPUs. |
536 | */ |
537 | |
538 | ENTRY(system_call) |
539 | @@ -254,7 +258,10 @@ sysret_signal: |
540 | xorl %esi,%esi # oldset -> arg2 |
541 | call ptregscall_common |
542 | 1: movl $_TIF_NEED_RESCHED,%edi |
543 | - jmp sysret_check |
544 | + /* Use IRET because user could have changed frame. This |
545 | + works because ptregscall_common has called FIXUP_TOP_OF_STACK. */ |
546 | + cli |
547 | + jmp int_with_check |
548 | |
549 | badsys: |
550 | movq $-ENOSYS,RAX-ARGOFFSET(%rsp) |
551 | @@ -280,7 +287,8 @@ tracesys: |
552 | call syscall_trace_leave |
553 | RESTORE_TOP_OF_STACK %rbx |
554 | RESTORE_REST |
555 | - jmp ret_from_sys_call |
556 | + /* Use IRET because user could have changed frame */ |
557 | + jmp int_ret_from_sys_call |
558 | CFI_ENDPROC |
559 | |
560 | /* |
561 | @@ -408,25 +416,9 @@ ENTRY(stub_execve) |
562 | CFI_ADJUST_CFA_OFFSET -8 |
563 | CFI_REGISTER rip, r11 |
564 | SAVE_REST |
565 | - movq %r11, %r15 |
566 | - CFI_REGISTER rip, r15 |
567 | FIXUP_TOP_OF_STACK %r11 |
568 | call sys_execve |
569 | - GET_THREAD_INFO(%rcx) |
570 | - bt $TIF_IA32,threadinfo_flags(%rcx) |
571 | - CFI_REMEMBER_STATE |
572 | - jc exec_32bit |
573 | RESTORE_TOP_OF_STACK %r11 |
574 | - movq %r15, %r11 |
575 | - CFI_REGISTER rip, r11 |
576 | - RESTORE_REST |
577 | - pushq %r11 |
578 | - CFI_ADJUST_CFA_OFFSET 8 |
579 | - CFI_REL_OFFSET rip, 0 |
580 | - ret |
581 | - |
582 | -exec_32bit: |
583 | - CFI_RESTORE_STATE |
584 | movq %rax,RAX(%rsp) |
585 | RESTORE_REST |
586 | jmp int_ret_from_sys_call |
587 | diff --git a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c |
588 | index 22a05de..818ab9e 100644 |
589 | --- a/arch/x86_64/kernel/process.c |
590 | +++ b/arch/x86_64/kernel/process.c |
591 | @@ -527,8 +527,6 @@ __switch_to(struct task_struct *prev_p, |
592 | int cpu = smp_processor_id(); |
593 | struct tss_struct *tss = &per_cpu(init_tss, cpu); |
594 | |
595 | - unlazy_fpu(prev_p); |
596 | - |
597 | /* |
598 | * Reload esp0, LDT and the page table pointer: |
599 | */ |
600 | @@ -591,6 +589,12 @@ __switch_to(struct task_struct *prev_p, |
601 | prev->userrsp = read_pda(oldrsp); |
602 | write_pda(oldrsp, next->userrsp); |
603 | write_pda(pcurrent, next_p); |
604 | + |
605 | + /* This must be here to ensure both math_state_restore() and |
606 | + kernel_fpu_begin() work consistently. |
607 | + And the AMD workaround requires it to be after DS reload. */ |
608 | + unlazy_fpu(prev_p); |
609 | + |
610 | write_pda(kernelstack, |
611 | task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET); |
612 | |
613 | diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c |
614 | index aa55e3c..a4a0bb5 100644 |
615 | --- a/arch/x86_64/kernel/setup.c |
616 | +++ b/arch/x86_64/kernel/setup.c |
617 | @@ -909,6 +909,10 @@ #endif |
618 | if (c->x86 == 15 && ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)) |
619 | set_bit(X86_FEATURE_REP_GOOD, &c->x86_capability); |
620 | |
621 | + /* Enable workaround for FXSAVE leak */ |
622 | + if (c->x86 >= 6) |
623 | + set_bit(X86_FEATURE_FXSAVE_LEAK, &c->x86_capability); |
624 | + |
625 | r = get_model_name(c); |
626 | if (!r) { |
627 | switch (c->x86) { |
628 | diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c |
629 | index 07a7f97..29f3d75 100644 |
630 | --- a/drivers/base/cpu.c |
631 | +++ b/drivers/base/cpu.c |
632 | @@ -141,7 +141,7 @@ #endif |
633 | return error; |
634 | } |
635 | |
636 | -struct sys_device *get_cpu_sysdev(int cpu) |
637 | +struct sys_device *get_cpu_sysdev(unsigned cpu) |
638 | { |
639 | if (cpu < NR_CPUS) |
640 | return cpu_sys_devices[cpu]; |
641 | diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c |
642 | index e97e911..4723182 100644 |
643 | --- a/drivers/base/firmware_class.c |
644 | +++ b/drivers/base/firmware_class.c |
645 | @@ -211,18 +211,20 @@ static int |
646 | fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) |
647 | { |
648 | u8 *new_data; |
649 | + int new_size = fw_priv->alloc_size; |
650 | |
651 | if (min_size <= fw_priv->alloc_size) |
652 | return 0; |
653 | |
654 | - new_data = vmalloc(fw_priv->alloc_size + PAGE_SIZE); |
655 | + new_size = ALIGN(min_size, PAGE_SIZE); |
656 | + new_data = vmalloc(new_size); |
657 | if (!new_data) { |
658 | printk(KERN_ERR "%s: unable to alloc buffer\n", __FUNCTION__); |
659 | /* Make sure that we don't keep incomplete data */ |
660 | fw_load_abort(fw_priv); |
661 | return -ENOMEM; |
662 | } |
663 | - fw_priv->alloc_size += PAGE_SIZE; |
664 | + fw_priv->alloc_size = new_size; |
665 | if (fw_priv->fw->data) { |
666 | memcpy(new_data, fw_priv->fw->data, fw_priv->fw->size); |
667 | vfree(fw_priv->fw->data); |
668 | diff --git a/drivers/base/node.c b/drivers/base/node.c |
669 | index 16c513a..c80c3ae 100644 |
670 | --- a/drivers/base/node.c |
671 | +++ b/drivers/base/node.c |
672 | @@ -106,7 +106,7 @@ static ssize_t node_read_numastat(struct |
673 | other_node = 0; |
674 | for (i = 0; i < MAX_NR_ZONES; i++) { |
675 | struct zone *z = &pg->node_zones[i]; |
676 | - for (cpu = 0; cpu < NR_CPUS; cpu++) { |
677 | + for_each_online_cpu(cpu) { |
678 | struct per_cpu_pageset *ps = zone_pcp(z,cpu); |
679 | numa_hit += ps->numa_hit; |
680 | numa_miss += ps->numa_miss; |
681 | diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c |
682 | index 0d65394..71552e1 100644 |
683 | --- a/drivers/block/cciss.c |
684 | +++ b/drivers/block/cciss.c |
685 | @@ -1181,6 +1181,53 @@ static int revalidate_allvol(ctlr_info_t |
686 | return 0; |
687 | } |
688 | |
689 | +static inline void complete_buffers(struct bio *bio, int status) |
690 | +{ |
691 | + while (bio) { |
692 | + struct bio *xbh = bio->bi_next; |
693 | + int nr_sectors = bio_sectors(bio); |
694 | + |
695 | + bio->bi_next = NULL; |
696 | + blk_finished_io(len); |
697 | + bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO); |
698 | + bio = xbh; |
699 | + } |
700 | + |
701 | +} |
702 | + |
703 | +static void cciss_softirq_done(struct request *rq) |
704 | +{ |
705 | + CommandList_struct *cmd = rq->completion_data; |
706 | + ctlr_info_t *h = hba[cmd->ctlr]; |
707 | + unsigned long flags; |
708 | + u64bit temp64; |
709 | + int i, ddir; |
710 | + |
711 | + if (cmd->Request.Type.Direction == XFER_READ) |
712 | + ddir = PCI_DMA_FROMDEVICE; |
713 | + else |
714 | + ddir = PCI_DMA_TODEVICE; |
715 | + |
716 | + /* command did not need to be retried */ |
717 | + /* unmap the DMA mapping for all the scatter gather elements */ |
718 | + for(i=0; i<cmd->Header.SGList; i++) { |
719 | + temp64.val32.lower = cmd->SG[i].Addr.lower; |
720 | + temp64.val32.upper = cmd->SG[i].Addr.upper; |
721 | + pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir); |
722 | + } |
723 | + |
724 | + complete_buffers(rq->bio, rq->errors); |
725 | + |
726 | +#ifdef CCISS_DEBUG |
727 | + printk("Done with %p\n", rq); |
728 | +#endif /* CCISS_DEBUG */ |
729 | + |
730 | + spin_lock_irqsave(&h->lock, flags); |
731 | + end_that_request_last(rq, rq->errors); |
732 | + cmd_free(h, cmd,1); |
733 | + spin_unlock_irqrestore(&h->lock, flags); |
734 | +} |
735 | + |
736 | /* This function will check the usage_count of the drive to be updated/added. |
737 | * If the usage_count is zero then the drive information will be updated and |
738 | * the disk will be re-registered with the kernel. If not then it will be |
739 | @@ -1249,6 +1296,8 @@ static void cciss_update_drive_info(int |
740 | |
741 | blk_queue_max_sectors(disk->queue, 512); |
742 | |
743 | + blk_queue_softirq_done(disk->queue, cciss_softirq_done); |
744 | + |
745 | disk->queue->queuedata = hba[ctlr]; |
746 | |
747 | blk_queue_hardsect_size(disk->queue, |
748 | @@ -2148,20 +2197,6 @@ static void start_io( ctlr_info_t *h) |
749 | addQ (&(h->cmpQ), c); |
750 | } |
751 | } |
752 | - |
753 | -static inline void complete_buffers(struct bio *bio, int status) |
754 | -{ |
755 | - while (bio) { |
756 | - struct bio *xbh = bio->bi_next; |
757 | - int nr_sectors = bio_sectors(bio); |
758 | - |
759 | - bio->bi_next = NULL; |
760 | - blk_finished_io(len); |
761 | - bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO); |
762 | - bio = xbh; |
763 | - } |
764 | - |
765 | -} |
766 | /* Assumes that CCISS_LOCK(h->ctlr) is held. */ |
767 | /* Zeros out the error record and then resends the command back */ |
768 | /* to the controller */ |
769 | @@ -2179,39 +2214,6 @@ static inline void resend_cciss_cmd( ctl |
770 | start_io(h); |
771 | } |
772 | |
773 | -static void cciss_softirq_done(struct request *rq) |
774 | -{ |
775 | - CommandList_struct *cmd = rq->completion_data; |
776 | - ctlr_info_t *h = hba[cmd->ctlr]; |
777 | - unsigned long flags; |
778 | - u64bit temp64; |
779 | - int i, ddir; |
780 | - |
781 | - if (cmd->Request.Type.Direction == XFER_READ) |
782 | - ddir = PCI_DMA_FROMDEVICE; |
783 | - else |
784 | - ddir = PCI_DMA_TODEVICE; |
785 | - |
786 | - /* command did not need to be retried */ |
787 | - /* unmap the DMA mapping for all the scatter gather elements */ |
788 | - for(i=0; i<cmd->Header.SGList; i++) { |
789 | - temp64.val32.lower = cmd->SG[i].Addr.lower; |
790 | - temp64.val32.upper = cmd->SG[i].Addr.upper; |
791 | - pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir); |
792 | - } |
793 | - |
794 | - complete_buffers(rq->bio, rq->errors); |
795 | - |
796 | -#ifdef CCISS_DEBUG |
797 | - printk("Done with %p\n", rq); |
798 | -#endif /* CCISS_DEBUG */ |
799 | - |
800 | - spin_lock_irqsave(&h->lock, flags); |
801 | - end_that_request_last(rq, rq->errors); |
802 | - cmd_free(h, cmd,1); |
803 | - spin_unlock_irqrestore(&h->lock, flags); |
804 | -} |
805 | - |
806 | /* checks the status of the job and calls complete buffers to mark all |
807 | * buffers for the completed job. Note that this function does not need |
808 | * to hold the hba/queue lock. |
809 | @@ -3269,8 +3271,8 @@ clean2: |
810 | unregister_blkdev(hba[i]->major, hba[i]->devname); |
811 | clean1: |
812 | release_io_mem(hba[i]); |
813 | - free_hba(i); |
814 | hba[i]->busy_initializing = 0; |
815 | + free_hba(i); |
816 | return(-1); |
817 | } |
818 | |
819 | diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig |
820 | index 05ba410..8b72a61 100644 |
821 | --- a/drivers/char/Kconfig |
822 | +++ b/drivers/char/Kconfig |
823 | @@ -187,6 +187,7 @@ config MOXA_SMARTIO |
824 | config ISI |
825 | tristate "Multi-Tech multiport card support (EXPERIMENTAL)" |
826 | depends on SERIAL_NONSTANDARD |
827 | + select FW_LOADER |
828 | help |
829 | This is a driver for the Multi-Tech cards which provide several |
830 | serial ports. The driver is experimental and can currently only be |
831 | diff --git a/drivers/char/agp/efficeon-agp.c b/drivers/char/agp/efficeon-agp.c |
832 | index e7aea77..40dfc29 100644 |
833 | --- a/drivers/char/agp/efficeon-agp.c |
834 | +++ b/drivers/char/agp/efficeon-agp.c |
835 | @@ -64,6 +64,12 @@ static struct gatt_mask efficeon_generic |
836 | {.mask = 0x00000001, .type = 0} |
837 | }; |
838 | |
839 | +/* This function does the same thing as mask_memory() for this chipset... */ |
840 | +static inline unsigned long efficeon_mask_memory(unsigned long addr) |
841 | +{ |
842 | + return addr | 0x00000001; |
843 | +} |
844 | + |
845 | static struct aper_size_info_lvl2 efficeon_generic_sizes[4] = |
846 | { |
847 | {256, 65536, 0}, |
848 | @@ -251,7 +257,7 @@ static int efficeon_insert_memory(struct |
849 | last_page = NULL; |
850 | for (i = 0; i < count; i++) { |
851 | int index = pg_start + i; |
852 | - unsigned long insert = mem->memory[i]; |
853 | + unsigned long insert = efficeon_mask_memory(mem->memory[i]); |
854 | |
855 | page = (unsigned int *) efficeon_private.l1_table[index >> 10]; |
856 | |
857 | diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c |
858 | index 58dcdee..0030cd8 100644 |
859 | --- a/drivers/char/ipmi/ipmi_bt_sm.c |
860 | +++ b/drivers/char/ipmi/ipmi_bt_sm.c |
861 | @@ -165,7 +165,7 @@ static int bt_start_transaction(struct s |
862 | { |
863 | unsigned int i; |
864 | |
865 | - if ((size < 2) || (size > IPMI_MAX_MSG_LENGTH)) |
866 | + if ((size < 2) || (size > (IPMI_MAX_MSG_LENGTH - 2))) |
867 | return -1; |
868 | |
869 | if ((bt->state != BT_STATE_IDLE) && (bt->state != BT_STATE_HOSED)) |
870 | diff --git a/drivers/char/tlclk.c b/drivers/char/tlclk.c |
871 | index 4c27218..f58ad7f 100644 |
872 | --- a/drivers/char/tlclk.c |
873 | +++ b/drivers/char/tlclk.c |
874 | @@ -327,7 +327,7 @@ static ssize_t store_received_ref_clk3a( |
875 | return strnlen(buf, count); |
876 | } |
877 | |
878 | -static DEVICE_ATTR(received_ref_clk3a, S_IWUGO, NULL, |
879 | +static DEVICE_ATTR(received_ref_clk3a, (S_IWUSR|S_IWGRP), NULL, |
880 | store_received_ref_clk3a); |
881 | |
882 | |
883 | @@ -349,7 +349,7 @@ static ssize_t store_received_ref_clk3b( |
884 | return strnlen(buf, count); |
885 | } |
886 | |
887 | -static DEVICE_ATTR(received_ref_clk3b, S_IWUGO, NULL, |
888 | +static DEVICE_ATTR(received_ref_clk3b, (S_IWUSR|S_IWGRP), NULL, |
889 | store_received_ref_clk3b); |
890 | |
891 | |
892 | @@ -371,7 +371,7 @@ static ssize_t store_enable_clk3b_output |
893 | return strnlen(buf, count); |
894 | } |
895 | |
896 | -static DEVICE_ATTR(enable_clk3b_output, S_IWUGO, NULL, |
897 | +static DEVICE_ATTR(enable_clk3b_output, (S_IWUSR|S_IWGRP), NULL, |
898 | store_enable_clk3b_output); |
899 | |
900 | static ssize_t store_enable_clk3a_output(struct device *d, |
901 | @@ -392,7 +392,7 @@ static ssize_t store_enable_clk3a_output |
902 | return strnlen(buf, count); |
903 | } |
904 | |
905 | -static DEVICE_ATTR(enable_clk3a_output, S_IWUGO, NULL, |
906 | +static DEVICE_ATTR(enable_clk3a_output, (S_IWUSR|S_IWGRP), NULL, |
907 | store_enable_clk3a_output); |
908 | |
909 | static ssize_t store_enable_clkb1_output(struct device *d, |
910 | @@ -413,7 +413,7 @@ static ssize_t store_enable_clkb1_output |
911 | return strnlen(buf, count); |
912 | } |
913 | |
914 | -static DEVICE_ATTR(enable_clkb1_output, S_IWUGO, NULL, |
915 | +static DEVICE_ATTR(enable_clkb1_output, (S_IWUSR|S_IWGRP), NULL, |
916 | store_enable_clkb1_output); |
917 | |
918 | |
919 | @@ -435,7 +435,7 @@ static ssize_t store_enable_clka1_output |
920 | return strnlen(buf, count); |
921 | } |
922 | |
923 | -static DEVICE_ATTR(enable_clka1_output, S_IWUGO, NULL, |
924 | +static DEVICE_ATTR(enable_clka1_output, (S_IWUSR|S_IWGRP), NULL, |
925 | store_enable_clka1_output); |
926 | |
927 | static ssize_t store_enable_clkb0_output(struct device *d, |
928 | @@ -456,7 +456,7 @@ static ssize_t store_enable_clkb0_output |
929 | return strnlen(buf, count); |
930 | } |
931 | |
932 | -static DEVICE_ATTR(enable_clkb0_output, S_IWUGO, NULL, |
933 | +static DEVICE_ATTR(enable_clkb0_output, (S_IWUSR|S_IWGRP), NULL, |
934 | store_enable_clkb0_output); |
935 | |
936 | static ssize_t store_enable_clka0_output(struct device *d, |
937 | @@ -477,7 +477,7 @@ static ssize_t store_enable_clka0_output |
938 | return strnlen(buf, count); |
939 | } |
940 | |
941 | -static DEVICE_ATTR(enable_clka0_output, S_IWUGO, NULL, |
942 | +static DEVICE_ATTR(enable_clka0_output, (S_IWUSR|S_IWGRP), NULL, |
943 | store_enable_clka0_output); |
944 | |
945 | static ssize_t store_select_amcb2_transmit_clock(struct device *d, |
946 | @@ -519,7 +519,7 @@ static ssize_t store_select_amcb2_transm |
947 | return strnlen(buf, count); |
948 | } |
949 | |
950 | -static DEVICE_ATTR(select_amcb2_transmit_clock, S_IWUGO, NULL, |
951 | +static DEVICE_ATTR(select_amcb2_transmit_clock, (S_IWUSR|S_IWGRP), NULL, |
952 | store_select_amcb2_transmit_clock); |
953 | |
954 | static ssize_t store_select_amcb1_transmit_clock(struct device *d, |
955 | @@ -560,7 +560,7 @@ static ssize_t store_select_amcb1_transm |
956 | return strnlen(buf, count); |
957 | } |
958 | |
959 | -static DEVICE_ATTR(select_amcb1_transmit_clock, S_IWUGO, NULL, |
960 | +static DEVICE_ATTR(select_amcb1_transmit_clock, (S_IWUSR|S_IWGRP), NULL, |
961 | store_select_amcb1_transmit_clock); |
962 | |
963 | static ssize_t store_select_redundant_clock(struct device *d, |
964 | @@ -581,7 +581,7 @@ static ssize_t store_select_redundant_cl |
965 | return strnlen(buf, count); |
966 | } |
967 | |
968 | -static DEVICE_ATTR(select_redundant_clock, S_IWUGO, NULL, |
969 | +static DEVICE_ATTR(select_redundant_clock, (S_IWUSR|S_IWGRP), NULL, |
970 | store_select_redundant_clock); |
971 | |
972 | static ssize_t store_select_ref_frequency(struct device *d, |
973 | @@ -602,7 +602,7 @@ static ssize_t store_select_ref_frequenc |
974 | return strnlen(buf, count); |
975 | } |
976 | |
977 | -static DEVICE_ATTR(select_ref_frequency, S_IWUGO, NULL, |
978 | +static DEVICE_ATTR(select_ref_frequency, (S_IWUSR|S_IWGRP), NULL, |
979 | store_select_ref_frequency); |
980 | |
981 | static ssize_t store_filter_select(struct device *d, |
982 | @@ -623,7 +623,7 @@ static ssize_t store_filter_select(struc |
983 | return strnlen(buf, count); |
984 | } |
985 | |
986 | -static DEVICE_ATTR(filter_select, S_IWUGO, NULL, store_filter_select); |
987 | +static DEVICE_ATTR(filter_select, (S_IWUSR|S_IWGRP), NULL, store_filter_select); |
988 | |
989 | static ssize_t store_hardware_switching_mode(struct device *d, |
990 | struct device_attribute *attr, const char *buf, size_t count) |
991 | @@ -643,7 +643,7 @@ static ssize_t store_hardware_switching_ |
992 | return strnlen(buf, count); |
993 | } |
994 | |
995 | -static DEVICE_ATTR(hardware_switching_mode, S_IWUGO, NULL, |
996 | +static DEVICE_ATTR(hardware_switching_mode, (S_IWUSR|S_IWGRP), NULL, |
997 | store_hardware_switching_mode); |
998 | |
999 | static ssize_t store_hardware_switching(struct device *d, |
1000 | @@ -664,7 +664,7 @@ static ssize_t store_hardware_switching( |
1001 | return strnlen(buf, count); |
1002 | } |
1003 | |
1004 | -static DEVICE_ATTR(hardware_switching, S_IWUGO, NULL, |
1005 | +static DEVICE_ATTR(hardware_switching, (S_IWUSR|S_IWGRP), NULL, |
1006 | store_hardware_switching); |
1007 | |
1008 | static ssize_t store_refalign (struct device *d, |
1009 | @@ -684,7 +684,7 @@ static ssize_t store_refalign (struct de |
1010 | return strnlen(buf, count); |
1011 | } |
1012 | |
1013 | -static DEVICE_ATTR(refalign, S_IWUGO, NULL, store_refalign); |
1014 | +static DEVICE_ATTR(refalign, (S_IWUSR|S_IWGRP), NULL, store_refalign); |
1015 | |
1016 | static ssize_t store_mode_select (struct device *d, |
1017 | struct device_attribute *attr, const char *buf, size_t count) |
1018 | @@ -704,7 +704,7 @@ static ssize_t store_mode_select (struct |
1019 | return strnlen(buf, count); |
1020 | } |
1021 | |
1022 | -static DEVICE_ATTR(mode_select, S_IWUGO, NULL, store_mode_select); |
1023 | +static DEVICE_ATTR(mode_select, (S_IWUSR|S_IWGRP), NULL, store_mode_select); |
1024 | |
1025 | static ssize_t store_reset (struct device *d, |
1026 | struct device_attribute *attr, const char *buf, size_t count) |
1027 | @@ -724,7 +724,7 @@ static ssize_t store_reset (struct devic |
1028 | return strnlen(buf, count); |
1029 | } |
1030 | |
1031 | -static DEVICE_ATTR(reset, S_IWUGO, NULL, store_reset); |
1032 | +static DEVICE_ATTR(reset, (S_IWUSR|S_IWGRP), NULL, store_reset); |
1033 | |
1034 | static struct attribute *tlclk_sysfs_entries[] = { |
1035 | &dev_attr_current_ref.attr, |
1036 | @@ -767,6 +767,7 @@ static int __init tlclk_init(void) |
1037 | printk(KERN_ERR "tlclk: can't get major %d.\n", tlclk_major); |
1038 | return ret; |
1039 | } |
1040 | + tlclk_major = ret; |
1041 | alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL); |
1042 | if (!alarm_events) |
1043 | goto out1; |
1044 | diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c |
1045 | index 53d3d06..edaee70 100644 |
1046 | --- a/drivers/char/tty_io.c |
1047 | +++ b/drivers/char/tty_io.c |
1048 | @@ -2706,7 +2706,11 @@ #else |
1049 | } |
1050 | task_lock(p); |
1051 | if (p->files) { |
1052 | - rcu_read_lock(); |
1053 | + /* |
1054 | + * We don't take a ref to the file, so we must |
1055 | + * hold ->file_lock instead. |
1056 | + */ |
1057 | + spin_lock(&p->files->file_lock); |
1058 | fdt = files_fdtable(p->files); |
1059 | for (i=0; i < fdt->max_fds; i++) { |
1060 | filp = fcheck_files(p->files, i); |
1061 | @@ -2721,7 +2725,7 @@ #else |
1062 | break; |
1063 | } |
1064 | } |
1065 | - rcu_read_unlock(); |
1066 | + spin_unlock(&p->files->file_lock); |
1067 | } |
1068 | task_unlock(p); |
1069 | } while_each_task_pid(session, PIDTYPE_SID, p); |
1070 | diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig |
1071 | index 52f3eb4..7ecdb1e 100644 |
1072 | --- a/drivers/edac/Kconfig |
1073 | +++ b/drivers/edac/Kconfig |
1074 | @@ -71,7 +71,7 @@ config EDAC_E7XXX |
1075 | |
1076 | config EDAC_E752X |
1077 | tristate "Intel e752x (e7520, e7525, e7320)" |
1078 | - depends on EDAC_MM_EDAC && PCI |
1079 | + depends on EDAC_MM_EDAC && PCI && HOTPLUG |
1080 | help |
1081 | Support for error detection and correction on the Intel |
1082 | E7520, E7525, E7320 server chipsets. |
1083 | diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c |
1084 | index 8e0f315..dfca749 100644 |
1085 | --- a/drivers/i2c/busses/i2c-i801.c |
1086 | +++ b/drivers/i2c/busses/i2c-i801.c |
1087 | @@ -478,6 +478,11 @@ static s32 i801_access(struct i2c_adapte |
1088 | ret = i801_transaction(); |
1089 | } |
1090 | |
1091 | + /* Some BIOSes don't like it when PEC is enabled at reboot or resume |
1092 | + time, so we forcibly disable it after every transaction. */ |
1093 | + if (hwpec) |
1094 | + outb_p(0, SMBAUXCTL); |
1095 | + |
1096 | if(block) |
1097 | return ret; |
1098 | if(ret) |
1099 | diff --git a/drivers/i2c/chips/m41t00.c b/drivers/i2c/chips/m41t00.c |
1100 | index 2dc3d48..2836fb3 100644 |
1101 | --- a/drivers/i2c/chips/m41t00.c |
1102 | +++ b/drivers/i2c/chips/m41t00.c |
1103 | @@ -129,13 +129,13 @@ m41t00_set_tlet(ulong arg) |
1104 | if ((i2c_smbus_write_byte_data(save_client, 0, tm.tm_sec & 0x7f) < 0) |
1105 | || (i2c_smbus_write_byte_data(save_client, 1, tm.tm_min & 0x7f) |
1106 | < 0) |
1107 | - || (i2c_smbus_write_byte_data(save_client, 2, tm.tm_hour & 0x7f) |
1108 | + || (i2c_smbus_write_byte_data(save_client, 2, tm.tm_hour & 0x3f) |
1109 | < 0) |
1110 | - || (i2c_smbus_write_byte_data(save_client, 4, tm.tm_mday & 0x7f) |
1111 | + || (i2c_smbus_write_byte_data(save_client, 4, tm.tm_mday & 0x3f) |
1112 | < 0) |
1113 | - || (i2c_smbus_write_byte_data(save_client, 5, tm.tm_mon & 0x7f) |
1114 | + || (i2c_smbus_write_byte_data(save_client, 5, tm.tm_mon & 0x1f) |
1115 | < 0) |
1116 | - || (i2c_smbus_write_byte_data(save_client, 6, tm.tm_year & 0x7f) |
1117 | + || (i2c_smbus_write_byte_data(save_client, 6, tm.tm_year & 0xff) |
1118 | < 0)) |
1119 | |
1120 | dev_warn(&save_client->dev,"m41t00: can't write to rtc chip\n"); |
1121 | diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c |
1122 | index cf84350..8b24b4f 100644 |
1123 | --- a/drivers/ide/pci/alim15x3.c |
1124 | +++ b/drivers/ide/pci/alim15x3.c |
1125 | @@ -731,6 +731,8 @@ static unsigned int __devinit ata66_ali1 |
1126 | |
1127 | if(m5229_revision <= 0x20) |
1128 | tmpbyte = (tmpbyte & (~0x02)) | 0x01; |
1129 | + else if (m5229_revision == 0xc7) |
1130 | + tmpbyte |= 0x03; |
1131 | else |
1132 | tmpbyte |= 0x01; |
1133 | |
1134 | diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c |
1135 | index eca92eb..d83248e 100644 |
1136 | --- a/drivers/ieee1394/sbp2.c |
1137 | +++ b/drivers/ieee1394/sbp2.c |
1138 | @@ -495,22 +495,17 @@ static struct sbp2_command_info *sbp2uti |
1139 | /* |
1140 | * This function finds the sbp2_command for a given outstanding SCpnt. |
1141 | * Only looks at the inuse list. |
1142 | + * Must be called with scsi_id->sbp2_command_orb_lock held. |
1143 | */ |
1144 | -static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt) |
1145 | +static struct sbp2_command_info *sbp2util_find_command_for_SCpnt( |
1146 | + struct scsi_id_instance_data *scsi_id, void *SCpnt) |
1147 | { |
1148 | struct sbp2_command_info *command; |
1149 | - unsigned long flags; |
1150 | |
1151 | - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); |
1152 | - if (!list_empty(&scsi_id->sbp2_command_orb_inuse)) { |
1153 | - list_for_each_entry(command, &scsi_id->sbp2_command_orb_inuse, list) { |
1154 | - if (command->Current_SCpnt == SCpnt) { |
1155 | - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); |
1156 | + if (!list_empty(&scsi_id->sbp2_command_orb_inuse)) |
1157 | + list_for_each_entry(command, &scsi_id->sbp2_command_orb_inuse, list) |
1158 | + if (command->Current_SCpnt == SCpnt) |
1159 | return command; |
1160 | - } |
1161 | - } |
1162 | - } |
1163 | - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); |
1164 | return NULL; |
1165 | } |
1166 | |
1167 | @@ -579,17 +574,15 @@ static void sbp2util_free_command_dma(st |
1168 | |
1169 | /* |
1170 | * This function moves a command to the completed orb list. |
1171 | + * Must be called with scsi_id->sbp2_command_orb_lock held. |
1172 | */ |
1173 | -static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id, |
1174 | - struct sbp2_command_info *command) |
1175 | +static void sbp2util_mark_command_completed( |
1176 | + struct scsi_id_instance_data *scsi_id, |
1177 | + struct sbp2_command_info *command) |
1178 | { |
1179 | - unsigned long flags; |
1180 | - |
1181 | - spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); |
1182 | list_del(&command->list); |
1183 | sbp2util_free_command_dma(command); |
1184 | list_add_tail(&command->list, &scsi_id->sbp2_command_orb_completed); |
1185 | - spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); |
1186 | } |
1187 | |
1188 | /* |
1189 | @@ -2177,7 +2170,9 @@ static int sbp2_handle_status_write(stru |
1190 | * Matched status with command, now grab scsi command pointers and check status |
1191 | */ |
1192 | SCpnt = command->Current_SCpnt; |
1193 | + spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); |
1194 | sbp2util_mark_command_completed(scsi_id, command); |
1195 | + spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); |
1196 | |
1197 | if (SCpnt) { |
1198 | |
1199 | @@ -2513,6 +2508,7 @@ static int sbp2scsi_abort(struct scsi_cm |
1200 | (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0]; |
1201 | struct sbp2scsi_host_info *hi = scsi_id->hi; |
1202 | struct sbp2_command_info *command; |
1203 | + unsigned long flags; |
1204 | |
1205 | SBP2_ERR("aborting sbp2 command"); |
1206 | scsi_print_command(SCpnt); |
1207 | @@ -2523,6 +2519,7 @@ static int sbp2scsi_abort(struct scsi_cm |
1208 | * Right now, just return any matching command structures |
1209 | * to the free pool. |
1210 | */ |
1211 | + spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags); |
1212 | command = sbp2util_find_command_for_SCpnt(scsi_id, SCpnt); |
1213 | if (command) { |
1214 | SBP2_DEBUG("Found command to abort"); |
1215 | @@ -2540,6 +2537,7 @@ static int sbp2scsi_abort(struct scsi_cm |
1216 | command->Current_done(command->Current_SCpnt); |
1217 | } |
1218 | } |
1219 | + spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags); |
1220 | |
1221 | /* |
1222 | * Initiate a fetch agent reset. |
1223 | diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c |
1224 | index 5ebfd1d..5282fec 100644 |
1225 | --- a/drivers/macintosh/therm_adt746x.c |
1226 | +++ b/drivers/macintosh/therm_adt746x.c |
1227 | @@ -627,8 +627,8 @@ thermostat_init(void) |
1228 | if(therm_type == ADT7460) |
1229 | device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed); |
1230 | |
1231 | -#ifndef CONFIG_I2C_KEYWEST |
1232 | - request_module("i2c-keywest"); |
1233 | +#ifndef CONFIG_I2C_POWERMAC |
1234 | + request_module("i2c-powermac"); |
1235 | #endif |
1236 | |
1237 | return i2c_add_driver(&thermostat_driver); |
1238 | diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
1239 | index 745ca1f..d559569 100644 |
1240 | --- a/drivers/md/dm.c |
1241 | +++ b/drivers/md/dm.c |
1242 | @@ -533,30 +533,35 @@ static void __clone_and_map(struct clone |
1243 | |
1244 | } else { |
1245 | /* |
1246 | - * Create two copy bios to deal with io that has |
1247 | - * been split across a target. |
1248 | + * Handle a bvec that must be split between two or more targets. |
1249 | */ |
1250 | struct bio_vec *bv = bio->bi_io_vec + ci->idx; |
1251 | + sector_t remaining = to_sector(bv->bv_len); |
1252 | + unsigned int offset = 0; |
1253 | |
1254 | - clone = split_bvec(bio, ci->sector, ci->idx, |
1255 | - bv->bv_offset, max); |
1256 | - __map_bio(ti, clone, tio); |
1257 | + do { |
1258 | + if (offset) { |
1259 | + ti = dm_table_find_target(ci->map, ci->sector); |
1260 | + max = max_io_len(ci->md, ci->sector, ti); |
1261 | |
1262 | - ci->sector += max; |
1263 | - ci->sector_count -= max; |
1264 | - ti = dm_table_find_target(ci->map, ci->sector); |
1265 | - |
1266 | - len = to_sector(bv->bv_len) - max; |
1267 | - clone = split_bvec(bio, ci->sector, ci->idx, |
1268 | - bv->bv_offset + to_bytes(max), len); |
1269 | - tio = alloc_tio(ci->md); |
1270 | - tio->io = ci->io; |
1271 | - tio->ti = ti; |
1272 | - memset(&tio->info, 0, sizeof(tio->info)); |
1273 | - __map_bio(ti, clone, tio); |
1274 | + tio = alloc_tio(ci->md); |
1275 | + tio->io = ci->io; |
1276 | + tio->ti = ti; |
1277 | + memset(&tio->info, 0, sizeof(tio->info)); |
1278 | + } |
1279 | + |
1280 | + len = min(remaining, max); |
1281 | + |
1282 | + clone = split_bvec(bio, ci->sector, ci->idx, |
1283 | + bv->bv_offset + offset, len); |
1284 | + |
1285 | + __map_bio(ti, clone, tio); |
1286 | + |
1287 | + ci->sector += len; |
1288 | + ci->sector_count -= len; |
1289 | + offset += to_bytes(len); |
1290 | + } while (remaining -= len); |
1291 | |
1292 | - ci->sector += len; |
1293 | - ci->sector_count -= len; |
1294 | ci->idx++; |
1295 | } |
1296 | } |
1297 | diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig |
1298 | index d82c8a3..ef42a26 100644 |
1299 | --- a/drivers/media/video/Kconfig |
1300 | +++ b/drivers/media/video/Kconfig |
1301 | @@ -349,6 +349,7 @@ config VIDEO_AUDIO_DECODER |
1302 | config VIDEO_DECODER |
1303 | tristate "Add support for additional video chipsets" |
1304 | depends on VIDEO_DEV && I2C && EXPERIMENTAL |
1305 | + select FW_LOADER |
1306 | ---help--- |
1307 | Say Y here to compile drivers for SAA7115, SAA7127 and CX25840 |
1308 | video decoders. |
1309 | diff --git a/drivers/media/video/tuner-types.c b/drivers/media/video/tuner-types.c |
1310 | index 6fe7817..5f3d46d 100644 |
1311 | --- a/drivers/media/video/tuner-types.c |
1312 | +++ b/drivers/media/video/tuner-types.c |
1313 | @@ -1087,8 +1087,8 @@ static struct tuner_params tuner_tnf_533 |
1314 | /* ------------ TUNER_SAMSUNG_TCPN_2121P30A - Samsung NTSC ------------ */ |
1315 | |
1316 | static struct tuner_range tuner_samsung_tcpn_2121p30a_ntsc_ranges[] = { |
1317 | - { 16 * 175.75 /*MHz*/, 0x01, }, |
1318 | - { 16 * 410.25 /*MHz*/, 0x02, }, |
1319 | + { 16 * 130.00 /*MHz*/, 0x01, }, |
1320 | + { 16 * 364.50 /*MHz*/, 0x02, }, |
1321 | { 16 * 999.99 , 0x08, }, |
1322 | }; |
1323 | |
1324 | diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig |
1325 | index 1fc4c13..cfe288a 100644 |
1326 | --- a/drivers/mtd/nand/Kconfig |
1327 | +++ b/drivers/mtd/nand/Kconfig |
1328 | @@ -178,17 +178,16 @@ config MTD_NAND_DISKONCHIP_BBTWRITE |
1329 | Even if you leave this disabled, you can enable BBT writes at module |
1330 | load time (assuming you build diskonchip as a module) with the module |
1331 | parameter "inftl_bbt_write=1". |
1332 | - |
1333 | - config MTD_NAND_SHARPSL |
1334 | - bool "Support for NAND Flash on Sharp SL Series (C7xx + others)" |
1335 | - depends on MTD_NAND && ARCH_PXA |
1336 | - |
1337 | - config MTD_NAND_NANDSIM |
1338 | - bool "Support for NAND Flash Simulator" |
1339 | - depends on MTD_NAND && MTD_PARTITIONS |
1340 | |
1341 | +config MTD_NAND_SHARPSL |
1342 | + tristate "Support for NAND Flash on Sharp SL Series (C7xx + others)" |
1343 | + depends on MTD_NAND && ARCH_PXA |
1344 | + |
1345 | +config MTD_NAND_NANDSIM |
1346 | + tristate "Support for NAND Flash Simulator" |
1347 | + depends on MTD_NAND && MTD_PARTITIONS |
1348 | help |
1349 | The simulator may simulate verious NAND flash chips for the |
1350 | MTD nand layer. |
1351 | - |
1352 | + |
1353 | endmenu |
1354 | diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c |
1355 | index 8936058..6e2ec56 100644 |
1356 | --- a/drivers/net/irda/irda-usb.c |
1357 | +++ b/drivers/net/irda/irda-usb.c |
1358 | @@ -740,7 +740,7 @@ static void irda_usb_receive(struct urb |
1359 | struct sk_buff *newskb; |
1360 | struct sk_buff *dataskb; |
1361 | struct urb *next_urb; |
1362 | - int docopy; |
1363 | + unsigned int len, docopy; |
1364 | |
1365 | IRDA_DEBUG(2, "%s(), len=%d\n", __FUNCTION__, urb->actual_length); |
1366 | |
1367 | @@ -851,10 +851,11 @@ static void irda_usb_receive(struct urb |
1368 | dataskb->dev = self->netdev; |
1369 | dataskb->mac.raw = dataskb->data; |
1370 | dataskb->protocol = htons(ETH_P_IRDA); |
1371 | + len = dataskb->len; |
1372 | netif_rx(dataskb); |
1373 | |
1374 | /* Keep stats up to date */ |
1375 | - self->stats.rx_bytes += dataskb->len; |
1376 | + self->stats.rx_bytes += len; |
1377 | self->stats.rx_packets++; |
1378 | self->netdev->last_rx = jiffies; |
1379 | |
1380 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c |
1381 | index 7326036..0618cd5 100644 |
1382 | --- a/drivers/net/sky2.c |
1383 | +++ b/drivers/net/sky2.c |
1384 | @@ -579,8 +579,8 @@ static void sky2_mac_init(struct sky2_hw |
1385 | reg = gma_read16(hw, port, GM_PHY_ADDR); |
1386 | gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR); |
1387 | |
1388 | - for (i = 0; i < GM_MIB_CNT_SIZE; i++) |
1389 | - gma_read16(hw, port, GM_MIB_CNT_BASE + 8 * i); |
1390 | + for (i = GM_MIB_CNT_BASE; i <= GM_MIB_CNT_END; i += 4) |
1391 | + gma_read16(hw, port, i); |
1392 | gma_write16(hw, port, GM_PHY_ADDR, reg); |
1393 | |
1394 | /* transmit control */ |
1395 | diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h |
1396 | index dce955c..c91e0a4 100644 |
1397 | --- a/drivers/net/sky2.h |
1398 | +++ b/drivers/net/sky2.h |
1399 | @@ -1380,6 +1380,7 @@ enum { |
1400 | /* MIB Counters */ |
1401 | #define GM_MIB_CNT_BASE 0x0100 /* Base Address of MIB Counters */ |
1402 | #define GM_MIB_CNT_SIZE 44 /* Number of MIB Counters */ |
1403 | +#define GM_MIB_CNT_END 0x025C /* Last MIB counter */ |
1404 | |
1405 | /* |
1406 | * MIB Counters base address definitions (low word) - |
1407 | diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig |
1408 | index ef85d76..8101657 100644 |
1409 | --- a/drivers/net/wireless/Kconfig |
1410 | +++ b/drivers/net/wireless/Kconfig |
1411 | @@ -239,7 +239,8 @@ config IPW2200_DEBUG |
1412 | |
1413 | config AIRO |
1414 | tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" |
1415 | - depends on NET_RADIO && ISA_DMA_API && CRYPTO && (PCI || BROKEN) |
1416 | + depends on NET_RADIO && ISA_DMA_API && (PCI || BROKEN) |
1417 | + select CRYPTO |
1418 | ---help--- |
1419 | This is the standard Linux driver to support Cisco/Aironet ISA and |
1420 | PCI 802.11 wireless cards. |
1421 | @@ -374,6 +375,7 @@ config PCMCIA_HERMES |
1422 | config PCMCIA_SPECTRUM |
1423 | tristate "Symbol Spectrum24 Trilogy PCMCIA card support" |
1424 | depends on NET_RADIO && PCMCIA && HERMES |
1425 | + select FW_LOADER |
1426 | ---help--- |
1427 | |
1428 | This is a driver for 802.11b cards using RAM-loadable Symbol |
1429 | @@ -387,6 +389,7 @@ config PCMCIA_SPECTRUM |
1430 | config AIRO_CS |
1431 | tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards" |
1432 | depends on NET_RADIO && PCMCIA && (BROKEN || !M32R) |
1433 | + select CRYPTO |
1434 | ---help--- |
1435 | This is the standard Linux driver to support Cisco/Aironet PCMCIA |
1436 | 802.11 wireless cards. This driver is the same as the Aironet |
1437 | diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c |
1438 | index 4a85e63..5f398bd 100644 |
1439 | --- a/drivers/net/wireless/hostap/hostap_80211_tx.c |
1440 | +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c |
1441 | @@ -469,7 +469,7 @@ int hostap_master_start_xmit(struct sk_b |
1442 | } |
1443 | |
1444 | if (local->ieee_802_1x && meta->ethertype == ETH_P_PAE && tx.crypt && |
1445 | - !(fc & IEEE80211_FCTL_VERS)) { |
1446 | + !(fc & IEEE80211_FCTL_PROTECTED)) { |
1447 | no_encrypt = 1; |
1448 | PDEBUG(DEBUG_EXTRA2, "%s: TX: IEEE 802.1X - passing " |
1449 | "unencrypted EAPOL frame\n", dev->name); |
1450 | diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c |
1451 | index 287676a..aa6f3a4 100644 |
1452 | --- a/drivers/net/wireless/ipw2200.c |
1453 | +++ b/drivers/net/wireless/ipw2200.c |
1454 | @@ -9956,9 +9956,8 @@ static int ipw_ethtool_set_eeprom(struct |
1455 | return -EINVAL; |
1456 | down(&p->sem); |
1457 | memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len); |
1458 | - for (i = IPW_EEPROM_DATA; |
1459 | - i < IPW_EEPROM_DATA + IPW_EEPROM_IMAGE_SIZE; i++) |
1460 | - ipw_write8(p, i, p->eeprom[i]); |
1461 | + for (i = 0; i < IPW_EEPROM_IMAGE_SIZE; i++) |
1462 | + ipw_write8(p, i + IPW_EEPROM_DATA, p->eeprom[i]); |
1463 | up(&p->sem); |
1464 | return 0; |
1465 | } |
1466 | diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c |
1467 | index bb96ce1..a4333a8 100644 |
1468 | --- a/drivers/pcmcia/ds.c |
1469 | +++ b/drivers/pcmcia/ds.c |
1470 | @@ -546,7 +546,7 @@ static int pcmcia_device_query(struct pc |
1471 | tmp = vers1->str + vers1->ofs[i]; |
1472 | |
1473 | length = strlen(tmp) + 1; |
1474 | - if ((length < 3) || (length > 255)) |
1475 | + if ((length < 2) || (length > 255)) |
1476 | continue; |
1477 | |
1478 | p_dev->prod_id[i] = kmalloc(sizeof(char) * length, |
1479 | diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c |
1480 | index d9152d0..9132549 100644 |
1481 | --- a/drivers/scsi/3w-9xxx.c |
1482 | +++ b/drivers/scsi/3w-9xxx.c |
1483 | @@ -85,7 +85,7 @@ #include <scsi/scsi_cmnd.h> |
1484 | #include "3w-9xxx.h" |
1485 | |
1486 | /* Globals */ |
1487 | -#define TW_DRIVER_VERSION "2.26.02.005" |
1488 | +#define TW_DRIVER_VERSION "2.26.02.007" |
1489 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; |
1490 | static unsigned int twa_device_extension_count; |
1491 | static int twa_major = -1; |
1492 | @@ -1944,9 +1944,13 @@ static void twa_scsiop_execute_scsi_comp |
1493 | } |
1494 | if (tw_dev->srb[request_id]->use_sg == 1) { |
1495 | struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; |
1496 | - char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; |
1497 | + char *buf; |
1498 | + unsigned long flags = 0; |
1499 | + local_irq_save(flags); |
1500 | + buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; |
1501 | memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); |
1502 | kunmap_atomic(buf - sg->offset, KM_IRQ0); |
1503 | + local_irq_restore(flags); |
1504 | } |
1505 | } |
1506 | } /* End twa_scsiop_execute_scsi_complete() */ |
1507 | diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c |
1508 | index 25f678d..e8e41e6 100644 |
1509 | --- a/drivers/scsi/3w-xxxx.c |
1510 | +++ b/drivers/scsi/3w-xxxx.c |
1511 | @@ -1508,10 +1508,12 @@ static void tw_transfer_internal(TW_Devi |
1512 | struct scsi_cmnd *cmd = tw_dev->srb[request_id]; |
1513 | void *buf; |
1514 | unsigned int transfer_len; |
1515 | + unsigned long flags = 0; |
1516 | |
1517 | if (cmd->use_sg) { |
1518 | struct scatterlist *sg = |
1519 | (struct scatterlist *)cmd->request_buffer; |
1520 | + local_irq_save(flags); |
1521 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; |
1522 | transfer_len = min(sg->length, len); |
1523 | } else { |
1524 | @@ -1526,6 +1528,7 @@ static void tw_transfer_internal(TW_Devi |
1525 | |
1526 | sg = (struct scatterlist *)cmd->request_buffer; |
1527 | kunmap_atomic(buf - sg->offset, KM_IRQ0); |
1528 | + local_irq_restore(flags); |
1529 | } |
1530 | } |
1531 | |
1532 | diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c |
1533 | index 2770005..b00af08 100644 |
1534 | --- a/drivers/scsi/sata_mv.c |
1535 | +++ b/drivers/scsi/sata_mv.c |
1536 | @@ -1102,6 +1102,7 @@ static u8 mv_get_crpb_status(struct ata_ |
1537 | void __iomem *port_mmio = mv_ap_base(ap); |
1538 | struct mv_port_priv *pp = ap->private_data; |
1539 | u32 out_ptr; |
1540 | + u8 ata_status; |
1541 | |
1542 | out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); |
1543 | |
1544 | @@ -1109,6 +1110,8 @@ static u8 mv_get_crpb_status(struct ata_ |
1545 | assert(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) == |
1546 | pp->rsp_consumer); |
1547 | |
1548 | + ata_status = pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT; |
1549 | + |
1550 | /* increment our consumer index... */ |
1551 | pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer); |
1552 | |
1553 | @@ -1123,7 +1126,7 @@ static u8 mv_get_crpb_status(struct ata_ |
1554 | writelfl(out_ptr, port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); |
1555 | |
1556 | /* Return ATA status register for completed CRPB */ |
1557 | - return (pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT); |
1558 | + return ata_status; |
1559 | } |
1560 | |
1561 | /** |
1562 | @@ -1192,7 +1195,6 @@ static void mv_host_intr(struct ata_host |
1563 | u32 hc_irq_cause; |
1564 | int shift, port, port0, hard_port, handled; |
1565 | unsigned int err_mask; |
1566 | - u8 ata_status = 0; |
1567 | |
1568 | if (hc == 0) { |
1569 | port0 = 0; |
1570 | @@ -1210,6 +1212,7 @@ static void mv_host_intr(struct ata_host |
1571 | hc,relevant,hc_irq_cause); |
1572 | |
1573 | for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) { |
1574 | + u8 ata_status = 0; |
1575 | ap = host_set->ports[port]; |
1576 | hard_port = port & MV_PORT_MASK; /* range 0-3 */ |
1577 | handled = 0; /* ensure ata_status is set if handled++ */ |
1578 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
1579 | index 7135e54..96cabeb 100644 |
1580 | --- a/drivers/usb/core/message.c |
1581 | +++ b/drivers/usb/core/message.c |
1582 | @@ -1388,11 +1388,13 @@ free_interfaces: |
1583 | if (dev->state != USB_STATE_ADDRESS) |
1584 | usb_disable_device (dev, 1); // Skip ep0 |
1585 | |
1586 | - i = dev->bus_mA - cp->desc.bMaxPower * 2; |
1587 | - if (i < 0) |
1588 | - dev_warn(&dev->dev, "new config #%d exceeds power " |
1589 | - "limit by %dmA\n", |
1590 | - configuration, -i); |
1591 | + if (cp) { |
1592 | + i = dev->bus_mA - cp->desc.bMaxPower * 2; |
1593 | + if (i < 0) |
1594 | + dev_warn(&dev->dev, "new config #%d exceeds power " |
1595 | + "limit by %dmA\n", |
1596 | + configuration, -i); |
1597 | + } |
1598 | |
1599 | if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), |
1600 | USB_REQ_SET_CONFIGURATION, 0, configuration, 0, |
1601 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c |
1602 | index ebcca97..88419c6 100644 |
1603 | --- a/drivers/usb/host/ehci-sched.c |
1604 | +++ b/drivers/usb/host/ehci-sched.c |
1605 | @@ -707,6 +707,7 @@ iso_stream_init ( |
1606 | } else { |
1607 | u32 addr; |
1608 | int think_time; |
1609 | + int hs_transfers; |
1610 | |
1611 | addr = dev->ttport << 24; |
1612 | if (!ehci_is_TDI(ehci) |
1613 | @@ -719,6 +720,7 @@ iso_stream_init ( |
1614 | think_time = dev->tt ? dev->tt->think_time : 0; |
1615 | stream->tt_usecs = NS_TO_US (think_time + usb_calc_bus_time ( |
1616 | dev->speed, is_input, 1, maxp)); |
1617 | + hs_transfers = max (1u, (maxp + 187) / 188); |
1618 | if (is_input) { |
1619 | u32 tmp; |
1620 | |
1621 | @@ -727,12 +729,11 @@ iso_stream_init ( |
1622 | stream->usecs = HS_USECS_ISO (1); |
1623 | stream->raw_mask = 1; |
1624 | |
1625 | - /* pessimistic c-mask */ |
1626 | - tmp = usb_calc_bus_time (USB_SPEED_FULL, 1, 0, maxp) |
1627 | - / (125 * 1000); |
1628 | - stream->raw_mask |= 3 << (tmp + 9); |
1629 | + /* c-mask as specified in USB 2.0 11.18.4 3.c */ |
1630 | + tmp = (1 << (hs_transfers + 2)) - 1; |
1631 | + stream->raw_mask |= tmp << (8 + 2); |
1632 | } else |
1633 | - stream->raw_mask = smask_out [maxp / 188]; |
1634 | + stream->raw_mask = smask_out [hs_transfers - 1]; |
1635 | bandwidth = stream->usecs + stream->c_usecs; |
1636 | bandwidth /= 1 << (interval + 2); |
1637 | |
1638 | diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c |
1639 | index 167f8ec..8023bb7 100644 |
1640 | --- a/drivers/usb/serial/console.c |
1641 | +++ b/drivers/usb/serial/console.c |
1642 | @@ -54,7 +54,7 @@ static struct console usbcons; |
1643 | * serial.c code, except that the specifier is "ttyUSB" instead |
1644 | * of "ttyS". |
1645 | */ |
1646 | -static int __init usb_console_setup(struct console *co, char *options) |
1647 | +static int usb_console_setup(struct console *co, char *options) |
1648 | { |
1649 | struct usbcons_info *info = &usbcons_info; |
1650 | int baud = 9600; |
1651 | diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig |
1652 | index 92be101..be9eec2 100644 |
1653 | --- a/drivers/usb/storage/Kconfig |
1654 | +++ b/drivers/usb/storage/Kconfig |
1655 | @@ -48,7 +48,8 @@ config USB_STORAGE_FREECOM |
1656 | |
1657 | config USB_STORAGE_ISD200 |
1658 | bool "ISD-200 USB/ATA Bridge support" |
1659 | - depends on USB_STORAGE && BLK_DEV_IDE |
1660 | + depends on USB_STORAGE |
1661 | + depends on BLK_DEV_IDE=y || BLK_DEV_IDE=USB_STORAGE |
1662 | ---help--- |
1663 | Say Y here if you want to use USB Mass Store devices based |
1664 | on the In-Systems Design ISD-200 USB/ATA bridge. |
1665 | diff --git a/drivers/video/cfbimgblt.c b/drivers/video/cfbimgblt.c |
1666 | index 910e233..8ba6152 100644 |
1667 | --- a/drivers/video/cfbimgblt.c |
1668 | +++ b/drivers/video/cfbimgblt.c |
1669 | @@ -169,7 +169,7 @@ static inline void slow_imageblit(const |
1670 | |
1671 | while (j--) { |
1672 | l--; |
1673 | - color = (*s & 1 << (FB_BIT_NR(l))) ? fgcolor : bgcolor; |
1674 | + color = (*s & (1 << l)) ? fgcolor : bgcolor; |
1675 | val |= FB_SHIFT_HIGH(color, shift); |
1676 | |
1677 | /* Did the bitshift spill bits to the next long? */ |
1678 | diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c |
1679 | index 996c7b5..b3094ae 100644 |
1680 | --- a/drivers/video/fbmem.c |
1681 | +++ b/drivers/video/fbmem.c |
1682 | @@ -669,13 +669,19 @@ fb_write(struct file *file, const char _ |
1683 | total_size = info->fix.smem_len; |
1684 | |
1685 | if (p > total_size) |
1686 | - return 0; |
1687 | + return -EFBIG; |
1688 | |
1689 | - if (count >= total_size) |
1690 | + if (count > total_size) { |
1691 | + err = -EFBIG; |
1692 | count = total_size; |
1693 | + } |
1694 | + |
1695 | + if (count + p > total_size) { |
1696 | + if (!err) |
1697 | + err = -ENOSPC; |
1698 | |
1699 | - if (count + p > total_size) |
1700 | count = total_size - p; |
1701 | + } |
1702 | |
1703 | buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, |
1704 | GFP_KERNEL); |
1705 | @@ -717,7 +723,7 @@ fb_write(struct file *file, const char _ |
1706 | |
1707 | kfree(buffer); |
1708 | |
1709 | - return (err) ? err : cnt; |
1710 | + return (cnt) ? cnt : err; |
1711 | } |
1712 | |
1713 | #ifdef CONFIG_KMOD |
1714 | diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c |
1715 | index d8467c0..788297e 100644 |
1716 | --- a/drivers/video/i810/i810_main.c |
1717 | +++ b/drivers/video/i810/i810_main.c |
1718 | @@ -1508,7 +1508,7 @@ static int i810fb_cursor(struct fb_info |
1719 | int size = ((cursor->image.width + 7) >> 3) * |
1720 | cursor->image.height; |
1721 | int i; |
1722 | - u8 *data = kmalloc(64 * 8, GFP_KERNEL); |
1723 | + u8 *data = kmalloc(64 * 8, GFP_ATOMIC); |
1724 | |
1725 | if (data == NULL) |
1726 | return -ENOMEM; |
1727 | diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c |
1728 | index 3ad8455..651a9e1 100644 |
1729 | --- a/fs/9p/vfs_inode.c |
1730 | +++ b/fs/9p/vfs_inode.c |
1731 | @@ -614,6 +614,7 @@ static struct dentry *v9fs_vfs_lookup(st |
1732 | |
1733 | sb = dir->i_sb; |
1734 | v9ses = v9fs_inode2v9ses(dir); |
1735 | + dentry->d_op = &v9fs_dentry_operations; |
1736 | dirfid = v9fs_fid_lookup(dentry->d_parent); |
1737 | |
1738 | if (!dirfid) { |
1739 | @@ -681,8 +682,6 @@ static struct dentry *v9fs_vfs_lookup(st |
1740 | goto FreeFcall; |
1741 | |
1742 | fid->qid = fcall->params.rstat.stat.qid; |
1743 | - |
1744 | - dentry->d_op = &v9fs_dentry_operations; |
1745 | v9fs_stat2inode(&fcall->params.rstat.stat, inode, inode->i_sb); |
1746 | |
1747 | d_add(dentry, inode); |
1748 | diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c |
1749 | index a2c2485..3f5e38c 100644 |
1750 | --- a/fs/cifs/cifsencrypt.c |
1751 | +++ b/fs/cifs/cifsencrypt.c |
1752 | @@ -56,9 +56,6 @@ int cifs_sign_smb(struct smb_hdr * cifs_ |
1753 | int rc = 0; |
1754 | char smb_signature[20]; |
1755 | |
1756 | - /* BB remember to initialize sequence number elsewhere and initialize mac_signing key elsewhere BB */ |
1757 | - /* BB remember to add code to save expected sequence number in midQ entry BB */ |
1758 | - |
1759 | if((cifs_pdu == NULL) || (server == NULL)) |
1760 | return -EINVAL; |
1761 | |
1762 | @@ -85,20 +82,33 @@ int cifs_sign_smb(struct smb_hdr * cifs_ |
1763 | static int cifs_calc_signature2(const struct kvec * iov, int n_vec, |
1764 | const char * key, char * signature) |
1765 | { |
1766 | - struct MD5Context context; |
1767 | - |
1768 | - if((iov == NULL) || (signature == NULL)) |
1769 | - return -EINVAL; |
1770 | + struct MD5Context context; |
1771 | + int i; |
1772 | |
1773 | - MD5Init(&context); |
1774 | - MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16); |
1775 | + if((iov == NULL) || (signature == NULL)) |
1776 | + return -EINVAL; |
1777 | |
1778 | -/* MD5Update(&context,cifs_pdu->Protocol,cifs_pdu->smb_buf_length); */ /* BB FIXME BB */ |
1779 | + MD5Init(&context); |
1780 | + MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16); |
1781 | + for(i=0;i<n_vec;i++) { |
1782 | + if(iov[i].iov_base == NULL) { |
1783 | + cERROR(1,("null iovec entry")); |
1784 | + return -EIO; |
1785 | + } else if(iov[i].iov_len == 0) |
1786 | + break; /* bail out if we are sent nothing to sign */ |
1787 | + /* The first entry includes a length field (which does not get |
1788 | + signed that occupies the first 4 bytes before the header */ |
1789 | + if(i==0) { |
1790 | + if (iov[0].iov_len <= 8 ) /* cmd field at offset 9 */ |
1791 | + break; /* nothing to sign or corrupt header */ |
1792 | + MD5Update(&context,iov[0].iov_base+4, iov[0].iov_len-4); |
1793 | + } else |
1794 | + MD5Update(&context,iov[i].iov_base, iov[i].iov_len); |
1795 | + } |
1796 | |
1797 | - MD5Final(signature,&context); |
1798 | + MD5Final(signature,&context); |
1799 | |
1800 | - return -EOPNOTSUPP; |
1801 | -/* return 0; */ |
1802 | + return 0; |
1803 | } |
1804 | |
1805 | |
1806 | diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c |
1807 | index fed55e3..5e562bc 100644 |
1808 | --- a/fs/cifs/dir.c |
1809 | +++ b/fs/cifs/dir.c |
1810 | @@ -441,6 +441,20 @@ cifs_lookup(struct inode *parent_dir_ino |
1811 | cifs_sb = CIFS_SB(parent_dir_inode->i_sb); |
1812 | pTcon = cifs_sb->tcon; |
1813 | |
1814 | + /* |
1815 | + * Don't allow the separator character in a path component. |
1816 | + * The VFS will not allow "/", but "\" is allowed by posix. |
1817 | + */ |
1818 | + if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)) { |
1819 | + int i; |
1820 | + for (i = 0; i < direntry->d_name.len; i++) |
1821 | + if (direntry->d_name.name[i] == '\\') { |
1822 | + cFYI(1, ("Invalid file name")); |
1823 | + FreeXid(xid); |
1824 | + return ERR_PTR(-EINVAL); |
1825 | + } |
1826 | + } |
1827 | + |
1828 | /* can not grab the rename sem here since it would |
1829 | deadlock in the cases (beginning of sys_rename itself) |
1830 | in which we already have the sb rename sem */ |
1831 | diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c |
1832 | index 1041dab..14f5f6e 100644 |
1833 | --- a/fs/ext3/resize.c |
1834 | +++ b/fs/ext3/resize.c |
1835 | @@ -974,6 +974,7 @@ int ext3_group_extend(struct super_block |
1836 | if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) { |
1837 | ext3_warning(sb, __FUNCTION__, |
1838 | "multiple resizers run on filesystem!"); |
1839 | + unlock_super(sb); |
1840 | err = -EBUSY; |
1841 | goto exit_put; |
1842 | } |
1843 | diff --git a/fs/fuse/file.c b/fs/fuse/file.c |
1844 | index 6f05379..ce93cf9 100644 |
1845 | --- a/fs/fuse/file.c |
1846 | +++ b/fs/fuse/file.c |
1847 | @@ -397,8 +397,12 @@ static int fuse_readpages(struct file *f |
1848 | return -EINTR; |
1849 | |
1850 | err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); |
1851 | - if (!err) |
1852 | - fuse_send_readpages(data.req, file, inode); |
1853 | + if (!err) { |
1854 | + if (data.req->num_pages) |
1855 | + fuse_send_readpages(data.req, file, inode); |
1856 | + else |
1857 | + fuse_put_request(fc, data.req); |
1858 | + } |
1859 | return err; |
1860 | } |
1861 | |
1862 | diff --git a/fs/locks.c b/fs/locks.c |
1863 | index 909eab8..e75ac39 100644 |
1864 | --- a/fs/locks.c |
1865 | +++ b/fs/locks.c |
1866 | @@ -2212,7 +2212,12 @@ void steal_locks(fl_owner_t from) |
1867 | |
1868 | lock_kernel(); |
1869 | j = 0; |
1870 | - rcu_read_lock(); |
1871 | + |
1872 | + /* |
1873 | + * We are not taking a ref to the file structures, so |
1874 | + * we need to acquire ->file_lock. |
1875 | + */ |
1876 | + spin_lock(&files->file_lock); |
1877 | fdt = files_fdtable(files); |
1878 | for (;;) { |
1879 | unsigned long set; |
1880 | @@ -2230,7 +2235,7 @@ void steal_locks(fl_owner_t from) |
1881 | set >>= 1; |
1882 | } |
1883 | } |
1884 | - rcu_read_unlock(); |
1885 | + spin_unlock(&files->file_lock); |
1886 | unlock_kernel(); |
1887 | } |
1888 | EXPORT_SYMBOL(steal_locks); |
1889 | diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c |
1890 | index 6d2dfed..f61142a 100644 |
1891 | --- a/fs/nfsd/nfs3proc.c |
1892 | +++ b/fs/nfsd/nfs3proc.c |
1893 | @@ -682,7 +682,7 @@ static struct svc_procedure nfsd_proced |
1894 | PROC(lookup, dirop, dirop, fhandle2, RC_NOCACHE, ST+FH+pAT+pAT), |
1895 | PROC(access, access, access, fhandle, RC_NOCACHE, ST+pAT+1), |
1896 | PROC(readlink, readlink, readlink, fhandle, RC_NOCACHE, ST+pAT+1+NFS3_MAXPATHLEN/4), |
1897 | - PROC(read, read, read, fhandle, RC_NOCACHE, ST+pAT+4+NFSSVC_MAXBLKSIZE), |
1898 | + PROC(read, read, read, fhandle, RC_NOCACHE, ST+pAT+4+NFSSVC_MAXBLKSIZE/4), |
1899 | PROC(write, write, write, fhandle, RC_REPLBUFF, ST+WC+4), |
1900 | PROC(create, create, create, fhandle2, RC_REPLBUFF, ST+(1+FH+pAT)+WC), |
1901 | PROC(mkdir, mkdir, create, fhandle2, RC_REPLBUFF, ST+(1+FH+pAT)+WC), |
1902 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
1903 | index 6d63f1d..ca8a4c4 100644 |
1904 | --- a/fs/nfsd/nfs4proc.c |
1905 | +++ b/fs/nfsd/nfs4proc.c |
1906 | @@ -975,7 +975,7 @@ #define PROC(name, argt, rest, relt, cac |
1907 | */ |
1908 | static struct svc_procedure nfsd_procedures4[2] = { |
1909 | PROC(null, void, void, void, RC_NOCACHE, 1), |
1910 | - PROC(compound, compound, compound, compound, RC_NOCACHE, NFSD_BUFSIZE) |
1911 | + PROC(compound, compound, compound, compound, RC_NOCACHE, NFSD_BUFSIZE/4) |
1912 | }; |
1913 | |
1914 | struct svc_version nfsd_version4 = { |
1915 | diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c |
1916 | index 3e6b75c..06cd0db 100644 |
1917 | --- a/fs/nfsd/nfsproc.c |
1918 | +++ b/fs/nfsd/nfsproc.c |
1919 | @@ -553,7 +553,7 @@ static struct svc_procedure nfsd_proced |
1920 | PROC(none, void, void, none, RC_NOCACHE, ST), |
1921 | PROC(lookup, diropargs, diropres, fhandle, RC_NOCACHE, ST+FH+AT), |
1922 | PROC(readlink, readlinkargs, readlinkres, none, RC_NOCACHE, ST+1+NFS_MAXPATHLEN/4), |
1923 | - PROC(read, readargs, readres, fhandle, RC_NOCACHE, ST+AT+1+NFSSVC_MAXBLKSIZE), |
1924 | + PROC(read, readargs, readres, fhandle, RC_NOCACHE, ST+AT+1+NFSSVC_MAXBLKSIZE/4), |
1925 | PROC(none, void, void, none, RC_NOCACHE, ST), |
1926 | PROC(write, writeargs, attrstat, fhandle, RC_REPLBUFF, ST+AT), |
1927 | PROC(create, createargs, diropres, fhandle, RC_REPLBUFF, ST+FH+AT), |
1928 | diff --git a/fs/open.c b/fs/open.c |
1929 | index 70e0230..f697914 100644 |
1930 | --- a/fs/open.c |
1931 | +++ b/fs/open.c |
1932 | @@ -330,7 +330,10 @@ out: |
1933 | |
1934 | asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length) |
1935 | { |
1936 | - return do_sys_ftruncate(fd, length, 1); |
1937 | + long ret = do_sys_ftruncate(fd, length, 1); |
1938 | + /* avoid REGPARM breakage on x86: */ |
1939 | + prevent_tail_call(ret); |
1940 | + return ret; |
1941 | } |
1942 | |
1943 | /* LFS versions of truncate are only needed on 32 bit machines */ |
1944 | @@ -342,7 +345,10 @@ asmlinkage long sys_truncate64(const cha |
1945 | |
1946 | asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length) |
1947 | { |
1948 | - return do_sys_ftruncate(fd, length, 0); |
1949 | + long ret = do_sys_ftruncate(fd, length, 0); |
1950 | + /* avoid REGPARM breakage on x86: */ |
1951 | + prevent_tail_call(ret); |
1952 | + return ret; |
1953 | } |
1954 | #endif |
1955 | |
1956 | @@ -1083,20 +1089,30 @@ long do_sys_open(int dfd, const char __u |
1957 | |
1958 | asmlinkage long sys_open(const char __user *filename, int flags, int mode) |
1959 | { |
1960 | + long ret; |
1961 | + |
1962 | if (force_o_largefile()) |
1963 | flags |= O_LARGEFILE; |
1964 | |
1965 | - return do_sys_open(AT_FDCWD, filename, flags, mode); |
1966 | + ret = do_sys_open(AT_FDCWD, filename, flags, mode); |
1967 | + /* avoid REGPARM breakage on x86: */ |
1968 | + prevent_tail_call(ret); |
1969 | + return ret; |
1970 | } |
1971 | EXPORT_SYMBOL_GPL(sys_open); |
1972 | |
1973 | asmlinkage long sys_openat(int dfd, const char __user *filename, int flags, |
1974 | int mode) |
1975 | { |
1976 | + long ret; |
1977 | + |
1978 | if (force_o_largefile()) |
1979 | flags |= O_LARGEFILE; |
1980 | |
1981 | - return do_sys_open(dfd, filename, flags, mode); |
1982 | + ret = do_sys_open(dfd, filename, flags, mode); |
1983 | + /* avoid REGPARM breakage on x86: */ |
1984 | + prevent_tail_call(ret); |
1985 | + return ret; |
1986 | } |
1987 | EXPORT_SYMBOL_GPL(sys_openat); |
1988 | |
1989 | diff --git a/fs/partitions/check.c b/fs/partitions/check.c |
1990 | index f924f45..2ef03aa 100644 |
1991 | --- a/fs/partitions/check.c |
1992 | +++ b/fs/partitions/check.c |
1993 | @@ -345,6 +345,7 @@ static char *make_block_name(struct gend |
1994 | char *name; |
1995 | static char *block_str = "block:"; |
1996 | int size; |
1997 | + char *s; |
1998 | |
1999 | size = strlen(block_str) + strlen(disk->disk_name) + 1; |
2000 | name = kmalloc(size, GFP_KERNEL); |
2001 | @@ -352,6 +353,10 @@ static char *make_block_name(struct gend |
2002 | return NULL; |
2003 | strcpy(name, block_str); |
2004 | strcat(name, disk->disk_name); |
2005 | + /* ewww... some of these buggers have / in name... */ |
2006 | + s = strchr(name, '/'); |
2007 | + if (s) |
2008 | + *s = '!'; |
2009 | return name; |
2010 | } |
2011 | |
2012 | diff --git a/fs/proc/base.c b/fs/proc/base.c |
2013 | index 20feb75..c192cb2 100644 |
2014 | --- a/fs/proc/base.c |
2015 | +++ b/fs/proc/base.c |
2016 | @@ -294,16 +294,20 @@ static int proc_fd_link(struct inode *in |
2017 | |
2018 | files = get_files_struct(task); |
2019 | if (files) { |
2020 | - rcu_read_lock(); |
2021 | + /* |
2022 | + * We are not taking a ref to the file structure, so we must |
2023 | + * hold ->file_lock. |
2024 | + */ |
2025 | + spin_lock(&files->file_lock); |
2026 | file = fcheck_files(files, fd); |
2027 | if (file) { |
2028 | *mnt = mntget(file->f_vfsmnt); |
2029 | *dentry = dget(file->f_dentry); |
2030 | - rcu_read_unlock(); |
2031 | + spin_unlock(&files->file_lock); |
2032 | put_files_struct(files); |
2033 | return 0; |
2034 | } |
2035 | - rcu_read_unlock(); |
2036 | + spin_unlock(&files->file_lock); |
2037 | put_files_struct(files); |
2038 | } |
2039 | return -ENOENT; |
2040 | @@ -1485,7 +1489,12 @@ static struct dentry *proc_lookupfd(stru |
2041 | if (!files) |
2042 | goto out_unlock; |
2043 | inode->i_mode = S_IFLNK; |
2044 | - rcu_read_lock(); |
2045 | + |
2046 | + /* |
2047 | + * We are not taking a ref to the file structure, so we must |
2048 | + * hold ->file_lock. |
2049 | + */ |
2050 | + spin_lock(&files->file_lock); |
2051 | file = fcheck_files(files, fd); |
2052 | if (!file) |
2053 | goto out_unlock2; |
2054 | @@ -1493,7 +1502,7 @@ static struct dentry *proc_lookupfd(stru |
2055 | inode->i_mode |= S_IRUSR | S_IXUSR; |
2056 | if (file->f_mode & 2) |
2057 | inode->i_mode |= S_IWUSR | S_IXUSR; |
2058 | - rcu_read_unlock(); |
2059 | + spin_unlock(&files->file_lock); |
2060 | put_files_struct(files); |
2061 | inode->i_op = &proc_pid_link_inode_operations; |
2062 | inode->i_size = 64; |
2063 | @@ -1503,7 +1512,7 @@ static struct dentry *proc_lookupfd(stru |
2064 | return NULL; |
2065 | |
2066 | out_unlock2: |
2067 | - rcu_read_unlock(); |
2068 | + spin_unlock(&files->file_lock); |
2069 | put_files_struct(files); |
2070 | out_unlock: |
2071 | iput(inode); |
2072 | diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c |
2073 | index 1d24fea..826c131 100644 |
2074 | --- a/fs/proc/proc_misc.c |
2075 | +++ b/fs/proc/proc_misc.c |
2076 | @@ -312,7 +312,7 @@ static void *devinfo_next(struct seq_fil |
2077 | case BLK_HDR: |
2078 | info->state = BLK_LIST; |
2079 | (*pos)++; |
2080 | - break; |
2081 | + /*fallthrough*/ |
2082 | case BLK_LIST: |
2083 | if (get_blkdev_info(info->blkdev,&idummy,&ndummy)) { |
2084 | /* |
2085 | diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c |
2086 | index 4063fb3..164a7d0 100644 |
2087 | --- a/fs/proc/vmcore.c |
2088 | +++ b/fs/proc/vmcore.c |
2089 | @@ -103,8 +103,8 @@ static ssize_t read_vmcore(struct file * |
2090 | size_t buflen, loff_t *fpos) |
2091 | { |
2092 | ssize_t acc = 0, tmp; |
2093 | - size_t tsz, nr_bytes; |
2094 | - u64 start; |
2095 | + size_t tsz; |
2096 | + u64 start, nr_bytes; |
2097 | struct vmcore *curr_m = NULL; |
2098 | |
2099 | if (buflen == 0 || *fpos >= vmcore_size) |
2100 | diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c |
2101 | index 49bd219..cfd290d 100644 |
2102 | --- a/fs/sysfs/dir.c |
2103 | +++ b/fs/sysfs/dir.c |
2104 | @@ -302,6 +302,7 @@ void sysfs_remove_dir(struct kobject * k |
2105 | * Drop reference from dget() on entrance. |
2106 | */ |
2107 | dput(dentry); |
2108 | + kobj->dentry = NULL; |
2109 | } |
2110 | |
2111 | int sysfs_rename_dir(struct kobject * kobj, const char *new_name) |
2112 | diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c |
2113 | index d0e3d84..2ecc58c 100644 |
2114 | --- a/fs/sysfs/file.c |
2115 | +++ b/fs/sysfs/file.c |
2116 | @@ -183,7 +183,7 @@ fill_write_buffer(struct sysfs_buffer * |
2117 | return -ENOMEM; |
2118 | |
2119 | if (count >= PAGE_SIZE) |
2120 | - count = PAGE_SIZE; |
2121 | + count = PAGE_SIZE - 1; |
2122 | error = copy_from_user(buffer->page,buf,count); |
2123 | buffer->needs_read_fill = 1; |
2124 | return error ? -EFAULT : count; |
2125 | diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c |
2126 | index 689f7bc..6beee6f 100644 |
2127 | --- a/fs/sysfs/inode.c |
2128 | +++ b/fs/sysfs/inode.c |
2129 | @@ -227,12 +227,16 @@ void sysfs_drop_dentry(struct sysfs_dire |
2130 | void sysfs_hash_and_remove(struct dentry * dir, const char * name) |
2131 | { |
2132 | struct sysfs_dirent * sd; |
2133 | - struct sysfs_dirent * parent_sd = dir->d_fsdata; |
2134 | + struct sysfs_dirent * parent_sd; |
2135 | + |
2136 | + if (!dir) |
2137 | + return; |
2138 | |
2139 | if (dir->d_inode == NULL) |
2140 | /* no inode means this hasn't been made visible yet */ |
2141 | return; |
2142 | |
2143 | + parent_sd = dir->d_fsdata; |
2144 | mutex_lock(&dir->d_inode->i_mutex); |
2145 | list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { |
2146 | if (!sd->s_element) |
2147 | diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c |
2148 | index e38d633..e5ce6e7 100644 |
2149 | --- a/fs/sysfs/symlink.c |
2150 | +++ b/fs/sysfs/symlink.c |
2151 | @@ -66,6 +66,7 @@ static int sysfs_add_link(struct dentry |
2152 | if (!error) |
2153 | return 0; |
2154 | |
2155 | + kobject_put(target); |
2156 | kfree(sl->link_name); |
2157 | exit2: |
2158 | kfree(sl); |
2159 | diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c |
2160 | index 74d8be8..a980736 100644 |
2161 | --- a/fs/xfs/linux-2.6/xfs_aops.c |
2162 | +++ b/fs/xfs/linux-2.6/xfs_aops.c |
2163 | @@ -616,7 +616,7 @@ xfs_is_delayed_page( |
2164 | acceptable = (type == IOMAP_UNWRITTEN); |
2165 | else if (buffer_delay(bh)) |
2166 | acceptable = (type == IOMAP_DELAY); |
2167 | - else if (buffer_mapped(bh)) |
2168 | + else if (buffer_dirty(bh) && buffer_mapped(bh)) |
2169 | acceptable = (type == 0); |
2170 | else |
2171 | break; |
2172 | diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c |
2173 | index d7f6f2d..43808e2 100644 |
2174 | --- a/fs/xfs/linux-2.6/xfs_iops.c |
2175 | +++ b/fs/xfs/linux-2.6/xfs_iops.c |
2176 | @@ -673,8 +673,7 @@ linvfs_setattr( |
2177 | if (ia_valid & ATTR_ATIME) { |
2178 | vattr.va_mask |= XFS_AT_ATIME; |
2179 | vattr.va_atime = attr->ia_atime; |
2180 | - if (ia_valid & ATTR_ATIME_SET) |
2181 | - inode->i_atime = attr->ia_atime; |
2182 | + inode->i_atime = attr->ia_atime; |
2183 | } |
2184 | if (ia_valid & ATTR_MTIME) { |
2185 | vattr.va_mask |= XFS_AT_MTIME; |
2186 | diff --git a/include/asm-i386/cpufeature.h b/include/asm-i386/cpufeature.h |
2187 | index c4ec2a4..9d15eec 100644 |
2188 | --- a/include/asm-i386/cpufeature.h |
2189 | +++ b/include/asm-i386/cpufeature.h |
2190 | @@ -70,6 +70,7 @@ #define X86_FEATURE_K7 (3*32+ 5) /* Ath |
2191 | #define X86_FEATURE_P3 (3*32+ 6) /* P3 */ |
2192 | #define X86_FEATURE_P4 (3*32+ 7) /* P4 */ |
2193 | #define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */ |
2194 | +#define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* FXSAVE leaks FOP/FIP/FOP */ |
2195 | |
2196 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ |
2197 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ |
2198 | diff --git a/include/asm-i386/i387.h b/include/asm-i386/i387.h |
2199 | index 152d0ba..7b1f011 100644 |
2200 | --- a/include/asm-i386/i387.h |
2201 | +++ b/include/asm-i386/i387.h |
2202 | @@ -13,6 +13,7 @@ #define __ASM_I386_I387_H |
2203 | |
2204 | #include <linux/sched.h> |
2205 | #include <linux/init.h> |
2206 | +#include <linux/kernel_stat.h> |
2207 | #include <asm/processor.h> |
2208 | #include <asm/sigcontext.h> |
2209 | #include <asm/user.h> |
2210 | @@ -38,17 +39,38 @@ #define restore_fpu(tsk) \ |
2211 | extern void kernel_fpu_begin(void); |
2212 | #define kernel_fpu_end() do { stts(); preempt_enable(); } while(0) |
2213 | |
2214 | +/* We need a safe address that is cheap to find and that is already |
2215 | + in L1 during context switch. The best choices are unfortunately |
2216 | + different for UP and SMP */ |
2217 | +#ifdef CONFIG_SMP |
2218 | +#define safe_address (__per_cpu_offset[0]) |
2219 | +#else |
2220 | +#define safe_address (kstat_cpu(0).cpustat.user) |
2221 | +#endif |
2222 | + |
2223 | /* |
2224 | * These must be called with preempt disabled |
2225 | */ |
2226 | static inline void __save_init_fpu( struct task_struct *tsk ) |
2227 | { |
2228 | + /* Use more nops than strictly needed in case the compiler |
2229 | + varies code */ |
2230 | alternative_input( |
2231 | - "fnsave %1 ; fwait ;" GENERIC_NOP2, |
2232 | - "fxsave %1 ; fnclex", |
2233 | + "fnsave %[fx] ;fwait;" GENERIC_NOP8 GENERIC_NOP4, |
2234 | + "fxsave %[fx]\n" |
2235 | + "bt $7,%[fsw] ; jc 1f ; fnclex\n1:", |
2236 | X86_FEATURE_FXSR, |
2237 | - "m" (tsk->thread.i387.fxsave) |
2238 | - :"memory"); |
2239 | + [fx] "m" (tsk->thread.i387.fxsave), |
2240 | + [fsw] "m" (tsk->thread.i387.fxsave.swd) : "memory"); |
2241 | + /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception |
2242 | + is pending. Clear the x87 state here by setting it to fixed |
2243 | + values. __per_cpu_offset[0] is a random variable that should be in L1 */ |
2244 | + alternative_input( |
2245 | + GENERIC_NOP8 GENERIC_NOP2, |
2246 | + "emms\n\t" /* clear stack tags */ |
2247 | + "fildl %[addr]", /* set F?P to defined value */ |
2248 | + X86_FEATURE_FXSAVE_LEAK, |
2249 | + [addr] "m" (safe_address)); |
2250 | task_thread_info(tsk)->status &= ~TS_USEDFPU; |
2251 | } |
2252 | |
2253 | diff --git a/include/asm-m32r/smp.h b/include/asm-m32r/smp.h |
2254 | index 7885b7d..1184293 100644 |
2255 | --- a/include/asm-m32r/smp.h |
2256 | +++ b/include/asm-m32r/smp.h |
2257 | @@ -67,7 +67,8 @@ #define cpu_to_physid(cpu_id) cpu_2_phys |
2258 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
2259 | |
2260 | extern cpumask_t cpu_callout_map; |
2261 | -#define cpu_possible_map cpu_callout_map |
2262 | +extern cpumask_t cpu_possible_map; |
2263 | +extern cpumask_t cpu_present_map; |
2264 | |
2265 | static __inline__ int hard_smp_processor_id(void) |
2266 | { |
2267 | diff --git a/include/asm-m32r/uaccess.h b/include/asm-m32r/uaccess.h |
2268 | index e8ae619..819cc28 100644 |
2269 | --- a/include/asm-m32r/uaccess.h |
2270 | +++ b/include/asm-m32r/uaccess.h |
2271 | @@ -5,17 +5,9 @@ #define _ASM_M32R_UACCESS_H |
2272 | * linux/include/asm-m32r/uaccess.h |
2273 | * |
2274 | * M32R version. |
2275 | - * Copyright (C) 2004 Hirokazu Takata <takata at linux-m32r.org> |
2276 | + * Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org> |
2277 | */ |
2278 | |
2279 | -#undef UACCESS_DEBUG |
2280 | - |
2281 | -#ifdef UACCESS_DEBUG |
2282 | -#define UAPRINTK(args...) printk(args) |
2283 | -#else |
2284 | -#define UAPRINTK(args...) |
2285 | -#endif /* UACCESS_DEBUG */ |
2286 | - |
2287 | /* |
2288 | * User space memory access functions |
2289 | */ |
2290 | @@ -38,27 +30,29 @@ #define VERIFY_WRITE 1 |
2291 | #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) |
2292 | |
2293 | #ifdef CONFIG_MMU |
2294 | + |
2295 | #define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF) |
2296 | #define USER_DS MAKE_MM_SEG(PAGE_OFFSET) |
2297 | -#else |
2298 | -#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF) |
2299 | -#define USER_DS MAKE_MM_SEG(0xFFFFFFFF) |
2300 | -#endif /* CONFIG_MMU */ |
2301 | - |
2302 | #define get_ds() (KERNEL_DS) |
2303 | -#ifdef CONFIG_MMU |
2304 | #define get_fs() (current_thread_info()->addr_limit) |
2305 | #define set_fs(x) (current_thread_info()->addr_limit = (x)) |
2306 | -#else |
2307 | + |
2308 | +#else /* not CONFIG_MMU */ |
2309 | + |
2310 | +#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF) |
2311 | +#define USER_DS MAKE_MM_SEG(0xFFFFFFFF) |
2312 | +#define get_ds() (KERNEL_DS) |
2313 | + |
2314 | static inline mm_segment_t get_fs(void) |
2315 | { |
2316 | - return USER_DS; |
2317 | + return USER_DS; |
2318 | } |
2319 | |
2320 | static inline void set_fs(mm_segment_t s) |
2321 | { |
2322 | } |
2323 | -#endif /* CONFIG_MMU */ |
2324 | + |
2325 | +#endif /* not CONFIG_MMU */ |
2326 | |
2327 | #define segment_eq(a,b) ((a).seg == (b).seg) |
2328 | |
2329 | @@ -83,9 +77,9 @@ #define __range_ok(addr,size) ({ \ |
2330 | " subx %0, %0\n" \ |
2331 | " cmpu %4, %1\n" \ |
2332 | " subx %0, %5\n" \ |
2333 | - : "=&r"(flag), "=r"(sum) \ |
2334 | - : "1"(addr), "r"((int)(size)), \ |
2335 | - "r"(current_thread_info()->addr_limit.seg), "r"(0) \ |
2336 | + : "=&r" (flag), "=r" (sum) \ |
2337 | + : "1" (addr), "r" ((int)(size)), \ |
2338 | + "r" (current_thread_info()->addr_limit.seg), "r" (0) \ |
2339 | : "cbit" ); \ |
2340 | flag; }) |
2341 | |
2342 | @@ -113,10 +107,10 @@ #define access_ok(type,addr,size) (likel |
2343 | #else |
2344 | static inline int access_ok(int type, const void *addr, unsigned long size) |
2345 | { |
2346 | - extern unsigned long memory_start, memory_end; |
2347 | - unsigned long val = (unsigned long)addr; |
2348 | + extern unsigned long memory_start, memory_end; |
2349 | + unsigned long val = (unsigned long)addr; |
2350 | |
2351 | - return ((val >= memory_start) && ((val + size) < memory_end)); |
2352 | + return ((val >= memory_start) && ((val + size) < memory_end)); |
2353 | } |
2354 | #endif /* CONFIG_MMU */ |
2355 | |
2356 | @@ -155,39 +149,6 @@ extern int fixup_exception(struct pt_reg |
2357 | * accesses to the same area of user memory). |
2358 | */ |
2359 | |
2360 | -extern void __get_user_1(void); |
2361 | -extern void __get_user_2(void); |
2362 | -extern void __get_user_4(void); |
2363 | - |
2364 | -#ifndef MODULE |
2365 | -#define __get_user_x(size,ret,x,ptr) \ |
2366 | - __asm__ __volatile__( \ |
2367 | - " mv r0, %0\n" \ |
2368 | - " mv r1, %1\n" \ |
2369 | - " bl __get_user_" #size "\n" \ |
2370 | - " mv %0, r0\n" \ |
2371 | - " mv %1, r1\n" \ |
2372 | - : "=r"(ret), "=r"(x) \ |
2373 | - : "0"(ptr) \ |
2374 | - : "r0", "r1", "r14" ) |
2375 | -#else /* MODULE */ |
2376 | -/* |
2377 | - * Use "jl" instead of "bl" for MODULE |
2378 | - */ |
2379 | -#define __get_user_x(size,ret,x,ptr) \ |
2380 | - __asm__ __volatile__( \ |
2381 | - " mv r0, %0\n" \ |
2382 | - " mv r1, %1\n" \ |
2383 | - " seth lr, #high(__get_user_" #size ")\n" \ |
2384 | - " or3 lr, lr, #low(__get_user_" #size ")\n" \ |
2385 | - " jl lr\n" \ |
2386 | - " mv %0, r0\n" \ |
2387 | - " mv %1, r1\n" \ |
2388 | - : "=r"(ret), "=r"(x) \ |
2389 | - : "0"(ptr) \ |
2390 | - : "r0", "r1", "r14" ) |
2391 | -#endif |
2392 | - |
2393 | /* Careful: we have to cast the result to the type of the pointer for sign |
2394 | reasons */ |
2395 | /** |
2396 | @@ -208,20 +169,7 @@ #endif |
2397 | * On error, the variable @x is set to zero. |
2398 | */ |
2399 | #define get_user(x,ptr) \ |
2400 | -({ int __ret_gu; \ |
2401 | - unsigned long __val_gu; \ |
2402 | - __chk_user_ptr(ptr); \ |
2403 | - switch(sizeof (*(ptr))) { \ |
2404 | - case 1: __get_user_x(1,__ret_gu,__val_gu,ptr); break; \ |
2405 | - case 2: __get_user_x(2,__ret_gu,__val_gu,ptr); break; \ |
2406 | - case 4: __get_user_x(4,__ret_gu,__val_gu,ptr); break; \ |
2407 | - default: __get_user_x(X,__ret_gu,__val_gu,ptr); break; \ |
2408 | - } \ |
2409 | - (x) = (__typeof__(*(ptr)))__val_gu; \ |
2410 | - __ret_gu; \ |
2411 | -}) |
2412 | - |
2413 | -extern void __put_user_bad(void); |
2414 | + __get_user_check((x),(ptr),sizeof(*(ptr))) |
2415 | |
2416 | /** |
2417 | * put_user: - Write a simple value into user space. |
2418 | @@ -240,8 +188,7 @@ extern void __put_user_bad(void); |
2419 | * Returns zero on success, or -EFAULT on error. |
2420 | */ |
2421 | #define put_user(x,ptr) \ |
2422 | - __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) |
2423 | - |
2424 | + __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) |
2425 | |
2426 | /** |
2427 | * __get_user: - Get a simple variable from user space, with less checking. |
2428 | @@ -264,8 +211,64 @@ #define put_user(x,ptr) \ |
2429 | * On error, the variable @x is set to zero. |
2430 | */ |
2431 | #define __get_user(x,ptr) \ |
2432 | - __get_user_nocheck((x),(ptr),sizeof(*(ptr))) |
2433 | + __get_user_nocheck((x),(ptr),sizeof(*(ptr))) |
2434 | |
2435 | +#define __get_user_nocheck(x,ptr,size) \ |
2436 | +({ \ |
2437 | + long __gu_err = 0; \ |
2438 | + unsigned long __gu_val; \ |
2439 | + might_sleep(); \ |
2440 | + __get_user_size(__gu_val,(ptr),(size),__gu_err); \ |
2441 | + (x) = (__typeof__(*(ptr)))__gu_val; \ |
2442 | + __gu_err; \ |
2443 | +}) |
2444 | + |
2445 | +#define __get_user_check(x,ptr,size) \ |
2446 | +({ \ |
2447 | + long __gu_err = -EFAULT; \ |
2448 | + unsigned long __gu_val = 0; \ |
2449 | + const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \ |
2450 | + might_sleep(); \ |
2451 | + if (access_ok(VERIFY_READ,__gu_addr,size)) \ |
2452 | + __get_user_size(__gu_val,__gu_addr,(size),__gu_err); \ |
2453 | + (x) = (__typeof__(*(ptr)))__gu_val; \ |
2454 | + __gu_err; \ |
2455 | +}) |
2456 | + |
2457 | +extern long __get_user_bad(void); |
2458 | + |
2459 | +#define __get_user_size(x,ptr,size,retval) \ |
2460 | +do { \ |
2461 | + retval = 0; \ |
2462 | + __chk_user_ptr(ptr); \ |
2463 | + switch (size) { \ |
2464 | + case 1: __get_user_asm(x,ptr,retval,"ub"); break; \ |
2465 | + case 2: __get_user_asm(x,ptr,retval,"uh"); break; \ |
2466 | + case 4: __get_user_asm(x,ptr,retval,""); break; \ |
2467 | + default: (x) = __get_user_bad(); \ |
2468 | + } \ |
2469 | +} while (0) |
2470 | + |
2471 | +#define __get_user_asm(x, addr, err, itype) \ |
2472 | + __asm__ __volatile__( \ |
2473 | + " .fillinsn\n" \ |
2474 | + "1: ld"itype" %1,@%2\n" \ |
2475 | + " .fillinsn\n" \ |
2476 | + "2:\n" \ |
2477 | + ".section .fixup,\"ax\"\n" \ |
2478 | + " .balign 4\n" \ |
2479 | + "3: ldi %0,%3\n" \ |
2480 | + " seth r14,#high(2b)\n" \ |
2481 | + " or3 r14,r14,#low(2b)\n" \ |
2482 | + " jmp r14\n" \ |
2483 | + ".previous\n" \ |
2484 | + ".section __ex_table,\"a\"\n" \ |
2485 | + " .balign 4\n" \ |
2486 | + " .long 1b,3b\n" \ |
2487 | + ".previous" \ |
2488 | + : "=&r" (err), "=&r" (x) \ |
2489 | + : "r" (addr), "i" (-EFAULT), "0" (err) \ |
2490 | + : "r14", "memory") |
2491 | |
2492 | /** |
2493 | * __put_user: - Write a simple value into user space, with less checking. |
2494 | @@ -287,11 +290,13 @@ #define __get_user(x,ptr) \ |
2495 | * Returns zero on success, or -EFAULT on error. |
2496 | */ |
2497 | #define __put_user(x,ptr) \ |
2498 | - __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) |
2499 | + __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) |
2500 | + |
2501 | |
2502 | #define __put_user_nocheck(x,ptr,size) \ |
2503 | ({ \ |
2504 | long __pu_err; \ |
2505 | + might_sleep(); \ |
2506 | __put_user_size((x),(ptr),(size),__pu_err); \ |
2507 | __pu_err; \ |
2508 | }) |
2509 | @@ -308,28 +313,28 @@ ({ \ |
2510 | }) |
2511 | |
2512 | #if defined(__LITTLE_ENDIAN__) |
2513 | -#define __put_user_u64(x, addr, err) \ |
2514 | - __asm__ __volatile__( \ |
2515 | - " .fillinsn\n" \ |
2516 | - "1: st %L1,@%2\n" \ |
2517 | - " .fillinsn\n" \ |
2518 | - "2: st %H1,@(4,%2)\n" \ |
2519 | - " .fillinsn\n" \ |
2520 | - "3:\n" \ |
2521 | - ".section .fixup,\"ax\"\n" \ |
2522 | - " .balign 4\n" \ |
2523 | - "4: ldi %0,%3\n" \ |
2524 | - " seth r14,#high(3b)\n" \ |
2525 | - " or3 r14,r14,#low(3b)\n" \ |
2526 | - " jmp r14\n" \ |
2527 | - ".previous\n" \ |
2528 | - ".section __ex_table,\"a\"\n" \ |
2529 | - " .balign 4\n" \ |
2530 | - " .long 1b,4b\n" \ |
2531 | - " .long 2b,4b\n" \ |
2532 | - ".previous" \ |
2533 | - : "=&r"(err) \ |
2534 | - : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err) \ |
2535 | +#define __put_user_u64(x, addr, err) \ |
2536 | + __asm__ __volatile__( \ |
2537 | + " .fillinsn\n" \ |
2538 | + "1: st %L1,@%2\n" \ |
2539 | + " .fillinsn\n" \ |
2540 | + "2: st %H1,@(4,%2)\n" \ |
2541 | + " .fillinsn\n" \ |
2542 | + "3:\n" \ |
2543 | + ".section .fixup,\"ax\"\n" \ |
2544 | + " .balign 4\n" \ |
2545 | + "4: ldi %0,%3\n" \ |
2546 | + " seth r14,#high(3b)\n" \ |
2547 | + " or3 r14,r14,#low(3b)\n" \ |
2548 | + " jmp r14\n" \ |
2549 | + ".previous\n" \ |
2550 | + ".section __ex_table,\"a\"\n" \ |
2551 | + " .balign 4\n" \ |
2552 | + " .long 1b,4b\n" \ |
2553 | + " .long 2b,4b\n" \ |
2554 | + ".previous" \ |
2555 | + : "=&r" (err) \ |
2556 | + : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err) \ |
2557 | : "r14", "memory") |
2558 | |
2559 | #elif defined(__BIG_ENDIAN__) |
2560 | @@ -353,13 +358,15 @@ #define __put_user_u64(x, addr, err) |
2561 | " .long 1b,4b\n" \ |
2562 | " .long 2b,4b\n" \ |
2563 | ".previous" \ |
2564 | - : "=&r"(err) \ |
2565 | - : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err) \ |
2566 | + : "=&r" (err) \ |
2567 | + : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err) \ |
2568 | : "r14", "memory") |
2569 | #else |
2570 | #error no endian defined |
2571 | #endif |
2572 | |
2573 | +extern void __put_user_bad(void); |
2574 | + |
2575 | #define __put_user_size(x,ptr,size,retval) \ |
2576 | do { \ |
2577 | retval = 0; \ |
2578 | @@ -398,52 +405,8 @@ #define __put_user_asm(x, addr, err, ity |
2579 | " .balign 4\n" \ |
2580 | " .long 1b,3b\n" \ |
2581 | ".previous" \ |
2582 | - : "=&r"(err) \ |
2583 | - : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err) \ |
2584 | - : "r14", "memory") |
2585 | - |
2586 | -#define __get_user_nocheck(x,ptr,size) \ |
2587 | -({ \ |
2588 | - long __gu_err; \ |
2589 | - unsigned long __gu_val; \ |
2590 | - __get_user_size(__gu_val,(ptr),(size),__gu_err); \ |
2591 | - (x) = (__typeof__(*(ptr)))__gu_val; \ |
2592 | - __gu_err; \ |
2593 | -}) |
2594 | - |
2595 | -extern long __get_user_bad(void); |
2596 | - |
2597 | -#define __get_user_size(x,ptr,size,retval) \ |
2598 | -do { \ |
2599 | - retval = 0; \ |
2600 | - __chk_user_ptr(ptr); \ |
2601 | - switch (size) { \ |
2602 | - case 1: __get_user_asm(x,ptr,retval,"ub"); break; \ |
2603 | - case 2: __get_user_asm(x,ptr,retval,"uh"); break; \ |
2604 | - case 4: __get_user_asm(x,ptr,retval,""); break; \ |
2605 | - default: (x) = __get_user_bad(); \ |
2606 | - } \ |
2607 | -} while (0) |
2608 | - |
2609 | -#define __get_user_asm(x, addr, err, itype) \ |
2610 | - __asm__ __volatile__( \ |
2611 | - " .fillinsn\n" \ |
2612 | - "1: ld"itype" %1,@%2\n" \ |
2613 | - " .fillinsn\n" \ |
2614 | - "2:\n" \ |
2615 | - ".section .fixup,\"ax\"\n" \ |
2616 | - " .balign 4\n" \ |
2617 | - "3: ldi %0,%3\n" \ |
2618 | - " seth r14,#high(2b)\n" \ |
2619 | - " or3 r14,r14,#low(2b)\n" \ |
2620 | - " jmp r14\n" \ |
2621 | - ".previous\n" \ |
2622 | - ".section __ex_table,\"a\"\n" \ |
2623 | - " .balign 4\n" \ |
2624 | - " .long 1b,3b\n" \ |
2625 | - ".previous" \ |
2626 | - : "=&r"(err), "=&r"(x) \ |
2627 | - : "r"(addr), "i"(-EFAULT), "0"(err) \ |
2628 | + : "=&r" (err) \ |
2629 | + : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err) \ |
2630 | : "r14", "memory") |
2631 | |
2632 | /* |
2633 | @@ -453,7 +416,6 @@ #define __get_user_asm(x, addr, err, ity |
2634 | * anything, so this is accurate. |
2635 | */ |
2636 | |
2637 | - |
2638 | /* |
2639 | * Copy To/From Userspace |
2640 | */ |
2641 | @@ -511,8 +473,9 @@ do { \ |
2642 | " .long 2b,9b\n" \ |
2643 | " .long 3b,9b\n" \ |
2644 | ".previous\n" \ |
2645 | - : "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c) \ |
2646 | - : "0"(to), "1"(from), "2"(size), "3"(size / 4) \ |
2647 | + : "=&r" (__dst), "=&r" (__src), "=&r" (size), \ |
2648 | + "=&r" (__c) \ |
2649 | + : "0" (to), "1" (from), "2" (size), "3" (size / 4) \ |
2650 | : "r14", "memory"); \ |
2651 | } while (0) |
2652 | |
2653 | @@ -573,8 +536,9 @@ do { \ |
2654 | " .long 2b,7b\n" \ |
2655 | " .long 3b,7b\n" \ |
2656 | ".previous\n" \ |
2657 | - : "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c) \ |
2658 | - : "0"(to), "1"(from), "2"(size), "3"(size / 4) \ |
2659 | + : "=&r" (__dst), "=&r" (__src), "=&r" (size), \ |
2660 | + "=&r" (__c) \ |
2661 | + : "0" (to), "1" (from), "2" (size), "3" (size / 4) \ |
2662 | : "r14", "memory"); \ |
2663 | } while (0) |
2664 | |
2665 | @@ -676,7 +640,7 @@ #define __copy_from_user(to,from,n) \ |
2666 | #define copy_from_user(to,from,n) \ |
2667 | ({ \ |
2668 | might_sleep(); \ |
2669 | -__generic_copy_from_user((to),(from),(n)); \ |
2670 | + __generic_copy_from_user((to),(from),(n)); \ |
2671 | }) |
2672 | |
2673 | long __must_check strncpy_from_user(char *dst, const char __user *src, |
2674 | diff --git a/include/asm-powerpc/floppy.h b/include/asm-powerpc/floppy.h |
2675 | index e258778..608164c 100644 |
2676 | --- a/include/asm-powerpc/floppy.h |
2677 | +++ b/include/asm-powerpc/floppy.h |
2678 | @@ -35,6 +35,7 @@ #define fd_free_irq() free_irq |
2679 | #ifdef CONFIG_PCI |
2680 | |
2681 | #include <linux/pci.h> |
2682 | +#include <asm/ppc-pci.h> /* for ppc64_isabridge_dev */ |
2683 | |
2684 | #define fd_dma_setup(addr,size,mode,io) powerpc_fd_dma_setup(addr,size,mode,io) |
2685 | |
2686 | @@ -52,12 +53,12 @@ static __inline__ int powerpc_fd_dma_set |
2687 | if (bus_addr |
2688 | && (addr != prev_addr || size != prev_size || dir != prev_dir)) { |
2689 | /* different from last time -- unmap prev */ |
2690 | - pci_unmap_single(NULL, bus_addr, prev_size, prev_dir); |
2691 | + pci_unmap_single(ppc64_isabridge_dev, bus_addr, prev_size, prev_dir); |
2692 | bus_addr = 0; |
2693 | } |
2694 | |
2695 | if (!bus_addr) /* need to map it */ |
2696 | - bus_addr = pci_map_single(NULL, addr, size, dir); |
2697 | + bus_addr = pci_map_single(ppc64_isabridge_dev, addr, size, dir); |
2698 | |
2699 | /* remember this one as prev */ |
2700 | prev_addr = addr; |
2701 | diff --git a/include/asm-x86_64/cpufeature.h b/include/asm-x86_64/cpufeature.h |
2702 | index 76bb619..662964b 100644 |
2703 | --- a/include/asm-x86_64/cpufeature.h |
2704 | +++ b/include/asm-x86_64/cpufeature.h |
2705 | @@ -64,6 +64,7 @@ #define X86_FEATURE_CENTAUR_MCR (3*32+ 3 |
2706 | #define X86_FEATURE_REP_GOOD (3*32+ 4) /* rep microcode works well on this CPU */ |
2707 | #define X86_FEATURE_CONSTANT_TSC (3*32+5) /* TSC runs at constant rate */ |
2708 | #define X86_FEATURE_SYNC_RDTSC (3*32+6) /* RDTSC syncs CPU core */ |
2709 | +#define X86_FEATURE_FXSAVE_LEAK (3*32+7) /* FIP/FOP/FDP leaks through FXSAVE */ |
2710 | |
2711 | /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ |
2712 | #define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ |
2713 | diff --git a/include/asm-x86_64/i387.h b/include/asm-x86_64/i387.h |
2714 | index 876eb9a..cba8a3b 100644 |
2715 | --- a/include/asm-x86_64/i387.h |
2716 | +++ b/include/asm-x86_64/i387.h |
2717 | @@ -72,6 +72,23 @@ #define set_fpu_cwd(t,val) ((t)->thread. |
2718 | #define set_fpu_swd(t,val) ((t)->thread.i387.fxsave.swd = (val)) |
2719 | #define set_fpu_fxsr_twd(t,val) ((t)->thread.i387.fxsave.twd = (val)) |
2720 | |
2721 | +#define X87_FSW_ES (1 << 7) /* Exception Summary */ |
2722 | + |
2723 | +/* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception |
2724 | + is pending. Clear the x87 state here by setting it to fixed |
2725 | + values. The kernel data segment can be sometimes 0 and sometimes |
2726 | + new user value. Both should be ok. |
2727 | + Use the PDA as safe address because it should be already in L1. */ |
2728 | +static inline void clear_fpu_state(struct i387_fxsave_struct *fx) |
2729 | +{ |
2730 | + if (unlikely(fx->swd & X87_FSW_ES)) |
2731 | + asm volatile("fnclex"); |
2732 | + alternative_input(ASM_NOP8 ASM_NOP2, |
2733 | + " emms\n" /* clear stack tags */ |
2734 | + " fildl %%gs:0", /* load to clear state */ |
2735 | + X86_FEATURE_FXSAVE_LEAK); |
2736 | +} |
2737 | + |
2738 | static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) |
2739 | { |
2740 | int err; |
2741 | @@ -119,6 +136,7 @@ #else |
2742 | #endif |
2743 | if (unlikely(err)) |
2744 | __clear_user(fx, sizeof(struct i387_fxsave_struct)); |
2745 | + /* No need to clear here because the caller clears USED_MATH */ |
2746 | return err; |
2747 | } |
2748 | |
2749 | @@ -149,7 +167,7 @@ #else |
2750 | "i" (offsetof(__typeof__(*tsk), |
2751 | thread.i387.fxsave))); |
2752 | #endif |
2753 | - __asm__ __volatile__("fnclex"); |
2754 | + clear_fpu_state(&tsk->thread.i387.fxsave); |
2755 | } |
2756 | |
2757 | static inline void kernel_fpu_begin(void) |
2758 | diff --git a/include/linux/cpu.h b/include/linux/cpu.h |
2759 | index 0ed1d48..d612b89 100644 |
2760 | --- a/include/linux/cpu.h |
2761 | +++ b/include/linux/cpu.h |
2762 | @@ -32,7 +32,7 @@ struct cpu { |
2763 | }; |
2764 | |
2765 | extern int register_cpu(struct cpu *, int, struct node *); |
2766 | -extern struct sys_device *get_cpu_sysdev(int cpu); |
2767 | +extern struct sys_device *get_cpu_sysdev(unsigned cpu); |
2768 | #ifdef CONFIG_HOTPLUG_CPU |
2769 | extern void unregister_cpu(struct cpu *, struct node *); |
2770 | #endif |
2771 | diff --git a/include/linux/fb.h b/include/linux/fb.h |
2772 | index 2cb19e6..2fdd8ae 100644 |
2773 | --- a/include/linux/fb.h |
2774 | +++ b/include/linux/fb.h |
2775 | @@ -839,12 +839,10 @@ #if defined (__BIG_ENDIAN) |
2776 | #define FB_LEFT_POS(bpp) (32 - bpp) |
2777 | #define FB_SHIFT_HIGH(val, bits) ((val) >> (bits)) |
2778 | #define FB_SHIFT_LOW(val, bits) ((val) << (bits)) |
2779 | -#define FB_BIT_NR(b) (7 - (b)) |
2780 | #else |
2781 | #define FB_LEFT_POS(bpp) (0) |
2782 | #define FB_SHIFT_HIGH(val, bits) ((val) << (bits)) |
2783 | #define FB_SHIFT_LOW(val, bits) ((val) >> (bits)) |
2784 | -#define FB_BIT_NR(b) (b) |
2785 | #endif |
2786 | |
2787 | /* |
2788 | diff --git a/include/linux/mm.h b/include/linux/mm.h |
2789 | index 498ff87..279446e 100644 |
2790 | --- a/include/linux/mm.h |
2791 | +++ b/include/linux/mm.h |
2792 | @@ -229,10 +229,9 @@ struct page { |
2793 | unsigned long private; /* Mapping-private opaque data: |
2794 | * usually used for buffer_heads |
2795 | * if PagePrivate set; used for |
2796 | - * swp_entry_t if PageSwapCache. |
2797 | - * When page is free, this |
2798 | + * swp_entry_t if PageSwapCache; |
2799 | * indicates order in the buddy |
2800 | - * system. |
2801 | + * system if PG_buddy is set. |
2802 | */ |
2803 | struct address_space *mapping; /* If low bit clear, points to |
2804 | * inode address_space, or NULL. |
2805 | --- linux-2.6.16/include/linux/page-flags.h 2006-04-25 19:04:00.000000000 +0200 |
2806 | +++ linux-2.6.16-magellan-r7/include/linux/page-flags.h 2006-04-25 19:01:23.000000000 +0200 |
2807 | @@ -74,8 +74,9 @@ |
2808 | #define PG_mappedtodisk 16 /* Has blocks allocated on-disk */ |
2809 | #define PG_reclaim 17 /* To be reclaimed asap */ |
2810 | #define PG_nosave_free 18 /* Free, should not be written */ |
2811 | -#define PG_uncached 19 /* Page has been mapped as uncached */ |
2812 | +#define PG_buddy 19 /* Page is free, on buddy lists */ |
2813 | #define PG_readahead 20 /* Reminder to do readahead */ |
2814 | +#define PG_uncached 21 /* Page has been mapped as uncached */ |
2815 | |
2816 | /* |
2817 | * Global page accounting. One instance per CPU. Only unsigned longs are |
2818 | @@ -320,6 +321,10 @@ |
2819 | #define SetPageNosaveFree(page) set_bit(PG_nosave_free, &(page)->flags) |
2820 | #define ClearPageNosaveFree(page) clear_bit(PG_nosave_free, &(page)->flags) |
2821 | |
2822 | +#define PageBuddy(page) test_bit(PG_buddy, &(page)->flags) |
2823 | +#define __SetPageBuddy(page) __set_bit(PG_buddy, &(page)->flags) |
2824 | +#define __ClearPageBuddy(page) __clear_bit(PG_buddy, &(page)->flags) |
2825 | + |
2826 | #define PageMappedToDisk(page) test_bit(PG_mappedtodisk, &(page)->flags) |
2827 | #define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags) |
2828 | #define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags) |
2829 | |
2830 | diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h |
2831 | index aa6322d..6c1e347 100644 |
2832 | --- a/include/linux/proc_fs.h |
2833 | +++ b/include/linux/proc_fs.h |
2834 | @@ -78,7 +78,7 @@ struct kcore_list { |
2835 | struct vmcore { |
2836 | struct list_head list; |
2837 | unsigned long long paddr; |
2838 | - unsigned long size; |
2839 | + unsigned long long size; |
2840 | loff_t offset; |
2841 | }; |
2842 | |
2843 | diff --git a/include/linux/raid/raid1.h b/include/linux/raid/raid1.h |
2844 | index 9d5494a..3009c81 100644 |
2845 | --- a/include/linux/raid/raid1.h |
2846 | +++ b/include/linux/raid/raid1.h |
2847 | @@ -130,6 +130,6 @@ #define R1BIO_BarrierRetry 5 |
2848 | * with failure when last write completes (and all failed). |
2849 | * Record that bi_end_io was called with this flag... |
2850 | */ |
2851 | -#define R1BIO_Returned 4 |
2852 | +#define R1BIO_Returned 6 |
2853 | |
2854 | #endif |
2855 | diff --git a/include/linux/rtc.h b/include/linux/rtc.h |
2856 | index 0b2ba67..b739ac1 100644 |
2857 | --- a/include/linux/rtc.h |
2858 | +++ b/include/linux/rtc.h |
2859 | @@ -11,8 +11,6 @@ |
2860 | #ifndef _LINUX_RTC_H_ |
2861 | #define _LINUX_RTC_H_ |
2862 | |
2863 | -#include <linux/interrupt.h> |
2864 | - |
2865 | /* |
2866 | * The struct used to pass data via the following ioctl. Similar to the |
2867 | * struct tm in <time.h>, but it needs to be here so that the kernel |
2868 | @@ -95,6 +93,8 @@ #define RTC_PLL_SET _IOW('p', 0x12, stru |
2869 | |
2870 | #ifdef __KERNEL__ |
2871 | |
2872 | +#include <linux/interrupt.h> |
2873 | + |
2874 | typedef struct rtc_task { |
2875 | void (*func)(void *private_data); |
2876 | void *private_data; |
2877 | diff --git a/include/net/ip.h b/include/net/ip.h |
2878 | index fab3d5b..ed84d04 100644 |
2879 | --- a/include/net/ip.h |
2880 | +++ b/include/net/ip.h |
2881 | @@ -95,6 +95,7 @@ extern int ip_local_deliver(struct sk_b |
2882 | extern int ip_mr_input(struct sk_buff *skb); |
2883 | extern int ip_output(struct sk_buff *skb); |
2884 | extern int ip_mc_output(struct sk_buff *skb); |
2885 | +extern int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); |
2886 | extern int ip_do_nat(struct sk_buff *skb); |
2887 | extern void ip_send_check(struct iphdr *ip); |
2888 | extern int ip_queue_xmit(struct sk_buff *skb, int ipfragok); |
2889 | diff --git a/ipc/shm.c b/ipc/shm.c |
2890 | index 9162123..f409726 100644 |
2891 | --- a/ipc/shm.c |
2892 | +++ b/ipc/shm.c |
2893 | @@ -161,6 +161,8 @@ static int shm_mmap(struct file * file, |
2894 | ret = shmem_mmap(file, vma); |
2895 | if (ret == 0) { |
2896 | vma->vm_ops = &shm_vm_ops; |
2897 | + if (!(vma->vm_flags & VM_WRITE)) |
2898 | + vma->vm_flags &= ~VM_MAYWRITE; |
2899 | shm_inc(file->f_dentry->d_inode->i_ino); |
2900 | } |
2901 | |
2902 | diff --git a/ipc/util.c b/ipc/util.c |
2903 | index 8626219..303b058 100644 |
2904 | --- a/ipc/util.c |
2905 | +++ b/ipc/util.c |
2906 | @@ -182,8 +182,7 @@ static int grow_ary(struct ipc_ids* ids, |
2907 | if(new == NULL) |
2908 | return size; |
2909 | new->size = newsize; |
2910 | - memcpy(new->p, ids->entries->p, sizeof(struct kern_ipc_perm *)*size + |
2911 | - sizeof(struct ipc_id_ary)); |
2912 | + memcpy(new->p, ids->entries->p, sizeof(struct kern_ipc_perm *)*size); |
2913 | for(i=size;i<newsize;i++) { |
2914 | new->p[i] = NULL; |
2915 | } |
2916 | diff --git a/kernel/exec_domain.c b/kernel/exec_domain.c |
2917 | index 867d6db..c01cead 100644 |
2918 | --- a/kernel/exec_domain.c |
2919 | +++ b/kernel/exec_domain.c |
2920 | @@ -140,6 +140,7 @@ __set_personality(u_long personality) |
2921 | ep = lookup_exec_domain(personality); |
2922 | if (ep == current_thread_info()->exec_domain) { |
2923 | current->personality = personality; |
2924 | + module_put(ep->module); |
2925 | return 0; |
2926 | } |
2927 | |
2928 | diff --git a/kernel/fork.c b/kernel/fork.c |
2929 | index b373322..9d4e0d8 100644 |
2930 | --- a/kernel/fork.c |
2931 | +++ b/kernel/fork.c |
2932 | @@ -720,7 +720,7 @@ out_release: |
2933 | free_fdset (new_fdt->open_fds, new_fdt->max_fdset); |
2934 | free_fd_array(new_fdt->fd, new_fdt->max_fds); |
2935 | kmem_cache_free(files_cachep, newf); |
2936 | - goto out; |
2937 | + return NULL; |
2938 | } |
2939 | |
2940 | static int copy_files(unsigned long clone_flags, struct task_struct * tsk) |
2941 | diff --git a/kernel/power/process.c b/kernel/power/process.c |
2942 | index 28de118..67b2cdd 100644 |
2943 | --- a/kernel/power/process.c |
2944 | +++ b/kernel/power/process.c |
2945 | @@ -25,8 +25,7 @@ static inline int freezeable(struct task |
2946 | (p->flags & PF_NOFREEZE) || |
2947 | (p->exit_state == EXIT_ZOMBIE) || |
2948 | (p->exit_state == EXIT_DEAD) || |
2949 | - (p->state == TASK_STOPPED) || |
2950 | - (p->state == TASK_TRACED)) |
2951 | + (p->state == TASK_STOPPED)) |
2952 | return 0; |
2953 | return 1; |
2954 | } |
2955 | diff --git a/kernel/ptrace.c b/kernel/ptrace.c |
2956 | index d95a72c..b5eaeb9 100644 |
2957 | --- a/kernel/ptrace.c |
2958 | +++ b/kernel/ptrace.c |
2959 | @@ -57,10 +57,6 @@ void ptrace_untrace(task_t *child) |
2960 | signal_wake_up(child, 1); |
2961 | } |
2962 | } |
2963 | - if (child->signal->flags & SIGNAL_GROUP_EXIT) { |
2964 | - sigaddset(&child->pending.signal, SIGKILL); |
2965 | - signal_wake_up(child, 1); |
2966 | - } |
2967 | spin_unlock(&child->sighand->siglock); |
2968 | } |
2969 | |
2970 | @@ -82,7 +78,8 @@ void __ptrace_unlink(task_t *child) |
2971 | SET_LINKS(child); |
2972 | } |
2973 | |
2974 | - ptrace_untrace(child); |
2975 | + if (child->state == TASK_TRACED) |
2976 | + ptrace_untrace(child); |
2977 | } |
2978 | |
2979 | /* |
2980 | diff --git a/kernel/sched.c b/kernel/sched.c |
2981 | index 4d46e90..4e7efac 100644 |
2982 | --- a/kernel/sched.c |
2983 | +++ b/kernel/sched.c |
2984 | @@ -237,6 +237,7 @@ #ifdef CONFIG_SMP |
2985 | |
2986 | task_t *migration_thread; |
2987 | struct list_head migration_queue; |
2988 | + int cpu; |
2989 | #endif |
2990 | |
2991 | #ifdef CONFIG_SCHEDSTATS |
2992 | @@ -1660,6 +1661,9 @@ #ifdef CONFIG_SMP |
2993 | /* |
2994 | * double_rq_lock - safely lock two runqueues |
2995 | * |
2996 | + * We must take them in cpu order to match code in |
2997 | + * dependent_sleeper and wake_dependent_sleeper. |
2998 | + * |
2999 | * Note this does not disable interrupts like task_rq_lock, |
3000 | * you need to do so manually before calling. |
3001 | */ |
3002 | @@ -1671,7 +1675,7 @@ static void double_rq_lock(runqueue_t *r |
3003 | spin_lock(&rq1->lock); |
3004 | __acquire(rq2->lock); /* Fake it out ;) */ |
3005 | } else { |
3006 | - if (rq1 < rq2) { |
3007 | + if (rq1->cpu < rq2->cpu) { |
3008 | spin_lock(&rq1->lock); |
3009 | spin_lock(&rq2->lock); |
3010 | } else { |
3011 | @@ -1707,7 +1711,7 @@ static void double_lock_balance(runqueue |
3012 | __acquires(this_rq->lock) |
3013 | { |
3014 | if (unlikely(!spin_trylock(&busiest->lock))) { |
3015 | - if (busiest < this_rq) { |
3016 | + if (busiest->cpu < this_rq->cpu) { |
3017 | spin_unlock(&this_rq->lock); |
3018 | spin_lock(&busiest->lock); |
3019 | spin_lock(&this_rq->lock); |
3020 | @@ -6035,6 +6039,7 @@ #ifdef CONFIG_SMP |
3021 | rq->push_cpu = 0; |
3022 | rq->migration_thread = NULL; |
3023 | INIT_LIST_HEAD(&rq->migration_queue); |
3024 | + rq->cpu = i; |
3025 | #endif |
3026 | atomic_set(&rq->nr_iowait, 0); |
3027 | |
3028 | diff --git a/kernel/signal.c b/kernel/signal.c |
3029 | index ea15410..acbccf7 100644 |
3030 | --- a/kernel/signal.c |
3031 | +++ b/kernel/signal.c |
3032 | @@ -975,7 +975,6 @@ __group_complete_signal(int sig, struct |
3033 | if (t == NULL) |
3034 | /* restart balancing at this thread */ |
3035 | t = p->signal->curr_target = p; |
3036 | - BUG_ON(t->tgid != p->tgid); |
3037 | |
3038 | while (!wants_signal(sig, t)) { |
3039 | t = next_thread(t); |
3040 | @@ -1689,6 +1688,7 @@ static void ptrace_stop(int exit_code, i |
3041 | /* Let the debugger run. */ |
3042 | set_current_state(TASK_TRACED); |
3043 | spin_unlock_irq(¤t->sighand->siglock); |
3044 | + try_to_freeze(); |
3045 | read_lock(&tasklist_lock); |
3046 | if (likely(current->ptrace & PT_PTRACED) && |
3047 | likely(current->parent != current->real_parent || |
3048 | @@ -1942,9 +1942,9 @@ relock: |
3049 | /* Let the debugger run. */ |
3050 | ptrace_stop(signr, signr, info); |
3051 | |
3052 | - /* We're back. Did the debugger cancel the sig or group_exit? */ |
3053 | + /* We're back. Did the debugger cancel the sig? */ |
3054 | signr = current->exit_code; |
3055 | - if (signr == 0 || current->signal->flags & SIGNAL_GROUP_EXIT) |
3056 | + if (signr == 0) |
3057 | continue; |
3058 | |
3059 | current->exit_code = 0; |
3060 | diff --git a/kernel/sys.c b/kernel/sys.c |
3061 | index f91218a..105e102 100644 |
3062 | --- a/kernel/sys.c |
3063 | +++ b/kernel/sys.c |
3064 | @@ -1657,7 +1657,19 @@ asmlinkage long sys_setrlimit(unsigned i |
3065 | (cputime_eq(current->signal->it_prof_expires, cputime_zero) || |
3066 | new_rlim.rlim_cur <= cputime_to_secs( |
3067 | current->signal->it_prof_expires))) { |
3068 | - cputime_t cputime = secs_to_cputime(new_rlim.rlim_cur); |
3069 | + unsigned long rlim_cur = new_rlim.rlim_cur; |
3070 | + cputime_t cputime; |
3071 | + |
3072 | + if (rlim_cur == 0) { |
3073 | + /* |
3074 | + * The caller is asking for an immediate RLIMIT_CPU |
3075 | + * expiry. But we use the zero value to mean "it was |
3076 | + * never set". So let's cheat and make it one second |
3077 | + * instead |
3078 | + */ |
3079 | + rlim_cur = 1; |
3080 | + } |
3081 | + cputime = secs_to_cputime(rlim_cur); |
3082 | read_lock(&tasklist_lock); |
3083 | spin_lock_irq(¤t->sighand->siglock); |
3084 | set_process_cpu_timer(current, CPUCLOCK_PROF, |
3085 | diff --git a/kernel/uid16.c b/kernel/uid16.c |
3086 | index aa25605..187e2a4 100644 |
3087 | --- a/kernel/uid16.c |
3088 | +++ b/kernel/uid16.c |
3089 | @@ -20,43 +20,67 @@ #include <asm/uaccess.h> |
3090 | |
3091 | asmlinkage long sys_chown16(const char __user * filename, old_uid_t user, old_gid_t group) |
3092 | { |
3093 | - return sys_chown(filename, low2highuid(user), low2highgid(group)); |
3094 | + long ret = sys_chown(filename, low2highuid(user), low2highgid(group)); |
3095 | + /* avoid REGPARM breakage on x86: */ |
3096 | + prevent_tail_call(ret); |
3097 | + return ret; |
3098 | } |
3099 | |
3100 | asmlinkage long sys_lchown16(const char __user * filename, old_uid_t user, old_gid_t group) |
3101 | { |
3102 | - return sys_lchown(filename, low2highuid(user), low2highgid(group)); |
3103 | + long ret = sys_lchown(filename, low2highuid(user), low2highgid(group)); |
3104 | + /* avoid REGPARM breakage on x86: */ |
3105 | + prevent_tail_call(ret); |
3106 | + return ret; |
3107 | } |
3108 | |
3109 | asmlinkage long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group) |
3110 | { |
3111 | - return sys_fchown(fd, low2highuid(user), low2highgid(group)); |
3112 | + long ret = sys_fchown(fd, low2highuid(user), low2highgid(group)); |
3113 | + /* avoid REGPARM breakage on x86: */ |
3114 | + prevent_tail_call(ret); |
3115 | + return ret; |
3116 | } |
3117 | |
3118 | asmlinkage long sys_setregid16(old_gid_t rgid, old_gid_t egid) |
3119 | { |
3120 | - return sys_setregid(low2highgid(rgid), low2highgid(egid)); |
3121 | + long ret = sys_setregid(low2highgid(rgid), low2highgid(egid)); |
3122 | + /* avoid REGPARM breakage on x86: */ |
3123 | + prevent_tail_call(ret); |
3124 | + return ret; |
3125 | } |
3126 | |
3127 | asmlinkage long sys_setgid16(old_gid_t gid) |
3128 | { |
3129 | - return sys_setgid(low2highgid(gid)); |
3130 | + long ret = sys_setgid(low2highgid(gid)); |
3131 | + /* avoid REGPARM breakage on x86: */ |
3132 | + prevent_tail_call(ret); |
3133 | + return ret; |
3134 | } |
3135 | |
3136 | asmlinkage long sys_setreuid16(old_uid_t ruid, old_uid_t euid) |
3137 | { |
3138 | - return sys_setreuid(low2highuid(ruid), low2highuid(euid)); |
3139 | + long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid)); |
3140 | + /* avoid REGPARM breakage on x86: */ |
3141 | + prevent_tail_call(ret); |
3142 | + return ret; |
3143 | } |
3144 | |
3145 | asmlinkage long sys_setuid16(old_uid_t uid) |
3146 | { |
3147 | - return sys_setuid(low2highuid(uid)); |
3148 | + long ret = sys_setuid(low2highuid(uid)); |
3149 | + /* avoid REGPARM breakage on x86: */ |
3150 | + prevent_tail_call(ret); |
3151 | + return ret; |
3152 | } |
3153 | |
3154 | asmlinkage long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid) |
3155 | { |
3156 | - return sys_setresuid(low2highuid(ruid), low2highuid(euid), |
3157 | - low2highuid(suid)); |
3158 | + long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid), |
3159 | + low2highuid(suid)); |
3160 | + /* avoid REGPARM breakage on x86: */ |
3161 | + prevent_tail_call(ret); |
3162 | + return ret; |
3163 | } |
3164 | |
3165 | asmlinkage long sys_getresuid16(old_uid_t __user *ruid, old_uid_t __user *euid, old_uid_t __user *suid) |
3166 | @@ -72,8 +96,11 @@ asmlinkage long sys_getresuid16(old_uid_ |
3167 | |
3168 | asmlinkage long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid) |
3169 | { |
3170 | - return sys_setresgid(low2highgid(rgid), low2highgid(egid), |
3171 | - low2highgid(sgid)); |
3172 | + long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid), |
3173 | + low2highgid(sgid)); |
3174 | + /* avoid REGPARM breakage on x86: */ |
3175 | + prevent_tail_call(ret); |
3176 | + return ret; |
3177 | } |
3178 | |
3179 | asmlinkage long sys_getresgid16(old_gid_t __user *rgid, old_gid_t __user *egid, old_gid_t __user *sgid) |
3180 | @@ -89,12 +116,18 @@ asmlinkage long sys_getresgid16(old_gid_ |
3181 | |
3182 | asmlinkage long sys_setfsuid16(old_uid_t uid) |
3183 | { |
3184 | - return sys_setfsuid(low2highuid(uid)); |
3185 | + long ret = sys_setfsuid(low2highuid(uid)); |
3186 | + /* avoid REGPARM breakage on x86: */ |
3187 | + prevent_tail_call(ret); |
3188 | + return ret; |
3189 | } |
3190 | |
3191 | asmlinkage long sys_setfsgid16(old_gid_t gid) |
3192 | { |
3193 | - return sys_setfsgid(low2highgid(gid)); |
3194 | + long ret = sys_setfsgid(low2highgid(gid)); |
3195 | + /* avoid REGPARM breakage on x86: */ |
3196 | + prevent_tail_call(ret); |
3197 | + return ret; |
3198 | } |
3199 | |
3200 | static int groups16_to_user(old_gid_t __user *grouplist, |
3201 | diff --git a/mm/madvise.c b/mm/madvise.c |
3202 | index af3d573..4e19615 100644 |
3203 | --- a/mm/madvise.c |
3204 | +++ b/mm/madvise.c |
3205 | @@ -168,6 +168,9 @@ static long madvise_remove(struct vm_are |
3206 | return -EINVAL; |
3207 | } |
3208 | |
3209 | + if ((vma->vm_flags & (VM_SHARED|VM_WRITE)) != (VM_SHARED|VM_WRITE)) |
3210 | + return -EACCES; |
3211 | + |
3212 | mapping = vma->vm_file->f_mapping; |
3213 | |
3214 | offset = (loff_t)(start - vma->vm_start) |
3215 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
3216 | index 234bd48..61de222 100644 |
3217 | --- a/mm/page_alloc.c |
3218 | +++ b/mm/page_alloc.c |
3219 | @@ -153,7 +153,8 @@ static void bad_page(struct page *page) |
3220 | 1 << PG_reclaim | |
3221 | 1 << PG_slab | |
3222 | 1 << PG_swapcache | |
3223 | - 1 << PG_writeback ); |
3224 | + 1 << PG_writeback | |
3225 | + 1 << PG_buddy ); |
3226 | set_page_count(page, 0); |
3227 | reset_page_mapcount(page); |
3228 | page->mapping = NULL; |
3229 | @@ -224,12 +225,12 @@ static inline unsigned long page_order(s |
3230 | |
3231 | static inline void set_page_order(struct page *page, int order) { |
3232 | set_page_private(page, order); |
3233 | - __SetPagePrivate(page); |
3234 | + __SetPageBuddy(page); |
3235 | } |
3236 | |
3237 | static inline void rmv_page_order(struct page *page) |
3238 | { |
3239 | - __ClearPagePrivate(page); |
3240 | + __ClearPageBuddy(page); |
3241 | set_page_private(page, 0); |
3242 | } |
3243 | |
3244 | @@ -268,11 +269,13 @@ __find_combined_index(unsigned long page |
3245 | * This function checks whether a page is free && is the buddy |
3246 | * we can do coalesce a page and its buddy if |
3247 | * (a) the buddy is not in a hole && |
3248 | - * (b) the buddy is free && |
3249 | - * (c) the buddy is on the buddy system && |
3250 | - * (d) a page and its buddy have the same order. |
3251 | - * for recording page's order, we use page_private(page) and PG_private. |
3252 | + * (b) the buddy is in the buddy system && |
3253 | + * (c) a page and its buddy have the same order. |
3254 | + * |
3255 | + * For recording whether a page is in the buddy system, we use PG_buddy. |
3256 | + * Setting, clearing, and testing PG_buddy is serialized by zone->lock. |
3257 | * |
3258 | + * For recording page's order, we use page_private(page). |
3259 | */ |
3260 | static inline int page_is_buddy(struct page *page, int order) |
3261 | { |
3262 | @@ -281,10 +284,10 @@ #ifdef CONFIG_HOLES_IN_ZONE |
3263 | return 0; |
3264 | #endif |
3265 | |
3266 | - if (PagePrivate(page) && |
3267 | - (page_order(page) == order) && |
3268 | - page_count(page) == 0) |
3269 | + if (PageBuddy(page) && page_order(page) == order) { |
3270 | + BUG_ON(page_count(page) != 0); |
3271 | return 1; |
3272 | + } |
3273 | return 0; |
3274 | } |
3275 | |
3276 | @@ -301,7 +304,7 @@ #endif |
3277 | * as necessary, plus some accounting needed to play nicely with other |
3278 | * parts of the VM system. |
3279 | * At each level, we keep a list of pages, which are heads of continuous |
3280 | - * free pages of length of (1 << order) and marked with PG_Private.Page's |
3281 | + * free pages of length of (1 << order) and marked with PG_buddy. Page's |
3282 | * order is recorded in page_private(page) field. |
3283 | * So when we are allocating or freeing one, we can derive the state of the |
3284 | * other. That is, if we allocate a small block, and both were |
3285 | @@ -364,7 +367,8 @@ static inline int free_pages_check(struc |
3286 | 1 << PG_slab | |
3287 | 1 << PG_swapcache | |
3288 | 1 << PG_writeback | |
3289 | - 1 << PG_reserved )))) |
3290 | + 1 << PG_reserved | |
3291 | + 1 << PG_buddy )))) |
3292 | bad_page(page); |
3293 | if (PageDirty(page)) |
3294 | __ClearPageDirty(page); |
3295 | @@ -522,7 +526,8 @@ static int prep_new_page(struct page *pa |
3296 | 1 << PG_slab | |
3297 | 1 << PG_swapcache | |
3298 | 1 << PG_writeback | |
3299 | - 1 << PG_reserved )))) |
3300 | + 1 << PG_reserved | |
3301 | + 1 << PG_buddy )))) |
3302 | bad_page(page); |
3303 | |
3304 | /* |
3305 | diff --git a/net/atm/clip.c b/net/atm/clip.c |
3306 | index 73370de..1842a4e 100644 |
3307 | --- a/net/atm/clip.c |
3308 | +++ b/net/atm/clip.c |
3309 | @@ -613,12 +613,19 @@ static int clip_create(int number) |
3310 | |
3311 | |
3312 | static int clip_device_event(struct notifier_block *this,unsigned long event, |
3313 | - void *dev) |
3314 | + void *arg) |
3315 | { |
3316 | + struct net_device *dev = arg; |
3317 | + |
3318 | + if (event == NETDEV_UNREGISTER) { |
3319 | + neigh_ifdown(&clip_tbl, dev); |
3320 | + return NOTIFY_DONE; |
3321 | + } |
3322 | + |
3323 | /* ignore non-CLIP devices */ |
3324 | - if (((struct net_device *) dev)->type != ARPHRD_ATM || |
3325 | - ((struct net_device *) dev)->hard_start_xmit != clip_start_xmit) |
3326 | + if (dev->type != ARPHRD_ATM || dev->hard_start_xmit != clip_start_xmit) |
3327 | return NOTIFY_DONE; |
3328 | + |
3329 | switch (event) { |
3330 | case NETDEV_UP: |
3331 | DPRINTK("clip_device_event NETDEV_UP\n"); |
3332 | @@ -686,14 +693,12 @@ static struct notifier_block clip_inet_n |
3333 | static void atmarpd_close(struct atm_vcc *vcc) |
3334 | { |
3335 | DPRINTK("atmarpd_close\n"); |
3336 | - atmarpd = NULL; /* assumed to be atomic */ |
3337 | - barrier(); |
3338 | - unregister_inetaddr_notifier(&clip_inet_notifier); |
3339 | - unregister_netdevice_notifier(&clip_dev_notifier); |
3340 | - if (skb_peek(&sk_atm(vcc)->sk_receive_queue)) |
3341 | - printk(KERN_ERR "atmarpd_close: closing with requests " |
3342 | - "pending\n"); |
3343 | + |
3344 | + rtnl_lock(); |
3345 | + atmarpd = NULL; |
3346 | skb_queue_purge(&sk_atm(vcc)->sk_receive_queue); |
3347 | + rtnl_unlock(); |
3348 | + |
3349 | DPRINTK("(done)\n"); |
3350 | module_put(THIS_MODULE); |
3351 | } |
3352 | @@ -714,7 +719,12 @@ static struct atm_dev atmarpd_dev = { |
3353 | |
3354 | static int atm_init_atmarp(struct atm_vcc *vcc) |
3355 | { |
3356 | - if (atmarpd) return -EADDRINUSE; |
3357 | + rtnl_lock(); |
3358 | + if (atmarpd) { |
3359 | + rtnl_unlock(); |
3360 | + return -EADDRINUSE; |
3361 | + } |
3362 | + |
3363 | if (start_timer) { |
3364 | start_timer = 0; |
3365 | init_timer(&idle_timer); |
3366 | @@ -731,10 +741,7 @@ static int atm_init_atmarp(struct atm_vc |
3367 | vcc->push = NULL; |
3368 | vcc->pop = NULL; /* crash */ |
3369 | vcc->push_oam = NULL; /* crash */ |
3370 | - if (register_netdevice_notifier(&clip_dev_notifier)) |
3371 | - printk(KERN_ERR "register_netdevice_notifier failed\n"); |
3372 | - if (register_inetaddr_notifier(&clip_inet_notifier)) |
3373 | - printk(KERN_ERR "register_inetaddr_notifier failed\n"); |
3374 | + rtnl_unlock(); |
3375 | return 0; |
3376 | } |
3377 | |
3378 | @@ -992,6 +999,8 @@ static int __init atm_clip_init(void) |
3379 | |
3380 | clip_tbl_hook = &clip_tbl; |
3381 | register_atm_ioctl(&clip_ioctl_ops); |
3382 | + register_netdevice_notifier(&clip_dev_notifier); |
3383 | + register_inetaddr_notifier(&clip_inet_notifier); |
3384 | |
3385 | #ifdef CONFIG_PROC_FS |
3386 | { |
3387 | @@ -1012,6 +1021,9 @@ static void __exit atm_clip_exit(void) |
3388 | |
3389 | remove_proc_entry("arp", atm_proc_root); |
3390 | |
3391 | + unregister_inetaddr_notifier(&clip_inet_notifier); |
3392 | + unregister_netdevice_notifier(&clip_dev_notifier); |
3393 | + |
3394 | deregister_atm_ioctl(&clip_ioctl_ops); |
3395 | |
3396 | /* First, stop the idle timer, so it stops banging |
3397 | diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c |
3398 | index e060aad..9e27373 100644 |
3399 | --- a/net/bridge/br_netfilter.c |
3400 | +++ b/net/bridge/br_netfilter.c |
3401 | @@ -739,6 +739,15 @@ out: |
3402 | return NF_STOLEN; |
3403 | } |
3404 | |
3405 | +static int br_nf_dev_queue_xmit(struct sk_buff *skb) |
3406 | +{ |
3407 | + if (skb->protocol == htons(ETH_P_IP) && |
3408 | + skb->len > skb->dev->mtu && |
3409 | + !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size)) |
3410 | + return ip_fragment(skb, br_dev_queue_push_xmit); |
3411 | + else |
3412 | + return br_dev_queue_push_xmit(skb); |
3413 | +} |
3414 | |
3415 | /* PF_BRIDGE/POST_ROUTING ********************************************/ |
3416 | static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb, |
3417 | @@ -798,7 +807,7 @@ #if defined(CONFIG_VLAN_8021Q) || define |
3418 | realoutdev = nf_bridge->netoutdev; |
3419 | #endif |
3420 | NF_HOOK(pf, NF_IP_POST_ROUTING, skb, NULL, realoutdev, |
3421 | - br_dev_queue_push_xmit); |
3422 | + br_nf_dev_queue_xmit); |
3423 | |
3424 | return NF_STOLEN; |
3425 | |
3426 | @@ -843,7 +852,7 @@ static unsigned int ip_sabotage_out(unsi |
3427 | if ((out->hard_start_xmit == br_dev_xmit && |
3428 | okfn != br_nf_forward_finish && |
3429 | okfn != br_nf_local_out_finish && |
3430 | - okfn != br_dev_queue_push_xmit) |
3431 | + okfn != br_nf_dev_queue_xmit) |
3432 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) |
3433 | || ((out->priv_flags & IFF_802_1Q_VLAN) && |
3434 | VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit) |
3435 | diff --git a/net/core/dev.c b/net/core/dev.c |
3436 | index 2afb0de..12a214c 100644 |
3437 | --- a/net/core/dev.c |
3438 | +++ b/net/core/dev.c |
3439 | @@ -2932,11 +2932,11 @@ void netdev_run_todo(void) |
3440 | |
3441 | switch(dev->reg_state) { |
3442 | case NETREG_REGISTERING: |
3443 | + dev->reg_state = NETREG_REGISTERED; |
3444 | err = netdev_register_sysfs(dev); |
3445 | if (err) |
3446 | printk(KERN_ERR "%s: failed sysfs registration (%d)\n", |
3447 | dev->name, err); |
3448 | - dev->reg_state = NETREG_REGISTERED; |
3449 | break; |
3450 | |
3451 | case NETREG_UNREGISTERING: |
3452 | diff --git a/net/core/sock.c b/net/core/sock.c |
3453 | index 6e00811..5621198 100644 |
3454 | --- a/net/core/sock.c |
3455 | +++ b/net/core/sock.c |
3456 | @@ -404,8 +404,9 @@ #ifdef CONFIG_NETDEVICES |
3457 | if (!valbool) { |
3458 | sk->sk_bound_dev_if = 0; |
3459 | } else { |
3460 | - if (optlen > IFNAMSIZ) |
3461 | - optlen = IFNAMSIZ; |
3462 | + if (optlen > IFNAMSIZ - 1) |
3463 | + optlen = IFNAMSIZ - 1; |
3464 | + memset(devname, 0, sizeof(devname)); |
3465 | if (copy_from_user(devname, optval, optlen)) { |
3466 | ret = -EFAULT; |
3467 | break; |
3468 | diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c |
3469 | index e320b32..24009be 100644 |
3470 | --- a/net/ipv4/fib_trie.c |
3471 | +++ b/net/ipv4/fib_trie.c |
3472 | @@ -314,11 +314,6 @@ static void __leaf_free_rcu(struct rcu_h |
3473 | kfree(container_of(head, struct leaf, rcu)); |
3474 | } |
3475 | |
3476 | -static inline void free_leaf(struct leaf *leaf) |
3477 | -{ |
3478 | - call_rcu(&leaf->rcu, __leaf_free_rcu); |
3479 | -} |
3480 | - |
3481 | static void __leaf_info_free_rcu(struct rcu_head *head) |
3482 | { |
3483 | kfree(container_of(head, struct leaf_info, rcu)); |
3484 | @@ -357,7 +352,12 @@ static void __tnode_free_rcu(struct rcu_ |
3485 | |
3486 | static inline void tnode_free(struct tnode *tn) |
3487 | { |
3488 | - call_rcu(&tn->rcu, __tnode_free_rcu); |
3489 | + if(IS_LEAF(tn)) { |
3490 | + struct leaf *l = (struct leaf *) tn; |
3491 | + call_rcu_bh(&l->rcu, __leaf_free_rcu); |
3492 | + } |
3493 | + else |
3494 | + call_rcu(&tn->rcu, __tnode_free_rcu); |
3495 | } |
3496 | |
3497 | static struct leaf *leaf_new(void) |
3498 | diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c |
3499 | index 8ee4d01..8dcba38 100644 |
3500 | --- a/net/ipv4/ip_output.c |
3501 | +++ b/net/ipv4/ip_output.c |
3502 | @@ -86,8 +86,6 @@ #include <linux/tcp.h> |
3503 | |
3504 | int sysctl_ip_default_ttl = IPDEFTTL; |
3505 | |
3506 | -static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)); |
3507 | - |
3508 | /* Generate a checksum for an outgoing IP datagram. */ |
3509 | __inline__ void ip_send_check(struct iphdr *iph) |
3510 | { |
3511 | @@ -421,7 +419,7 @@ #endif |
3512 | * single device frame, and queue such a frame for sending. |
3513 | */ |
3514 | |
3515 | -static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) |
3516 | +int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*)) |
3517 | { |
3518 | struct iphdr *iph; |
3519 | int raw = 0; |
3520 | @@ -673,6 +671,8 @@ fail: |
3521 | return err; |
3522 | } |
3523 | |
3524 | +EXPORT_SYMBOL(ip_fragment); |
3525 | + |
3526 | int |
3527 | ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) |
3528 | { |
3529 | @@ -1249,11 +1249,7 @@ int ip_push_pending_frames(struct sock * |
3530 | iph->tos = inet->tos; |
3531 | iph->tot_len = htons(skb->len); |
3532 | iph->frag_off = df; |
3533 | - if (!df) { |
3534 | - __ip_select_ident(iph, &rt->u.dst, 0); |
3535 | - } else { |
3536 | - iph->id = htons(inet->id++); |
3537 | - } |
3538 | + ip_select_ident(iph, &rt->u.dst, sk); |
3539 | iph->ttl = ttl; |
3540 | iph->protocol = sk->sk_protocol; |
3541 | iph->saddr = rt->rt_src; |
3542 | diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c |
3543 | index e0b5926..d4e6d0a 100644 |
3544 | --- a/net/ipv4/netfilter/ip_conntrack_netlink.c |
3545 | +++ b/net/ipv4/netfilter/ip_conntrack_netlink.c |
3546 | @@ -1619,7 +1619,7 @@ static void __exit ctnetlink_exit(void) |
3547 | printk("ctnetlink: unregistering from nfnetlink.\n"); |
3548 | |
3549 | #ifdef CONFIG_IP_NF_CONNTRACK_EVENTS |
3550 | - ip_conntrack_unregister_notifier(&ctnl_notifier_exp); |
3551 | + ip_conntrack_expect_unregister_notifier(&ctnl_notifier_exp); |
3552 | ip_conntrack_unregister_notifier(&ctnl_notifier); |
3553 | #endif |
3554 | |
3555 | diff --git a/net/ipv4/route.c b/net/ipv4/route.c |
3556 | index fca5fe0..a67955e 100644 |
3557 | --- a/net/ipv4/route.c |
3558 | +++ b/net/ipv4/route.c |
3559 | @@ -2750,7 +2750,10 @@ int inet_rtm_getroute(struct sk_buff *in |
3560 | /* Reserve room for dummy headers, this skb can pass |
3561 | through good chunk of routing engine. |
3562 | */ |
3563 | - skb->mac.raw = skb->data; |
3564 | + skb->mac.raw = skb->nh.raw = skb->data; |
3565 | + |
3566 | + /* Bugfix: need to give ip_route_input enough of an IP header to not gag. */ |
3567 | + skb->nh.iph->protocol = IPPROTO_ICMP; |
3568 | skb_reserve(skb, MAX_HEADER + sizeof(struct iphdr)); |
3569 | |
3570 | if (rta[RTA_SRC - 1]) |
3571 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
3572 | index 9f498a6..310f2e6 100644 |
3573 | --- a/net/ipv4/tcp_output.c |
3574 | +++ b/net/ipv4/tcp_output.c |
3575 | @@ -537,7 +537,9 @@ int tcp_fragment(struct sock *sk, struct |
3576 | buff = sk_stream_alloc_skb(sk, nsize, GFP_ATOMIC); |
3577 | if (buff == NULL) |
3578 | return -ENOMEM; /* We'll just try again later. */ |
3579 | - sk_charge_skb(sk, buff); |
3580 | + |
3581 | + buff->truesize = skb->len - len; |
3582 | + skb->truesize -= buff->truesize; |
3583 | |
3584 | /* Correct the sequence numbers. */ |
3585 | TCP_SKB_CB(buff)->seq = TCP_SKB_CB(skb)->seq + len; |
3586 | diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c |
3587 | index 2a1e7e4..d88cab7 100644 |
3588 | --- a/net/ipv6/exthdrs.c |
3589 | +++ b/net/ipv6/exthdrs.c |
3590 | @@ -489,6 +489,18 @@ int ipv6_parse_hopopts(struct sk_buff *s |
3591 | { |
3592 | struct inet6_skb_parm *opt = IP6CB(skb); |
3593 | |
3594 | + /* |
3595 | + * skb->nh.raw is equal to skb->data, and |
3596 | + * skb->h.raw - skb->nh.raw is always equal to |
3597 | + * sizeof(struct ipv6hdr) by definition of |
3598 | + * hop-by-hop options. |
3599 | + */ |
3600 | + if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + 8) || |
3601 | + !pskb_may_pull(skb, sizeof(struct ipv6hdr) + ((skb->h.raw[1] + 1) << 3))) { |
3602 | + kfree_skb(skb); |
3603 | + return -1; |
3604 | + } |
3605 | + |
3606 | opt->hop = sizeof(struct ipv6hdr); |
3607 | if (ip6_parse_tlv(tlvprochopopt_lst, skb)) { |
3608 | skb->h.raw += (skb->h.raw[1]+1)<<3; |
3609 | diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c |
3610 | index 91cce8b..88c840f 100644 |
3611 | --- a/net/ipv6/xfrm6_policy.c |
3612 | +++ b/net/ipv6/xfrm6_policy.c |
3613 | @@ -191,16 +191,18 @@ error: |
3614 | static inline void |
3615 | _decode_session6(struct sk_buff *skb, struct flowi *fl) |
3616 | { |
3617 | - u16 offset = sizeof(struct ipv6hdr); |
3618 | + u16 offset = skb->h.raw - skb->nh.raw; |
3619 | struct ipv6hdr *hdr = skb->nh.ipv6h; |
3620 | - struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); |
3621 | - u8 nexthdr = skb->nh.ipv6h->nexthdr; |
3622 | + struct ipv6_opt_hdr *exthdr; |
3623 | + u8 nexthdr = skb->nh.raw[IP6CB(skb)->nhoff]; |
3624 | |
3625 | memset(fl, 0, sizeof(struct flowi)); |
3626 | ipv6_addr_copy(&fl->fl6_dst, &hdr->daddr); |
3627 | ipv6_addr_copy(&fl->fl6_src, &hdr->saddr); |
3628 | |
3629 | while (pskb_may_pull(skb, skb->nh.raw + offset + 1 - skb->data)) { |
3630 | + exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset); |
3631 | + |
3632 | switch (nexthdr) { |
3633 | case NEXTHDR_ROUTING: |
3634 | case NEXTHDR_HOP: |
3635 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c |
3636 | index 9ff3463..40edeef 100644 |
3637 | --- a/net/netfilter/nf_conntrack_netlink.c |
3638 | +++ b/net/netfilter/nf_conntrack_netlink.c |
3639 | @@ -1641,7 +1641,7 @@ static void __exit ctnetlink_exit(void) |
3640 | printk("ctnetlink: unregistering from nfnetlink.\n"); |
3641 | |
3642 | #ifdef CONFIG_NF_CONNTRACK_EVENTS |
3643 | - nf_conntrack_unregister_notifier(&ctnl_notifier_exp); |
3644 | + nf_conntrack_expect_unregister_notifier(&ctnl_notifier_exp); |
3645 | nf_conntrack_unregister_notifier(&ctnl_notifier); |
3646 | #endif |
3647 | |
3648 | diff --git a/security/keys/key.c b/security/keys/key.c |
3649 | index 99781b7..0e2584e 100644 |
3650 | --- a/security/keys/key.c |
3651 | +++ b/security/keys/key.c |
3652 | @@ -785,6 +785,10 @@ key_ref_t key_create_or_update(key_ref_t |
3653 | |
3654 | key_check(keyring); |
3655 | |
3656 | + key_ref = ERR_PTR(-ENOTDIR); |
3657 | + if (keyring->type != &key_type_keyring) |
3658 | + goto error_2; |
3659 | + |
3660 | down_write(&keyring->sem); |
3661 | |
3662 | /* if we're going to allocate a new key, we're going to have |
3663 | diff --git a/security/keys/keyring.c b/security/keys/keyring.c |
3664 | index d65a180..bffa924 100644 |
3665 | --- a/security/keys/keyring.c |
3666 | +++ b/security/keys/keyring.c |
3667 | @@ -437,6 +437,7 @@ EXPORT_SYMBOL(keyring_search); |
3668 | /* |
3669 | * search the given keyring only (no recursion) |
3670 | * - keyring must be locked by caller |
3671 | + * - caller must guarantee that the keyring is a keyring |
3672 | */ |
3673 | key_ref_t __keyring_search_one(key_ref_t keyring_ref, |
3674 | const struct key_type *ktype, |
3675 | diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c |
3676 | index 640d0bf..84047f6 100644 |
3677 | --- a/security/selinux/ss/mls.c |
3678 | +++ b/security/selinux/ss/mls.c |
3679 | @@ -264,7 +264,7 @@ int mls_context_to_sid(char oldc, |
3680 | |
3681 | if (!selinux_mls_enabled) { |
3682 | if (def_sid != SECSID_NULL && oldc) |
3683 | - *scontext += strlen(*scontext); |
3684 | + *scontext += strlen(*scontext)+1; |
3685 | return 0; |
3686 | } |
3687 | |
3688 | diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c |
3689 | index 63d96be..65b28cb 100644 |
3690 | --- a/sound/isa/opti9xx/opti92x-ad1848.c |
3691 | +++ b/sound/isa/opti9xx/opti92x-ad1848.c |
3692 | @@ -2088,9 +2088,11 @@ static int __init alsa_card_opti9xx_init |
3693 | int error; |
3694 | struct platform_device *device; |
3695 | |
3696 | +#ifdef CONFIG_PNP |
3697 | pnp_register_card_driver(&opti9xx_pnpc_driver); |
3698 | if (snd_opti9xx_pnp_is_probed) |
3699 | return 0; |
3700 | +#endif |
3701 | if (! is_isapnp_selected()) { |
3702 | error = platform_driver_register(&snd_opti9xx_driver); |
3703 | if (error < 0) |
3704 | @@ -2102,7 +2104,9 @@ static int __init alsa_card_opti9xx_init |
3705 | } |
3706 | platform_driver_unregister(&snd_opti9xx_driver); |
3707 | } |
3708 | +#ifdef CONFIG_PNP |
3709 | pnp_unregister_card_driver(&opti9xx_pnpc_driver); |
3710 | +#endif |
3711 | #ifdef MODULE |
3712 | printk(KERN_ERR "no OPTi " CHIP_NAME " soundcard found\n"); |
3713 | #endif |
3714 | @@ -2115,7 +2119,9 @@ static void __exit alsa_card_opti9xx_exi |
3715 | platform_device_unregister(snd_opti9xx_platform_device); |
3716 | platform_driver_unregister(&snd_opti9xx_driver); |
3717 | } |
3718 | +#ifdef CONFIG_PNP |
3719 | pnp_unregister_card_driver(&opti9xx_pnpc_driver); |
3720 | +#endif |
3721 | } |
3722 | |
3723 | module_init(alsa_card_opti9xx_init) |
3724 | diff --git a/sound/oss/dmasound/tas_common.c b/sound/oss/dmasound/tas_common.c |
3725 | index 8131599..882ae98 100644 |
3726 | --- a/sound/oss/dmasound/tas_common.c |
3727 | +++ b/sound/oss/dmasound/tas_common.c |
3728 | @@ -195,8 +195,8 @@ tas_init(int driver_id, const char *driv |
3729 | |
3730 | printk(KERN_INFO "tas driver [%s])\n", driver_name); |
3731 | |
3732 | -#ifndef CONFIG_I2C_KEYWEST |
3733 | - request_module("i2c-keywest"); |
3734 | +#ifndef CONFIG_I2C_POWERMAC |
3735 | + request_module("i2c-powermac"); |
3736 | #endif |
3737 | tas_node = find_devices("deq"); |
3738 | if (tas_node == NULL) |
3739 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3740 | index b767552..d5cd3a1 100644 |
3741 | --- a/sound/pci/hda/patch_realtek.c |
3742 | +++ b/sound/pci/hda/patch_realtek.c |
3743 | @@ -2948,6 +2948,8 @@ static struct hda_board_config alc260_cf |
3744 | { .modelname = "basic", .config = ALC260_BASIC }, |
3745 | { .pci_subvendor = 0x104d, .pci_subdevice = 0x81bb, |
3746 | .config = ALC260_BASIC }, /* Sony VAIO */ |
3747 | + { .pci_subvendor = 0x152d, .pci_subdevice = 0x0729, |
3748 | + .config = ALC260_BASIC }, /* CTL Travel Master U553W */ |
3749 | { .modelname = "hp", .config = ALC260_HP }, |
3750 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP }, |
3751 | { .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP }, |
3752 | diff --git a/sound/ppc/daca.c b/sound/ppc/daca.c |
3753 | index 08cde51..b96cd94 100644 |
3754 | --- a/sound/ppc/daca.c |
3755 | +++ b/sound/ppc/daca.c |
3756 | @@ -256,7 +256,7 @@ int __init snd_pmac_daca_init(struct snd |
3757 | |
3758 | #ifdef CONFIG_KMOD |
3759 | if (current->fs->root) |
3760 | - request_module("i2c-keywest"); |
3761 | + request_module("i2c-powermac"); |
3762 | #endif /* CONFIG_KMOD */ |
3763 | |
3764 | mix = kmalloc(sizeof(*mix), GFP_KERNEL); |
3765 | diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c |
3766 | index 838fc11..39d4cde 100644 |
3767 | --- a/sound/ppc/tumbler.c |
3768 | +++ b/sound/ppc/tumbler.c |
3769 | @@ -1314,7 +1314,7 @@ int __init snd_pmac_tumbler_init(struct |
3770 | |
3771 | #ifdef CONFIG_KMOD |
3772 | if (current->fs->root) |
3773 | - request_module("i2c-keywest"); |
3774 | + request_module("i2c-powermac"); |
3775 | #endif /* CONFIG_KMOD */ |
3776 | |
3777 | mix = kmalloc(sizeof(*mix), GFP_KERNEL); |