Magellan Linux

Contents of /trunk/kernel26-magellan/patches-2.6.16-r10/0100-2.6.16-patch-2.6.16.11_fixed

Parent Directory Parent Directory | Revision Log Revision Log


Revision 70 - (show annotations) (download)
Thu May 11 19:09:22 2006 UTC (18 years ago) by niro
File size: 119006 byte(s)
import

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