/[linux-patches]/genpatches-2.6/tags/2.6.20-9/1003_linux-2.6.20.4.patch
Gentoo

Contents of /genpatches-2.6/tags/2.6.20-9/1003_linux-2.6.20.4.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 927 - (show annotations) (download)
Thu Apr 26 15:33:43 2007 UTC (7 years, 5 months ago) by phreak
File size: 40400 byte(s)
2.6.20-9 release
1 diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c
2 index 0fc5fb7..02479e1 100644
3 --- a/arch/ia64/kernel/iosapic.c
4 +++ b/arch/ia64/kernel/iosapic.c
5 @@ -446,7 +446,7 @@ iosapic_end_level_irq (unsigned int irq)
6 #define iosapic_disable_level_irq mask_irq
7 #define iosapic_ack_level_irq nop
8
9 -struct hw_interrupt_type irq_type_iosapic_level = {
10 +struct irq_chip irq_type_iosapic_level = {
11 .name = "IO-SAPIC-level",
12 .startup = iosapic_startup_level_irq,
13 .shutdown = iosapic_shutdown_level_irq,
14 @@ -454,6 +454,8 @@ struct hw_interrupt_type irq_type_iosapic_level = {
15 .disable = iosapic_disable_level_irq,
16 .ack = iosapic_ack_level_irq,
17 .end = iosapic_end_level_irq,
18 + .mask = mask_irq,
19 + .unmask = unmask_irq,
20 .set_affinity = iosapic_set_affinity
21 };
22
23 @@ -493,7 +495,7 @@ iosapic_ack_edge_irq (unsigned int irq)
24 #define iosapic_disable_edge_irq nop
25 #define iosapic_end_edge_irq nop
26
27 -struct hw_interrupt_type irq_type_iosapic_edge = {
28 +struct irq_chip irq_type_iosapic_edge = {
29 .name = "IO-SAPIC-edge",
30 .startup = iosapic_startup_edge_irq,
31 .shutdown = iosapic_disable_edge_irq,
32 @@ -501,6 +503,8 @@ struct hw_interrupt_type irq_type_iosapic_edge = {
33 .disable = iosapic_disable_edge_irq,
34 .ack = iosapic_ack_edge_irq,
35 .end = iosapic_end_edge_irq,
36 + .mask = mask_irq,
37 + .unmask = unmask_irq,
38 .set_affinity = iosapic_set_affinity
39 };
40
41 diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c
42 index 8c5bee0..8d2a1bf 100644
43 --- a/arch/ia64/sn/kernel/irq.c
44 +++ b/arch/ia64/sn/kernel/irq.c
45 @@ -205,7 +205,17 @@ static void sn_set_affinity_irq(unsigned int irq, cpumask_t mask)
46 (void)sn_retarget_vector(sn_irq_info, nasid, slice);
47 }
48
49 -struct hw_interrupt_type irq_type_sn = {
50 +static void
51 +sn_mask_irq(unsigned int irq)
52 +{
53 +}
54 +
55 +static void
56 +sn_unmask_irq(unsigned int irq)
57 +{
58 +}
59 +
60 +struct irq_chip irq_type_sn = {
61 .name = "SN hub",
62 .startup = sn_startup_irq,
63 .shutdown = sn_shutdown_irq,
64 @@ -213,6 +223,8 @@ struct hw_interrupt_type irq_type_sn = {
65 .disable = sn_disable_irq,
66 .ack = sn_ack_irq,
67 .end = sn_end_irq,
68 + .mask = sn_mask_irq,
69 + .unmask = sn_unmask_irq,
70 .set_affinity = sn_set_affinity_irq
71 };
72
73 diff --git a/arch/sparc64/kernel/ktlb.S b/arch/sparc64/kernel/ktlb.S
74 index e492db8..d4024ac 100644
75 --- a/arch/sparc64/kernel/ktlb.S
76 +++ b/arch/sparc64/kernel/ktlb.S
77 @@ -138,9 +138,15 @@ kvmap_dtlb_4v:
78 brgez,pn %g4, kvmap_dtlb_nonlinear
79 nop
80
81 +#ifdef CONFIG_DEBUG_PAGEALLOC
82 + /* Index through the base page size TSB even for linear
83 + * mappings when using page allocation debugging.
84 + */
85 + KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load)
86 +#else
87 /* Correct TAG_TARGET is already in %g6, check 4mb TSB. */
88 KERN_TSB4M_LOOKUP_TL1(%g6, %g5, %g1, %g2, %g3, kvmap_dtlb_load)
89 -
90 +#endif
91 /* TSB entry address left in %g1, lookup linear PTE.
92 * Must preserve %g1 and %g6 (TAG).
93 */
94 diff --git a/arch/sparc64/kernel/tsb.S b/arch/sparc64/kernel/tsb.S
95 index eedf94f..10adb2f 100644
96 --- a/arch/sparc64/kernel/tsb.S
97 +++ b/arch/sparc64/kernel/tsb.S
98 @@ -546,6 +546,7 @@ NGtsb_init:
99 subcc %o1, 0x100, %o1
100 bne,pt %xcc, 1b
101 add %o0, 0x100, %o0
102 + membar #Sync
103 retl
104 wr %g2, 0x0, %asi
105 .size NGtsb_init, .-NGtsb_init
106 diff --git a/arch/sparc64/lib/NGbzero.S b/arch/sparc64/lib/NGbzero.S
107 index e86baec..f10e452 100644
108 --- a/arch/sparc64/lib/NGbzero.S
109 +++ b/arch/sparc64/lib/NGbzero.S
110 @@ -88,6 +88,7 @@ NGbzero_loop:
111 bne,pt %xcc, NGbzero_loop
112 add %o0, 64, %o0
113
114 + membar #Sync
115 wr %o4, 0x0, %asi
116 brz,pn %o1, NGbzero_done
117 NGbzero_medium:
118 diff --git a/arch/sparc64/lib/NGmemcpy.S b/arch/sparc64/lib/NGmemcpy.S
119 index 8e522b3..66063a9 100644
120 --- a/arch/sparc64/lib/NGmemcpy.S
121 +++ b/arch/sparc64/lib/NGmemcpy.S
122 @@ -247,6 +247,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
123 /* fall through */
124
125 60:
126 + membar #Sync
127 +
128 /* %o2 contains any final bytes still needed to be copied
129 * over. If anything is left, we copy it one byte at a time.
130 */
131 diff --git a/arch/sparc64/lib/NGpage.S b/arch/sparc64/lib/NGpage.S
132 index 7d7c3bb..8ce3a0c 100644
133 --- a/arch/sparc64/lib/NGpage.S
134 +++ b/arch/sparc64/lib/NGpage.S
135 @@ -41,6 +41,7 @@ NGcopy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
136 subcc %g7, 64, %g7
137 bne,pt %xcc, 1b
138 add %o0, 32, %o0
139 + membar #Sync
140 retl
141 nop
142
143 @@ -63,6 +64,7 @@ NGclear_user_page: /* %o0=dest, %o1=vaddr */
144 subcc %g7, 64, %g7
145 bne,pt %xcc, 1b
146 add %o0, 32, %o0
147 + membar #Sync
148 retl
149 nop
150
151 diff --git a/arch/sparc64/mm/hugetlbpage.c b/arch/sparc64/mm/hugetlbpage.c
152 index 33fd0b2..00677b5 100644
153 --- a/arch/sparc64/mm/hugetlbpage.c
154 +++ b/arch/sparc64/mm/hugetlbpage.c
155 @@ -248,6 +248,7 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
156 if (!pte_present(*ptep) && pte_present(entry))
157 mm->context.huge_pte_count++;
158
159 + addr &= HPAGE_MASK;
160 for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
161 set_pte_at(mm, addr, ptep, entry);
162 ptep++;
163 @@ -266,6 +267,8 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
164 if (pte_present(entry))
165 mm->context.huge_pte_count--;
166
167 + addr &= HPAGE_MASK;
168 +
169 for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
170 pte_clear(mm, addr, ptep);
171 addr += PAGE_SIZE;
172 diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
173 index 054822a..5391cd5 100644
174 --- a/arch/sparc64/mm/init.c
175 +++ b/arch/sparc64/mm/init.c
176 @@ -59,8 +59,10 @@ unsigned long kern_linear_pte_xor[2] __read_mostly;
177 */
178 unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)];
179
180 +#ifndef CONFIG_DEBUG_PAGEALLOC
181 /* A special kernel TSB for 4MB and 256MB linear mappings. */
182 struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES];
183 +#endif
184
185 #define MAX_BANKS 32
186
187 @@ -1301,7 +1303,12 @@ static void __init tsb_phys_patch(void)
188 }
189
190 /* Don't mark as init, we give this to the Hypervisor. */
191 -static struct hv_tsb_descr ktsb_descr[2];
192 +#ifndef CONFIG_DEBUG_PAGEALLOC
193 +#define NUM_KTSB_DESCR 2
194 +#else
195 +#define NUM_KTSB_DESCR 1
196 +#endif
197 +static struct hv_tsb_descr ktsb_descr[NUM_KTSB_DESCR];
198 extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES];
199
200 static void __init sun4v_ktsb_init(void)
201 @@ -1340,6 +1347,7 @@ static void __init sun4v_ktsb_init(void)
202 ktsb_descr[0].tsb_base = ktsb_pa;
203 ktsb_descr[0].resv = 0;
204
205 +#ifndef CONFIG_DEBUG_PAGEALLOC
206 /* Second KTSB for 4MB/256MB mappings. */
207 ktsb_pa = (kern_base +
208 ((unsigned long)&swapper_4m_tsb[0] - KERNBASE));
209 @@ -1352,6 +1360,7 @@ static void __init sun4v_ktsb_init(void)
210 ktsb_descr[1].ctx_idx = 0;
211 ktsb_descr[1].tsb_base = ktsb_pa;
212 ktsb_descr[1].resv = 0;
213 +#endif
214 }
215
216 void __cpuinit sun4v_ktsb_register(void)
217 @@ -1364,7 +1373,7 @@ void __cpuinit sun4v_ktsb_register(void)
218 pa = kern_base + ((unsigned long)&ktsb_descr[0] - KERNBASE);
219
220 func = HV_FAST_MMU_TSB_CTX0;
221 - arg0 = 2;
222 + arg0 = NUM_KTSB_DESCR;
223 arg1 = pa;
224 __asm__ __volatile__("ta %6"
225 : "=&r" (func), "=&r" (arg0), "=&r" (arg1)
226 @@ -1393,7 +1402,9 @@ void __init paging_init(void)
227
228 /* Invalidate both kernel TSBs. */
229 memset(swapper_tsb, 0x40, sizeof(swapper_tsb));
230 +#ifndef CONFIG_DEBUG_PAGEALLOC
231 memset(swapper_4m_tsb, 0x40, sizeof(swapper_4m_tsb));
232 +#endif
233
234 if (tlb_type == hypervisor)
235 sun4v_pgprot_init();
236 @@ -1725,8 +1736,13 @@ static void __init sun4u_pgprot_init(void)
237 pg_iobits = (_PAGE_VALID | _PAGE_PRESENT_4U | __DIRTY_BITS_4U |
238 __ACCESS_BITS_4U | _PAGE_E_4U);
239
240 +#ifdef CONFIG_DEBUG_PAGEALLOC
241 + kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZBITS_4U) ^
242 + 0xfffff80000000000;
243 +#else
244 kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4U) ^
245 0xfffff80000000000;
246 +#endif
247 kern_linear_pte_xor[0] |= (_PAGE_CP_4U | _PAGE_CV_4U |
248 _PAGE_P_4U | _PAGE_W_4U);
249
250 @@ -1769,13 +1785,23 @@ static void __init sun4v_pgprot_init(void)
251 _PAGE_E = _PAGE_E_4V;
252 _PAGE_CACHE = _PAGE_CACHE_4V;
253
254 +#ifdef CONFIG_DEBUG_PAGEALLOC
255 + kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZBITS_4V) ^
256 + 0xfffff80000000000;
257 +#else
258 kern_linear_pte_xor[0] = (_PAGE_VALID | _PAGE_SZ4MB_4V) ^
259 0xfffff80000000000;
260 +#endif
261 kern_linear_pte_xor[0] |= (_PAGE_CP_4V | _PAGE_CV_4V |
262 _PAGE_P_4V | _PAGE_W_4V);
263
264 +#ifdef CONFIG_DEBUG_PAGEALLOC
265 + kern_linear_pte_xor[1] = (_PAGE_VALID | _PAGE_SZBITS_4V) ^
266 + 0xfffff80000000000;
267 +#else
268 kern_linear_pte_xor[1] = (_PAGE_VALID | _PAGE_SZ256MB_4V) ^
269 0xfffff80000000000;
270 +#endif
271 kern_linear_pte_xor[1] |= (_PAGE_CP_4V | _PAGE_CV_4V |
272 _PAGE_P_4V | _PAGE_W_4V);
273
274 diff --git a/arch/um/include/os.h b/arch/um/include/os.h
275 index 13a86bd..4e9a13e 100644
276 --- a/arch/um/include/os.h
277 +++ b/arch/um/include/os.h
278 @@ -341,4 +341,6 @@ extern void maybe_sigio_broken(int fd, int read);
279 extern void sig_handler_common_skas(int sig, void *sc_ptr);
280 extern void user_signal(int sig, union uml_pt_regs *regs, int pid);
281
282 +extern int os_arch_prctl(int pid, int code, unsigned long *addr);
283 +
284 #endif
285 diff --git a/arch/um/os-Linux/sys-x86_64/Makefile b/arch/um/os-Linux/sys-x86_64/Makefile
286 index f67842a..7955e06 100644
287 --- a/arch/um/os-Linux/sys-x86_64/Makefile
288 +++ b/arch/um/os-Linux/sys-x86_64/Makefile
289 @@ -3,7 +3,7 @@
290 # Licensed under the GPL
291 #
292
293 -obj-$(CONFIG_MODE_SKAS) = registers.o signal.o
294 +obj-$(CONFIG_MODE_SKAS) = registers.o prctl.o signal.o
295
296 USER_OBJS := $(obj-y)
297
298 diff --git a/arch/um/os-Linux/sys-x86_64/prctl.c b/arch/um/os-Linux/sys-x86_64/prctl.c
299 new file mode 100644
300 index 0000000..79c278a
301 --- /dev/null
302 +++ b/arch/um/os-Linux/sys-x86_64/prctl.c
303 @@ -0,0 +1,12 @@
304 +/*
305 + * Copyright (C) 2007 Jeff Dike (jdike@{addtoit.com,linux.intel.com})
306 + * Licensed under the GPL
307 + */
308 +
309 +#include <sys/ptrace.h>
310 +#include <linux/ptrace.h>
311 +
312 +int os_arch_prctl(int pid, int code, unsigned long *addr)
313 +{
314 + return ptrace(PTRACE_ARCH_PRCTL, pid, (unsigned long) addr, code);
315 +}
316 diff --git a/arch/um/sys-x86_64/syscalls.c b/arch/um/sys-x86_64/syscalls.c
317 index 73ce446..6d5605b 100644
318 --- a/arch/um/sys-x86_64/syscalls.c
319 +++ b/arch/um/sys-x86_64/syscalls.c
320 @@ -16,6 +16,7 @@
321 #include "asm/prctl.h" /* XXX This should get the constants from libc */
322 #include "choose-mode.h"
323 #include "kern.h"
324 +#include "os.h"
325
326 asmlinkage long sys_uname64(struct new_utsname __user * name)
327 {
328 @@ -58,40 +59,70 @@ static long arch_prctl_tt(int code, unsigned long addr)
329
330 #ifdef CONFIG_MODE_SKAS
331
332 -/* XXX: Must also call arch_prctl in the host, beside saving the segment bases! */
333 -static long arch_prctl_skas(int code, unsigned long addr)
334 +static long arch_prctl_skas(int code, unsigned long __user *addr)
335 {
336 - long ret = 0;
337 + unsigned long *ptr = addr, tmp;
338 + long ret;
339 + int pid = current->mm->context.skas.id.u.pid;
340 +
341 + /*
342 + * With ARCH_SET_FS (and ARCH_SET_GS is treated similarly to
343 + * be safe), we need to call arch_prctl on the host because
344 + * setting %fs may result in something else happening (like a
345 + * GDT being set instead). So, we let the host fiddle the
346 + * registers and restore them afterwards.
347 + *
348 + * So, the saved registers are stored to the process (this
349 + * needed because a stub may have been the last thing to run),
350 + * arch_prctl is run on the host, then the registers are read
351 + * back.
352 + */
353 + switch(code){
354 + case ARCH_SET_FS:
355 + case ARCH_SET_GS:
356 + restore_registers(pid, &current->thread.regs.regs);
357 + break;
358 + case ARCH_GET_FS:
359 + case ARCH_GET_GS:
360 + /*
361 + * With these two, we read to a local pointer and
362 + * put_user it to the userspace pointer that we were
363 + * given. If addr isn't valid (because it hasn't been
364 + * faulted in or is just bogus), we want put_user to
365 + * fault it in (or return -EFAULT) instead of having
366 + * the host return -EFAULT.
367 + */
368 + ptr = &tmp;
369 + }
370 +
371 + ret = os_arch_prctl(pid, code, ptr);
372 + if(ret)
373 + return ret;
374
375 switch(code){
376 case ARCH_SET_FS:
377 - current->thread.regs.regs.skas.regs[FS_BASE / sizeof(unsigned long)] = addr;
378 + current->thread.arch.fs = (unsigned long) ptr;
379 + save_registers(pid, &current->thread.regs.regs);
380 break;
381 case ARCH_SET_GS:
382 - current->thread.regs.regs.skas.regs[GS_BASE / sizeof(unsigned long)] = addr;
383 + save_registers(pid, &current->thread.regs.regs);
384 break;
385 case ARCH_GET_FS:
386 - ret = put_user(current->thread.regs.regs.skas.
387 - regs[FS_BASE / sizeof(unsigned long)],
388 - (unsigned long __user *)addr);
389 - break;
390 + ret = put_user(tmp, addr);
391 + break;
392 case ARCH_GET_GS:
393 - ret = put_user(current->thread.regs.regs.skas.
394 - regs[GS_BASE / sizeof(unsigned long)],
395 - (unsigned long __user *)addr);
396 - break;
397 - default:
398 - ret = -EINVAL;
399 + ret = put_user(tmp, addr);
400 break;
401 }
402
403 - return(ret);
404 + return ret;
405 }
406 #endif
407
408 long sys_arch_prctl(int code, unsigned long addr)
409 {
410 - return(CHOOSE_MODE_PROC(arch_prctl_tt, arch_prctl_skas, code, addr));
411 + return CHOOSE_MODE_PROC(arch_prctl_tt, arch_prctl_skas, code,
412 + (unsigned long __user *) addr);
413 }
414
415 long sys_clone(unsigned long clone_flags, unsigned long newsp,
416 @@ -105,5 +136,14 @@ long sys_clone(unsigned long clone_flags, unsigned long newsp,
417 ret = do_fork(clone_flags, newsp, &current->thread.regs, 0, parent_tid,
418 child_tid);
419 current->thread.forking = 0;
420 - return(ret);
421 + return ret;
422 }
423 +
424 +void arch_switch_to_skas(struct task_struct *from, struct task_struct *to)
425 +{
426 + if((to->thread.arch.fs == 0) || (to->mm == NULL))
427 + return;
428 +
429 + arch_prctl_skas(ARCH_SET_FS, (void __user *) to->thread.arch.fs);
430 +}
431 +
432 diff --git a/arch/um/sys-x86_64/tls.c b/arch/um/sys-x86_64/tls.c
433 index ce1bf1b..febbc94 100644
434 --- a/arch/um/sys-x86_64/tls.c
435 +++ b/arch/um/sys-x86_64/tls.c
436 @@ -1,14 +1,17 @@
437 #include "linux/sched.h"
438
439 -void debug_arch_force_load_TLS(void)
440 -{
441 -}
442 -
443 void clear_flushed_tls(struct task_struct *task)
444 {
445 }
446
447 int arch_copy_tls(struct task_struct *t)
448 {
449 + /*
450 + * If CLONE_SETTLS is set, we need to save the thread id
451 + * (which is argument 5, child_tid, of clone) so it can be set
452 + * during context switches.
453 + */
454 + t->thread.arch.fs = t->thread.regs.regs.skas.regs[R8 / sizeof(long)];
455 +
456 return 0;
457 }
458 diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
459 index debe944..3b12996 100644
460 --- a/drivers/input/serio/i8042.c
461 +++ b/drivers/input/serio/i8042.c
462 @@ -371,7 +371,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
463 if (unlikely(i8042_suppress_kbd_ack))
464 if (port_no == I8042_KBD_PORT_NO &&
465 (data == 0xfa || data == 0xfe)) {
466 - i8042_suppress_kbd_ack = 0;
467 + i8042_suppress_kbd_ack--;
468 goto out;
469 }
470
471 @@ -543,6 +543,7 @@ static int __devinit i8042_check_aux(void)
472 {
473 int retval = -1;
474 int irq_registered = 0;
475 + int aux_loop_broken = 0;
476 unsigned long flags;
477 unsigned char param;
478
479 @@ -559,7 +560,8 @@ static int __devinit i8042_check_aux(void)
480 */
481
482 param = 0x5a;
483 - if (i8042_command(&param, I8042_CMD_AUX_LOOP) || param != 0x5a) {
484 + retval = i8042_command(&param, I8042_CMD_AUX_LOOP);
485 + if (retval || param != 0x5a) {
486
487 /*
488 * External connection test - filters out AT-soldered PS/2 i8042's
489 @@ -572,6 +574,13 @@ static int __devinit i8042_check_aux(void)
490 if (i8042_command(&param, I8042_CMD_AUX_TEST) ||
491 (param && param != 0xfa && param != 0xff))
492 return -1;
493 +
494 +/*
495 + * If AUX_LOOP completed without error but returned unexpected data
496 + * mark it as broken
497 + */
498 + if (!retval)
499 + aux_loop_broken = 1;
500 }
501
502 /*
503 @@ -595,7 +604,7 @@ static int __devinit i8042_check_aux(void)
504 * used it for a PCI card or somethig else.
505 */
506
507 - if (i8042_noloop) {
508 + if (i8042_noloop || aux_loop_broken) {
509 /*
510 * Without LOOP command we can't test AUX IRQ delivery. Assume the port
511 * is working and hope we are right.
512 @@ -838,13 +847,14 @@ static long i8042_panic_blink(long count)
513 led ^= 0x01 | 0x04;
514 while (i8042_read_status() & I8042_STR_IBF)
515 DELAY;
516 - i8042_suppress_kbd_ack = 1;
517 + dbg("%02x -> i8042 (panic blink)", 0xed);
518 + i8042_suppress_kbd_ack = 2;
519 i8042_write_data(0xed); /* set leds */
520 DELAY;
521 while (i8042_read_status() & I8042_STR_IBF)
522 DELAY;
523 DELAY;
524 - i8042_suppress_kbd_ack = 1;
525 + dbg("%02x -> i8042 (panic blink)", led);
526 i8042_write_data(led);
527 DELAY;
528 last_blink = count;
529 diff --git a/drivers/md/linear.c b/drivers/md/linear.c
530 index c625ddb..d5ecd2d 100644
531 --- a/drivers/md/linear.c
532 +++ b/drivers/md/linear.c
533 @@ -188,7 +188,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
534 for (i=0; i < cnt-1 ; i++) {
535 sector_t sz = 0;
536 int j;
537 - for (j=i; i<cnt-1 && sz < min_spacing ; j++)
538 + for (j = i; j < cnt - 1 && sz < min_spacing; j++)
539 sz += conf->disks[j].size;
540 if (sz >= min_spacing && sz < conf->hash_spacing)
541 conf->hash_spacing = sz;
542 diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
543 index 577babd..1aafa71 100644
544 --- a/drivers/net/r8169.c
545 +++ b/drivers/net/r8169.c
546 @@ -1369,11 +1369,7 @@ static inline void rtl8169_request_timer(struct net_device *dev)
547 (tp->phy_version >= RTL_GIGA_PHY_VER_H))
548 return;
549
550 - init_timer(timer);
551 - timer->expires = jiffies + RTL8169_PHY_TIMEOUT;
552 - timer->data = (unsigned long)(dev);
553 - timer->function = rtl8169_phy_timer;
554 - add_timer(timer);
555 + mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
556 }
557
558 #ifdef CONFIG_NET_POLL_CONTROLLER
559 @@ -1686,6 +1682,10 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
560 tp->mmio_addr = ioaddr;
561 tp->align = rtl_cfg_info[ent->driver_data].align;
562
563 + init_timer(&tp->timer);
564 + tp->timer.data = (unsigned long) dev;
565 + tp->timer.function = rtl8169_phy_timer;
566 +
567 spin_lock_init(&tp->lock);
568
569 rc = register_netdev(dev);
570 diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
571 index 0e0401d..0252ef9 100644
572 --- a/drivers/pci/probe.c
573 +++ b/drivers/pci/probe.c
574 @@ -639,7 +639,34 @@ static void pci_read_irq(struct pci_dev *dev)
575 dev->irq = irq;
576 }
577
578 -#define LEGACY_IO_RESOURCE (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
579 +static void change_legacy_io_resource(struct pci_dev * dev, unsigned index,
580 + unsigned start, unsigned end)
581 +{
582 + unsigned base = start & PCI_BASE_ADDRESS_IO_MASK;
583 + unsigned len = (end | ~PCI_BASE_ADDRESS_IO_MASK) - base + 1;
584 +
585 + /*
586 + * Some X versions get confused when the BARs reported through
587 + * /sys or /proc differ from those seen in config space, thus
588 + * try to update the config space values, too.
589 + */
590 + if (!(pci_resource_flags(dev, index) & IORESOURCE_IO))
591 + printk(KERN_WARNING "%s: cannot adjust BAR%u (not I/O)\n",
592 + pci_name(dev), index);
593 + else if (pci_resource_len(dev, index) != len)
594 + printk(KERN_WARNING "%s: cannot adjust BAR%u (size %04X)\n",
595 + pci_name(dev), index, (unsigned)pci_resource_len(dev, index));
596 + else {
597 + printk(KERN_INFO "%s: trying to change BAR%u from %04X to %04X\n",
598 + pci_name(dev), index,
599 + (unsigned)pci_resource_start(dev, index), base);
600 + pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + index * 4, base);
601 + }
602 + pci_resource_start(dev, index) = start;
603 + pci_resource_end(dev, index) = end;
604 + pci_resource_flags(dev, index) =
605 + IORESOURCE_IO | IORESOURCE_PCI_FIXED | PCI_BASE_ADDRESS_SPACE_IO;
606 +}
607
608 /**
609 * pci_setup_device - fill in class and map information of a device
610 @@ -692,20 +719,12 @@ static int pci_setup_device(struct pci_dev * dev)
611 u8 progif;
612 pci_read_config_byte(dev, PCI_CLASS_PROG, &progif);
613 if ((progif & 1) == 0) {
614 - dev->resource[0].start = 0x1F0;
615 - dev->resource[0].end = 0x1F7;
616 - dev->resource[0].flags = LEGACY_IO_RESOURCE;
617 - dev->resource[1].start = 0x3F6;
618 - dev->resource[1].end = 0x3F6;
619 - dev->resource[1].flags = LEGACY_IO_RESOURCE;
620 + change_legacy_io_resource(dev, 0, 0x1F0, 0x1F7);
621 + change_legacy_io_resource(dev, 1, 0x3F6, 0x3F6);
622 }
623 if ((progif & 4) == 0) {
624 - dev->resource[2].start = 0x170;
625 - dev->resource[2].end = 0x177;
626 - dev->resource[2].flags = LEGACY_IO_RESOURCE;
627 - dev->resource[3].start = 0x376;
628 - dev->resource[3].end = 0x376;
629 - dev->resource[3].flags = LEGACY_IO_RESOURCE;
630 + change_legacy_io_resource(dev, 2, 0x170, 0x177);
631 + change_legacy_io_resource(dev, 3, 0x376, 0x376);
632 }
633 }
634 break;
635 diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
636 index 4c698a7..df10267 100644
637 --- a/drivers/scsi/gdth.c
638 +++ b/drivers/scsi/gdth.c
639 @@ -3092,6 +3092,7 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b)
640 cmdp->u.raw64.direction =
641 gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN;
642 memcpy(cmdp->u.raw64.cmd,scp->cmnd,16);
643 + cmdp->u.raw64.sg_ranz = 0;
644 } else {
645 cmdp->u.raw.reserved = 0;
646 cmdp->u.raw.mdisc_time = 0;
647 @@ -3108,6 +3109,7 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b)
648 cmdp->u.raw.direction =
649 gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN;
650 memcpy(cmdp->u.raw.cmd,scp->cmnd,12);
651 + cmdp->u.raw.sg_ranz = 0;
652 }
653
654 if (scp->use_sg) {
655 diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
656 index 488ec79..16e279b 100644
657 --- a/drivers/scsi/st.c
658 +++ b/drivers/scsi/st.c
659 @@ -9,7 +9,7 @@
660 Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
661 Michael Schaefer, J"org Weule, and Eric Youngdale.
662
663 - Copyright 1992 - 2006 Kai Makisara
664 + Copyright 1992 - 2007 Kai Makisara
665 email Kai.Makisara@kolumbus.fi
666
667 Some small formal changes - aeb, 950809
668 @@ -17,7 +17,7 @@
669 Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
670 */
671
672 -static const char *verstr = "20061107";
673 +static const char *verstr = "20070203";
674
675 #include <linux/module.h>
676
677 @@ -1168,6 +1168,7 @@ static int st_open(struct inode *inode, struct file *filp)
678 STps = &(STp->ps[i]);
679 STps->rw = ST_IDLE;
680 }
681 + STp->try_dio_now = STp->try_dio;
682 STp->recover_count = 0;
683 DEB( STp->nbr_waits = STp->nbr_finished = 0;
684 STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = STp->nbr_combinable = 0; )
685 @@ -1400,9 +1401,9 @@ static int setup_buffering(struct scsi_tape *STp, const char __user *buf,
686 struct st_buffer *STbp = STp->buffer;
687
688 if (is_read)
689 - i = STp->try_dio && try_rdio;
690 + i = STp->try_dio_now && try_rdio;
691 else
692 - i = STp->try_dio && try_wdio;
693 + i = STp->try_dio_now && try_wdio;
694
695 if (i && ((unsigned long)buf & queue_dma_alignment(
696 STp->device->request_queue)) == 0) {
697 @@ -1599,7 +1600,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
698 STm->do_async_writes && STps->eof < ST_EOM_OK;
699
700 if (STp->block_size != 0 && STm->do_buffer_writes &&
701 - !(STp->try_dio && try_wdio) && STps->eof < ST_EOM_OK &&
702 + !(STp->try_dio_now && try_wdio) && STps->eof < ST_EOM_OK &&
703 STbp->buffer_bytes < STbp->buffer_size) {
704 STp->dirty = 1;
705 /* Don't write a buffer that is not full enough. */
706 @@ -1769,7 +1770,7 @@ static long read_tape(struct scsi_tape *STp, long count,
707 if (STp->block_size == 0)
708 blks = bytes = count;
709 else {
710 - if (!(STp->try_dio && try_rdio) && STm->do_read_ahead) {
711 + if (!(STp->try_dio_now && try_rdio) && STm->do_read_ahead) {
712 blks = (STp->buffer)->buffer_blocks;
713 bytes = blks * STp->block_size;
714 } else {
715 @@ -1948,10 +1949,12 @@ st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
716 goto out;
717
718 STm = &(STp->modes[STp->current_mode]);
719 - if (!(STm->do_read_ahead) && STp->block_size != 0 &&
720 - (count % STp->block_size) != 0) {
721 - retval = (-EINVAL); /* Read must be integral number of blocks */
722 - goto out;
723 + if (STp->block_size != 0 && (count % STp->block_size) != 0) {
724 + if (!STm->do_read_ahead) {
725 + retval = (-EINVAL); /* Read must be integral number of blocks */
726 + goto out;
727 + }
728 + STp->try_dio_now = 0; /* Direct i/o can't handle split blocks */
729 }
730
731 STps = &(STp->ps[STp->partition]);
732 diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h
733 index 05a5cae..50f3deb 100644
734 --- a/drivers/scsi/st.h
735 +++ b/drivers/scsi/st.h
736 @@ -117,7 +117,8 @@ struct scsi_tape {
737 unsigned char cln_sense_value;
738 unsigned char cln_sense_mask;
739 unsigned char use_pf; /* Set Page Format bit in all mode selects? */
740 - unsigned char try_dio; /* try direct i/o? */
741 + unsigned char try_dio; /* try direct i/o in general? */
742 + unsigned char try_dio_now; /* try direct i/o before next close? */
743 unsigned char c_algo; /* compression algorithm */
744 unsigned char pos_unknown; /* after reset position unknown */
745 int tape_type;
746 diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
747 index bfe5f30..2d36a8d 100644
748 --- a/drivers/usb/host/ehci-hub.c
749 +++ b/drivers/usb/host/ehci-hub.c
750 @@ -134,6 +134,10 @@ static int ehci_bus_resume (struct usb_hcd *hcd)
751 /* restore CMD_RUN, framelist size, and irq threshold */
752 writel (ehci->command, &ehci->regs->command);
753
754 + /* Some controller/firmware combinations need a delay during which
755 + * they set up the port statuses. See Bugzilla #8190. */
756 + mdelay(8);
757 +
758 /* manually resume the ports we suspended during bus_suspend() */
759 i = HCS_N_PORTS (ehci->hcs_params);
760 while (i--) {
761 diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
762 index d834982..5a83e8d 100644
763 --- a/fs/nfs/inode.c
764 +++ b/fs/nfs/inode.c
765 @@ -422,7 +422,8 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
766 int err;
767
768 /* Flush out writes to the server in order to update c/mtime */
769 - nfs_sync_mapping_range(inode->i_mapping, 0, 0, FLUSH_NOCOMMIT);
770 + if (S_ISREG(inode->i_mode))
771 + nfs_sync_mapping_range(inode->i_mapping, 0, 0, FLUSH_NOCOMMIT);
772
773 /*
774 * We may force a getattr if the user cares about atime.
775 diff --git a/include/asm-sparc64/tsb.h b/include/asm-sparc64/tsb.h
776 index e82612c..ab55ffc 100644
777 --- a/include/asm-sparc64/tsb.h
778 +++ b/include/asm-sparc64/tsb.h
779 @@ -264,6 +264,7 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;
780 be,a,pt %xcc, OK_LABEL; \
781 mov REG4, REG1;
782
783 +#ifndef CONFIG_DEBUG_PAGEALLOC
784 /* This version uses a trick, the TAG is already (VADDR >> 22) so
785 * we can make use of that for the index computation.
786 */
787 @@ -277,5 +278,6 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end;
788 cmp REG3, TAG; \
789 be,a,pt %xcc, OK_LABEL; \
790 mov REG4, REG1;
791 +#endif
792
793 #endif /* !(_SPARC64_TSB_H) */
794 diff --git a/include/asm-um/processor-x86_64.h b/include/asm-um/processor-x86_64.h
795 index 10609af..578ca04 100644
796 --- a/include/asm-um/processor-x86_64.h
797 +++ b/include/asm-um/processor-x86_64.h
798 @@ -13,6 +13,7 @@
799 struct arch_thread {
800 unsigned long debugregs[8];
801 int debugregs_seq;
802 + unsigned long fs;
803 struct faultinfo faultinfo;
804 };
805
806 @@ -25,8 +26,9 @@ extern inline void rep_nop(void)
807 #define cpu_relax() rep_nop()
808
809 #define INIT_ARCH_THREAD { .debugregs = { [ 0 ... 7 ] = 0 }, \
810 - .debugregs_seq = 0, \
811 - .faultinfo = { 0, 0, 0 } }
812 + .debugregs_seq = 0, \
813 + .fs = 0, \
814 + .faultinfo = { 0, 0, 0 } }
815
816 static inline void arch_flush_thread(struct arch_thread *thread)
817 {
818 diff --git a/include/asm-um/ptrace-x86_64.h b/include/asm-um/ptrace-x86_64.h
819 index 03b4af4..a927450 100644
820 --- a/include/asm-um/ptrace-x86_64.h
821 +++ b/include/asm-um/ptrace-x86_64.h
822 @@ -81,9 +81,7 @@ static inline void arch_switch_to_tt(struct task_struct *from,
823 {
824 }
825
826 -static inline void arch_switch_to_skas(struct task_struct *from,
827 - struct task_struct *to)
828 -{
829 -}
830 +extern void arch_switch_to_skas(struct task_struct *from,
831 + struct task_struct *to);
832
833 #endif
834 diff --git a/include/linux/ktime.h b/include/linux/ktime.h
835 index 611f17f..83ae2e7 100644
836 --- a/include/linux/ktime.h
837 +++ b/include/linux/ktime.h
838 @@ -57,7 +57,11 @@ typedef union {
839 } ktime_t;
840
841 #define KTIME_MAX ((s64)~((u64)1 << 63))
842 -#define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
843 +#if (BITS_PER_LONG == 64)
844 +# define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC)
845 +#else
846 +# define KTIME_SEC_MAX LONG_MAX
847 +#endif
848
849 /*
850 * ktime_t definitions when using the 64-bit scalar representation:
851 diff --git a/kernel/auditsc.c b/kernel/auditsc.c
852 index 2988975..470f845 100644
853 --- a/kernel/auditsc.c
854 +++ b/kernel/auditsc.c
855 @@ -734,28 +734,26 @@ static inline void audit_free_context(struct audit_context *context)
856 void audit_log_task_context(struct audit_buffer *ab)
857 {
858 char *ctx = NULL;
859 - ssize_t len = 0;
860 + unsigned len;
861 + int error;
862 + u32 sid;
863 +
864 + selinux_get_task_sid(current, &sid);
865 + if (!sid)
866 + return;
867
868 - len = security_getprocattr(current, "current", NULL, 0);
869 - if (len < 0) {
870 - if (len != -EINVAL)
871 + error = selinux_sid_to_string(sid, &ctx, &len);
872 + if (error) {
873 + if (error != -EINVAL)
874 goto error_path;
875 return;
876 }
877
878 - ctx = kmalloc(len, GFP_KERNEL);
879 - if (!ctx)
880 - goto error_path;
881 -
882 - len = security_getprocattr(current, "current", ctx, len);
883 - if (len < 0 )
884 - goto error_path;
885 -
886 audit_log_format(ab, " subj=%s", ctx);
887 + kfree(ctx);
888 return;
889
890 error_path:
891 - kfree(ctx);
892 audit_panic("error in audit_log_task_context");
893 return;
894 }
895 diff --git a/kernel/fork.c b/kernel/fork.c
896 index d57118d..cc374fb 100644
897 --- a/kernel/fork.c
898 +++ b/kernel/fork.c
899 @@ -933,8 +933,8 @@ asmlinkage long sys_set_tid_address(int __user *tidptr)
900
901 static inline void rt_mutex_init_task(struct task_struct *p)
902 {
903 -#ifdef CONFIG_RT_MUTEXES
904 spin_lock_init(&p->pi_lock);
905 +#ifdef CONFIG_RT_MUTEXES
906 plist_head_init(&p->pi_waiters, &p->pi_lock);
907 p->pi_blocked_on = NULL;
908 #endif
909 diff --git a/kernel/futex.c b/kernel/futex.c
910 index 5a737de..1df411e 100644
911 --- a/kernel/futex.c
912 +++ b/kernel/futex.c
913 @@ -565,6 +565,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
914 if (!pi_state)
915 return -EINVAL;
916
917 + spin_lock(&pi_state->pi_mutex.wait_lock);
918 new_owner = rt_mutex_next_owner(&pi_state->pi_mutex);
919
920 /*
921 @@ -604,6 +605,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
922 pi_state->owner = new_owner;
923 spin_unlock_irq(&new_owner->pi_lock);
924
925 + spin_unlock(&pi_state->pi_mutex.wait_lock);
926 rt_mutex_unlock(&pi_state->pi_mutex);
927
928 return 0;
929 diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
930 index d0ba190..8596409 100644
931 --- a/kernel/hrtimer.c
932 +++ b/kernel/hrtimer.c
933 @@ -332,6 +332,12 @@ hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval)
934 orun++;
935 }
936 timer->expires = ktime_add(timer->expires, interval);
937 + /*
938 + * Make sure, that the result did not wrap with a very large
939 + * interval.
940 + */
941 + if (timer->expires.tv64 < 0)
942 + timer->expires = ktime_set(KTIME_SEC_MAX, 0);
943
944 return orun;
945 }
946 diff --git a/mm/filemap.c b/mm/filemap.c
947 index 8332c77..ab57e6c 100644
948 --- a/mm/filemap.c
949 +++ b/mm/filemap.c
950 @@ -2393,7 +2393,8 @@ generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
951 struct file *file = iocb->ki_filp;
952 struct address_space *mapping = file->f_mapping;
953 ssize_t retval;
954 - size_t write_len = 0;
955 + size_t write_len;
956 + pgoff_t end = 0; /* silence gcc */
957
958 /*
959 * If it's a write, unmap all mmappings of the file up-front. This
960 @@ -2402,23 +2403,46 @@ generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
961 */
962 if (rw == WRITE) {
963 write_len = iov_length(iov, nr_segs);
964 + end = (offset + write_len - 1) >> PAGE_CACHE_SHIFT;
965 if (mapping_mapped(mapping))
966 unmap_mapping_range(mapping, offset, write_len, 0);
967 }
968
969 retval = filemap_write_and_wait(mapping);
970 - if (retval == 0) {
971 - retval = mapping->a_ops->direct_IO(rw, iocb, iov,
972 - offset, nr_segs);
973 - if (rw == WRITE && mapping->nrpages) {
974 - pgoff_t end = (offset + write_len - 1)
975 - >> PAGE_CACHE_SHIFT;
976 - int err = invalidate_inode_pages2_range(mapping,
977 + if (retval)
978 + goto out;
979 +
980 + /*
981 + * After a write we want buffered reads to be sure to go to disk to get
982 + * the new data. We invalidate clean cached page from the region we're
983 + * about to write. We do this *before* the write so that we can return
984 + * -EIO without clobbering -EIOCBQUEUED from ->direct_IO().
985 + */
986 + if (rw == WRITE && mapping->nrpages) {
987 + retval = invalidate_inode_pages2_range(mapping,
988 offset >> PAGE_CACHE_SHIFT, end);
989 - if (err)
990 - retval = err;
991 - }
992 + if (retval)
993 + goto out;
994 }
995 +
996 + retval = mapping->a_ops->direct_IO(rw, iocb, iov, offset, nr_segs);
997 + if (retval)
998 + goto out;
999 +
1000 + /*
1001 + * Finally, try again to invalidate clean pages which might have been
1002 + * faulted in by get_user_pages() if the source of the write was an
1003 + * mmap()ed region of the file we're writing. That's a pretty crazy
1004 + * thing to do, so we don't support it 100%. If this invalidation
1005 + * fails and we have -EIOCBQUEUED we ignore the failure.
1006 + */
1007 + if (rw == WRITE && mapping->nrpages) {
1008 + int err = invalidate_inode_pages2_range(mapping,
1009 + offset >> PAGE_CACHE_SHIFT, end);
1010 + if (err && retval >= 0)
1011 + retval = err;
1012 + }
1013 +out:
1014 return retval;
1015 }
1016
1017 diff --git a/mm/madvise.c b/mm/madvise.c
1018 index 4e19615..77916e9 100644
1019 --- a/mm/madvise.c
1020 +++ b/mm/madvise.c
1021 @@ -155,11 +155,14 @@ static long madvise_dontneed(struct vm_area_struct * vma,
1022 * Other filesystems return -ENOSYS.
1023 */
1024 static long madvise_remove(struct vm_area_struct *vma,
1025 + struct vm_area_struct **prev,
1026 unsigned long start, unsigned long end)
1027 {
1028 struct address_space *mapping;
1029 loff_t offset, endoff;
1030
1031 + *prev = vma;
1032 +
1033 if (vma->vm_flags & (VM_LOCKED|VM_NONLINEAR|VM_HUGETLB))
1034 return -EINVAL;
1035
1036 @@ -199,7 +202,7 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
1037 error = madvise_behavior(vma, prev, start, end, behavior);
1038 break;
1039 case MADV_REMOVE:
1040 - error = madvise_remove(vma, start, end);
1041 + error = madvise_remove(vma, prev, start, end);
1042 break;
1043
1044 case MADV_WILLNEED:
1045 diff --git a/mm/oom_kill.c b/mm/oom_kill.c
1046 index b278b8d..2f39169 100644
1047 --- a/mm/oom_kill.c
1048 +++ b/mm/oom_kill.c
1049 @@ -320,7 +320,7 @@ static int oom_kill_task(struct task_struct *p)
1050 * Don't kill the process if any threads are set to OOM_DISABLE
1051 */
1052 do_each_thread(g, q) {
1053 - if (q->mm == mm && p->oomkilladj == OOM_DISABLE)
1054 + if (q->mm == mm && q->oomkilladj == OOM_DISABLE)
1055 return 1;
1056 } while_each_thread(g, q);
1057
1058 diff --git a/net/core/skbuff.c b/net/core/skbuff.c
1059 index de7801d..5299083 100644
1060 --- a/net/core/skbuff.c
1061 +++ b/net/core/skbuff.c
1062 @@ -464,6 +464,7 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)
1063 memcpy(n->cb, skb->cb, sizeof(skb->cb));
1064 C(len);
1065 C(data_len);
1066 + C(mac_len);
1067 C(csum);
1068 C(local_df);
1069 n->cloned = 1;
1070 diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c
1071 index 60aafb4..c976dd7 100644
1072 --- a/net/ipv4/cipso_ipv4.c
1073 +++ b/net/ipv4/cipso_ipv4.c
1074 @@ -732,11 +732,12 @@ static int cipso_v4_map_lvl_hton(const struct cipso_v4_doi *doi_def,
1075 *net_lvl = host_lvl;
1076 return 0;
1077 case CIPSO_V4_MAP_STD:
1078 - if (host_lvl < doi_def->map.std->lvl.local_size) {
1079 + if (host_lvl < doi_def->map.std->lvl.local_size &&
1080 + doi_def->map.std->lvl.local[host_lvl] < CIPSO_V4_INV_LVL) {
1081 *net_lvl = doi_def->map.std->lvl.local[host_lvl];
1082 return 0;
1083 }
1084 - break;
1085 + return -EPERM;
1086 }
1087
1088 return -EINVAL;
1089 @@ -771,7 +772,7 @@ static int cipso_v4_map_lvl_ntoh(const struct cipso_v4_doi *doi_def,
1090 *host_lvl = doi_def->map.std->lvl.cipso[net_lvl];
1091 return 0;
1092 }
1093 - break;
1094 + return -EPERM;
1095 }
1096
1097 return -EINVAL;
1098 diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
1099 index 480ace9..728ba5f 100644
1100 --- a/net/ipv4/devinet.c
1101 +++ b/net/ipv4/devinet.c
1102 @@ -503,8 +503,10 @@ static struct in_ifaddr *rtm_to_ifaddr(struct nlmsghdr *nlh)
1103 goto errout;
1104
1105 ifm = nlmsg_data(nlh);
1106 - if (ifm->ifa_prefixlen > 32 || tb[IFA_LOCAL] == NULL)
1107 + if (ifm->ifa_prefixlen > 32 || tb[IFA_LOCAL] == NULL) {
1108 + err = -EINVAL;
1109 goto errout;
1110 + }
1111
1112 dev = __dev_get_by_index(ifm->ifa_index);
1113 if (dev == NULL) {
1114 diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
1115 index 1e589b9..a742ea3 100644
1116 --- a/net/ipv4/fib_trie.c
1117 +++ b/net/ipv4/fib_trie.c
1118 @@ -1528,7 +1528,6 @@ static int trie_leaf_remove(struct trie *t, t_key key)
1119 t->revision++;
1120 t->size--;
1121
1122 - preempt_disable();
1123 tp = NODE_PARENT(n);
1124 tnode_free((struct tnode *) n);
1125
1126 @@ -1538,7 +1537,6 @@ static int trie_leaf_remove(struct trie *t, t_key key)
1127 rcu_assign_pointer(t->trie, trie_rebalance(t, tp));
1128 } else
1129 rcu_assign_pointer(t->trie, NULL);
1130 - preempt_enable();
1131
1132 return 1;
1133 }
1134 diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
1135 index 23db88e..b20726f 100644
1136 --- a/net/ipv6/ipv6_sockglue.c
1137 +++ b/net/ipv6/ipv6_sockglue.c
1138 @@ -414,7 +414,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
1139 }
1140
1141 /* routing header option needs extra check */
1142 - if (optname == IPV6_RTHDR && opt->srcrt) {
1143 + if (optname == IPV6_RTHDR && opt && opt->srcrt) {
1144 struct ipv6_rt_hdr *rthdr = opt->srcrt;
1145 switch (rthdr->type) {
1146 case IPV6_SRCRT_TYPE_0:
1147 diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
1148 index c25e930..a2d41ba 100644
1149 --- a/net/ipv6/tcp_ipv6.c
1150 +++ b/net/ipv6/tcp_ipv6.c
1151 @@ -1453,6 +1453,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
1152 First: no IPv4 options.
1153 */
1154 newinet->opt = NULL;
1155 + newnp->ipv6_fl_list = NULL;
1156
1157 /* Clone RX bits */
1158 newnp->rxopt.all = np->rxopt.all;
1159 diff --git a/net/irda/irttp.c b/net/irda/irttp.c
1160 index 03504f3..4703107 100644
1161 --- a/net/irda/irttp.c
1162 +++ b/net/irda/irttp.c
1163 @@ -1455,6 +1455,7 @@ struct tsap_cb *irttp_dup(struct tsap_cb *orig, void *instance)
1164
1165 /* Not everything should be copied */
1166 new->notify.instance = instance;
1167 + spin_lock_init(&new->lock);
1168 init_timer(&new->todo_timer);
1169
1170 skb_queue_head_init(&new->rx_queue);
1171 diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
1172 index 690b173..f7eafd8 100644
1173 --- a/net/netfilter/nfnetlink_log.c
1174 +++ b/net/netfilter/nfnetlink_log.c
1175 @@ -218,10 +218,8 @@ _instance_destroy2(struct nfulnl_instance *inst, int lock)
1176 spin_lock_bh(&inst->lock);
1177 if (inst->skb) {
1178 /* timer "holds" one reference (we have one more) */
1179 - if (timer_pending(&inst->timer)) {
1180 - del_timer(&inst->timer);
1181 + if (del_timer(&inst->timer))
1182 instance_put(inst);
1183 - }
1184 if (inst->qlen)
1185 __nfulnl_send(inst);
1186 if (inst->skb) {
1187 @@ -695,10 +693,8 @@ nfulnl_log_packet(unsigned int pf,
1188 UDEBUG("flushing old skb\n");
1189
1190 /* timer "holds" one reference (we have another one) */
1191 - if (timer_pending(&inst->timer)) {
1192 - del_timer(&inst->timer);
1193 + if (del_timer(&inst->timer))
1194 instance_put(inst);
1195 - }
1196 __nfulnl_send(inst);
1197
1198 if (!(inst->skb = nfulnl_alloc_skb(nlbufsiz, size))) {
1199 diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
1200 index fdb08d9..f0f2c1a 100644
1201 --- a/net/xfrm/xfrm_state.c
1202 +++ b/net/xfrm/xfrm_state.c
1203 @@ -707,7 +707,8 @@ static struct xfrm_state *__find_acq_core(unsigned short family, u8 mode, u32 re
1204 x->props.mode != mode ||
1205 x->props.family != family ||
1206 x->km.state != XFRM_STATE_ACQ ||
1207 - x->id.spi != 0)
1208 + x->id.spi != 0 ||
1209 + x->id.proto != proto)
1210 continue;
1211
1212 switch (family) {
1213 @@ -804,7 +805,8 @@ int xfrm_state_add(struct xfrm_state *x)
1214
1215 if (use_spi && x->km.seq) {
1216 x1 = __xfrm_find_acq_byseq(x->km.seq);
1217 - if (x1 && xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family)) {
1218 + if (x1 && ((x1->id.proto != x->id.proto) ||
1219 + xfrm_addr_cmp(&x1->id.daddr, &x->id.daddr, family))) {
1220 xfrm_state_put(x1);
1221 x1 = NULL;
1222 }
1223 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
1224 index 77f8ec7..ba2c754 100644
1225 --- a/sound/pci/hda/hda_intel.c
1226 +++ b/sound/pci/hda/hda_intel.c
1227 @@ -199,7 +199,6 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
1228
1229 /* STATESTS int mask: SD2,SD1,SD0 */
1230 #define STATESTS_INT_MASK 0x07
1231 -#define AZX_MAX_CODECS 3
1232
1233 /* SD_CTL bits */
1234 #define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
1235 @@ -966,6 +965,16 @@ static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1236 * Codec initialization
1237 */
1238
1239 +static unsigned int azx_max_codecs[] __devinitdata = {
1240 + [AZX_DRIVER_ICH] = 3,
1241 + [AZX_DRIVER_ATI] = 4,
1242 + [AZX_DRIVER_ATIHDMI] = 4,
1243 + [AZX_DRIVER_VIA] = 3, /* FIXME: correct? */
1244 + [AZX_DRIVER_SIS] = 3, /* FIXME: correct? */
1245 + [AZX_DRIVER_ULI] = 3, /* FIXME: correct? */
1246 + [AZX_DRIVER_NVIDIA] = 3, /* FIXME: correct? */
1247 +};
1248 +
1249 static int __devinit azx_codec_create(struct azx *chip, const char *model)
1250 {
1251 struct hda_bus_template bus_temp;
1252 @@ -982,7 +991,7 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
1253 return err;
1254
1255 codecs = 0;
1256 - for (c = 0; c < AZX_MAX_CODECS; c++) {
1257 + for (c = 0; c < azx_max_codecs[chip->driver_type]; c++) {
1258 if ((chip->codec_mask & (1 << c)) & probe_mask) {
1259 err = snd_hda_codec_new(chip->bus, c, NULL);
1260 if (err < 0)

  ViewVC Help
Powered by ViewVC 1.1.20