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