make this target current
authorEric Andersen <andersen@codepoet.org>
Wed, 13 Dec 2006 12:18:08 +0000 (12:18 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 13 Dec 2006 12:18:08 +0000 (12:18 -0000)
12 files changed:
target/device/AMD/DBAu1500/kernel-patches/001-patch-2.6.16.20.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/004-correct-toolchain.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/006_init_unshare.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/008-ieee1394-fix.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/009-sysfs-n.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/028-cdrom_oexcl.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/064-shutup-md.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/098_scsi-warnings.patch [deleted file]
target/device/AMD/DBAu1500/kernel-patches/100_VERSION.patch [deleted file]
target/device/AMD/DBAu1500/linux.mk [deleted file]
target/device/AMD/DBAu1500/linux26.mk [new file with mode: 0644]

diff --git a/target/device/AMD/DBAu1500/kernel-patches/001-patch-2.6.16.20.patch b/target/device/AMD/DBAu1500/kernel-patches/001-patch-2.6.16.20.patch
deleted file mode 100644 (file)
index 1a1b324..0000000
+++ /dev/null
@@ -1,6360 +0,0 @@
-diff --git a/Documentation/dvb/get_dvb_firmware b/Documentation/dvb/get_dvb_firmware
-index 75c28a1..948f502 100644
---- a/Documentation/dvb/get_dvb_firmware
-+++ b/Documentation/dvb/get_dvb_firmware
-@@ -240,9 +240,9 @@ sub dibusb {
- }
- sub nxt2002 {
--    my $sourcefile = "Broadband4PC_4_2_11.zip";
-+    my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip";
-     my $url = "http://www.bbti.us/download/windows/$sourcefile";
--    my $hash = "c6d2ea47a8f456d887ada0cfb718ff2a";
-+    my $hash = "476befae8c7c1bb9648954060b1eec1f";
-     my $outfile = "dvb-fe-nxt2002.fw";
-     my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
-@@ -250,8 +250,8 @@ sub nxt2002 {
-     wgetfile($sourcefile, $url);
-     unzip($sourcefile, $tmpdir);
--    verify("$tmpdir/SkyNETU.sys", $hash);
--    extract("$tmpdir/SkyNETU.sys", 375832, 5908, $outfile);
-+    verify("$tmpdir/SkyNET.sys", $hash);
-+    extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile);
-     $outfile;
- }
-diff --git a/Makefile b/Makefile
-index cb57905..600c769 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,7 +1,7 @@
- VERSION = 2
- PATCHLEVEL = 6
- SUBLEVEL = 16
--EXTRAVERSION =
-+EXTRAVERSION = .20
- NAME=Sliding Snow Leopard
- # *DOCUMENTATION*
-diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c
-index b4e5f8f..45308bd 100644
---- a/arch/alpha/kernel/setup.c
-+++ b/arch/alpha/kernel/setup.c
-@@ -24,6 +24,7 @@ #include <linux/delay.h>
- #include <linux/config.h>     /* CONFIG_ALPHA_LCA etc */
- #include <linux/mc146818rtc.h>
- #include <linux/console.h>
-+#include <linux/cpu.h>
- #include <linux/errno.h>
- #include <linux/init.h>
- #include <linux/string.h>
-@@ -477,6 +478,22 @@ #undef PFN_DOWN
- #undef PFN_PHYS
- #undef PFN_MAX
-+static int __init
-+register_cpus(void)
-+{
-+      int i;
-+
-+      for_each_possible_cpu(i) {
-+              struct cpu *p = kzalloc(sizeof(*p), GFP_KERNEL);
-+              if (!p)
-+                      return -ENOMEM;
-+              register_cpu(p, i, NULL);
-+      }
-+      return 0;
-+}
-+
-+arch_initcall(register_cpus);
-+
- void __init
- setup_arch(char **cmdline_p)
- {
-diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
-index 02c2db0..1852554 100644
---- a/arch/alpha/kernel/smp.c
-+++ b/arch/alpha/kernel/smp.c
-@@ -439,7 +439,7 @@ setup_smp(void)
-                       if ((cpu->flags & 0x1cc) == 0x1cc) {
-                               smp_num_probed++;
-                               /* Assume here that "whami" == index */
--                              cpu_set(i, cpu_possible_map);
-+                              cpu_set(i, cpu_present_mask);
-                               cpu->pal_revision = boot_cpu_palrev;
-                       }
-@@ -450,9 +450,8 @@ setup_smp(void)
-               }
-       } else {
-               smp_num_probed = 1;
--              cpu_set(boot_cpuid, cpu_possible_map);
-+              cpu_set(boot_cpuid, cpu_present_mask);
-       }
--      cpu_present_mask = cpumask_of_cpu(boot_cpuid);
-       printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
-              smp_num_probed, cpu_possible_map.bits[0]);
-@@ -488,9 +487,8 @@ void __devinit
- smp_prepare_boot_cpu(void)
- {
-       /*
--       * Mark the boot cpu (current cpu) as both present and online
-+       * Mark the boot cpu (current cpu) as online
-        */ 
--      cpu_set(smp_processor_id(), cpu_present_mask);
-       cpu_set(smp_processor_id(), cpu_online_map);
- }
-diff --git a/arch/alpha/lib/strncpy.S b/arch/alpha/lib/strncpy.S
-index 338551c..bbdef1b 100644
---- a/arch/alpha/lib/strncpy.S
-+++ b/arch/alpha/lib/strncpy.S
-@@ -43,8 +43,8 @@ strncpy:
-       .align  4
- $multiword:
--      subq    $24, 1, $2      # clear the final bits in the prev word
--      or      $2, $24, $2
-+      subq    $27, 1, $2      # clear the final bits in the prev word
-+      or      $2, $27, $2
-       zapnot  $1, $2, $1
-       subq    $18, 1, $18
-@@ -70,8 +70,8 @@ strncpy:
-       bne     $18, 0b
- 1:    ldq_u   $1, 0($16)      # clear the leading bits in the final word
--      subq    $27, 1, $2
--      or      $2, $27, $2
-+      subq    $24, 1, $2
-+      or      $2, $24, $2
-       zap     $1, $2, $1
-       stq_u   $1, 0($16)
-diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c
-index 05312a8..558d2d2 100644
---- a/arch/i386/kernel/apm.c
-+++ b/arch/i386/kernel/apm.c
-@@ -1081,7 +1081,7 @@ static int apm_console_blank(int blank)
-                       break;
-       }
--      if (error == APM_NOT_ENGAGED && state != APM_STATE_READY) {
-+      if (error == APM_NOT_ENGAGED) {
-               static int tried;
-               int eng_error;
-               if (tried++ == 0) {
-diff --git a/arch/i386/kernel/cpu/amd.c b/arch/i386/kernel/cpu/amd.c
-index 0810f81..d2d50cb 100644
---- a/arch/i386/kernel/cpu/amd.c
-+++ b/arch/i386/kernel/cpu/amd.c
-@@ -207,6 +207,8 @@ #define CBAR_KEY   (0X000000CB)
-               set_bit(X86_FEATURE_K7, c->x86_capability); 
-               break;
-       }
-+      if (c->x86 >= 6)
-+              set_bit(X86_FEATURE_FXSAVE_LEAK, c->x86_capability);
-       display_cacheinfo(c);
-diff --git a/arch/i386/kernel/cpu/cpufreq/Kconfig b/arch/i386/kernel/cpu/cpufreq/Kconfig
-index 26892d2..16f2e35 100644
---- a/arch/i386/kernel/cpu/cpufreq/Kconfig
-+++ b/arch/i386/kernel/cpu/cpufreq/Kconfig
-@@ -203,6 +203,7 @@ config X86_LONGRUN
- config X86_LONGHAUL
-       tristate "VIA Cyrix III Longhaul"
-       select CPU_FREQ_TABLE
-+      depends on BROKEN
-       help
-         This adds the CPUFreq driver for VIA Samuel/CyrixIII, 
-         VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T 
-diff --git a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
-index cc73a7a..ebe1848 100644
---- a/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
-+++ b/arch/i386/kernel/cpu/cpufreq/p4-clockmod.c
-@@ -244,7 +244,7 @@ #endif
-       for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
-               if ((i<2) && (has_N44_O17_errata[policy->cpu]))
-                       p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
--              else if (has_N60_errata[policy->cpu] && p4clockmod_table[i].frequency < 2000000)
-+              else if (has_N60_errata[policy->cpu] && ((stock_freq * i)/8) < 2000000)
-                       p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
-               else
-                       p4clockmod_table[i].frequency = (stock_freq * i)/8;
-diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
-index 28cc5d5..cfc4276 100644
---- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
-+++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c
-@@ -75,7 +75,9 @@ static int speedstep_smi_ownership (void
-       __asm__ __volatile__(
-               "out %%al, (%%dx)\n"
-               : "=D" (result)
--              : "a" (command), "b" (function), "c" (0), "d" (smi_port), "D" (0), "S" (magic)
-+              : "a" (command), "b" (function), "c" (0), "d" (smi_port),
-+                      "D" (0), "S" (magic)
-+              : "memory"
-       );
-       dprintk("result is %x\n", result);
-diff --git a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c
-index 6a93d75..ca2a0cb 100644
---- a/arch/i386/kernel/dmi_scan.c
-+++ b/arch/i386/kernel/dmi_scan.c
-@@ -106,7 +106,7 @@ static void __init dmi_save_devices(stru
-       struct dmi_device *dev;
-       for (i = 0; i < count; i++) {
--              char *d = ((char *) dm) + (i * 2);
-+              char *d = (char *)(dm + 1) + (i * 2);
-               /* Skip disabled device */
-               if ((*d & 0x80) == 0)
-diff --git a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c
-index f51c894..aee14fa 100644
---- a/arch/i386/kernel/vm86.c
-+++ b/arch/i386/kernel/vm86.c
-@@ -43,6 +43,7 @@ #include <linux/smp.h>
- #include <linux/smp_lock.h>
- #include <linux/highmem.h>
- #include <linux/ptrace.h>
-+#include <linux/audit.h>
- #include <asm/uaccess.h>
- #include <asm/io.h>
-@@ -252,6 +253,7 @@ out:
- static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk)
- {
-       struct tss_struct *tss;
-+      long eax;
- /*
-  * make sure the vm86() system call doesn't try to do anything silly
-  */
-@@ -305,13 +307,19 @@ static void do_sys_vm86(struct kernel_vm
-       tsk->thread.screen_bitmap = info->screen_bitmap;
-       if (info->flags & VM86_SCREEN_BITMAP)
-               mark_screen_rdonly(tsk->mm);
-+      __asm__ __volatile__("xorl %eax,%eax; movl %eax,%fs; movl %eax,%gs\n\t");
-+      __asm__ __volatile__("movl %%eax, %0\n" :"=r"(eax));
-+
-+      /*call audit_syscall_exit since we do not exit via the normal paths */
-+      if (unlikely(current->audit_context))
-+              audit_syscall_exit(current, AUDITSC_RESULT(eax), eax);
-+
-       __asm__ __volatile__(
--              "xorl %%eax,%%eax; movl %%eax,%%fs; movl %%eax,%%gs\n\t"
-               "movl %0,%%esp\n\t"
-               "movl %1,%%ebp\n\t"
-               "jmp resume_userspace"
-               : /* no outputs */
--              :"r" (&info->regs), "r" (task_thread_info(tsk)) : "ax");
-+              :"r" (&info->regs), "r" (task_thread_info(tsk)));
-       /* we never return here */
- }
-diff --git a/arch/m32r/kernel/m32r_ksyms.c b/arch/m32r/kernel/m32r_ksyms.c
-index be8b711..6000950 100644
---- a/arch/m32r/kernel/m32r_ksyms.c
-+++ b/arch/m32r/kernel/m32r_ksyms.c
-@@ -38,10 +38,6 @@ EXPORT_SYMBOL(__udelay);
- EXPORT_SYMBOL(__delay);
- EXPORT_SYMBOL(__const_udelay);
--EXPORT_SYMBOL(__get_user_1);
--EXPORT_SYMBOL(__get_user_2);
--EXPORT_SYMBOL(__get_user_4);
--
- EXPORT_SYMBOL(strpbrk);
- EXPORT_SYMBOL(strstr);
-diff --git a/arch/m32r/kernel/setup.c b/arch/m32r/kernel/setup.c
-index d742037..542ed93 100644
---- a/arch/m32r/kernel/setup.c
-+++ b/arch/m32r/kernel/setup.c
-@@ -9,6 +9,7 @@
- #include <linux/config.h>
- #include <linux/init.h>
-+#include <linux/kernel.h>
- #include <linux/stddef.h>
- #include <linux/fs.h>
- #include <linux/sched.h>
-@@ -218,8 +219,6 @@ #else      /* CONFIG_DISCONTIGMEM */
- extern unsigned long setup_memory(void);
- #endif        /* CONFIG_DISCONTIGMEM */
--#define M32R_PCC_PCATCR       0x00ef7014      /* will move to m32r.h */
--
- void __init setup_arch(char **cmdline_p)
- {
-       ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
-@@ -268,15 +267,14 @@ #endif   /* CONFIG_DISCONTIGMEM */
-       paging_init();
- }
--static struct cpu cpu[NR_CPUS];
-+static struct cpu cpu_devices[NR_CPUS];
- static int __init topology_init(void)
- {
--      int cpu_id;
-+      int i;
--      for (cpu_id = 0; cpu_id < NR_CPUS; cpu_id++)
--              if (cpu_possible(cpu_id))
--                      register_cpu(&cpu[cpu_id], cpu_id, NULL);
-+      for_each_present_cpu(i)
-+              register_cpu(&cpu_devices[i], i, NULL);
-       return 0;
- }
-diff --git a/arch/m32r/kernel/smpboot.c b/arch/m32r/kernel/smpboot.c
-index d7ec16e..840b434 100644
---- a/arch/m32r/kernel/smpboot.c
-+++ b/arch/m32r/kernel/smpboot.c
-@@ -39,8 +39,10 @@
-  *            Martin J. Bligh :       Added support for multi-quad systems
-  */
-+#include <linux/module.h>
- #include <linux/config.h>
- #include <linux/init.h>
-+#include <linux/kernel.h>
- #include <linux/mm.h>
- #include <linux/smp_lock.h>
- #include <linux/irq.h>
-@@ -72,11 +74,15 @@ physid_mask_t phys_cpu_present_map;
- /* Bitmask of currently online CPUs */
- cpumask_t cpu_online_map;
-+EXPORT_SYMBOL(cpu_online_map);
- cpumask_t cpu_bootout_map;
- cpumask_t cpu_bootin_map;
--cpumask_t cpu_callout_map;
- static cpumask_t cpu_callin_map;
-+cpumask_t cpu_callout_map;
-+EXPORT_SYMBOL(cpu_callout_map);
-+cpumask_t cpu_possible_map = CPU_MASK_ALL;
-+EXPORT_SYMBOL(cpu_possible_map);
- /* Per CPU bogomips and other parameters */
- struct cpuinfo_m32r cpu_data[NR_CPUS] __cacheline_aligned;
-@@ -110,7 +116,6 @@ static unsigned int calibration_result;
- void smp_prepare_boot_cpu(void);
- void smp_prepare_cpus(unsigned int);
--static void smp_tune_scheduling(void);
- static void init_ipi_lock(void);
- static void do_boot_cpu(int);
- int __cpu_up(unsigned int);
-@@ -177,6 +182,9 @@ void __init smp_prepare_cpus(unsigned in
-       }
-       for (phys_id = 0 ; phys_id < nr_cpu ; phys_id++)
-               physid_set(phys_id, phys_cpu_present_map);
-+#ifndef CONFIG_HOTPLUG_CPU
-+      cpu_present_map = cpu_possible_map;
-+#endif
-       show_mp_info(nr_cpu);
-@@ -186,7 +194,6 @@ void __init smp_prepare_cpus(unsigned in
-        * Setup boot CPU information
-        */
-       smp_store_cpu_info(0); /* Final full version of the data */
--      smp_tune_scheduling();
-       /*
-        * If SMP should be disabled, then really disable it!
-@@ -230,11 +237,6 @@ smp_done:
-       Dprintk("Boot done.\n");
- }
--static void __init smp_tune_scheduling(void)
--{
--      /* Nothing to do. */
--}
--
- /*
-  * init_ipi_lock : Initialize IPI locks.
-  */
-@@ -629,4 +631,3 @@ static void __init unmap_cpu_to_physid(i
-       physid_2_cpu[phys_id] = -1;
-       cpu_2_physid[cpu_id] = -1;
- }
--
-diff --git a/arch/m32r/lib/Makefile b/arch/m32r/lib/Makefile
-index e632d10..d16b4e4 100644
---- a/arch/m32r/lib/Makefile
-+++ b/arch/m32r/lib/Makefile
-@@ -2,6 +2,6 @@ #
- # Makefile for M32R-specific library files..
- #
--lib-y  := checksum.o ashxdi3.o memset.o memcpy.o getuser.o \
--        putuser.o delay.o strlen.o usercopy.o csum_partial_copy.o
-+lib-y  := checksum.o ashxdi3.o memset.o memcpy.o \
-+        delay.o strlen.o usercopy.o csum_partial_copy.o
-diff --git a/arch/m32r/lib/getuser.S b/arch/m32r/lib/getuser.S
-deleted file mode 100644
-index 58a0db0..0000000
---- a/arch/m32r/lib/getuser.S
-+++ /dev/null
-@@ -1,88 +0,0 @@
--/*
-- * __get_user functions.
-- *
-- * (C) Copyright 2001 Hirokazu Takata
-- *
-- * These functions have a non-standard call interface
-- * to make them more efficient, especially as they
-- * return an error value in addition to the "real"
-- * return value.
-- */
--
--#include <linux/config.h>
--
--/*
-- * __get_user_X
-- *
-- * Inputs:    r0 contains the address
-- *
-- * Outputs:   r0 is error code (0 or -EFAULT)
-- *            r1 contains zero-extended value
-- *
-- * These functions should not modify any other registers,
-- * as they get called from within inline assembly.
-- */
--
--#ifdef CONFIG_ISA_DUAL_ISSUE
--
--      .text
--      .balign 4
--      .globl __get_user_1
--__get_user_1:
--1:    ldub    r1, @r0             ||  ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __get_user_2
--__get_user_2:
--2:    lduh    r1, @r0             ||  ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __get_user_4
--__get_user_4:
--3:    ld      r1, @r0             ||  ldi     r0, #0
--      jmp     r14
--
--bad_get_user:
--      ldi     r1, #0              ||  ldi     r0, #-14
--      jmp     r14
--
--#else /* not CONFIG_ISA_DUAL_ISSUE */
--
--      .text
--      .balign 4
--      .globl __get_user_1
--__get_user_1:
--1:    ldub    r1, @r0
--      ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __get_user_2
--__get_user_2:
--2:    lduh    r1, @r0
--      ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __get_user_4
--__get_user_4:
--3:    ld      r1, @r0
--      ldi     r0, #0
--      jmp     r14
--
--bad_get_user:
--      ldi     r1, #0
--      ldi     r0, #-14
--      jmp     r14
--
--#endif /* not CONFIG_ISA_DUAL_ISSUE */
--
--.section __ex_table,"a"
--      .long 1b,bad_get_user
--      .long 2b,bad_get_user
--      .long 3b,bad_get_user
--.previous
--
--      .end
-diff --git a/arch/m32r/lib/putuser.S b/arch/m32r/lib/putuser.S
-deleted file mode 100644
-index 218154c..0000000
---- a/arch/m32r/lib/putuser.S
-+++ /dev/null
-@@ -1,84 +0,0 @@
--/*
-- * __put_user functions.
-- *
-- * (C) Copyright 1998 Linus Torvalds
-- * (C) Copyright 2001 Hirokazu Takata
-- *
-- * These functions have a non-standard call interface
-- * to make them more efficient.
-- */
--
--#include <linux/config.h>
--
--/*
-- * __put_user_X
-- *
-- * Inputs:    r0 contains the address
-- *            r1 contains the value
-- *
-- * Outputs:   r0 is error code (0 or -EFAULT)
-- *            r1 is corrupted (will contain "current_task").
-- *
-- * These functions should not modify any other registers,
-- * as they get called from within inline assembly.
-- */
--
--#ifdef CONFIG_ISA_DUAL_ISSUE
--
--      .text
--      .balign 4
--      .globl __put_user_1
--__put_user_1:
--1:    stb     r1, @r0             ||  ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __put_user_2
--__put_user_2:
--2:    sth     r1, @r0             ||  ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __put_user_4
--__put_user_4:
--3:    st      r1, @r0             ||  ldi     r0, #0
--      jmp     r14
--
--bad_put_user:
--      ldi     r0, #-14            ||  jmp     r14
--
--#else /* not CONFIG_ISA_DUAL_ISSUE */
--
--      .text
--      .balign 4
--      .globl __put_user_1
--__put_user_1:
--1:    stb     r1, @r0
--      ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __put_user_2
--__put_user_2:
--2:    sth     r1, @r0
--      ldi     r0, #0
--      jmp     r14
--
--      .balign 4
--      .globl __put_user_4
--__put_user_4:
--3:    st      r1, @r0
--      ldi     r0, #0
--      jmp     r14
--
--bad_put_user:
--      ldi     r0, #-14
--      jmp     r14
--
--#endif /* not CONFIG_ISA_DUAL_ISSUE */
--
--.section __ex_table,"a"
--      .long 1b,bad_put_user
--      .long 2b,bad_put_user
--      .long 3b,bad_put_user
--.previous
-diff --git a/arch/mips/kernel/branch.c b/arch/mips/kernel/branch.c
-index 374de83..b6232d9 100644
---- a/arch/mips/kernel/branch.c
-+++ b/arch/mips/kernel/branch.c
-@@ -184,7 +184,7 @@ int __compute_return_epc(struct pt_regs 
-               bit = (insn.i_format.rt >> 2);
-               bit += (bit != 0);
-               bit += 23;
--              switch (insn.i_format.rt) {
-+              switch (insn.i_format.rt & 3) {
-               case 0: /* bc1f */
-               case 2: /* bc1fl */
-                       if (~fcr31 & (1 << bit))
-diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
-index 9572ed4..a761f99 100644
---- a/arch/mips/mm/c-r4k.c
-+++ b/arch/mips/mm/c-r4k.c
-@@ -154,7 +154,8 @@ static inline void blast_icache32_r4600_
- static inline void tx49_blast_icache32_page_indexed(unsigned long page)
- {
--      unsigned long start = page;
-+      unsigned long indexmask = current_cpu_data.icache.waysize - 1;
-+      unsigned long start = INDEX_BASE + (page & indexmask);
-       unsigned long end = start + PAGE_SIZE;
-       unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
-       unsigned long ws_end = current_cpu_data.icache.ways <<
-diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
-index ba92bab..4c4449b 100644
---- a/arch/powerpc/kernel/pci_64.c
-+++ b/arch/powerpc/kernel/pci_64.c
-@@ -78,6 +78,7 @@ int global_phb_number;               /* Global phb co
- /* Cached ISA bridge dev. */
- struct pci_dev *ppc64_isabridge_dev = NULL;
-+EXPORT_SYMBOL_GPL(ppc64_isabridge_dev);
- static void fixup_broken_pcnet32(struct pci_dev* dev)
- {
-diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
-index f96c49b..abd758f 100644
---- a/arch/powerpc/kernel/setup_64.c
-+++ b/arch/powerpc/kernel/setup_64.c
-@@ -256,12 +256,10 @@ #endif
-       /*
-        * Initialize stab / SLB management except on iSeries
-        */
--      if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
--              if (cpu_has_feature(CPU_FTR_SLB))
--                      slb_initialize();
--              else
--                      stab_initialize(lpaca->stab_real);
--      }
-+      if (cpu_has_feature(CPU_FTR_SLB))
-+              slb_initialize();
-+      else if (!firmware_has_feature(FW_FEATURE_ISERIES))
-+              stab_initialize(lpaca->stab_real);
-       DBG(" <- early_setup()\n");
- }
-diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
-index 4324f8a..096dfdc 100644
---- a/arch/powerpc/kernel/signal_64.c
-+++ b/arch/powerpc/kernel/signal_64.c
-@@ -213,7 +213,7 @@ static inline void __user * get_sigframe
-         /* Default to using normal stack */
-         newsp = regs->gpr[1];
--      if (ka->sa.sa_flags & SA_ONSTACK) {
-+      if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size) {
-               if (! on_sig_stack(regs->gpr[1]))
-                       newsp = (current->sas_ss_sp + current->sas_ss_size);
-       }
-diff --git a/arch/powerpc/platforms/powermac/setup.c b/arch/powerpc/platforms/powermac/setup.c
-index 29c2946..f649750 100644
---- a/arch/powerpc/platforms/powermac/setup.c
-+++ b/arch/powerpc/platforms/powermac/setup.c
-@@ -456,11 +456,23 @@ static int pmac_pm_finish(suspend_state_
-       return 0;
- }
-+static int pmac_pm_valid(suspend_state_t state)
-+{
-+      switch (state) {
-+      case PM_SUSPEND_DISK:
-+              return 1;
-+      /* can't do any other states via generic mechanism yet */
-+      default:
-+              return 0;
-+      }
-+}
-+
- static struct pm_ops pmac_pm_ops = {
-       .pm_disk_mode   = PM_DISK_SHUTDOWN,
-       .prepare        = pmac_pm_prepare,
-       .enter          = pmac_pm_enter,
-       .finish         = pmac_pm_finish,
-+      .valid          = pmac_pm_valid,
- };
- #endif /* CONFIG_SOFTWARE_SUSPEND */
-diff --git a/arch/x86_64/ia32/Makefile b/arch/x86_64/ia32/Makefile
-index 929e6b0..e9263b4 100644
---- a/arch/x86_64/ia32/Makefile
-+++ b/arch/x86_64/ia32/Makefile
-@@ -27,5 +27,5 @@ quiet_cmd_syscall = SYSCALL $@
- $(obj)/vsyscall-%.so: $(src)/vsyscall.lds $(obj)/vsyscall-%.o FORCE
-       $(call if_changed,syscall)
--AFLAGS_vsyscall-sysenter.o = -m32
--AFLAGS_vsyscall-syscall.o = -m32
-+AFLAGS_vsyscall-sysenter.o = -m32 -Wa,-32
-+AFLAGS_vsyscall-syscall.o = -m32 -Wa,-32
-diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S
-index 7c10e90..97583bb 100644
---- a/arch/x86_64/kernel/entry.S
-+++ b/arch/x86_64/kernel/entry.S
-@@ -180,6 +180,10 @@ rff_trace:
-  *
-  * XXX        if we had a free scratch register we could save the RSP into the stack frame
-  *      and report it properly in ps. Unfortunately we haven't.
-+ *
-+ * When user can change the frames always force IRET. That is because
-+ * it deals with uncanonical addresses better. SYSRET has trouble
-+ * with them due to bugs in both AMD and Intel CPUs.
-  */                                   
- ENTRY(system_call)
-@@ -254,7 +258,10 @@ sysret_signal:
-       xorl %esi,%esi # oldset -> arg2
-       call ptregscall_common
- 1:    movl $_TIF_NEED_RESCHED,%edi
--      jmp sysret_check
-+      /* Use IRET because user could have changed frame. This
-+         works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
-+      cli
-+      jmp int_with_check
-       
- badsys:
-       movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
-@@ -274,13 +281,9 @@ tracesys:                  
-       ja  1f
-       movq %r10,%rcx  /* fixup for C */
-       call *sys_call_table(,%rax,8)
--      movq %rax,RAX-ARGOFFSET(%rsp)
--1:    SAVE_REST
--      movq %rsp,%rdi
--      call syscall_trace_leave
--      RESTORE_TOP_OF_STACK %rbx
--      RESTORE_REST
--      jmp ret_from_sys_call
-+1:    movq %rax,RAX-ARGOFFSET(%rsp)
-+      /* Use IRET because user could have changed frame */
-+      jmp int_ret_from_sys_call
-       CFI_ENDPROC
-               
- /* 
-@@ -408,25 +411,9 @@ ENTRY(stub_execve)
-       CFI_ADJUST_CFA_OFFSET -8
-       CFI_REGISTER rip, r11
-       SAVE_REST
--      movq %r11, %r15
--      CFI_REGISTER rip, r15
-       FIXUP_TOP_OF_STACK %r11
-       call sys_execve
--      GET_THREAD_INFO(%rcx)
--      bt $TIF_IA32,threadinfo_flags(%rcx)
--      CFI_REMEMBER_STATE
--      jc exec_32bit
-       RESTORE_TOP_OF_STACK %r11
--      movq %r15, %r11
--      CFI_REGISTER rip, r11
--      RESTORE_REST
--      pushq %r11
--      CFI_ADJUST_CFA_OFFSET 8
--      CFI_REL_OFFSET rip, 0
--      ret
--
--exec_32bit:
--      CFI_RESTORE_STATE
-       movq %rax,RAX(%rsp)
-       RESTORE_REST
-       jmp int_ret_from_sys_call
-diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c
-index 0c3f052..b9dbe3c 100644
---- a/arch/x86_64/kernel/pci-gart.c
-+++ b/arch/x86_64/kernel/pci-gart.c
-@@ -114,10 +114,6 @@ static unsigned long alloc_iommu(int siz
- static void free_iommu(unsigned long offset, int size)
- { 
-       unsigned long flags;
--      if (size == 1) { 
--              clear_bit(offset, iommu_gart_bitmap); 
--              return;
--      }
-       spin_lock_irqsave(&iommu_bitmap_lock, flags);
-       __clear_bit_string(iommu_gart_bitmap, offset, size);
-       spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
-diff --git a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c
-index 22a05de..818ab9e 100644
---- a/arch/x86_64/kernel/process.c
-+++ b/arch/x86_64/kernel/process.c
-@@ -527,8 +527,6 @@ __switch_to(struct task_struct *prev_p, 
-       int cpu = smp_processor_id();  
-       struct tss_struct *tss = &per_cpu(init_tss, cpu);
--      unlazy_fpu(prev_p);
--
-       /*
-        * Reload esp0, LDT and the page table pointer:
-        */
-@@ -591,6 +589,12 @@ __switch_to(struct task_struct *prev_p, 
-       prev->userrsp = read_pda(oldrsp); 
-       write_pda(oldrsp, next->userrsp); 
-       write_pda(pcurrent, next_p); 
-+
-+      /* This must be here to ensure both math_state_restore() and
-+         kernel_fpu_begin() work consistently.
-+         And the AMD workaround requires it to be after DS reload. */
-+      unlazy_fpu(prev_p);
-+
-       write_pda(kernelstack,
-                 task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET);
-diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
-index aa55e3c..a4a0bb5 100644
---- a/arch/x86_64/kernel/setup.c
-+++ b/arch/x86_64/kernel/setup.c
-@@ -909,6 +909,10 @@ #endif
-       if (c->x86 == 15 && ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58))
-               set_bit(X86_FEATURE_REP_GOOD, &c->x86_capability);
-+      /* Enable workaround for FXSAVE leak */
-+      if (c->x86 >= 6)
-+              set_bit(X86_FEATURE_FXSAVE_LEAK, &c->x86_capability);
-+
-       r = get_model_name(c);
-       if (!r) { 
-               switch (c->x86) { 
-diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c
-index 28d50dc..a5209fd 100644
---- a/arch/x86_64/kernel/traps.c
-+++ b/arch/x86_64/kernel/traps.c
-@@ -30,6 +30,7 @@ #include <linux/module.h>
- #include <linux/moduleparam.h>
- #include <linux/nmi.h>
- #include <linux/kprobes.h>
-+#include <linux/kexec.h>
- #include <asm/system.h>
- #include <asm/uaccess.h>
-@@ -434,6 +435,8 @@ #endif
-       printk(KERN_ALERT "RIP ");
-       printk_address(regs->rip); 
-       printk(" RSP <%016lx>\n", regs->rsp); 
-+      if (kexec_should_crash(current))
-+              crash_kexec(regs);
- }
- void die(const char * str, struct pt_regs * regs, long err)
-@@ -456,6 +459,8 @@ void __kprobes die_nmi(char *str, struct
-        */
-       printk(str, safe_smp_processor_id());
-       show_registers(regs);
-+      if (kexec_should_crash(current))
-+              crash_kexec(regs);
-       if (panic_on_timeout || panic_on_oops)
-               panic("nmi watchdog");
-       printk("console shuts up ...\n");
-diff --git a/block/elevator.c b/block/elevator.c
-index 24b702d..ef1e606 100644
---- a/block/elevator.c
-+++ b/block/elevator.c
-@@ -314,6 +314,7 @@ void elv_insert(request_queue_t *q, stru
- {
-       struct list_head *pos;
-       unsigned ordseq;
-+      int unplug_it = 1;
-       rq->q = q;
-@@ -378,6 +379,11 @@ void elv_insert(request_queue_t *q, stru
-               }
-               list_add_tail(&rq->queuelist, pos);
-+              /*
-+               * most requeues happen because of a busy condition, don't
-+               * force unplug of the queue for that case.
-+               */
-+              unplug_it = 0;
-               break;
-       default:
-@@ -386,7 +392,7 @@ void elv_insert(request_queue_t *q, stru
-               BUG();
-       }
--      if (blk_queue_plugged(q)) {
-+      if (unplug_it && blk_queue_plugged(q)) {
-               int nrq = q->rq.count[READ] + q->rq.count[WRITE]
-                       - q->in_flight;
-diff --git a/block/genhd.c b/block/genhd.c
-index db57546..7f406f9 100644
---- a/block/genhd.c
-+++ b/block/genhd.c
-@@ -16,8 +16,6 @@ #include <linux/kmod.h>
- #include <linux/kobj_map.h>
- #include <linux/buffer_head.h>
--#define MAX_PROBE_HASH 255    /* random */
--
- static struct subsystem block_subsys;
- static DECLARE_MUTEX(block_subsys_sem);
-@@ -30,108 +28,29 @@ static struct blk_major_name {
-       struct blk_major_name *next;
-       int major;
-       char name[16];
--} *major_names[MAX_PROBE_HASH];
-+} *major_names[BLKDEV_MAJOR_HASH_SIZE];
- /* index in the above - for now: assume no multimajor ranges */
- static inline int major_to_index(int major)
- {
--      return major % MAX_PROBE_HASH;
--}
--
--struct blkdev_info {
--        int index;
--        struct blk_major_name *bd;
--};
--
--/*
-- * iterate over a list of blkdev_info structures.  allows
-- * the major_names array to be iterated over from outside this file
-- * must be called with the block_subsys_sem held
-- */
--void *get_next_blkdev(void *dev)
--{
--        struct blkdev_info *info;
--
--        if (dev == NULL) {
--                info = kmalloc(sizeof(*info), GFP_KERNEL);
--                if (!info)
--                        goto out;
--                info->index=0;
--                info->bd = major_names[info->index];
--                if (info->bd)
--                        goto out;
--        } else {
--                info = dev;
--        }
--
--        while (info->index < ARRAY_SIZE(major_names)) {
--                if (info->bd)
--                        info->bd = info->bd->next;
--                if (info->bd)
--                        goto out;
--                /*
--                 * No devices on this chain, move to the next
--                 */
--                info->index++;
--                info->bd = (info->index < ARRAY_SIZE(major_names)) ?
--                      major_names[info->index] : NULL;
--                if (info->bd)
--                        goto out;
--        }
--
--out:
--        return info;
--}
--
--void *acquire_blkdev_list(void)
--{
--        down(&block_subsys_sem);
--        return get_next_blkdev(NULL);
--}
--
--void release_blkdev_list(void *dev)
--{
--        up(&block_subsys_sem);
--        kfree(dev);
-+      return major % BLKDEV_MAJOR_HASH_SIZE;
- }
-+#ifdef CONFIG_PROC_FS
--/*
-- * Count the number of records in the blkdev_list.
-- * must be called with the block_subsys_sem held
-- */
--int count_blkdev_list(void)
-+void blkdev_show(struct seq_file *f, off_t offset)
- {
--      struct blk_major_name *n;
--      int i, count;
-+      struct blk_major_name *dp;
--      count = 0;
--
--      for (i = 0; i < ARRAY_SIZE(major_names); i++) {
--              for (n = major_names[i]; n; n = n->next)
--                              count++;
-+      if (offset < BLKDEV_MAJOR_HASH_SIZE) {
-+              down(&block_subsys_sem);
-+              for (dp = major_names[offset]; dp; dp = dp->next)
-+                      seq_printf(f, "%3d %s\n", dp->major, dp->name);
-+              up(&block_subsys_sem);
-       }
--
--      return count;
--}
--
--/*
-- * extract the major and name values from a blkdev_info struct
-- * passed in as a void to *dev.  Must be called with
-- * block_subsys_sem held
-- */
--int get_blkdev_info(void *dev, int *major, char **name)
--{
--        struct blkdev_info *info = dev;
--
--        if (info->bd == NULL)
--                return 1;
--
--        *major = info->bd->major;
--        *name = info->bd->name;
--        return 0;
- }
-+#endif /* CONFIG_PROC_FS */
- int register_blkdev(unsigned int major, const char *name)
- {
-diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
-index 0ef2971..cd995c3 100644
---- a/block/ll_rw_blk.c
-+++ b/block/ll_rw_blk.c
-@@ -1719,8 +1719,21 @@ void blk_run_queue(struct request_queue 
-       spin_lock_irqsave(q->queue_lock, flags);
-       blk_remove_plug(q);
--      if (!elv_queue_empty(q))
--              q->request_fn(q);
-+
-+      /*
-+       * Only recurse once to avoid overrunning the stack, let the unplug
-+       * handling reinvoke the handler shortly if we already got there.
-+       */
-+      if (!elv_queue_empty(q)) {
-+              if (!test_and_set_bit(QUEUE_FLAG_REENTER, &q->queue_flags)) {
-+                      q->request_fn(q);
-+                      clear_bit(QUEUE_FLAG_REENTER, &q->queue_flags);
-+              } else {
-+                      blk_plug_device(q);
-+                      kblockd_schedule_work(&q->unplug_work);
-+              }
-+      }
-+
-       spin_unlock_irqrestore(q->queue_lock, flags);
- }
- EXPORT_SYMBOL(blk_run_queue);
-diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
-index 07a7f97..29f3d75 100644
---- a/drivers/base/cpu.c
-+++ b/drivers/base/cpu.c
-@@ -141,7 +141,7 @@ #endif
-       return error;
- }
--struct sys_device *get_cpu_sysdev(int cpu)
-+struct sys_device *get_cpu_sysdev(unsigned cpu)
- {
-       if (cpu < NR_CPUS)
-               return cpu_sys_devices[cpu];
-diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
-index e97e911..4723182 100644
---- a/drivers/base/firmware_class.c
-+++ b/drivers/base/firmware_class.c
-@@ -211,18 +211,20 @@ static int
- fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
- {
-       u8 *new_data;
-+      int new_size = fw_priv->alloc_size;
-       if (min_size <= fw_priv->alloc_size)
-               return 0;
--      new_data = vmalloc(fw_priv->alloc_size + PAGE_SIZE);
-+      new_size = ALIGN(min_size, PAGE_SIZE);
-+      new_data = vmalloc(new_size);
-       if (!new_data) {
-               printk(KERN_ERR "%s: unable to alloc buffer\n", __FUNCTION__);
-               /* Make sure that we don't keep incomplete data */
-               fw_load_abort(fw_priv);
-               return -ENOMEM;
-       }
--      fw_priv->alloc_size += PAGE_SIZE;
-+      fw_priv->alloc_size = new_size;
-       if (fw_priv->fw->data) {
-               memcpy(new_data, fw_priv->fw->data, fw_priv->fw->size);
-               vfree(fw_priv->fw->data);
-diff --git a/drivers/base/node.c b/drivers/base/node.c
-index 16c513a..c80c3ae 100644
---- a/drivers/base/node.c
-+++ b/drivers/base/node.c
-@@ -106,7 +106,7 @@ static ssize_t node_read_numastat(struct
-       other_node = 0;
-       for (i = 0; i < MAX_NR_ZONES; i++) {
-               struct zone *z = &pg->node_zones[i];
--              for (cpu = 0; cpu < NR_CPUS; cpu++) {
-+              for_each_online_cpu(cpu) {
-                       struct per_cpu_pageset *ps = zone_pcp(z,cpu);
-                       numa_hit += ps->numa_hit;
-                       numa_miss += ps->numa_miss;
-diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
-index 0d65394..71552e1 100644
---- a/drivers/block/cciss.c
-+++ b/drivers/block/cciss.c
-@@ -1181,6 +1181,53 @@ static int revalidate_allvol(ctlr_info_t
-         return 0;
- }
-+static inline void complete_buffers(struct bio *bio, int status)
-+{
-+      while (bio) {
-+              struct bio *xbh = bio->bi_next;
-+              int nr_sectors = bio_sectors(bio);
-+
-+              bio->bi_next = NULL;
-+              blk_finished_io(len);
-+              bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
-+              bio = xbh;
-+      }
-+
-+}
-+
-+static void cciss_softirq_done(struct request *rq)
-+{
-+      CommandList_struct *cmd = rq->completion_data;
-+      ctlr_info_t *h = hba[cmd->ctlr];
-+      unsigned long flags;
-+      u64bit temp64;
-+      int i, ddir;
-+
-+      if (cmd->Request.Type.Direction == XFER_READ)
-+              ddir = PCI_DMA_FROMDEVICE;
-+      else
-+              ddir = PCI_DMA_TODEVICE;
-+
-+      /* command did not need to be retried */
-+      /* unmap the DMA mapping for all the scatter gather elements */
-+      for(i=0; i<cmd->Header.SGList; i++) {
-+              temp64.val32.lower = cmd->SG[i].Addr.lower;
-+              temp64.val32.upper = cmd->SG[i].Addr.upper;
-+              pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
-+      }
-+
-+      complete_buffers(rq->bio, rq->errors);
-+
-+#ifdef CCISS_DEBUG
-+      printk("Done with %p\n", rq);
-+#endif /* CCISS_DEBUG */
-+
-+      spin_lock_irqsave(&h->lock, flags);
-+      end_that_request_last(rq, rq->errors);
-+      cmd_free(h, cmd,1);
-+      spin_unlock_irqrestore(&h->lock, flags);
-+}
-+
- /* This function will check the usage_count of the drive to be updated/added.
-  * If the usage_count is zero then the drive information will be updated and
-  * the disk will be re-registered with the kernel.  If not then it will be
-@@ -1249,6 +1296,8 @@ static void cciss_update_drive_info(int 
-               blk_queue_max_sectors(disk->queue, 512);
-+              blk_queue_softirq_done(disk->queue, cciss_softirq_done);
-+
-               disk->queue->queuedata = hba[ctlr];
-               blk_queue_hardsect_size(disk->queue,
-@@ -2148,20 +2197,6 @@ static void start_io( ctlr_info_t *h)
-               addQ (&(h->cmpQ), c); 
-       }
- }
--
--static inline void complete_buffers(struct bio *bio, int status)
--{
--      while (bio) {
--              struct bio *xbh = bio->bi_next; 
--              int nr_sectors = bio_sectors(bio);
--
--              bio->bi_next = NULL; 
--              blk_finished_io(len);
--              bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
--              bio = xbh;
--      }
--
--} 
- /* Assumes that CCISS_LOCK(h->ctlr) is held. */
- /* Zeros out the error record and then resends the command back */
- /* to the controller */
-@@ -2179,39 +2214,6 @@ static inline void resend_cciss_cmd( ctl
-       start_io(h);
- }
--static void cciss_softirq_done(struct request *rq)
--{
--      CommandList_struct *cmd = rq->completion_data;
--      ctlr_info_t *h = hba[cmd->ctlr];
--      unsigned long flags;
--      u64bit temp64;
--      int i, ddir;
--
--      if (cmd->Request.Type.Direction == XFER_READ)
--              ddir = PCI_DMA_FROMDEVICE;
--      else
--              ddir = PCI_DMA_TODEVICE;
--
--      /* command did not need to be retried */
--      /* unmap the DMA mapping for all the scatter gather elements */
--      for(i=0; i<cmd->Header.SGList; i++) {
--              temp64.val32.lower = cmd->SG[i].Addr.lower;
--              temp64.val32.upper = cmd->SG[i].Addr.upper;
--              pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
--      }
--
--      complete_buffers(rq->bio, rq->errors);
--
--#ifdef CCISS_DEBUG
--      printk("Done with %p\n", rq);
--#endif /* CCISS_DEBUG */ 
--
--      spin_lock_irqsave(&h->lock, flags);
--      end_that_request_last(rq, rq->errors);
--      cmd_free(h, cmd,1);
--      spin_unlock_irqrestore(&h->lock, flags);
--}
--
- /* checks the status of the job and calls complete buffers to mark all 
-  * buffers for the completed job. Note that this function does not need
-  * to hold the hba/queue lock.
-@@ -3269,8 +3271,8 @@ clean2:
-       unregister_blkdev(hba[i]->major, hba[i]->devname);
- clean1:
-       release_io_mem(hba[i]);
--      free_hba(i);
-       hba[i]->busy_initializing = 0;
-+      free_hba(i);
-       return(-1);
- }
-diff --git a/drivers/block/ub.c b/drivers/block/ub.c
-index f04d864..a9485e5 100644
---- a/drivers/block/ub.c
-+++ b/drivers/block/ub.c
-@@ -704,6 +704,9 @@ static void ub_cleanup(struct ub_dev *sc
-               kfree(lun);
-       }
-+      usb_set_intfdata(sc->intf, NULL);
-+      usb_put_intf(sc->intf);
-+      usb_put_dev(sc->dev);
-       kfree(sc);
- }
-@@ -2428,7 +2431,12 @@ static int ub_probe(struct usb_interface
-       // sc->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
-       usb_set_intfdata(intf, sc);
-       usb_get_dev(sc->dev);
--      // usb_get_intf(sc->intf);      /* Do we need this? */
-+      /*
-+       * Since we give the interface struct to the block level through
-+       * disk->driverfs_dev, we have to pin it. Otherwise, block_uevent
-+       * oopses on close after a disconnect (kernels 2.6.16 and up).
-+       */
-+      usb_get_intf(sc->intf);
-       snprintf(sc->name, 12, DRV_NAME "(%d.%d)",
-           sc->dev->bus->busnum, sc->dev->devnum);
-@@ -2509,7 +2517,7 @@ #endif
- err_diag:
- err_dev_desc:
-       usb_set_intfdata(intf, NULL);
--      // usb_put_intf(sc->intf);
-+      usb_put_intf(sc->intf);
-       usb_put_dev(sc->dev);
-       kfree(sc);
- err_core:
-@@ -2688,12 +2696,6 @@ static void ub_disconnect(struct usb_int
-        */
-       device_remove_file(&sc->intf->dev, &dev_attr_diag);
--      usb_set_intfdata(intf, NULL);
--      // usb_put_intf(sc->intf);
--      sc->intf = NULL;
--      usb_put_dev(sc->dev);
--      sc->dev = NULL;
--
-       ub_put(sc);
- }
-diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
-index 05ba410..8b72a61 100644
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -187,6 +187,7 @@ config MOXA_SMARTIO
- config ISI
-       tristate "Multi-Tech multiport card support (EXPERIMENTAL)"
-       depends on SERIAL_NONSTANDARD
-+      select FW_LOADER
-       help
-         This is a driver for the Multi-Tech cards which provide several
-         serial ports.  The driver is experimental and can currently only be
-diff --git a/drivers/char/agp/efficeon-agp.c b/drivers/char/agp/efficeon-agp.c
-index e7aea77..40dfc29 100644
---- a/drivers/char/agp/efficeon-agp.c
-+++ b/drivers/char/agp/efficeon-agp.c
-@@ -64,6 +64,12 @@ static struct gatt_mask efficeon_generic
-       {.mask = 0x00000001, .type = 0}
- };
-+/* This function does the same thing as mask_memory() for this chipset... */
-+static inline unsigned long efficeon_mask_memory(unsigned long addr)
-+{
-+      return addr | 0x00000001;
-+}
-+
- static struct aper_size_info_lvl2 efficeon_generic_sizes[4] =
- {
-       {256, 65536, 0},
-@@ -251,7 +257,7 @@ static int efficeon_insert_memory(struct
-       last_page = NULL;
-       for (i = 0; i < count; i++) {
-               int index = pg_start + i;
--              unsigned long insert = mem->memory[i];
-+              unsigned long insert = efficeon_mask_memory(mem->memory[i]);
-               page = (unsigned int *) efficeon_private.l1_table[index >> 10];
-diff --git a/drivers/char/cs5535_gpio.c b/drivers/char/cs5535_gpio.c
-index 5d72f50..46d6603 100644
---- a/drivers/char/cs5535_gpio.c
-+++ b/drivers/char/cs5535_gpio.c
-@@ -241,9 +241,10 @@ static int __init cs5535_gpio_init(void)
- static void __exit cs5535_gpio_cleanup(void)
- {
-       dev_t dev_id = MKDEV(major, 0);
-+
-+      cdev_del(&cs5535_gpio_cdev);
-       unregister_chrdev_region(dev_id, CS5535_GPIO_COUNT);
--      if (gpio_base != 0)
--              release_region(gpio_base, CS5535_GPIO_SIZE);
-+      release_region(gpio_base, CS5535_GPIO_SIZE);
- }
- module_init(cs5535_gpio_init);
-diff --git a/drivers/char/ipmi/ipmi_bt_sm.c b/drivers/char/ipmi/ipmi_bt_sm.c
-index 58dcdee..0030cd8 100644
---- a/drivers/char/ipmi/ipmi_bt_sm.c
-+++ b/drivers/char/ipmi/ipmi_bt_sm.c
-@@ -165,7 +165,7 @@ static int bt_start_transaction(struct s
- {
-       unsigned int i;
--      if ((size < 2) || (size > IPMI_MAX_MSG_LENGTH))
-+      if ((size < 2) || (size > (IPMI_MAX_MSG_LENGTH - 2)))
-              return -1;
-       if ((bt->state != BT_STATE_IDLE) && (bt->state != BT_STATE_HOSED))
-diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
-index 5fdf185..b61354a 100644
---- a/drivers/char/pcmcia/cm4000_cs.c
-+++ b/drivers/char/pcmcia/cm4000_cs.c
-@@ -2010,10 +2010,6 @@ static int __init cmm_init(void)
-       if (!cmm_class)
-               return -1;
--      rc = pcmcia_register_driver(&cm4000_driver);
--      if (rc < 0)
--              return rc;
--
-       major = register_chrdev(0, DEVICE_NAME, &cm4000_fops);
-       if (major < 0) {
-               printk(KERN_WARNING MODULE_NAME
-@@ -2021,6 +2017,12 @@ static int __init cmm_init(void)
-               return -1;
-       }
-+      rc = pcmcia_register_driver(&cm4000_driver);
-+      if (rc < 0) {
-+              unregister_chrdev(major, DEVICE_NAME);
-+              return rc;
-+      }
-+
-       return 0;
- }
-diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c
-index 466e33b..744b57d 100644
---- a/drivers/char/pcmcia/cm4040_cs.c
-+++ b/drivers/char/pcmcia/cm4040_cs.c
-@@ -769,16 +769,19 @@ static int __init cm4040_init(void)
-       if (!cmx_class)
-               return -1;
--      rc = pcmcia_register_driver(&reader_driver);
--      if (rc < 0)
--              return rc;
--
-       major = register_chrdev(0, DEVICE_NAME, &reader_fops);
-       if (major < 0) {
-               printk(KERN_WARNING MODULE_NAME
-                       ": could not get major number\n");
-               return -1;
-       }
-+
-+      rc = pcmcia_register_driver(&reader_driver);
-+      if (rc < 0) {
-+              unregister_chrdev(major, DEVICE_NAME);
-+              return rc;
-+      }
-+
-       return 0;
- }
-diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c
-index 0e7d216..d22da98 100644
---- a/drivers/char/snsc.c
-+++ b/drivers/char/snsc.c
-@@ -391,7 +391,8 @@ scdrv_init(void)
-                       format_module_id(devnamep, geo_module(geoid),
-                                        MODULE_FORMAT_BRIEF);
-                       devnamep = devname + strlen(devname);
--                      sprintf(devnamep, "#%d", geo_slab(geoid));
-+                      sprintf(devnamep, "^%d#%d", geo_slot(geoid),
-+                              geo_slab(geoid));
-                       /* allocate sysctl device data */
-                       scd = kmalloc(sizeof (struct sysctl_data_s),
-diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
-index f8dd852..a90f5d9 100644
---- a/drivers/char/sonypi.c
-+++ b/drivers/char/sonypi.c
-@@ -1341,6 +1341,9 @@ static int __devinit sonypi_probe(struct
-       else if ((pcidev = pci_get_device(PCI_VENDOR_ID_INTEL,
-                                         PCI_DEVICE_ID_INTEL_ICH6_1, NULL)))
-               sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE3;
-+      else if ((pcidev = pci_get_device(PCI_VENDOR_ID_INTEL,
-+                                        PCI_DEVICE_ID_INTEL_ICH7_1, NULL)))
-+              sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE3;
-       else
-               sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE2;
-diff --git a/drivers/char/tipar.c b/drivers/char/tipar.c
-index eb2eb3e..079db5a 100644
---- a/drivers/char/tipar.c
-+++ b/drivers/char/tipar.c
-@@ -515,7 +515,7 @@ tipar_init_module(void)
-               err = PTR_ERR(tipar_class);
-               goto out_chrdev;
-       }
--      if (parport_register_driver(&tipar_driver) || tp_count == 0) {
-+      if (parport_register_driver(&tipar_driver)) {
-               printk(KERN_ERR "tipar: unable to register with parport\n");
-               err = -EIO;
-               goto out_class;
-diff --git a/drivers/char/tlclk.c b/drivers/char/tlclk.c
-index 4c27218..f58ad7f 100644
---- a/drivers/char/tlclk.c
-+++ b/drivers/char/tlclk.c
-@@ -327,7 +327,7 @@ static ssize_t store_received_ref_clk3a(
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(received_ref_clk3a, S_IWUGO, NULL,
-+static DEVICE_ATTR(received_ref_clk3a, (S_IWUSR|S_IWGRP), NULL,
-               store_received_ref_clk3a);
-@@ -349,7 +349,7 @@ static ssize_t store_received_ref_clk3b(
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(received_ref_clk3b, S_IWUGO, NULL,
-+static DEVICE_ATTR(received_ref_clk3b, (S_IWUSR|S_IWGRP), NULL,
-               store_received_ref_clk3b);
-@@ -371,7 +371,7 @@ static ssize_t store_enable_clk3b_output
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(enable_clk3b_output, S_IWUGO, NULL,
-+static DEVICE_ATTR(enable_clk3b_output, (S_IWUSR|S_IWGRP), NULL,
-               store_enable_clk3b_output);
- static ssize_t store_enable_clk3a_output(struct device *d,
-@@ -392,7 +392,7 @@ static ssize_t store_enable_clk3a_output
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(enable_clk3a_output, S_IWUGO, NULL,
-+static DEVICE_ATTR(enable_clk3a_output, (S_IWUSR|S_IWGRP), NULL,
-               store_enable_clk3a_output);
- static ssize_t store_enable_clkb1_output(struct device *d,
-@@ -413,7 +413,7 @@ static ssize_t store_enable_clkb1_output
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(enable_clkb1_output, S_IWUGO, NULL,
-+static DEVICE_ATTR(enable_clkb1_output, (S_IWUSR|S_IWGRP), NULL,
-               store_enable_clkb1_output);
-@@ -435,7 +435,7 @@ static ssize_t store_enable_clka1_output
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(enable_clka1_output, S_IWUGO, NULL,
-+static DEVICE_ATTR(enable_clka1_output, (S_IWUSR|S_IWGRP), NULL,
-               store_enable_clka1_output);
- static ssize_t store_enable_clkb0_output(struct device *d,
-@@ -456,7 +456,7 @@ static ssize_t store_enable_clkb0_output
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(enable_clkb0_output, S_IWUGO, NULL,
-+static DEVICE_ATTR(enable_clkb0_output, (S_IWUSR|S_IWGRP), NULL,
-               store_enable_clkb0_output);
- static ssize_t store_enable_clka0_output(struct device *d,
-@@ -477,7 +477,7 @@ static ssize_t store_enable_clka0_output
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(enable_clka0_output, S_IWUGO, NULL,
-+static DEVICE_ATTR(enable_clka0_output, (S_IWUSR|S_IWGRP), NULL,
-               store_enable_clka0_output);
- static ssize_t store_select_amcb2_transmit_clock(struct device *d,
-@@ -519,7 +519,7 @@ static ssize_t store_select_amcb2_transm
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(select_amcb2_transmit_clock, S_IWUGO, NULL,
-+static DEVICE_ATTR(select_amcb2_transmit_clock, (S_IWUSR|S_IWGRP), NULL,
-       store_select_amcb2_transmit_clock);
- static ssize_t store_select_amcb1_transmit_clock(struct device *d,
-@@ -560,7 +560,7 @@ static ssize_t store_select_amcb1_transm
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(select_amcb1_transmit_clock, S_IWUGO, NULL,
-+static DEVICE_ATTR(select_amcb1_transmit_clock, (S_IWUSR|S_IWGRP), NULL,
-               store_select_amcb1_transmit_clock);
- static ssize_t store_select_redundant_clock(struct device *d,
-@@ -581,7 +581,7 @@ static ssize_t store_select_redundant_cl
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(select_redundant_clock, S_IWUGO, NULL,
-+static DEVICE_ATTR(select_redundant_clock, (S_IWUSR|S_IWGRP), NULL,
-               store_select_redundant_clock);
- static ssize_t store_select_ref_frequency(struct device *d,
-@@ -602,7 +602,7 @@ static ssize_t store_select_ref_frequenc
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(select_ref_frequency, S_IWUGO, NULL,
-+static DEVICE_ATTR(select_ref_frequency, (S_IWUSR|S_IWGRP), NULL,
-               store_select_ref_frequency);
- static ssize_t store_filter_select(struct device *d,
-@@ -623,7 +623,7 @@ static ssize_t store_filter_select(struc
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(filter_select, S_IWUGO, NULL, store_filter_select);
-+static DEVICE_ATTR(filter_select, (S_IWUSR|S_IWGRP), NULL, store_filter_select);
- static ssize_t store_hardware_switching_mode(struct device *d,
-                struct device_attribute *attr, const char *buf, size_t count)
-@@ -643,7 +643,7 @@ static ssize_t store_hardware_switching_
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(hardware_switching_mode, S_IWUGO, NULL,
-+static DEVICE_ATTR(hardware_switching_mode, (S_IWUSR|S_IWGRP), NULL,
-               store_hardware_switching_mode);
- static ssize_t store_hardware_switching(struct device *d,
-@@ -664,7 +664,7 @@ static ssize_t store_hardware_switching(
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(hardware_switching, S_IWUGO, NULL,
-+static DEVICE_ATTR(hardware_switching, (S_IWUSR|S_IWGRP), NULL,
-               store_hardware_switching);
- static ssize_t store_refalign (struct device *d,
-@@ -684,7 +684,7 @@ static ssize_t store_refalign (struct de
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(refalign, S_IWUGO, NULL, store_refalign);
-+static DEVICE_ATTR(refalign, (S_IWUSR|S_IWGRP), NULL, store_refalign);
- static ssize_t store_mode_select (struct device *d,
-                struct device_attribute *attr, const char *buf, size_t count)
-@@ -704,7 +704,7 @@ static ssize_t store_mode_select (struct
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(mode_select, S_IWUGO, NULL, store_mode_select);
-+static DEVICE_ATTR(mode_select, (S_IWUSR|S_IWGRP), NULL, store_mode_select);
- static ssize_t store_reset (struct device *d,
-                struct device_attribute *attr, const char *buf, size_t count)
-@@ -724,7 +724,7 @@ static ssize_t store_reset (struct devic
-       return strnlen(buf, count);
- }
--static DEVICE_ATTR(reset, S_IWUGO, NULL, store_reset);
-+static DEVICE_ATTR(reset, (S_IWUSR|S_IWGRP), NULL, store_reset);
- static struct attribute *tlclk_sysfs_entries[] = {
-       &dev_attr_current_ref.attr,
-@@ -767,6 +767,7 @@ static int __init tlclk_init(void)
-               printk(KERN_ERR "tlclk: can't get major %d.\n", tlclk_major);
-               return ret;
-       }
-+      tlclk_major = ret;
-       alarm_events = kzalloc( sizeof(struct tlclk_alarms), GFP_KERNEL);
-       if (!alarm_events)
-               goto out1;
-diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
-index 53d3d06..edaee70 100644
---- a/drivers/char/tty_io.c
-+++ b/drivers/char/tty_io.c
-@@ -2706,7 +2706,11 @@ #else
-               }
-               task_lock(p);
-               if (p->files) {
--                      rcu_read_lock();
-+                      /*
-+                       * We don't take a ref to the file, so we must
-+                       * hold ->file_lock instead.
-+                       */
-+                      spin_lock(&p->files->file_lock);
-                       fdt = files_fdtable(p->files);
-                       for (i=0; i < fdt->max_fds; i++) {
-                               filp = fcheck_files(p->files, i);
-@@ -2721,7 +2725,7 @@ #else
-                                       break;
-                               }
-                       }
--                      rcu_read_unlock();
-+                      spin_unlock(&p->files->file_lock);
-               }
-               task_unlock(p);
-       } while_each_task_pid(session, PIDTYPE_SID, p);
-diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig
-index 52f3eb4..7ecdb1e 100644
---- a/drivers/edac/Kconfig
-+++ b/drivers/edac/Kconfig
-@@ -71,7 +71,7 @@ config EDAC_E7XXX
- config EDAC_E752X
-       tristate "Intel e752x (e7520, e7525, e7320)"
--      depends on EDAC_MM_EDAC && PCI
-+      depends on EDAC_MM_EDAC && PCI && HOTPLUG
-       help
-         Support for error detection and correction on the Intel
-         E7520, E7525, E7320 server chipsets.
-diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
-index 8e0f315..dfca749 100644
---- a/drivers/i2c/busses/i2c-i801.c
-+++ b/drivers/i2c/busses/i2c-i801.c
-@@ -478,6 +478,11 @@ static s32 i801_access(struct i2c_adapte
-               ret = i801_transaction();
-       }
-+      /* Some BIOSes don't like it when PEC is enabled at reboot or resume
-+         time, so we forcibly disable it after every transaction. */
-+      if (hwpec)
-+              outb_p(0, SMBAUXCTL);
-+
-       if(block)
-               return ret;
-       if(ret)
-diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c
-index d3478e0..ad44dd5 100644
---- a/drivers/i2c/busses/scx200_acb.c
-+++ b/drivers/i2c/busses/scx200_acb.c
-@@ -440,7 +440,6 @@ static int  __init scx200_acb_create(int
-       struct scx200_acb_iface *iface;
-       struct i2c_adapter *adapter;
-       int rc = 0;
--      char description[64];
-       iface = kzalloc(sizeof(*iface), GFP_KERNEL);
-       if (!iface) {
-@@ -459,8 +458,7 @@ static int  __init scx200_acb_create(int
-       init_MUTEX(&iface->sem);
--      snprintf(description, sizeof(description), "NatSemi SCx200 ACCESS.bus [%s]", adapter->name);
--      if (request_region(base, 8, description) == 0) {
-+      if (!request_region(base, 8, adapter->name)) {
-               dev_err(&adapter->dev, "can't allocate io 0x%x-0x%x\n",
-                       base, base + 8-1);
-               rc = -EBUSY;
-diff --git a/drivers/i2c/chips/m41t00.c b/drivers/i2c/chips/m41t00.c
-index 2dc3d48..2836fb3 100644
---- a/drivers/i2c/chips/m41t00.c
-+++ b/drivers/i2c/chips/m41t00.c
-@@ -129,13 +129,13 @@ m41t00_set_tlet(ulong arg)
-       if ((i2c_smbus_write_byte_data(save_client, 0, tm.tm_sec & 0x7f) < 0)
-               || (i2c_smbus_write_byte_data(save_client, 1, tm.tm_min & 0x7f)
-                       < 0)
--              || (i2c_smbus_write_byte_data(save_client, 2, tm.tm_hour & 0x7f)
-+              || (i2c_smbus_write_byte_data(save_client, 2, tm.tm_hour & 0x3f)
-                       < 0)
--              || (i2c_smbus_write_byte_data(save_client, 4, tm.tm_mday & 0x7f)
-+              || (i2c_smbus_write_byte_data(save_client, 4, tm.tm_mday & 0x3f)
-                       < 0)
--              || (i2c_smbus_write_byte_data(save_client, 5, tm.tm_mon & 0x7f)
-+              || (i2c_smbus_write_byte_data(save_client, 5, tm.tm_mon & 0x1f)
-                       < 0)
--              || (i2c_smbus_write_byte_data(save_client, 6, tm.tm_year & 0x7f)
-+              || (i2c_smbus_write_byte_data(save_client, 6, tm.tm_year & 0xff)
-                       < 0))
-               dev_warn(&save_client->dev,"m41t00: can't write to rtc chip\n");
-diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c
-index cf84350..8b24b4f 100644
---- a/drivers/ide/pci/alim15x3.c
-+++ b/drivers/ide/pci/alim15x3.c
-@@ -731,6 +731,8 @@ static unsigned int __devinit ata66_ali1
-       
-       if(m5229_revision <= 0x20)
-               tmpbyte = (tmpbyte & (~0x02)) | 0x01;
-+      else if (m5229_revision == 0xc7)
-+              tmpbyte |= 0x03;
-       else
-               tmpbyte |= 0x01;
-diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
-index b6b96fa..a9a73f7 100644
---- a/drivers/ieee1394/ohci1394.c
-+++ b/drivers/ieee1394/ohci1394.c
-@@ -2525,7 +2525,7 @@ static irqreturn_t ohci_irq_handler(int 
-                       if (phys_dma) {
-                               reg_write(ohci,OHCI1394_PhyReqFilterHiSet, 0xffffffff);
-                               reg_write(ohci,OHCI1394_PhyReqFilterLoSet, 0xffffffff);
--                              reg_write(ohci,OHCI1394_PhyUpperBound, 0xffff0000);
-+                              reg_write(ohci,OHCI1394_PhyUpperBound, 0x01000000);
-                       } else {
-                               reg_write(ohci,OHCI1394_PhyReqFilterHiSet, 0x00000000);
-                               reg_write(ohci,OHCI1394_PhyReqFilterLoSet, 0x00000000);
-diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
-index eca92eb..d02be4a 100644
---- a/drivers/ieee1394/sbp2.c
-+++ b/drivers/ieee1394/sbp2.c
-@@ -495,22 +495,17 @@ static struct sbp2_command_info *sbp2uti
- /*
-  * This function finds the sbp2_command for a given outstanding SCpnt.
-  * Only looks at the inuse list.
-+ * Must be called with scsi_id->sbp2_command_orb_lock held.
-  */
--static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt)
-+static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(
-+              struct scsi_id_instance_data *scsi_id, void *SCpnt)
- {
-       struct sbp2_command_info *command;
--      unsigned long flags;
--      spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
--      if (!list_empty(&scsi_id->sbp2_command_orb_inuse)) {
--              list_for_each_entry(command, &scsi_id->sbp2_command_orb_inuse, list) {
--                      if (command->Current_SCpnt == SCpnt) {
--                              spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
-+      if (!list_empty(&scsi_id->sbp2_command_orb_inuse))
-+              list_for_each_entry(command, &scsi_id->sbp2_command_orb_inuse, list)
-+                      if (command->Current_SCpnt == SCpnt)
-                               return command;
--                      }
--              }
--      }
--      spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
-       return NULL;
- }
-@@ -579,17 +574,15 @@ static void sbp2util_free_command_dma(st
- /*
-  * This function moves a command to the completed orb list.
-+ * Must be called with scsi_id->sbp2_command_orb_lock held.
-  */
--static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
--                                          struct sbp2_command_info *command)
-+static void sbp2util_mark_command_completed(
-+              struct scsi_id_instance_data *scsi_id,
-+              struct sbp2_command_info *command)
- {
--      unsigned long flags;
--
--      spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
-       list_del(&command->list);
-       sbp2util_free_command_dma(command);
-       list_add_tail(&command->list, &scsi_id->sbp2_command_orb_completed);
--      spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
- }
- /*
-@@ -761,12 +754,17 @@ #endif
-       /* Register the status FIFO address range. We could use the same FIFO
-        * for targets at different nodes. However we need different FIFOs per
--       * target in order to support multi-unit devices. */
-+       * target in order to support multi-unit devices.
-+       * The FIFO is located out of the local host controller's physical range
-+       * but, if possible, within the posted write area. Status writes will
-+       * then be performed as unified transactions. This slightly reduces
-+       * bandwidth usage, and some Prolific based devices seem to require it.
-+       */
-       scsi_id->status_fifo_addr = hpsb_allocate_and_register_addrspace(
-                       &sbp2_highlevel, ud->ne->host, &sbp2_ops,
-                       sizeof(struct sbp2_status_block), sizeof(quadlet_t),
--                      ~0ULL, ~0ULL);
--      if (!scsi_id->status_fifo_addr) {
-+                      0x010000000000ULL, CSR1212_ALL_SPACE_END);
-+      if (scsi_id->status_fifo_addr == ~0ULL) {
-               SBP2_ERR("failed to allocate status FIFO address range");
-               goto failed_alloc;
-       }
-@@ -2177,7 +2175,9 @@ static int sbp2_handle_status_write(stru
-                * Matched status with command, now grab scsi command pointers and check status
-                */
-               SCpnt = command->Current_SCpnt;
-+              spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
-               sbp2util_mark_command_completed(scsi_id, command);
-+              spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
-               if (SCpnt) {
-@@ -2491,9 +2491,20 @@ static int sbp2scsi_slave_alloc(struct s
- static int sbp2scsi_slave_configure(struct scsi_device *sdev)
- {
-+      struct scsi_id_instance_data *scsi_id =
-+              (struct scsi_id_instance_data *)sdev->host->hostdata[0];
-+
-       blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
-       sdev->use_10_for_rw = 1;
-       sdev->use_10_for_ms = 1;
-+
-+      if ((scsi_id->sbp2_firmware_revision & 0xffff00) == 0x0a2700 &&
-+          (scsi_id->ud->model_id == 0x000021 /* gen.4 iPod */ ||
-+           scsi_id->ud->model_id == 0x000023 /* iPod mini  */ ||
-+           scsi_id->ud->model_id == 0x00007e /* iPod Photo */ )) {
-+              SBP2_INFO("enabling iPod workaround: decrement disk capacity");
-+              sdev->fix_capacity = 1;
-+      }
-       return 0;
- }
-@@ -2513,6 +2524,7 @@ static int sbp2scsi_abort(struct scsi_cm
-               (struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
-       struct sbp2scsi_host_info *hi = scsi_id->hi;
-       struct sbp2_command_info *command;
-+      unsigned long flags;
-       SBP2_ERR("aborting sbp2 command");
-       scsi_print_command(SCpnt);
-@@ -2523,6 +2535,7 @@ static int sbp2scsi_abort(struct scsi_cm
-                * Right now, just return any matching command structures
-                * to the free pool.
-                */
-+              spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
-               command = sbp2util_find_command_for_SCpnt(scsi_id, SCpnt);
-               if (command) {
-                       SBP2_DEBUG("Found command to abort");
-@@ -2540,6 +2553,7 @@ static int sbp2scsi_abort(struct scsi_cm
-                               command->Current_done(command->Current_SCpnt);
-                       }
-               }
-+              spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
-               /*
-                * Initiate a fetch agent reset.
-diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
-index ad62174..b2bed1a 100644
---- a/drivers/input/mouse/psmouse-base.c
-+++ b/drivers/input/mouse/psmouse-base.c
-@@ -300,8 +300,10 @@ static irqreturn_t psmouse_interrupt(str
-  * Check if this is a new device announcement (0xAA 0x00)
-  */
-       if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) {
--              if (psmouse->pktcnt == 1)
-+              if (psmouse->pktcnt == 1) {
-+                      psmouse->last = jiffies;
-                       goto out;
-+              }
-               if (psmouse->packet[1] == PSMOUSE_RET_ID) {
-                       __psmouse_set_state(psmouse, PSMOUSE_IGNORE);
-diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c
-index 5ebfd1d..5282fec 100644
---- a/drivers/macintosh/therm_adt746x.c
-+++ b/drivers/macintosh/therm_adt746x.c
-@@ -627,8 +627,8 @@ thermostat_init(void)
-       if(therm_type == ADT7460)
-               device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
--#ifndef CONFIG_I2C_KEYWEST
--      request_module("i2c-keywest");
-+#ifndef CONFIG_I2C_POWERMAC
-+      request_module("i2c-powermac");
- #endif
-       return i2c_add_driver(&thermostat_driver);
-diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
-index f3759dd..1ed241d 100644
---- a/drivers/md/dm-snap.c
-+++ b/drivers/md/dm-snap.c
-@@ -542,8 +542,12 @@ static void snapshot_dtr(struct dm_targe
- {
-       struct dm_snapshot *s = (struct dm_snapshot *) ti->private;
-+      /* Prevent further origin writes from using this snapshot. */
-+      /* After this returns there can be no new kcopyd jobs. */
-       unregister_snapshot(s);
-+      kcopyd_client_destroy(s->kcopyd_client);
-+
-       exit_exception_table(&s->pending, pending_cache);
-       exit_exception_table(&s->complete, exception_cache);
-@@ -552,7 +556,7 @@ static void snapshot_dtr(struct dm_targe
-       dm_put_device(ti, s->origin);
-       dm_put_device(ti, s->cow);
--      kcopyd_client_destroy(s->kcopyd_client);
-+
-       kfree(s);
- }
-diff --git a/drivers/md/dm.c b/drivers/md/dm.c
-index 745ca1f..f6c8e8e 100644
---- a/drivers/md/dm.c
-+++ b/drivers/md/dm.c
-@@ -533,30 +533,35 @@ static void __clone_and_map(struct clone
-       } else {
-               /*
--               * Create two copy bios to deal with io that has
--               * been split across a target.
-+               * Handle a bvec that must be split between two or more targets.
-                */
-               struct bio_vec *bv = bio->bi_io_vec + ci->idx;
-+              sector_t remaining = to_sector(bv->bv_len);
-+              unsigned int offset = 0;
--              clone = split_bvec(bio, ci->sector, ci->idx,
--                                 bv->bv_offset, max);
--              __map_bio(ti, clone, tio);
-+              do {
-+                      if (offset) {
-+                              ti = dm_table_find_target(ci->map, ci->sector);
-+                              max = max_io_len(ci->md, ci->sector, ti);
--              ci->sector += max;
--              ci->sector_count -= max;
--              ti = dm_table_find_target(ci->map, ci->sector);
--
--              len = to_sector(bv->bv_len) - max;
--              clone = split_bvec(bio, ci->sector, ci->idx,
--                                 bv->bv_offset + to_bytes(max), len);
--              tio = alloc_tio(ci->md);
--              tio->io = ci->io;
--              tio->ti = ti;
--              memset(&tio->info, 0, sizeof(tio->info));
--              __map_bio(ti, clone, tio);
-+                              tio = alloc_tio(ci->md);
-+                              tio->io = ci->io;
-+                              tio->ti = ti;
-+                              memset(&tio->info, 0, sizeof(tio->info));
-+                      }
-+
-+                      len = min(remaining, max);
-+
-+                      clone = split_bvec(bio, ci->sector, ci->idx,
-+                                         bv->bv_offset + offset, len);
-+
-+                      __map_bio(ti, clone, tio);
-+
-+                      ci->sector += len;
-+                      ci->sector_count -= len;
-+                      offset += to_bytes(len);
-+              } while (remaining -= len);
--              ci->sector += len;
--              ci->sector_count -= len;
-               ci->idx++;
-       }
- }
-@@ -1093,6 +1098,7 @@ int dm_suspend(struct mapped_device *md,
- {
-       struct dm_table *map = NULL;
-       DECLARE_WAITQUEUE(wait, current);
-+      struct bio *def;
-       int r = -EINVAL;
-       down(&md->suspend_lock);
-@@ -1152,9 +1158,11 @@ int dm_suspend(struct mapped_device *md,
-       /* were we interrupted ? */
-       r = -EINTR;
-       if (atomic_read(&md->pending)) {
-+              clear_bit(DMF_BLOCK_IO, &md->flags);
-+              def = bio_list_get(&md->deferred);
-+              __flush_deferred_io(md, def);
-               up_write(&md->io_lock);
-               unlock_fs(md);
--              clear_bit(DMF_BLOCK_IO, &md->flags);
-               goto out;
-       }
-       up_write(&md->io_lock);
-diff --git a/drivers/md/kcopyd.c b/drivers/md/kcopyd.c
-index 8b3515f..fc009cb 100644
---- a/drivers/md/kcopyd.c
-+++ b/drivers/md/kcopyd.c
-@@ -44,6 +44,9 @@ struct kcopyd_client {
-       struct page_list *pages;
-       unsigned int nr_pages;
-       unsigned int nr_free_pages;
-+
-+      wait_queue_head_t destroyq;
-+      atomic_t nr_jobs;
- };
- static struct page_list *alloc_pl(void)
-@@ -293,10 +296,15 @@ static int run_complete_job(struct kcopy
-       int read_err = job->read_err;
-       unsigned int write_err = job->write_err;
-       kcopyd_notify_fn fn = job->fn;
-+      struct kcopyd_client *kc = job->kc;
--      kcopyd_put_pages(job->kc, job->pages);
-+      kcopyd_put_pages(kc, job->pages);
-       mempool_free(job, _job_pool);
-       fn(read_err, write_err, context);
-+
-+      if (atomic_dec_and_test(&kc->nr_jobs))
-+              wake_up(&kc->destroyq);
-+
-       return 0;
- }
-@@ -431,6 +439,7 @@ static void do_work(void *ignored)
-  */
- static void dispatch_job(struct kcopyd_job *job)
- {
-+      atomic_inc(&job->kc->nr_jobs);
-       push(&_pages_jobs, job);
-       wake();
- }
-@@ -670,6 +679,9 @@ int kcopyd_client_create(unsigned int nr
-               return r;
-       }
-+      init_waitqueue_head(&kc->destroyq);
-+      atomic_set(&kc->nr_jobs, 0);
-+
-       client_add(kc);
-       *result = kc;
-       return 0;
-@@ -677,6 +689,9 @@ int kcopyd_client_create(unsigned int nr
- void kcopyd_client_destroy(struct kcopyd_client *kc)
- {
-+      /* Wait for completion of all jobs submitted by this client. */
-+      wait_event(kc->destroyq, !atomic_read(&kc->nr_jobs));
-+
-       dm_io_put(kc->nr_pages);
-       client_free_pages(kc);
-       client_del(kc);
-diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
-index ab90a6d..039ed49 100644
---- a/drivers/md/raid10.c
-+++ b/drivers/md/raid10.c
-@@ -1436,9 +1436,9 @@ static void raid10d(mddev_t *mddev)
-                                               sl--;
-                                               d = r10_bio->devs[sl].devnum;
-                                               rdev = conf->mirrors[d].rdev;
--                                              atomic_add(s, &rdev->corrected_errors);
-                                               if (rdev &&
-                                                   test_bit(In_sync, &rdev->flags)) {
-+                                                      atomic_add(s, &rdev->corrected_errors);
-                                                       if (sync_page_io(rdev->bdev,
-                                                                        r10_bio->devs[sl].addr +
-                                                                        sect + rdev->data_offset,
-diff --git a/drivers/media/dvb/dvb-usb/cxusb.c b/drivers/media/dvb/dvb-usb/cxusb.c
-index 162f979..356a09a 100644
---- a/drivers/media/dvb/dvb-usb/cxusb.c
-+++ b/drivers/media/dvb/dvb-usb/cxusb.c
-@@ -149,6 +149,15 @@ static int cxusb_power_ctrl(struct dvb_u
-               return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
- }
-+static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
-+{
-+      u8 b = 0;
-+      if (onoff)
-+              return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
-+      else
-+              return 0;
-+}
-+
- static int cxusb_streaming_ctrl(struct dvb_usb_device *d, int onoff)
- {
-       u8 buf[2] = { 0x03, 0x00 };
-@@ -505,7 +514,7 @@ static struct dvb_usb_properties cxusb_b
-       .size_of_priv     = sizeof(struct cxusb_state),
-       .streaming_ctrl   = cxusb_streaming_ctrl,
--      .power_ctrl       = cxusb_power_ctrl,
-+      .power_ctrl       = cxusb_bluebird_power_ctrl,
-       .frontend_attach  = cxusb_lgdt3303_frontend_attach,
-       .tuner_attach     = cxusb_lgh064f_tuner_attach,
-@@ -545,7 +554,7 @@ static struct dvb_usb_properties cxusb_b
-       .size_of_priv     = sizeof(struct cxusb_state),
-       .streaming_ctrl   = cxusb_streaming_ctrl,
--      .power_ctrl       = cxusb_power_ctrl,
-+      .power_ctrl       = cxusb_bluebird_power_ctrl,
-       .frontend_attach  = cxusb_dee1601_frontend_attach,
-       .tuner_attach     = cxusb_dee1601_tuner_attach,
-@@ -594,7 +603,7 @@ static struct dvb_usb_properties cxusb_b
-       .size_of_priv     = sizeof(struct cxusb_state),
-       .streaming_ctrl   = cxusb_streaming_ctrl,
--      .power_ctrl       = cxusb_power_ctrl,
-+      .power_ctrl       = cxusb_bluebird_power_ctrl,
-       .frontend_attach  = cxusb_mt352_frontend_attach,
-       .tuner_attach     = cxusb_lgz201_tuner_attach,
-@@ -634,7 +643,7 @@ static struct dvb_usb_properties cxusb_b
-       .size_of_priv     = sizeof(struct cxusb_state),
-       .streaming_ctrl   = cxusb_streaming_ctrl,
--      .power_ctrl       = cxusb_power_ctrl,
-+      .power_ctrl       = cxusb_bluebird_power_ctrl,
-       .frontend_attach  = cxusb_mt352_frontend_attach,
-       .tuner_attach     = cxusb_dtt7579_tuner_attach,
-diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
-index d82c8a3..ef42a26 100644
---- a/drivers/media/video/Kconfig
-+++ b/drivers/media/video/Kconfig
-@@ -349,6 +349,7 @@ config VIDEO_AUDIO_DECODER
- config VIDEO_DECODER
-       tristate "Add support for additional video chipsets"
-       depends on VIDEO_DEV && I2C && EXPERIMENTAL
-+      select FW_LOADER
-       ---help---
-         Say Y here to compile drivers for SAA7115, SAA7127 and CX25840
-         video decoders.
-diff --git a/drivers/media/video/saa7127.c b/drivers/media/video/saa7127.c
-index 992c717..9e4c178 100644
---- a/drivers/media/video/saa7127.c
-+++ b/drivers/media/video/saa7127.c
-@@ -141,6 +141,7 @@ struct i2c_reg_value {
- static const struct i2c_reg_value saa7129_init_config_extra[] = {
-       { SAA7127_REG_OUTPUT_PORT_CONTROL,              0x38 },
-       { SAA7127_REG_VTRIG,                            0xfa },
-+      { 0, 0 }
- };
- static const struct i2c_reg_value saa7127_init_config_common[] = {
-diff --git a/drivers/media/video/tuner-types.c b/drivers/media/video/tuner-types.c
-index 6fe7817..5f3d46d 100644
---- a/drivers/media/video/tuner-types.c
-+++ b/drivers/media/video/tuner-types.c
-@@ -1087,8 +1087,8 @@ static struct tuner_params tuner_tnf_533
- /* ------------ TUNER_SAMSUNG_TCPN_2121P30A - Samsung NTSC ------------ */
- static struct tuner_range tuner_samsung_tcpn_2121p30a_ntsc_ranges[] = {
--      { 16 * 175.75 /*MHz*/, 0x01, },
--      { 16 * 410.25 /*MHz*/, 0x02, },
-+      { 16 * 130.00 /*MHz*/, 0x01, },
-+      { 16 * 364.50 /*MHz*/, 0x02, },
-       { 16 * 999.99        , 0x08, },
- };
-diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
-index 1fc4c13..cfe288a 100644
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -178,17 +178,16 @@ config MTD_NAND_DISKONCHIP_BBTWRITE
-         Even if you leave this disabled, you can enable BBT writes at module
-         load time (assuming you build diskonchip as a module) with the module
-         parameter "inftl_bbt_write=1".
--        
-- config MTD_NAND_SHARPSL
--      bool "Support for NAND Flash on Sharp SL Series (C7xx + others)"
--      depends on MTD_NAND && ARCH_PXA
-- 
-- config MTD_NAND_NANDSIM
--      bool "Support for NAND Flash Simulator"
--      depends on MTD_NAND && MTD_PARTITIONS
-+config MTD_NAND_SHARPSL
-+      tristate "Support for NAND Flash on Sharp SL Series (C7xx + others)"
-+      depends on MTD_NAND && ARCH_PXA
-+
-+config MTD_NAND_NANDSIM
-+      tristate "Support for NAND Flash Simulator"
-+      depends on MTD_NAND && MTD_PARTITIONS
-       help
-         The simulator may simulate verious NAND flash chips for the
-         MTD nand layer.
-- 
-+
- endmenu
-diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
-index 84dcca3..fa29402 100644
---- a/drivers/net/e1000/e1000_main.c
-+++ b/drivers/net/e1000/e1000_main.c
-@@ -3851,6 +3851,7 @@ #endif
-                       skb_shinfo(skb)->nr_frags++;
-                       skb->len += length;
-                       skb->data_len += length;
-+                      skb->truesize += length;
-               }
-               e1000_rx_checksum(adapter, staterr,
-diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c
-index 8936058..6e2ec56 100644
---- a/drivers/net/irda/irda-usb.c
-+++ b/drivers/net/irda/irda-usb.c
-@@ -740,7 +740,7 @@ static void irda_usb_receive(struct urb 
-       struct sk_buff *newskb;
-       struct sk_buff *dataskb;
-       struct urb *next_urb;
--      int             docopy;
-+      unsigned int len, docopy;
-       IRDA_DEBUG(2, "%s(), len=%d\n", __FUNCTION__, urb->actual_length);
-       
-@@ -851,10 +851,11 @@ static void irda_usb_receive(struct urb 
-       dataskb->dev = self->netdev;
-       dataskb->mac.raw  = dataskb->data;
-       dataskb->protocol = htons(ETH_P_IRDA);
-+      len = dataskb->len;
-       netif_rx(dataskb);
-       /* Keep stats up to date */
--      self->stats.rx_bytes += dataskb->len;
-+      self->stats.rx_bytes += len;
-       self->stats.rx_packets++;
-       self->netdev->last_rx = jiffies;
-diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
-index 7326036..0618cd5 100644
---- a/drivers/net/sky2.c
-+++ b/drivers/net/sky2.c
-@@ -579,8 +579,8 @@ static void sky2_mac_init(struct sky2_hw
-       reg = gma_read16(hw, port, GM_PHY_ADDR);
-       gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR);
--      for (i = 0; i < GM_MIB_CNT_SIZE; i++)
--              gma_read16(hw, port, GM_MIB_CNT_BASE + 8 * i);
-+      for (i = GM_MIB_CNT_BASE; i <= GM_MIB_CNT_END; i += 4)
-+              gma_read16(hw, port, i);
-       gma_write16(hw, port, GM_PHY_ADDR, reg);
-       /* transmit control */
-diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h
-index dce955c..c91e0a4 100644
---- a/drivers/net/sky2.h
-+++ b/drivers/net/sky2.h
-@@ -1380,6 +1380,7 @@ enum {
- /* MIB Counters */
- #define GM_MIB_CNT_BASE       0x0100          /* Base Address of MIB Counters */
- #define GM_MIB_CNT_SIZE       44              /* Number of MIB Counters */
-+#define GM_MIB_CNT_END        0x025C          /* Last MIB counter */
- /*
-  * MIB Counters base address definitions (low word) -
-diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
-index caf4102..7d00722 100644
---- a/drivers/net/tg3.c
-+++ b/drivers/net/tg3.c
-@@ -7368,21 +7368,23 @@ static int tg3_get_settings(struct net_d
-               cmd->supported |= (SUPPORTED_1000baseT_Half |
-                                  SUPPORTED_1000baseT_Full);
--      if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES))
-+      if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) {
-               cmd->supported |= (SUPPORTED_100baseT_Half |
-                                 SUPPORTED_100baseT_Full |
-                                 SUPPORTED_10baseT_Half |
-                                 SUPPORTED_10baseT_Full |
-                                 SUPPORTED_MII);
--      else
-+              cmd->port = PORT_TP;
-+      } else {
-               cmd->supported |= SUPPORTED_FIBRE;
-+              cmd->port = PORT_FIBRE;
-+      }
-   
-       cmd->advertising = tp->link_config.advertising;
-       if (netif_running(dev)) {
-               cmd->speed = tp->link_config.active_speed;
-               cmd->duplex = tp->link_config.active_duplex;
-       }
--      cmd->port = 0;
-       cmd->phy_address = PHY_ADDR;
-       cmd->transceiver = 0;
-       cmd->autoneg = tp->link_config.autoneg;
-diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c
-index 2418715..56864ff 100644
---- a/drivers/net/via-rhine.c
-+++ b/drivers/net/via-rhine.c
-@@ -129,6 +129,7 @@
-       - Massive clean-up
-       - Rewrite PHY, media handling (remove options, full_duplex, backoff)
-       - Fix Tx engine race for good
-+      - Craig Brind: Zero padded aligned buffers for short packets.
- */
-@@ -1306,7 +1307,12 @@ static int rhine_start_tx(struct sk_buff
-                       rp->stats.tx_dropped++;
-                       return 0;
-               }
-+
-+              /* Padding is not copied and so must be redone. */
-               skb_copy_and_csum_dev(skb, rp->tx_buf[entry]);
-+              if (skb->len < ETH_ZLEN)
-+                      memset(rp->tx_buf[entry] + skb->len, 0,
-+                             ETH_ZLEN - skb->len);
-               rp->tx_skbuff_dma[entry] = 0;
-               rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_bufs_dma +
-                                                     (rp->tx_buf[entry] -
-diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig
-index ef85d76..8101657 100644
---- a/drivers/net/wireless/Kconfig
-+++ b/drivers/net/wireless/Kconfig
-@@ -239,7 +239,8 @@ config IPW2200_DEBUG
- config AIRO
-       tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards"
--      depends on NET_RADIO && ISA_DMA_API && CRYPTO && (PCI || BROKEN)
-+      depends on NET_RADIO && ISA_DMA_API && (PCI || BROKEN)
-+      select CRYPTO
-       ---help---
-         This is the standard Linux driver to support Cisco/Aironet ISA and
-         PCI 802.11 wireless cards.
-@@ -374,6 +375,7 @@ config PCMCIA_HERMES
- config PCMCIA_SPECTRUM
-       tristate "Symbol Spectrum24 Trilogy PCMCIA card support"
-       depends on NET_RADIO && PCMCIA && HERMES
-+      select FW_LOADER
-       ---help---
-         This is a driver for 802.11b cards using RAM-loadable Symbol
-@@ -387,6 +389,7 @@ config PCMCIA_SPECTRUM
- config AIRO_CS
-       tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
-       depends on NET_RADIO && PCMCIA && (BROKEN || !M32R)
-+      select CRYPTO
-       ---help---
-         This is the standard Linux driver to support Cisco/Aironet PCMCIA
-         802.11 wireless cards.  This driver is the same as the Aironet
-diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c
-index 4a85e63..5f398bd 100644
---- a/drivers/net/wireless/hostap/hostap_80211_tx.c
-+++ b/drivers/net/wireless/hostap/hostap_80211_tx.c
-@@ -469,7 +469,7 @@ int hostap_master_start_xmit(struct sk_b
-       }
-       if (local->ieee_802_1x && meta->ethertype == ETH_P_PAE && tx.crypt &&
--          !(fc & IEEE80211_FCTL_VERS)) {
-+          !(fc & IEEE80211_FCTL_PROTECTED)) {
-               no_encrypt = 1;
-               PDEBUG(DEBUG_EXTRA2, "%s: TX: IEEE 802.1X - passing "
-                      "unencrypted EAPOL frame\n", dev->name);
-diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
-index 287676a..f42e51a 100644
---- a/drivers/net/wireless/ipw2200.c
-+++ b/drivers/net/wireless/ipw2200.c
-@@ -8391,20 +8391,28 @@ static int ipw_wx_get_range(struct net_d
-       i = 0;
-       if (priv->ieee->mode & (IEEE_B | IEEE_G)) {
--              for (j = 0; j < geo->bg_channels && i < IW_MAX_FREQUENCIES;
--                   i++, j++) {
-+              for (j = 0; j < geo->bg_channels && i < IW_MAX_FREQUENCIES; j++) {
-+                      if ((priv->ieee->iw_mode == IW_MODE_ADHOC) &&
-+                          (geo->bg[j].flags & IEEE80211_CH_PASSIVE_ONLY))
-+                              continue;
-+
-                       range->freq[i].i = geo->bg[j].channel;
-                       range->freq[i].m = geo->bg[j].freq * 100000;
-                       range->freq[i].e = 1;
-+                      i++;
-               }
-       }
-       if (priv->ieee->mode & IEEE_A) {
--              for (j = 0; j < geo->a_channels && i < IW_MAX_FREQUENCIES;
--                   i++, j++) {
-+              for (j = 0; j < geo->a_channels && i < IW_MAX_FREQUENCIES; j++) {
-+                      if ((priv->ieee->iw_mode == IW_MODE_ADHOC) &&
-+                          (geo->a[j].flags & IEEE80211_CH_PASSIVE_ONLY))
-+                              continue;
-+
-                       range->freq[i].i = geo->a[j].channel;
-                       range->freq[i].m = geo->a[j].freq * 100000;
-                       range->freq[i].e = 1;
-+                      i++;
-               }
-       }
-@@ -9956,9 +9964,8 @@ static int ipw_ethtool_set_eeprom(struct
-               return -EINVAL;
-       down(&p->sem);
-       memcpy(&p->eeprom[eeprom->offset], bytes, eeprom->len);
--      for (i = IPW_EEPROM_DATA;
--           i < IPW_EEPROM_DATA + IPW_EEPROM_IMAGE_SIZE; i++)
--              ipw_write8(p, i, p->eeprom[i]);
-+      for (i = 0; i < IPW_EEPROM_IMAGE_SIZE; i++)
-+              ipw_write8(p, i + IPW_EEPROM_DATA, p->eeprom[i]);
-       up(&p->sem);
-       return 0;
- }
-diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
-index 6917c6c..c2ecae5 100644
---- a/drivers/pci/pci-acpi.c
-+++ b/drivers/pci/pci-acpi.c
-@@ -33,13 +33,10 @@ acpi_query_osc (
-       acpi_status             status;
-       struct acpi_object_list input;
-       union acpi_object       in_params[4];
--      struct acpi_buffer      output;
--      union acpi_object       out_obj;        
-+      struct acpi_buffer      output = {ACPI_ALLOCATE_BUFFER, NULL};
-+      union acpi_object       *out_obj;
-       u32                     osc_dw0;
--      /* Setting up output buffer */
--      output.length = sizeof(out_obj) + 3*sizeof(u32);  
--      output.pointer = &out_obj;
-       
-       /* Setting up input parameters */
-       input.count = 4;
-@@ -61,12 +58,15 @@ acpi_query_osc (
-                       "Evaluate _OSC Set fails. Status = 0x%04x\n", status);
-               return status;
-       }
--      if (out_obj.type != ACPI_TYPE_BUFFER) {
-+      out_obj = output.pointer;
-+
-+      if (out_obj->type != ACPI_TYPE_BUFFER) {
-               printk(KERN_DEBUG  
-                       "Evaluate _OSC returns wrong type\n");
--              return AE_TYPE;
-+              status = AE_TYPE;
-+              goto query_osc_out;
-       }
--      osc_dw0 = *((u32 *) out_obj.buffer.pointer);
-+      osc_dw0 = *((u32 *) out_obj->buffer.pointer);
-       if (osc_dw0) {
-               if (osc_dw0 & OSC_REQUEST_ERROR)
-                       printk(KERN_DEBUG "_OSC request fails\n"); 
-@@ -76,15 +76,21 @@ acpi_query_osc (
-                       printk(KERN_DEBUG "_OSC invalid revision\n"); 
-               if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) {
-                       /* Update Global Control Set */
--                      global_ctrlsets = *((u32 *)(out_obj.buffer.pointer+8));
--                      return AE_OK;
-+                      global_ctrlsets = *((u32 *)(out_obj->buffer.pointer+8));
-+                      status = AE_OK;
-+                      goto query_osc_out;
-               }
--              return AE_ERROR;
-+              status = AE_ERROR;
-+              goto query_osc_out;
-       }
-       /* Update Global Control Set */
--      global_ctrlsets = *((u32 *)(out_obj.buffer.pointer + 8));
--      return AE_OK;
-+      global_ctrlsets = *((u32 *)(out_obj->buffer.pointer + 8));
-+      status = AE_OK;
-+
-+query_osc_out:
-+      kfree(output.pointer);
-+      return status;
- }
-@@ -96,14 +102,10 @@ acpi_run_osc (
-       acpi_status             status;
-       struct acpi_object_list input;
-       union acpi_object       in_params[4];
--      struct acpi_buffer      output;
--      union acpi_object       out_obj;        
-+      struct acpi_buffer      output = {ACPI_ALLOCATE_BUFFER, NULL};
-+      union acpi_object       *out_obj;
-       u32                     osc_dw0;
--      /* Setting up output buffer */
--      output.length = sizeof(out_obj) + 3*sizeof(u32);  
--      output.pointer = &out_obj;
--      
-       /* Setting up input parameters */
-       input.count = 4;
-       input.pointer = in_params;
-@@ -124,12 +126,14 @@ acpi_run_osc (
-                       "Evaluate _OSC Set fails. Status = 0x%04x\n", status);
-               return status;
-       }
--      if (out_obj.type != ACPI_TYPE_BUFFER) {
-+      out_obj = output.pointer;
-+      if (out_obj->type != ACPI_TYPE_BUFFER) {
-               printk(KERN_DEBUG  
-                       "Evaluate _OSC returns wrong type\n");
--              return AE_TYPE;
-+              status = AE_TYPE;
-+              goto run_osc_out;
-       }
--      osc_dw0 = *((u32 *) out_obj.buffer.pointer);
-+      osc_dw0 = *((u32 *) out_obj->buffer.pointer);
-       if (osc_dw0) {
-               if (osc_dw0 & OSC_REQUEST_ERROR)
-                       printk(KERN_DEBUG "_OSC request fails\n"); 
-@@ -139,11 +143,17 @@ acpi_run_osc (
-                       printk(KERN_DEBUG "_OSC invalid revision\n"); 
-               if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) {
-                       printk(KERN_DEBUG "_OSC FW not grant req. control\n");
--                      return AE_SUPPORT;
-+                      status = AE_SUPPORT;
-+                      goto run_osc_out;
-               }
--              return AE_ERROR;
-+              status = AE_ERROR;
-+              goto run_osc_out;
-       }
--      return AE_OK;
-+      status = AE_OK;
-+
-+run_osc_out:
-+      kfree(output.pointer);
-+      return status;
- }
- /**
-diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
-index dda6099..381f36b 100644
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -631,6 +631,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_V
-  * non-x86 architectures (yes Via exists on PPC among other places),
-  * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get
-  * interrupts delivered properly.
-+ *
-+ * Some of the on-chip devices are actually '586 devices' so they are
-+ * listed here.
-  */
- static void quirk_via_irq(struct pci_dev *dev)
- {
-@@ -639,13 +642,19 @@ static void quirk_via_irq(struct pci_dev
-       new_irq = dev->irq & 0xf;
-       pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
-       if (new_irq != irq) {
--              printk(KERN_INFO "PCI: Via IRQ fixup for %s, from %d to %d\n",
-+              printk(KERN_INFO "PCI: VIA IRQ fixup for %s, from %d to %d\n",
-                       pci_name(dev), irq, new_irq);
-               udelay(15);     /* unknown if delay really needed */
-               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq);
-       }
- }
--DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_irq);
-+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_via_irq);
-+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, quirk_via_irq);
-+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irq);
-+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_irq);
-+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_irq);
-+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_irq);
-+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irq);
- /*
-  * VIA VT82C598 has its device ID settable and many BIOSes
-@@ -861,6 +870,7 @@ static void __init quirk_eisa_bridge(str
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375,      quirk_eisa_bridge );
-+#ifndef CONFIG_ACPI_SLEEP
- /*
-  * On ASUS P4B boards, the SMBus PCI Device within the ICH2/4 southbridge
-  * is not activated. The myth is that Asus said that they do not want the
-@@ -872,8 +882,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
-  * bridge. Unfortunately, this device has no subvendor/subdevice ID. So it 
-  * becomes necessary to do this tweak in two steps -- I've chosen the Host
-  * bridge as trigger.
-+ *
-+ * Actually, leaving it unhidden and not redoing the quirk over suspend2ram
-+ * will cause thermal management to break down, and causing machine to
-+ * overheat.
-  */
--static int __initdata asus_hides_smbus = 0;
-+static int __initdata asus_hides_smbus;
- static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev)
- {
-@@ -1008,6 +1022,8 @@ static void __init asus_hides_smbus_lpc_
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1,     asus_hides_smbus_lpc_ich6 );
-+#endif
-+
- /*
-  * SiS 96x south bridge: BIOS typically hides SMBus device...
-  */
-diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
-index bb96ce1..a4333a8 100644
---- a/drivers/pcmcia/ds.c
-+++ b/drivers/pcmcia/ds.c
-@@ -546,7 +546,7 @@ static int pcmcia_device_query(struct pc
-                       tmp = vers1->str + vers1->ofs[i];
-                       length = strlen(tmp) + 1;
--                      if ((length < 3) || (length > 255))
-+                      if ((length < 2) || (length > 255))
-                               continue;
-                       p_dev->prod_id[i] = kmalloc(sizeof(char) * length,
-diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
-index d9152d0..9132549 100644
---- a/drivers/scsi/3w-9xxx.c
-+++ b/drivers/scsi/3w-9xxx.c
-@@ -85,7 +85,7 @@ #include <scsi/scsi_cmnd.h>
- #include "3w-9xxx.h"
- /* Globals */
--#define TW_DRIVER_VERSION "2.26.02.005"
-+#define TW_DRIVER_VERSION "2.26.02.007"
- static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
- static unsigned int twa_device_extension_count;
- static int twa_major = -1;
-@@ -1944,9 +1944,13 @@ static void twa_scsiop_execute_scsi_comp
-               }
-               if (tw_dev->srb[request_id]->use_sg == 1) {
-                       struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
--                      char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
-+                      char *buf;
-+                      unsigned long flags = 0;
-+                      local_irq_save(flags);
-+                      buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
-                       memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length);
-                       kunmap_atomic(buf - sg->offset, KM_IRQ0);
-+                      local_irq_restore(flags);
-               }
-       }
- } /* End twa_scsiop_execute_scsi_complete() */
-diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
-index 25f678d..e8e41e6 100644
---- a/drivers/scsi/3w-xxxx.c
-+++ b/drivers/scsi/3w-xxxx.c
-@@ -1508,10 +1508,12 @@ static void tw_transfer_internal(TW_Devi
-       struct scsi_cmnd *cmd = tw_dev->srb[request_id];
-       void *buf;
-       unsigned int transfer_len;
-+      unsigned long flags = 0;
-       if (cmd->use_sg) {
-               struct scatterlist *sg =
-                       (struct scatterlist *)cmd->request_buffer;
-+              local_irq_save(flags);
-               buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
-               transfer_len = min(sg->length, len);
-       } else {
-@@ -1526,6 +1528,7 @@ static void tw_transfer_internal(TW_Devi
-               sg = (struct scatterlist *)cmd->request_buffer;
-               kunmap_atomic(buf - sg->offset, KM_IRQ0);
-+              local_irq_restore(flags);
-       }
- }
-diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
-index 4f91b0d..400e9d7 100644
---- a/drivers/scsi/libata-core.c
-+++ b/drivers/scsi/libata-core.c
-@@ -4293,6 +4293,7 @@ static int ata_start_drive(struct ata_po
- int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
- {
-       if (ap->flags & ATA_FLAG_SUSPENDED) {
-+              ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 200000);
-               ap->flags &= ~ATA_FLAG_SUSPENDED;
-               ata_set_mode(ap);
-       }
-diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c
-index 2770005..b00af08 100644
---- a/drivers/scsi/sata_mv.c
-+++ b/drivers/scsi/sata_mv.c
-@@ -1102,6 +1102,7 @@ static u8 mv_get_crpb_status(struct ata_
-       void __iomem *port_mmio = mv_ap_base(ap);
-       struct mv_port_priv *pp = ap->private_data;
-       u32 out_ptr;
-+      u8 ata_status;
-       out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
-@@ -1109,6 +1110,8 @@ static u8 mv_get_crpb_status(struct ata_
-       assert(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) ==
-              pp->rsp_consumer);
-+      ata_status = pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT;
-+
-       /* increment our consumer index... */
-       pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer);
-@@ -1123,7 +1126,7 @@ static u8 mv_get_crpb_status(struct ata_
-       writelfl(out_ptr, port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);
-       /* Return ATA status register for completed CRPB */
--      return (pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT);
-+      return ata_status;
- }
- /**
-@@ -1192,7 +1195,6 @@ static void mv_host_intr(struct ata_host
-       u32 hc_irq_cause;
-       int shift, port, port0, hard_port, handled;
-       unsigned int err_mask;
--      u8 ata_status = 0;
-       if (hc == 0) {
-               port0 = 0;
-@@ -1210,6 +1212,7 @@ static void mv_host_intr(struct ata_host
-               hc,relevant,hc_irq_cause);
-       for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) {
-+              u8 ata_status = 0;
-               ap = host_set->ports[port];
-               hard_port = port & MV_PORT_MASK;        /* range 0-3 */
-               handled = 0;    /* ensure ata_status is set if handled++ */
-diff --git a/drivers/sn/ioc3.c b/drivers/sn/ioc3.c
-index 93449a1..4bd05a0 100644
---- a/drivers/sn/ioc3.c
-+++ b/drivers/sn/ioc3.c
-@@ -677,7 +677,7 @@ #endif
-       /* Track PCI-device specific data */
-       pci_set_drvdata(pdev, idd);
-       down_write(&ioc3_devices_rwsem);
--      list_add(&idd->list, &ioc3_devices);
-+      list_add_tail(&idd->list, &ioc3_devices);
-       idd->id = ioc3_counter++;
-       up_write(&ioc3_devices_rwsem);
-diff --git a/drivers/sn/ioc4.c b/drivers/sn/ioc4.c
-index ea75b3d..771e868 100644
---- a/drivers/sn/ioc4.c
-+++ b/drivers/sn/ioc4.c
-@@ -313,7 +313,7 @@ ioc4_probe(struct pci_dev *pdev, const s
-       idd->idd_serial_data = NULL;
-       pci_set_drvdata(idd->idd_pdev, idd);
-       down_write(&ioc4_devices_rwsem);
--      list_add(&idd->idd_list, &ioc4_devices);
-+      list_add_tail(&idd->idd_list, &ioc4_devices);
-       up_write(&ioc4_devices_rwsem);
-       /* Add this IOC4 to all submodules */
-diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
-index 7135e54..96cabeb 100644
---- a/drivers/usb/core/message.c
-+++ b/drivers/usb/core/message.c
-@@ -1388,11 +1388,13 @@ free_interfaces:
-       if (dev->state != USB_STATE_ADDRESS)
-               usb_disable_device (dev, 1);    // Skip ep0
--      i = dev->bus_mA - cp->desc.bMaxPower * 2;
--      if (i < 0)
--              dev_warn(&dev->dev, "new config #%d exceeds power "
--                              "limit by %dmA\n",
--                              configuration, -i);
-+      if (cp) {
-+              i = dev->bus_mA - cp->desc.bMaxPower * 2;
-+              if (i < 0)
-+                      dev_warn(&dev->dev, "new config #%d exceeds power "
-+                                      "limit by %dmA\n",
-+                                      configuration, -i);
-+      }
-       if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
-                       USB_REQ_SET_CONFIGURATION, 0, configuration, 0,
-diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
-index ebcca97..88419c6 100644
---- a/drivers/usb/host/ehci-sched.c
-+++ b/drivers/usb/host/ehci-sched.c
-@@ -707,6 +707,7 @@ iso_stream_init (
-       } else {
-               u32             addr;
-               int             think_time;
-+              int             hs_transfers;
-               addr = dev->ttport << 24;
-               if (!ehci_is_TDI(ehci)
-@@ -719,6 +720,7 @@ iso_stream_init (
-               think_time = dev->tt ? dev->tt->think_time : 0;
-               stream->tt_usecs = NS_TO_US (think_time + usb_calc_bus_time (
-                               dev->speed, is_input, 1, maxp));
-+              hs_transfers = max (1u, (maxp + 187) / 188);
-               if (is_input) {
-                       u32     tmp;
-@@ -727,12 +729,11 @@ iso_stream_init (
-                       stream->usecs = HS_USECS_ISO (1);
-                       stream->raw_mask = 1;
--                      /* pessimistic c-mask */
--                      tmp = usb_calc_bus_time (USB_SPEED_FULL, 1, 0, maxp)
--                                      / (125 * 1000);
--                      stream->raw_mask |= 3 << (tmp + 9);
-+                      /* c-mask as specified in USB 2.0 11.18.4 3.c */
-+                      tmp = (1 << (hs_transfers + 2)) - 1;
-+                      stream->raw_mask |= tmp << (8 + 2);
-               } else
--                      stream->raw_mask = smask_out [maxp / 188];
-+                      stream->raw_mask = smask_out [hs_transfers - 1];
-               bandwidth = stream->usecs + stream->c_usecs;
-               bandwidth /= 1 << (interval + 2);
-diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
-index 167f8ec..8023bb7 100644
---- a/drivers/usb/serial/console.c
-+++ b/drivers/usb/serial/console.c
-@@ -54,7 +54,7 @@ static struct console usbcons;
-  * serial.c code, except that the specifier is "ttyUSB" instead
-  * of "ttyS".
-  */
--static int __init usb_console_setup(struct console *co, char *options)
-+static int usb_console_setup(struct console *co, char *options)
- {
-       struct usbcons_info *info = &usbcons_info;
-       int baud = 9600;
-diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
-index 52bdf6f..fd8a50e 100644
---- a/drivers/usb/serial/option.c
-+++ b/drivers/usb/serial/option.c
-@@ -582,14 +582,14 @@ static void option_setup_urbs(struct usb
-       portdata = usb_get_serial_port_data(port);
-       /* Do indat endpoints first */
--      for (j = 0; j <= N_IN_URB; ++j) {
-+      for (j = 0; j < N_IN_URB; ++j) {
-               portdata->in_urbs[j] = option_setup_urb (serial,
-                   port->bulk_in_endpointAddress, USB_DIR_IN, port,
-                   portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
-       }
-       /* outdat endpoints */
--      for (j = 0; j <= N_OUT_URB; ++j) {
-+      for (j = 0; j < N_OUT_URB; ++j) {
-               portdata->out_urbs[j] = option_setup_urb (serial,
-                   port->bulk_out_endpointAddress, USB_DIR_OUT, port,
-                   portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
-diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig
-index 92be101..be9eec2 100644
---- a/drivers/usb/storage/Kconfig
-+++ b/drivers/usb/storage/Kconfig
-@@ -48,7 +48,8 @@ config USB_STORAGE_FREECOM
- config USB_STORAGE_ISD200
-       bool "ISD-200 USB/ATA Bridge support"
--      depends on USB_STORAGE && BLK_DEV_IDE
-+      depends on USB_STORAGE
-+      depends on BLK_DEV_IDE=y || BLK_DEV_IDE=USB_STORAGE
-       ---help---
-         Say Y here if you want to use USB Mass Store devices based
-         on the In-Systems Design ISD-200 USB/ATA bridge.
-diff --git a/drivers/video/cfbimgblt.c b/drivers/video/cfbimgblt.c
-index 910e233..8ba6152 100644
---- a/drivers/video/cfbimgblt.c
-+++ b/drivers/video/cfbimgblt.c
-@@ -169,7 +169,7 @@ static inline void slow_imageblit(const 
-               while (j--) {
-                       l--;
--                      color = (*s & 1 << (FB_BIT_NR(l))) ? fgcolor : bgcolor;
-+                      color = (*s & (1 << l)) ? fgcolor : bgcolor;
-                       val |= FB_SHIFT_HIGH(color, shift);
-                       
-                       /* Did the bitshift spill bits to the next long? */
-diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
-index 996c7b5..b3094ae 100644
---- a/drivers/video/fbmem.c
-+++ b/drivers/video/fbmem.c
-@@ -669,13 +669,19 @@ fb_write(struct file *file, const char _
-               total_size = info->fix.smem_len;
-       if (p > total_size)
--              return 0;
-+              return -EFBIG;
--      if (count >= total_size)
-+      if (count > total_size) {
-+              err = -EFBIG;
-               count = total_size;
-+      }
-+
-+      if (count + p > total_size) {
-+              if (!err)
-+                      err = -ENOSPC;
--      if (count + p > total_size)
-               count = total_size - p;
-+      }
-       buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count,
-                        GFP_KERNEL);
-@@ -717,7 +723,7 @@ fb_write(struct file *file, const char _
-       kfree(buffer);
--      return (err) ? err : cnt;
-+      return (cnt) ? cnt : err;
- }
- #ifdef CONFIG_KMOD
-diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
-index d8467c0..788297e 100644
---- a/drivers/video/i810/i810_main.c
-+++ b/drivers/video/i810/i810_main.c
-@@ -1508,7 +1508,7 @@ static int i810fb_cursor(struct fb_info 
-               int size = ((cursor->image.width + 7) >> 3) *
-                       cursor->image.height;
-               int i;
--              u8 *data = kmalloc(64 * 8, GFP_KERNEL);
-+              u8 *data = kmalloc(64 * 8, GFP_ATOMIC);
-               if (data == NULL)
-                       return -ENOMEM;
-diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
-index 3ad8455..651a9e1 100644
---- a/fs/9p/vfs_inode.c
-+++ b/fs/9p/vfs_inode.c
-@@ -614,6 +614,7 @@ static struct dentry *v9fs_vfs_lookup(st
-       sb = dir->i_sb;
-       v9ses = v9fs_inode2v9ses(dir);
-+      dentry->d_op = &v9fs_dentry_operations;
-       dirfid = v9fs_fid_lookup(dentry->d_parent);
-       if (!dirfid) {
-@@ -681,8 +682,6 @@ static struct dentry *v9fs_vfs_lookup(st
-               goto FreeFcall;
-       fid->qid = fcall->params.rstat.stat.qid;
--
--      dentry->d_op = &v9fs_dentry_operations;
-       v9fs_stat2inode(&fcall->params.rstat.stat, inode, inode->i_sb);
-       d_add(dentry, inode);
-diff --git a/fs/char_dev.c b/fs/char_dev.c
-index 21195c4..4e163af 100644
---- a/fs/char_dev.c
-+++ b/fs/char_dev.c
-@@ -15,6 +15,7 @@ #include <linux/errno.h>
- #include <linux/module.h>
- #include <linux/smp_lock.h>
- #include <linux/devfs_fs_kernel.h>
-+#include <linux/seq_file.h>
- #include <linux/kobject.h>
- #include <linux/kobj_map.h>
-@@ -26,8 +27,6 @@ #endif
- static struct kobj_map *cdev_map;
--#define MAX_PROBE_HASH 255    /* random */
--
- static DECLARE_MUTEX(chrdevs_lock);
- static struct char_device_struct {
-@@ -38,93 +37,29 @@ static struct char_device_struct {
-       char name[64];
-       struct file_operations *fops;
-       struct cdev *cdev;              /* will die */
--} *chrdevs[MAX_PROBE_HASH];
-+} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];
- /* index in the above */
- static inline int major_to_index(int major)
- {
--      return major % MAX_PROBE_HASH;
--}
--
--struct chrdev_info {
--      int index;
--      struct char_device_struct *cd;
--};
--
--void *get_next_chrdev(void *dev)
--{
--      struct chrdev_info *info;
--
--      if (dev == NULL) {
--              info = kmalloc(sizeof(*info), GFP_KERNEL);
--              if (!info)
--                      goto out;
--              info->index=0;
--              info->cd = chrdevs[info->index];
--              if (info->cd)
--                      goto out;
--      } else {
--              info = dev;
--      }
--
--      while (info->index < ARRAY_SIZE(chrdevs)) {
--              if (info->cd)
--                      info->cd = info->cd->next;
--              if (info->cd)
--                      goto out;
--              /*
--               * No devices on this chain, move to the next
--               */
--              info->index++;
--              info->cd = (info->index < ARRAY_SIZE(chrdevs)) ?
--                      chrdevs[info->index] : NULL;
--              if (info->cd)
--                      goto out;
--      }
--
--out:
--      return info;
--}
--
--void *acquire_chrdev_list(void)
--{
--      down(&chrdevs_lock);
--      return get_next_chrdev(NULL);
--}
--
--void release_chrdev_list(void *dev)
--{
--      up(&chrdevs_lock);
--      kfree(dev);
-+      return major % CHRDEV_MAJOR_HASH_SIZE;
- }
-+#ifdef CONFIG_PROC_FS
--int count_chrdev_list(void)
-+void chrdev_show(struct seq_file *f, off_t offset)
- {
-       struct char_device_struct *cd;
--      int i, count;
--
--      count = 0;
--      for (i = 0; i < ARRAY_SIZE(chrdevs) ; i++) {
--              for (cd = chrdevs[i]; cd; cd = cd->next)
--                      count++;
-+      if (offset < CHRDEV_MAJOR_HASH_SIZE) {
-+              down(&chrdevs_lock);
-+              for (cd = chrdevs[offset]; cd; cd = cd->next)
-+                      seq_printf(f, "%3d %s\n", cd->major, cd->name);
-+              up(&chrdevs_lock);
-       }
--
--      return count;
- }
--int get_chrdev_info(void *dev, int *major, char **name)
--{
--      struct chrdev_info *info = dev;
--
--      if (info->cd == NULL)
--              return 1;
--
--      *major = info->cd->major;
--      *name = info->cd->name;
--      return 0;
--}
-+#endif /* CONFIG_PROC_FS */
- /*
-  * Register a single major with a specified minor range.
-diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
-index a2c2485..3f5e38c 100644
---- a/fs/cifs/cifsencrypt.c
-+++ b/fs/cifs/cifsencrypt.c
-@@ -56,9 +56,6 @@ int cifs_sign_smb(struct smb_hdr * cifs_
-       int rc = 0;
-       char smb_signature[20];
--      /* BB remember to initialize sequence number elsewhere and initialize mac_signing key elsewhere BB */
--      /* BB remember to add code to save expected sequence number in midQ entry BB */
--
-       if((cifs_pdu == NULL) || (server == NULL))
-               return -EINVAL;
-@@ -85,20 +82,33 @@ int cifs_sign_smb(struct smb_hdr * cifs_
- static int cifs_calc_signature2(const struct kvec * iov, int n_vec,
-                               const char * key, char * signature)
- {
--        struct  MD5Context context;
--
--        if((iov == NULL) || (signature == NULL))
--                return -EINVAL;
-+      struct  MD5Context context;
-+      int i;
--        MD5Init(&context);
--        MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16);
-+      if((iov == NULL) || (signature == NULL))
-+              return -EINVAL;
--/*        MD5Update(&context,cifs_pdu->Protocol,cifs_pdu->smb_buf_length); */ /* BB FIXME BB */
-+      MD5Init(&context);
-+      MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16);
-+      for(i=0;i<n_vec;i++) {
-+              if(iov[i].iov_base == NULL) {
-+                      cERROR(1,("null iovec entry"));
-+                      return -EIO;
-+              } else if(iov[i].iov_len == 0)
-+                      break; /* bail out if we are sent nothing to sign */
-+              /* The first entry includes a length field (which does not get
-+                 signed that occupies the first 4 bytes before the header */
-+              if(i==0) {
-+                      if (iov[0].iov_len <= 8 ) /* cmd field at offset 9 */
-+                              break; /* nothing to sign or corrupt header */
-+                      MD5Update(&context,iov[0].iov_base+4, iov[0].iov_len-4);
-+              } else
-+                      MD5Update(&context,iov[i].iov_base, iov[i].iov_len);
-+      }
--        MD5Final(signature,&context);
-+      MD5Final(signature,&context);
--      return -EOPNOTSUPP;
--/*        return 0; */
-+      return 0;
- }
-diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
-index fed55e3..5e562bc 100644
---- a/fs/cifs/dir.c
-+++ b/fs/cifs/dir.c
-@@ -441,6 +441,20 @@ cifs_lookup(struct inode *parent_dir_ino
-       cifs_sb = CIFS_SB(parent_dir_inode->i_sb);
-       pTcon = cifs_sb->tcon;
-+      /*
-+       * Don't allow the separator character in a path component.
-+       * The VFS will not allow "/", but "\" is allowed by posix.
-+       */
-+      if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS)) {
-+              int i;
-+              for (i = 0; i < direntry->d_name.len; i++)
-+                      if (direntry->d_name.name[i] == '\\') {
-+                              cFYI(1, ("Invalid file name"));
-+                              FreeXid(xid);
-+                              return ERR_PTR(-EINVAL);
-+                      }
-+      }
-+
-       /* can not grab the rename sem here since it would
-       deadlock in the cases (beginning of sys_rename itself)
-       in which we already have the sb rename sem */
-diff --git a/fs/compat.c b/fs/compat.c
-index 5333c7d..8491bb8 100644
---- a/fs/compat.c
-+++ b/fs/compat.c
-@@ -1215,6 +1215,10 @@ static ssize_t compat_do_readv_writev(in
-       if (ret < 0)
-               goto out;
-+      ret = security_file_permission(file, type == READ ? MAY_READ:MAY_WRITE);
-+      if (ret)
-+              goto out;
-+
-       fnv = NULL;
-       if (type == READ) {
-               fn = file->f_op->read;
-@@ -1897,7 +1901,7 @@ asmlinkage long compat_sys_ppoll(struct 
-       }
-       if (sigmask) {
--              if (sigsetsize |= sizeof(compat_sigset_t))
-+              if (sigsetsize != sizeof(compat_sigset_t))
-                       return -EINVAL;
-               if (copy_from_user(&ss32, sigmask, sizeof(ss32)))
-                       return -EFAULT;
-diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c
-index 1041dab..14f5f6e 100644
---- a/fs/ext3/resize.c
-+++ b/fs/ext3/resize.c
-@@ -974,6 +974,7 @@ int ext3_group_extend(struct super_block
-       if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) {
-               ext3_warning(sb, __FUNCTION__,
-                            "multiple resizers run on filesystem!");
-+              unlock_super(sb);
-               err = -EBUSY;
-               goto exit_put;
-       }
-diff --git a/fs/fuse/file.c b/fs/fuse/file.c
-index 6f05379..ce93cf9 100644
---- a/fs/fuse/file.c
-+++ b/fs/fuse/file.c
-@@ -397,8 +397,12 @@ static int fuse_readpages(struct file *f
-               return -EINTR;
-       err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data);
--      if (!err)
--              fuse_send_readpages(data.req, file, inode);
-+      if (!err) {
-+              if (data.req->num_pages)
-+                      fuse_send_readpages(data.req, file, inode);
-+              else
-+                      fuse_put_request(fc, data.req);
-+      }
-       return err;
- }
-diff --git a/fs/locks.c b/fs/locks.c
-index 909eab8..39b038b 100644
---- a/fs/locks.c
-+++ b/fs/locks.c
-@@ -432,15 +432,14 @@ static struct lock_manager_operations le
-  */
- static int lease_init(struct file *filp, int type, struct file_lock *fl)
-  {
-+      if (assign_type(fl, type) != 0)
-+              return -EINVAL;
-+
-       fl->fl_owner = current->files;
-       fl->fl_pid = current->tgid;
-       fl->fl_file = filp;
-       fl->fl_flags = FL_LEASE;
--      if (assign_type(fl, type) != 0) {
--              locks_free_lock(fl);
--              return -EINVAL;
--      }
-       fl->fl_start = 0;
-       fl->fl_end = OFFSET_MAX;
-       fl->fl_ops = NULL;
-@@ -452,16 +451,19 @@ static int lease_init(struct file *filp,
- static int lease_alloc(struct file *filp, int type, struct file_lock **flp)
- {
-       struct file_lock *fl = locks_alloc_lock();
--      int error;
-+      int error = -ENOMEM;
-       if (fl == NULL)
--              return -ENOMEM;
-+              goto out;
-       error = lease_init(filp, type, fl);
--      if (error)
--              return error;
-+      if (error) {
-+              locks_free_lock(fl);
-+              fl = NULL;
-+      }
-+out:
-       *flp = fl;
--      return 0;
-+      return error;
- }
- /* Check if two locks overlap each other.
-@@ -712,8 +714,9 @@ EXPORT_SYMBOL(posix_locks_deadlock);
-  * at the head of the list, but that's secret knowledge known only to
-  * flock_lock_file and posix_lock_file.
-  */
--static int flock_lock_file(struct file *filp, struct file_lock *new_fl)
-+static int flock_lock_file(struct file *filp, struct file_lock *request)
- {
-+      struct file_lock *new_fl = NULL;
-       struct file_lock **before;
-       struct inode * inode = filp->f_dentry->d_inode;
-       int error = 0;
-@@ -728,17 +731,19 @@ static int flock_lock_file(struct file *
-                       continue;
-               if (filp != fl->fl_file)
-                       continue;
--              if (new_fl->fl_type == fl->fl_type)
-+              if (request->fl_type == fl->fl_type)
-                       goto out;
-               found = 1;
-               locks_delete_lock(before);
-               break;
-       }
--      unlock_kernel();
--      if (new_fl->fl_type == F_UNLCK)
--              return 0;
-+      if (request->fl_type == F_UNLCK)
-+              goto out;
-+      new_fl = locks_alloc_lock();
-+      if (new_fl == NULL)
-+              goto out;
-       /*
-        * If a higher-priority process was blocked on the old file lock,
-        * give it the opportunity to lock the file.
-@@ -746,26 +751,27 @@ static int flock_lock_file(struct file *
-       if (found)
-               cond_resched();
--      lock_kernel();
-       for_each_lock(inode, before) {
-               struct file_lock *fl = *before;
-               if (IS_POSIX(fl))
-                       break;
-               if (IS_LEASE(fl))
-                       continue;
--              if (!flock_locks_conflict(new_fl, fl))
-+              if (!flock_locks_conflict(request, fl))
-                       continue;
-               error = -EAGAIN;
--              if (new_fl->fl_flags & FL_SLEEP) {
--                      locks_insert_block(fl, new_fl);
--              }
-+              if (request->fl_flags & FL_SLEEP)
-+                      locks_insert_block(fl, request);
-               goto out;
-       }
-+      locks_copy_lock(new_fl, request);
-       locks_insert_lock(&inode->i_flock, new_fl);
--      error = 0;
-+      new_fl = NULL;
- out:
-       unlock_kernel();
-+      if (new_fl)
-+              locks_free_lock(new_fl);
-       return error;
- }
-@@ -1337,6 +1343,7 @@ static int __setlease(struct file *filp,
-               goto out;
-       if (my_before != NULL) {
-+              *flp = *my_before;
-               error = lease->fl_lmops->fl_change(my_before, arg);
-               goto out;
-       }
-@@ -1529,9 +1536,7 @@ asmlinkage long sys_flock(unsigned int f
-               error = flock_lock_file_wait(filp, lock);
-  out_free:
--      if (list_empty(&lock->fl_link)) {
--              locks_free_lock(lock);
--      }
-+      locks_free_lock(lock);
-  out_putf:
-       fput(filp);
-@@ -2212,7 +2217,12 @@ void steal_locks(fl_owner_t from)
-       lock_kernel();
-       j = 0;
--      rcu_read_lock();
-+
-+      /*
-+       * We are not taking a ref to the file structures, so
-+       * we need to acquire ->file_lock.
-+       */
-+      spin_lock(&files->file_lock);
-       fdt = files_fdtable(files);
-       for (;;) {
-               unsigned long set;
-@@ -2230,7 +2240,7 @@ void steal_locks(fl_owner_t from)
-                       set >>= 1;
-               }
-       }
--      rcu_read_unlock();
-+      spin_unlock(&files->file_lock);
-       unlock_kernel();
- }
- EXPORT_SYMBOL(steal_locks);
-diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
-index 6d2dfed..f61142a 100644
---- a/fs/nfsd/nfs3proc.c
-+++ b/fs/nfsd/nfs3proc.c
-@@ -682,7 +682,7 @@ static struct svc_procedure                nfsd_proced
-   PROC(lookup,         dirop,         dirop,          fhandle2, RC_NOCACHE, ST+FH+pAT+pAT),
-   PROC(access,         access,        access,         fhandle,  RC_NOCACHE, ST+pAT+1),
-   PROC(readlink, readlink,    readlink,       fhandle,  RC_NOCACHE, ST+pAT+1+NFS3_MAXPATHLEN/4),
--  PROC(read,   read,          read,           fhandle,  RC_NOCACHE, ST+pAT+4+NFSSVC_MAXBLKSIZE),
-+  PROC(read,   read,          read,           fhandle,  RC_NOCACHE, ST+pAT+4+NFSSVC_MAXBLKSIZE/4),
-   PROC(write,  write,         write,          fhandle,  RC_REPLBUFF, ST+WC+4),
-   PROC(create,         create,        create,         fhandle2, RC_REPLBUFF, ST+(1+FH+pAT)+WC),
-   PROC(mkdir,  mkdir,         create,         fhandle2, RC_REPLBUFF, ST+(1+FH+pAT)+WC),
-diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
-index 6d63f1d..ca8a4c4 100644
---- a/fs/nfsd/nfs4proc.c
-+++ b/fs/nfsd/nfs4proc.c
-@@ -975,7 +975,7 @@ #define PROC(name, argt, rest, relt, cac
-  */
- static struct svc_procedure           nfsd_procedures4[2] = {
-   PROC(null,   void,          void,           void,     RC_NOCACHE, 1),
--  PROC(compound, compound,    compound,       compound, RC_NOCACHE, NFSD_BUFSIZE)
-+  PROC(compound, compound,    compound,       compound, RC_NOCACHE, NFSD_BUFSIZE/4)
- };
- struct svc_version    nfsd_version4 = {
-diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c
-index 3e6b75c..06cd0db 100644
---- a/fs/nfsd/nfsproc.c
-+++ b/fs/nfsd/nfsproc.c
-@@ -553,7 +553,7 @@ static struct svc_procedure                nfsd_proced
-   PROC(none,   void,          void,           none,           RC_NOCACHE, ST),
-   PROC(lookup,         diropargs,     diropres,       fhandle,        RC_NOCACHE, ST+FH+AT),
-   PROC(readlink, readlinkargs,        readlinkres,    none,           RC_NOCACHE, ST+1+NFS_MAXPATHLEN/4),
--  PROC(read,   readargs,      readres,        fhandle,        RC_NOCACHE, ST+AT+1+NFSSVC_MAXBLKSIZE),
-+  PROC(read,   readargs,      readres,        fhandle,        RC_NOCACHE, ST+AT+1+NFSSVC_MAXBLKSIZE/4),
-   PROC(none,   void,          void,           none,           RC_NOCACHE, ST),
-   PROC(write,  writeargs,     attrstat,       fhandle,        RC_REPLBUFF, ST+AT),
-   PROC(create,         createargs,    diropres,       fhandle,        RC_REPLBUFF, ST+FH+AT),
-diff --git a/fs/open.c b/fs/open.c
-index 70e0230..f697914 100644
---- a/fs/open.c
-+++ b/fs/open.c
-@@ -330,7 +330,10 @@ out:
- asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length)
- {
--      return do_sys_ftruncate(fd, length, 1);
-+      long ret = do_sys_ftruncate(fd, length, 1);
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- /* LFS versions of truncate are only needed on 32 bit machines */
-@@ -342,7 +345,10 @@ asmlinkage long sys_truncate64(const cha
- asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length)
- {
--      return do_sys_ftruncate(fd, length, 0);
-+      long ret = do_sys_ftruncate(fd, length, 0);
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- #endif
-@@ -1083,20 +1089,30 @@ long do_sys_open(int dfd, const char __u
- asmlinkage long sys_open(const char __user *filename, int flags, int mode)
- {
-+      long ret;
-+
-       if (force_o_largefile())
-               flags |= O_LARGEFILE;
--      return do_sys_open(AT_FDCWD, filename, flags, mode);
-+      ret = do_sys_open(AT_FDCWD, filename, flags, mode);
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- EXPORT_SYMBOL_GPL(sys_open);
- asmlinkage long sys_openat(int dfd, const char __user *filename, int flags,
-                          int mode)
- {
-+      long ret;
-+
-       if (force_o_largefile())
-               flags |= O_LARGEFILE;
--      return do_sys_open(dfd, filename, flags, mode);
-+      ret = do_sys_open(dfd, filename, flags, mode);
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- EXPORT_SYMBOL_GPL(sys_openat);
-diff --git a/fs/partitions/check.c b/fs/partitions/check.c
-index f924f45..2ef03aa 100644
---- a/fs/partitions/check.c
-+++ b/fs/partitions/check.c
-@@ -345,6 +345,7 @@ static char *make_block_name(struct gend
-       char *name;
-       static char *block_str = "block:";
-       int size;
-+      char *s;
-       size = strlen(block_str) + strlen(disk->disk_name) + 1;
-       name = kmalloc(size, GFP_KERNEL);
-@@ -352,6 +353,10 @@ static char *make_block_name(struct gend
-               return NULL;
-       strcpy(name, block_str);
-       strcat(name, disk->disk_name);
-+      /* ewww... some of these buggers have / in name... */
-+      s = strchr(name, '/');
-+      if (s)
-+              *s = '!';
-       return name;
- }
-diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 20feb75..c192cb2 100644
---- a/fs/proc/base.c
-+++ b/fs/proc/base.c
-@@ -294,16 +294,20 @@ static int proc_fd_link(struct inode *in
-       files = get_files_struct(task);
-       if (files) {
--              rcu_read_lock();
-+              /*
-+               * We are not taking a ref to the file structure, so we must
-+               * hold ->file_lock.
-+               */
-+              spin_lock(&files->file_lock);
-               file = fcheck_files(files, fd);
-               if (file) {
-                       *mnt = mntget(file->f_vfsmnt);
-                       *dentry = dget(file->f_dentry);
--                      rcu_read_unlock();
-+                      spin_unlock(&files->file_lock);
-                       put_files_struct(files);
-                       return 0;
-               }
--              rcu_read_unlock();
-+              spin_unlock(&files->file_lock);
-               put_files_struct(files);
-       }
-       return -ENOENT;
-@@ -1485,7 +1489,12 @@ static struct dentry *proc_lookupfd(stru
-       if (!files)
-               goto out_unlock;
-       inode->i_mode = S_IFLNK;
--      rcu_read_lock();
-+
-+      /*
-+       * We are not taking a ref to the file structure, so we must
-+       * hold ->file_lock.
-+       */
-+      spin_lock(&files->file_lock);
-       file = fcheck_files(files, fd);
-       if (!file)
-               goto out_unlock2;
-@@ -1493,7 +1502,7 @@ static struct dentry *proc_lookupfd(stru
-               inode->i_mode |= S_IRUSR | S_IXUSR;
-       if (file->f_mode & 2)
-               inode->i_mode |= S_IWUSR | S_IXUSR;
--      rcu_read_unlock();
-+      spin_unlock(&files->file_lock);
-       put_files_struct(files);
-       inode->i_op = &proc_pid_link_inode_operations;
-       inode->i_size = 64;
-@@ -1503,7 +1512,7 @@ static struct dentry *proc_lookupfd(stru
-       return NULL;
- out_unlock2:
--      rcu_read_unlock();
-+      spin_unlock(&files->file_lock);
-       put_files_struct(files);
- out_unlock:
-       iput(inode);
-diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
-index 1d24fea..0c78312 100644
---- a/fs/proc/proc_misc.c
-+++ b/fs/proc/proc_misc.c
-@@ -249,144 +249,60 @@ static int cpuinfo_open(struct inode *in
-       return seq_open(file, &cpuinfo_op);
- }
--enum devinfo_states {
--      CHR_HDR,
--      CHR_LIST,
--      BLK_HDR,
--      BLK_LIST,
--      DEVINFO_DONE
--};
--
--struct devinfo_state {
--      void *chrdev;
--      void *blkdev;
--      unsigned int num_records;
--      unsigned int cur_record;
--      enum devinfo_states state;
-+static struct file_operations proc_cpuinfo_operations = {
-+      .open           = cpuinfo_open,
-+      .read           = seq_read,
-+      .llseek         = seq_lseek,
-+      .release        = seq_release,
- };
--static void *devinfo_start(struct seq_file *f, loff_t *pos)
-+static int devinfo_show(struct seq_file *f, void *v)
- {
--      struct devinfo_state *info = f->private;
-+      int i = *(loff_t *) v;
--      if (*pos) {
--              if ((info) && (*pos <= info->num_records))
--                      return info;
--              return NULL;
-+      if (i < CHRDEV_MAJOR_HASH_SIZE) {
-+              if (i == 0)
-+                      seq_printf(f, "Character devices:\n");
-+              chrdev_show(f, i);
-+      } else {
-+              i -= CHRDEV_MAJOR_HASH_SIZE;
-+              if (i == 0)
-+                      seq_printf(f, "\nBlock devices:\n");
-+              blkdev_show(f, i);
-       }
--      info = kmalloc(sizeof(*info), GFP_KERNEL);
--      f->private = info;
--      info->chrdev = acquire_chrdev_list();
--      info->blkdev = acquire_blkdev_list();
--      info->state = CHR_HDR;
--      info->num_records = count_chrdev_list();
--      info->num_records += count_blkdev_list();
--      info->num_records += 2; /* Character and Block headers */
--      *pos = 1;
--      info->cur_record = *pos;
--      return info;
-+      return 0;
- }
--static void *devinfo_next(struct seq_file *f, void *v, loff_t *pos)
-+static void *devinfo_start(struct seq_file *f, loff_t *pos)
- {
--      int idummy;
--      char *ndummy;
--      struct devinfo_state *info = f->private;
--
--      switch (info->state) {
--              case CHR_HDR:
--                      info->state = CHR_LIST;
--                      (*pos)++;
--                      /*fallthrough*/
--              case CHR_LIST:
--                      if (get_chrdev_info(info->chrdev,&idummy,&ndummy)) {
--                              /*
--                               * The character dev list is complete
--                               */
--                              info->state = BLK_HDR;
--                      } else {
--                              info->chrdev = get_next_chrdev(info->chrdev);
--                      }
--                      (*pos)++;
--                      break;
--              case BLK_HDR:
--                      info->state = BLK_LIST;
--                      (*pos)++;
--                      break;
--              case BLK_LIST:
--                      if (get_blkdev_info(info->blkdev,&idummy,&ndummy)) {
--                              /*
--                               * The block dev list is complete
--                               */
--                              info->state = DEVINFO_DONE;
--                      } else {
--                              info->blkdev = get_next_blkdev(info->blkdev);
--                      }
--                      (*pos)++;
--                      break;
--              case DEVINFO_DONE:
--                      (*pos)++;
--                      info->cur_record = *pos;
--                      info = NULL;
--                      break;
--              default:
--                      break;
--      }
--      if (info)
--              info->cur_record = *pos;
--      return info;
-+      if (*pos < (BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE))
-+              return pos;
-+      return NULL;
- }
--static void devinfo_stop(struct seq_file *f, void *v)
-+static void *devinfo_next(struct seq_file *f, void *v, loff_t *pos)
- {
--      struct devinfo_state *info = f->private;
--
--      if (info) {
--              release_chrdev_list(info->chrdev);
--              release_blkdev_list(info->blkdev);
--              f->private = NULL;
--              kfree(info);
--      }
-+      (*pos)++;
-+      if (*pos >= (BLKDEV_MAJOR_HASH_SIZE + CHRDEV_MAJOR_HASH_SIZE))
-+              return NULL;
-+      return pos;
- }
--static int devinfo_show(struct seq_file *f, void *arg)
--{
--      int major;
--      char *name;
--      struct devinfo_state *info = f->private;
--
--      switch(info->state) {
--              case CHR_HDR:
--                      seq_printf(f,"Character devices:\n");
--                      /* fallthrough */
--              case CHR_LIST:
--                      if (!get_chrdev_info(info->chrdev,&major,&name))
--                              seq_printf(f,"%3d %s\n",major,name);
--                      break;
--              case BLK_HDR:
--                      seq_printf(f,"\nBlock devices:\n");
--                      /* fallthrough */
--              case BLK_LIST:
--                      if (!get_blkdev_info(info->blkdev,&major,&name))
--                              seq_printf(f,"%3d %s\n",major,name);
--                      break;
--              default:
--                      break;
--      }
--
--      return 0;
-+static void devinfo_stop(struct seq_file *f, void *v)
-+{
-+      /* Nothing to do */
- }
--static  struct seq_operations devinfo_op = {
--      .start  = devinfo_start,
--      .next   = devinfo_next,
--      .stop   = devinfo_stop,
--      .show   = devinfo_show,
-+static struct seq_operations devinfo_ops = {
-+      .start = devinfo_start,
-+      .next  = devinfo_next,
-+      .stop  = devinfo_stop,
-+      .show  = devinfo_show
- };
--static int devinfo_open(struct inode *inode, struct file *file)
-+static int devinfo_open(struct inode *inode, struct file *filp)
- {
--      return seq_open(file, &devinfo_op);
-+      return seq_open(filp, &devinfo_ops);
- }
- static struct file_operations proc_devinfo_operations = {
-@@ -396,13 +312,6 @@ static struct file_operations proc_devin
-       .release        = seq_release,
- };
--static struct file_operations proc_cpuinfo_operations = {
--      .open           = cpuinfo_open,
--      .read           = seq_read,
--      .llseek         = seq_lseek,
--      .release        = seq_release,
--};
--
- extern struct seq_operations vmstat_op;
- static int vmstat_open(struct inode *inode, struct file *file)
- {
-diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
-index 4063fb3..164a7d0 100644
---- a/fs/proc/vmcore.c
-+++ b/fs/proc/vmcore.c
-@@ -103,8 +103,8 @@ static ssize_t read_vmcore(struct file *
-                               size_t buflen, loff_t *fpos)
- {
-       ssize_t acc = 0, tmp;
--      size_t tsz, nr_bytes;
--      u64 start;
-+      size_t tsz;
-+      u64 start, nr_bytes;
-       struct vmcore *curr_m = NULL;
-       if (buflen == 0 || *fpos >= vmcore_size)
-diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c
-index ab8894c..9df778a 100644
---- a/fs/reiserfs/xattr_acl.c
-+++ b/fs/reiserfs/xattr_acl.c
-@@ -408,8 +408,9 @@ int reiserfs_cache_default_acl(struct in
-               acl = reiserfs_get_acl(inode, ACL_TYPE_DEFAULT);
-               reiserfs_read_unlock_xattrs(inode->i_sb);
-               reiserfs_read_unlock_xattr_i(inode);
--              ret = acl ? 1 : 0;
--              posix_acl_release(acl);
-+              ret = (acl && !IS_ERR(acl));
-+              if (ret)
-+                      posix_acl_release(acl);
-       }
-       return ret;
-diff --git a/fs/smbfs/dir.c b/fs/smbfs/dir.c
-index 0424d06..45862ec 100644
---- a/fs/smbfs/dir.c
-+++ b/fs/smbfs/dir.c
-@@ -434,6 +434,11 @@ smb_lookup(struct inode *dir, struct den
-       if (dentry->d_name.len > SMB_MAXNAMELEN)
-               goto out;
-+      /* Do not allow lookup of names with backslashes in */
-+      error = -EINVAL;
-+      if (memchr(dentry->d_name.name, '\\', dentry->d_name.len))
-+              goto out;
-+
-       lock_kernel();
-       error = smb_proc_getattr(dentry, &finfo);
- #ifdef SMBFS_PARANOIA
-diff --git a/fs/smbfs/request.c b/fs/smbfs/request.c
-index c71c375..c71dd27 100644
---- a/fs/smbfs/request.c
-+++ b/fs/smbfs/request.c
-@@ -339,9 +339,11 @@ #endif
-               /*
-                * On timeout or on interrupt we want to try and remove the
-                * request from the recvq/xmitq.
-+               * First check if the request is still part of a queue. (May
-+               * have been removed by some error condition)
-                */
-               smb_lock_server(server);
--              if (!(req->rq_flags & SMB_REQ_RECEIVED)) {
-+              if (!list_empty(&req->rq_queue)) {
-                       list_del_init(&req->rq_queue);
-                       smb_rput(req);
-               }
-diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
-index 49bd219..cfd290d 100644
---- a/fs/sysfs/dir.c
-+++ b/fs/sysfs/dir.c
-@@ -302,6 +302,7 @@ void sysfs_remove_dir(struct kobject * k
-        * Drop reference from dget() on entrance.
-        */
-       dput(dentry);
-+      kobj->dentry = NULL;
- }
- int sysfs_rename_dir(struct kobject * kobj, const char *new_name)
-diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
-index d0e3d84..2ecc58c 100644
---- a/fs/sysfs/file.c
-+++ b/fs/sysfs/file.c
-@@ -183,7 +183,7 @@ fill_write_buffer(struct sysfs_buffer * 
-               return -ENOMEM;
-       if (count >= PAGE_SIZE)
--              count = PAGE_SIZE;
-+              count = PAGE_SIZE - 1;
-       error = copy_from_user(buffer->page,buf,count);
-       buffer->needs_read_fill = 1;
-       return error ? -EFAULT : count;
-diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c
-index 689f7bc..6beee6f 100644
---- a/fs/sysfs/inode.c
-+++ b/fs/sysfs/inode.c
-@@ -227,12 +227,16 @@ void sysfs_drop_dentry(struct sysfs_dire
- void sysfs_hash_and_remove(struct dentry * dir, const char * name)
- {
-       struct sysfs_dirent * sd;
--      struct sysfs_dirent * parent_sd = dir->d_fsdata;
-+      struct sysfs_dirent * parent_sd;
-+
-+      if (!dir)
-+              return;
-       if (dir->d_inode == NULL)
-               /* no inode means this hasn't been made visible yet */
-               return;
-+      parent_sd = dir->d_fsdata;
-       mutex_lock(&dir->d_inode->i_mutex);
-       list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
-               if (!sd->s_element)
-diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
-index e38d633..e5ce6e7 100644
---- a/fs/sysfs/symlink.c
-+++ b/fs/sysfs/symlink.c
-@@ -66,6 +66,7 @@ static int sysfs_add_link(struct dentry 
-       if (!error)
-               return 0;
-+      kobject_put(target);
-       kfree(sl->link_name);
- exit2:
-       kfree(sl);
-diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
-index 74d8be8..a980736 100644
---- a/fs/xfs/linux-2.6/xfs_aops.c
-+++ b/fs/xfs/linux-2.6/xfs_aops.c
-@@ -616,7 +616,7 @@ xfs_is_delayed_page(
-                               acceptable = (type == IOMAP_UNWRITTEN);
-                       else if (buffer_delay(bh))
-                               acceptable = (type == IOMAP_DELAY);
--                      else if (buffer_mapped(bh))
-+                      else if (buffer_dirty(bh) && buffer_mapped(bh))
-                               acceptable = (type == 0);
-                       else
-                               break;
-diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c
-index d7f6f2d..43808e2 100644
---- a/fs/xfs/linux-2.6/xfs_iops.c
-+++ b/fs/xfs/linux-2.6/xfs_iops.c
-@@ -673,8 +673,7 @@ linvfs_setattr(
-       if (ia_valid & ATTR_ATIME) {
-               vattr.va_mask |= XFS_AT_ATIME;
-               vattr.va_atime = attr->ia_atime;
--              if (ia_valid & ATTR_ATIME_SET)
--                      inode->i_atime = attr->ia_atime;
-+              inode->i_atime = attr->ia_atime;
-       }
-       if (ia_valid & ATTR_MTIME) {
-               vattr.va_mask |= XFS_AT_MTIME;
-diff --git a/include/asm-i386/cpufeature.h b/include/asm-i386/cpufeature.h
-index c4ec2a4..9d15eec 100644
---- a/include/asm-i386/cpufeature.h
-+++ b/include/asm-i386/cpufeature.h
-@@ -70,6 +70,7 @@ #define X86_FEATURE_K7               (3*32+ 5) /* Ath
- #define X86_FEATURE_P3                (3*32+ 6) /* P3 */
- #define X86_FEATURE_P4                (3*32+ 7) /* P4 */
- #define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */
-+#define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* FXSAVE leaks FOP/FIP/FOP */
- /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
- #define X86_FEATURE_XMM3      (4*32+ 0) /* Streaming SIMD Extensions-3 */
-diff --git a/include/asm-i386/i387.h b/include/asm-i386/i387.h
-index 152d0ba..bc1d6ed 100644
---- a/include/asm-i386/i387.h
-+++ b/include/asm-i386/i387.h
-@@ -13,6 +13,7 @@ #define __ASM_I386_I387_H
- #include <linux/sched.h>
- #include <linux/init.h>
-+#include <linux/kernel_stat.h>
- #include <asm/processor.h>
- #include <asm/sigcontext.h>
- #include <asm/user.h>
-@@ -38,17 +39,38 @@ #define restore_fpu(tsk)                   \
- extern void kernel_fpu_begin(void);
- #define kernel_fpu_end() do { stts(); preempt_enable(); } while(0)
-+/* We need a safe address that is cheap to find and that is already
-+   in L1 during context switch. The best choices are unfortunately
-+   different for UP and SMP */
-+#ifdef CONFIG_SMP
-+#define safe_address (__per_cpu_offset[0])
-+#else
-+#define safe_address (kstat_cpu(0).cpustat.user)
-+#endif
-+
- /*
-  * These must be called with preempt disabled
-  */
- static inline void __save_init_fpu( struct task_struct *tsk )
- {
-+      /* Use more nops than strictly needed in case the compiler
-+         varies code */
-       alternative_input(
--              "fnsave %1 ; fwait ;" GENERIC_NOP2,
--              "fxsave %1 ; fnclex",
-+              "fnsave %[fx] ;fwait;" GENERIC_NOP8 GENERIC_NOP4,
-+              "fxsave %[fx]\n"
-+              "bt $7,%[fsw] ; jnc 1f ; fnclex\n1:",
-               X86_FEATURE_FXSR,
--              "m" (tsk->thread.i387.fxsave)
--              :"memory");
-+              [fx] "m" (tsk->thread.i387.fxsave),
-+              [fsw] "m" (tsk->thread.i387.fxsave.swd) : "memory");
-+      /* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception
-+         is pending.  Clear the x87 state here by setting it to fixed
-+         values. safe_address is a random variable that should be in L1 */
-+      alternative_input(
-+              GENERIC_NOP8 GENERIC_NOP2,
-+              "emms\n\t"              /* clear stack tags */
-+              "fildl %[addr]",        /* set F?P to defined value */
-+              X86_FEATURE_FXSAVE_LEAK,
-+              [addr] "m" (safe_address));
-       task_thread_info(tsk)->status &= ~TS_USEDFPU;
- }
-diff --git a/include/asm-i386/pgtable-2level.h b/include/asm-i386/pgtable-2level.h
-index 74ef721..d76c61d 100644
---- a/include/asm-i386/pgtable-2level.h
-+++ b/include/asm-i386/pgtable-2level.h
-@@ -18,6 +18,9 @@ #define set_pte_at(mm,addr,ptep,pteval) 
- #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval)
- #define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
-+#define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
-+#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
-+
- #define ptep_get_and_clear(mm,addr,xp)        __pte(xchg(&(xp)->pte_low, 0))
- #define pte_same(a, b)                ((a).pte_low == (b).pte_low)
- #define pte_page(x)           pfn_to_page(pte_pfn(x))
-diff --git a/include/asm-i386/pgtable-3level.h b/include/asm-i386/pgtable-3level.h
-index f1a8b45..3dda0f6 100644
---- a/include/asm-i386/pgtable-3level.h
-+++ b/include/asm-i386/pgtable-3level.h
-@@ -85,6 +85,26 @@ ((unsigned long) __va(pud_val(pud) & PAG
- #define pmd_offset(pud, address) ((pmd_t *) pud_page(*(pud)) + \
-                       pmd_index(address))
-+/*
-+ * For PTEs and PDEs, we must clear the P-bit first when clearing a page table
-+ * entry, so clear the bottom half first and enforce ordering with a compiler
-+ * barrier.
-+ */
-+static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-+{
-+      ptep->pte_low = 0;
-+      smp_wmb();
-+      ptep->pte_high = 0;
-+}
-+
-+static inline void pmd_clear(pmd_t *pmd)
-+{
-+      u32 *tmp = (u32 *)pmd;
-+      *tmp = 0;
-+      smp_wmb();
-+      *(tmp + 1) = 0;
-+}
-+
- static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
- {
-       pte_t res;
-diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h
-index 088a945..6313403 100644
---- a/include/asm-i386/pgtable.h
-+++ b/include/asm-i386/pgtable.h
-@@ -204,12 +204,10 @@ #undef TEST_ACCESS_OK
- extern unsigned long pg0[];
- #define pte_present(x)        ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE))
--#define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
- /* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
- #define pmd_none(x)   (!(unsigned long)pmd_val(x))
- #define pmd_present(x)        (pmd_val(x) & _PAGE_PRESENT)
--#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
- #define       pmd_bad(x)      ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
-@@ -269,7 +267,7 @@ static inline pte_t ptep_get_and_clear_f
-       pte_t pte;
-       if (full) {
-               pte = *ptep;
--              *ptep = __pte(0);
-+              pte_clear(mm, addr, ptep);
-       } else {
-               pte = ptep_get_and_clear(mm, addr, ptep);
-       }
-diff --git a/include/asm-m32r/smp.h b/include/asm-m32r/smp.h
-index 7885b7d..1184293 100644
---- a/include/asm-m32r/smp.h
-+++ b/include/asm-m32r/smp.h
-@@ -67,7 +67,8 @@ #define cpu_to_physid(cpu_id)        cpu_2_phys
- #define raw_smp_processor_id()        (current_thread_info()->cpu)
- extern cpumask_t cpu_callout_map;
--#define cpu_possible_map cpu_callout_map
-+extern cpumask_t cpu_possible_map;
-+extern cpumask_t cpu_present_map;
- static __inline__ int hard_smp_processor_id(void)
- {
-diff --git a/include/asm-m32r/uaccess.h b/include/asm-m32r/uaccess.h
-index e8ae619..819cc28 100644
---- a/include/asm-m32r/uaccess.h
-+++ b/include/asm-m32r/uaccess.h
-@@ -5,17 +5,9 @@ #define _ASM_M32R_UACCESS_H
-  *  linux/include/asm-m32r/uaccess.h
-  *
-  *  M32R version.
-- *    Copyright (C) 2004  Hirokazu Takata <takata at linux-m32r.org>
-+ *    Copyright (C) 2004, 2006  Hirokazu Takata <takata at linux-m32r.org>
-  */
--#undef UACCESS_DEBUG
--
--#ifdef UACCESS_DEBUG
--#define UAPRINTK(args...) printk(args)
--#else
--#define UAPRINTK(args...)
--#endif /* UACCESS_DEBUG */
--
- /*
-  * User space memory access functions
-  */
-@@ -38,27 +30,29 @@ #define VERIFY_WRITE 1
- #define MAKE_MM_SEG(s)        ((mm_segment_t) { (s) })
- #ifdef CONFIG_MMU
-+
- #define KERNEL_DS     MAKE_MM_SEG(0xFFFFFFFF)
- #define USER_DS               MAKE_MM_SEG(PAGE_OFFSET)
--#else
--#define KERNEL_DS     MAKE_MM_SEG(0xFFFFFFFF)
--#define USER_DS               MAKE_MM_SEG(0xFFFFFFFF)
--#endif /* CONFIG_MMU */
--
- #define get_ds()      (KERNEL_DS)
--#ifdef CONFIG_MMU
- #define get_fs()      (current_thread_info()->addr_limit)
- #define set_fs(x)     (current_thread_info()->addr_limit = (x))
--#else
-+
-+#else /* not CONFIG_MMU */
-+
-+#define KERNEL_DS     MAKE_MM_SEG(0xFFFFFFFF)
-+#define USER_DS               MAKE_MM_SEG(0xFFFFFFFF)
-+#define get_ds()      (KERNEL_DS)
-+
- static inline mm_segment_t get_fs(void)
- {
--  return USER_DS;
-+      return USER_DS;
- }
- static inline void set_fs(mm_segment_t s)
- {
- }
--#endif /* CONFIG_MMU */
-+
-+#endif /* not CONFIG_MMU */
- #define segment_eq(a,b)       ((a).seg == (b).seg)
-@@ -83,9 +77,9 @@ #define __range_ok(addr,size) ({                                     \
-               "       subx    %0, %0\n"                               \
-               "       cmpu    %4, %1\n"                               \
-               "       subx    %0, %5\n"                               \
--              : "=&r"(flag), "=r"(sum)                                \
--              : "1"(addr), "r"((int)(size)),                          \
--                "r"(current_thread_info()->addr_limit.seg), "r"(0)    \
-+              : "=&r" (flag), "=r" (sum)                              \
-+              : "1" (addr), "r" ((int)(size)),                        \
-+                "r" (current_thread_info()->addr_limit.seg), "r" (0)  \
-               : "cbit" );                                             \
-       flag; })
-@@ -113,10 +107,10 @@ #define access_ok(type,addr,size) (likel
- #else
- static inline int access_ok(int type, const void *addr, unsigned long size)
- {
--  extern unsigned long memory_start, memory_end;
--  unsigned long val = (unsigned long)addr;
-+      extern unsigned long memory_start, memory_end;
-+      unsigned long val = (unsigned long)addr;
--  return ((val >= memory_start) && ((val + size) < memory_end));
-+      return ((val >= memory_start) && ((val + size) < memory_end));
- }
- #endif /* CONFIG_MMU */
-@@ -155,39 +149,6 @@ extern int fixup_exception(struct pt_reg
-  * accesses to the same area of user memory).
-  */
--extern void __get_user_1(void);
--extern void __get_user_2(void);
--extern void __get_user_4(void);
--
--#ifndef MODULE
--#define __get_user_x(size,ret,x,ptr)                                  \
--      __asm__ __volatile__(                                           \
--              "       mv      r0, %0\n"                               \
--              "       mv      r1, %1\n"                               \
--              "       bl __get_user_" #size "\n"                      \
--              "       mv      %0, r0\n"                               \
--              "       mv      %1, r1\n"                               \
--              : "=r"(ret), "=r"(x)                                    \
--              : "0"(ptr)                                              \
--              : "r0", "r1", "r14" )
--#else /* MODULE */
--/*
-- * Use "jl" instead of "bl" for MODULE
-- */
--#define __get_user_x(size,ret,x,ptr)                                  \
--      __asm__ __volatile__(                                           \
--              "       mv      r0, %0\n"                               \
--              "       mv      r1, %1\n"                               \
--              "       seth    lr, #high(__get_user_" #size ")\n"      \
--              "       or3     lr, lr, #low(__get_user_" #size ")\n"   \
--              "       jl      lr\n"                                   \
--              "       mv      %0, r0\n"                               \
--              "       mv      %1, r1\n"                               \
--              : "=r"(ret), "=r"(x)                                    \
--              : "0"(ptr)                                              \
--              : "r0", "r1", "r14" )
--#endif
--
- /* Careful: we have to cast the result to the type of the pointer for sign
-    reasons */
- /**
-@@ -208,20 +169,7 @@ #endif
-  * On error, the variable @x is set to zero.
-  */
- #define get_user(x,ptr)                                                       \
--({    int __ret_gu;                                                   \
--      unsigned long __val_gu;                                         \
--      __chk_user_ptr(ptr);                                            \
--      switch(sizeof (*(ptr))) {                                       \
--      case 1:  __get_user_x(1,__ret_gu,__val_gu,ptr); break;          \
--      case 2:  __get_user_x(2,__ret_gu,__val_gu,ptr); break;          \
--      case 4:  __get_user_x(4,__ret_gu,__val_gu,ptr); break;          \
--      default: __get_user_x(X,__ret_gu,__val_gu,ptr); break;          \
--      }                                                               \
--      (x) = (__typeof__(*(ptr)))__val_gu;                             \
--      __ret_gu;                                                       \
--})
--
--extern void __put_user_bad(void);
-+      __get_user_check((x),(ptr),sizeof(*(ptr)))
- /**
-  * put_user: - Write a simple value into user space.
-@@ -240,8 +188,7 @@ extern void __put_user_bad(void);
-  * Returns zero on success, or -EFAULT on error.
-  */
- #define put_user(x,ptr)                                                       \
--  __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
--
-+      __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
- /**
-  * __get_user: - Get a simple variable from user space, with less checking.
-@@ -264,8 +211,64 @@ #define put_user(x,ptr)                                                   \
-  * On error, the variable @x is set to zero.
-  */
- #define __get_user(x,ptr) \
--  __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
-+      __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
-+#define __get_user_nocheck(x,ptr,size)                                        \
-+({                                                                    \
-+      long __gu_err = 0;                                              \
-+      unsigned long __gu_val;                                         \
-+      might_sleep();                                                  \
-+      __get_user_size(__gu_val,(ptr),(size),__gu_err);                \
-+      (x) = (__typeof__(*(ptr)))__gu_val;                             \
-+      __gu_err;                                                       \
-+})
-+
-+#define __get_user_check(x,ptr,size)                                  \
-+({                                                                    \
-+      long __gu_err = -EFAULT;                                        \
-+      unsigned long __gu_val = 0;                                     \
-+      const __typeof__(*(ptr)) __user *__gu_addr = (ptr);             \
-+      might_sleep();                                                  \
-+      if (access_ok(VERIFY_READ,__gu_addr,size))                      \
-+              __get_user_size(__gu_val,__gu_addr,(size),__gu_err);    \
-+      (x) = (__typeof__(*(ptr)))__gu_val;                             \
-+      __gu_err;                                                       \
-+})
-+
-+extern long __get_user_bad(void);
-+
-+#define __get_user_size(x,ptr,size,retval)                            \
-+do {                                                                  \
-+      retval = 0;                                                     \
-+      __chk_user_ptr(ptr);                                            \
-+      switch (size) {                                                 \
-+        case 1: __get_user_asm(x,ptr,retval,"ub"); break;             \
-+        case 2: __get_user_asm(x,ptr,retval,"uh"); break;             \
-+        case 4: __get_user_asm(x,ptr,retval,""); break;               \
-+        default: (x) = __get_user_bad();                              \
-+      }                                                               \
-+} while (0)
-+
-+#define __get_user_asm(x, addr, err, itype)                           \
-+      __asm__ __volatile__(                                           \
-+              "       .fillinsn\n"                                    \
-+              "1:     ld"itype" %1,@%2\n"                             \
-+              "       .fillinsn\n"                                    \
-+              "2:\n"                                                  \
-+              ".section .fixup,\"ax\"\n"                              \
-+              "       .balign 4\n"                                    \
-+              "3:     ldi %0,%3\n"                                    \
-+              "       seth r14,#high(2b)\n"                           \
-+              "       or3 r14,r14,#low(2b)\n"                         \
-+              "       jmp r14\n"                                      \
-+              ".previous\n"                                           \
-+              ".section __ex_table,\"a\"\n"                           \
-+              "       .balign 4\n"                                    \
-+              "       .long 1b,3b\n"                                  \
-+              ".previous"                                             \
-+              : "=&r" (err), "=&r" (x)                                \
-+              : "r" (addr), "i" (-EFAULT), "0" (err)                  \
-+              : "r14", "memory")
- /**
-  * __put_user: - Write a simple value into user space, with less checking.
-@@ -287,11 +290,13 @@ #define __get_user(x,ptr) \
-  * Returns zero on success, or -EFAULT on error.
-  */
- #define __put_user(x,ptr) \
--  __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-+      __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-+
- #define __put_user_nocheck(x,ptr,size)                                        \
- ({                                                                    \
-       long __pu_err;                                                  \
-+      might_sleep();                                                  \
-       __put_user_size((x),(ptr),(size),__pu_err);                     \
-       __pu_err;                                                       \
- })
-@@ -308,28 +313,28 @@ ({                                                                       \
- })
- #if defined(__LITTLE_ENDIAN__)
--#define __put_user_u64(x, addr, err)                                    \
--        __asm__ __volatile__(                                           \
--                "       .fillinsn\n"                                    \
--                "1:     st %L1,@%2\n"                                    \
--                "       .fillinsn\n"                                    \
--                "2:     st %H1,@(4,%2)\n"                                \
--                "       .fillinsn\n"                                    \
--                "3:\n"                                                  \
--                ".section .fixup,\"ax\"\n"                              \
--                "       .balign 4\n"                                    \
--                "4:     ldi %0,%3\n"                                    \
--                "       seth r14,#high(3b)\n"                           \
--                "       or3 r14,r14,#low(3b)\n"                         \
--                "       jmp r14\n"                                      \
--                ".previous\n"                                           \
--                ".section __ex_table,\"a\"\n"                           \
--                "       .balign 4\n"                                    \
--                "       .long 1b,4b\n"                                  \
--                "       .long 2b,4b\n"                                  \
--                ".previous"                                             \
--                : "=&r"(err)                                             \
--                : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)           \
-+#define __put_user_u64(x, addr, err)                                  \
-+        __asm__ __volatile__(                                         \
-+                "       .fillinsn\n"                                  \
-+                "1:     st %L1,@%2\n"                                 \
-+                "       .fillinsn\n"                                  \
-+                "2:     st %H1,@(4,%2)\n"                             \
-+                "       .fillinsn\n"                                  \
-+                "3:\n"                                                        \
-+                ".section .fixup,\"ax\"\n"                            \
-+                "       .balign 4\n"                                  \
-+                "4:     ldi %0,%3\n"                                  \
-+                "       seth r14,#high(3b)\n"                         \
-+                "       or3 r14,r14,#low(3b)\n"                               \
-+                "       jmp r14\n"                                    \
-+                ".previous\n"                                         \
-+                ".section __ex_table,\"a\"\n"                         \
-+                "       .balign 4\n"                                  \
-+                "       .long 1b,4b\n"                                        \
-+                "       .long 2b,4b\n"                                        \
-+                ".previous"                                           \
-+                : "=&r" (err)                                         \
-+                : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err)               \
-                 : "r14", "memory")
- #elif defined(__BIG_ENDIAN__)
-@@ -353,13 +358,15 @@ #define __put_user_u64(x, addr, err)                             
-               "       .long 1b,4b\n"                                  \
-               "       .long 2b,4b\n"                                  \
-               ".previous"                                             \
--              : "=&r"(err)                                            \
--              : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)             \
-+              : "=&r" (err)                                           \
-+              : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err)         \
-               : "r14", "memory")
- #else
- #error no endian defined
- #endif
-+extern void __put_user_bad(void);
-+
- #define __put_user_size(x,ptr,size,retval)                            \
- do {                                                                  \
-       retval = 0;                                                     \
-@@ -398,52 +405,8 @@ #define __put_user_asm(x, addr, err, ity
-               "       .balign 4\n"                                    \
-               "       .long 1b,3b\n"                                  \
-               ".previous"                                             \
--              : "=&r"(err)                                            \
--              : "r"(x), "r"(addr), "i"(-EFAULT), "0"(err)             \
--              : "r14", "memory")
--
--#define __get_user_nocheck(x,ptr,size)                                        \
--({                                                                    \
--      long __gu_err;                                                  \
--      unsigned long __gu_val;                                         \
--      __get_user_size(__gu_val,(ptr),(size),__gu_err);                \
--      (x) = (__typeof__(*(ptr)))__gu_val;                             \
--      __gu_err;                                                       \
--})
--
--extern long __get_user_bad(void);
--
--#define __get_user_size(x,ptr,size,retval)                            \
--do {                                                                  \
--      retval = 0;                                                     \
--      __chk_user_ptr(ptr);                                            \
--      switch (size) {                                                 \
--        case 1: __get_user_asm(x,ptr,retval,"ub"); break;             \
--        case 2: __get_user_asm(x,ptr,retval,"uh"); break;             \
--        case 4: __get_user_asm(x,ptr,retval,""); break;               \
--        default: (x) = __get_user_bad();                              \
--      }                                                               \
--} while (0)
--
--#define __get_user_asm(x, addr, err, itype)                           \
--      __asm__ __volatile__(                                           \
--              "       .fillinsn\n"                                    \
--              "1:     ld"itype" %1,@%2\n"                             \
--              "       .fillinsn\n"                                    \
--              "2:\n"                                                  \
--              ".section .fixup,\"ax\"\n"                              \
--              "       .balign 4\n"                                    \
--              "3:     ldi %0,%3\n"                                    \
--              "       seth r14,#high(2b)\n"                           \
--              "       or3 r14,r14,#low(2b)\n"                         \
--              "       jmp r14\n"                                      \
--              ".previous\n"                                           \
--              ".section __ex_table,\"a\"\n"                           \
--              "       .balign 4\n"                                    \
--              "       .long 1b,3b\n"                                  \
--              ".previous"                                             \
--              : "=&r"(err), "=&r"(x)                                  \
--              : "r"(addr), "i"(-EFAULT), "0"(err)                     \
-+              : "=&r" (err)                                           \
-+              : "r" (x), "r" (addr), "i" (-EFAULT), "0" (err)         \
-               : "r14", "memory")
- /*
-@@ -453,7 +416,6 @@ #define __get_user_asm(x, addr, err, ity
-  * anything, so this is accurate.
-  */
--
- /*
-  * Copy To/From Userspace
-  */
-@@ -511,8 +473,9 @@ do {                                                                       \
-               "       .long 2b,9b\n"                                  \
-               "       .long 3b,9b\n"                                  \
-               ".previous\n"                                           \
--              : "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c)   \
--              : "0"(to), "1"(from), "2"(size), "3"(size / 4)          \
-+              : "=&r" (__dst), "=&r" (__src), "=&r" (size),           \
-+                "=&r" (__c)                                           \
-+              : "0" (to), "1" (from), "2" (size), "3" (size / 4)      \
-               : "r14", "memory");                                     \
- } while (0)
-@@ -573,8 +536,9 @@ do {                                                                       \
-               "       .long 2b,7b\n"                                  \
-               "       .long 3b,7b\n"                                  \
-               ".previous\n"                                           \
--              : "=&r"(__dst), "=&r"(__src), "=&r"(size), "=&r"(__c)   \
--              : "0"(to), "1"(from), "2"(size), "3"(size / 4)          \
-+              : "=&r" (__dst), "=&r" (__src), "=&r" (size),           \
-+                "=&r" (__c)                                           \
-+              : "0" (to), "1" (from), "2" (size), "3" (size / 4)      \
-               : "r14", "memory");                                     \
- } while (0)
-@@ -676,7 +640,7 @@ #define __copy_from_user(to,from,n)                        \
- #define copy_from_user(to,from,n)                     \
- ({                                                    \
-       might_sleep();                                  \
--__generic_copy_from_user((to),(from),(n));    \
-+      __generic_copy_from_user((to),(from),(n));      \
- })
- long __must_check strncpy_from_user(char *dst, const char __user *src,
-diff --git a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h
-index 8e80205..849155a 100644
---- a/include/asm-mips/bitops.h
-+++ b/include/asm-mips/bitops.h
-@@ -654,7 +654,12 @@ static inline unsigned long fls(unsigned
- {
- #ifdef CONFIG_32BIT
- #ifdef CONFIG_CPU_MIPS32
--      __asm__ ("clz %0, %1" : "=r" (word) : "r" (word));
-+      __asm__ (
-+      "       .set    mips32                                  \n"
-+      "       clz     %0, %1                                  \n"
-+      "       .set    mips0                                   \n"
-+      : "=r" (word)
-+      : "r" (word));
-       return 32 - word;
- #else
-@@ -678,7 +683,12 @@ #endif /* CONFIG_32BIT */
- #ifdef CONFIG_64BIT
- #ifdef CONFIG_CPU_MIPS64
--      __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word));
-+      __asm__ (
-+      "       .set    mips64                                  \n"
-+      "       dclz    %0, %1                                  \n"
-+      "       .set    mips0                                   \n"
-+      : "=r" (word)
-+      : "r" (word));
-       return 64 - word;
- #else
-diff --git a/include/asm-mips/byteorder.h b/include/asm-mips/byteorder.h
-index 584f812..4ce5bc3 100644
---- a/include/asm-mips/byteorder.h
-+++ b/include/asm-mips/byteorder.h
-@@ -19,7 +19,9 @@ #ifdef CONFIG_CPU_MIPSR2
- static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
- {
-       __asm__(
-+      "       .set    mips32r2                \n"
-       "       wsbh    %0, %1                  \n"
-+      "       .set    mips0                   \n"
-       : "=r" (x)
-       : "r" (x));
-@@ -30,8 +32,10 @@ #define __arch__swab16(x)   ___arch__swab1
- static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
- {
-       __asm__(
-+      "       .set    mips32r2                \n"
-       "       wsbh    %0, %1                  \n"
-       "       rotr    %0, %0, 16              \n"
-+      "       .set    mips0                   \n"
-       : "=r" (x)
-       : "r" (x));
-diff --git a/include/asm-mips/interrupt.h b/include/asm-mips/interrupt.h
-index 7743487..50baf6b 100644
---- a/include/asm-mips/interrupt.h
-+++ b/include/asm-mips/interrupt.h
-@@ -20,7 +20,9 @@ __asm__ (
-       "       .set    reorder                                         \n"
-       "       .set    noat                                            \n"
- #ifdef CONFIG_CPU_MIPSR2
-+      "       .set    mips32r2                                        \n"
-       "       ei                                                      \n"
-+      "       .set    mips0                                           \n"
- #else
-       "       mfc0    $1,$12                                          \n"
-       "       ori     $1,0x1f                                         \n"
-@@ -63,7 +65,9 @@ __asm__ (
-       "       .set    push                                            \n"
-       "       .set    noat                                            \n"
- #ifdef CONFIG_CPU_MIPSR2
-+      "       .set    mips32r2                                        \n"
-       "       di                                                      \n"
-+      "       .set    mips0                                           \n"
- #else
-       "       mfc0    $1,$12                                          \n"
-       "       ori     $1,0x1f                                         \n"
-@@ -103,8 +107,10 @@ __asm__ (
-       "       .set    reorder                                         \n"
-       "       .set    noat                                            \n"
- #ifdef CONFIG_CPU_MIPSR2
-+      "       .set    mips32r2                                        \n"
-       "       di      \\result                                        \n"
-       "       andi    \\result, 1                                     \n"
-+      "       .set    mips0                                           \n"
- #else
-       "       mfc0    \\result, $12                                   \n"
-       "       ori     $1, \\result, 0x1f                              \n"
-@@ -133,9 +139,11 @@ #if defined(CONFIG_CPU_MIPSR2) && define
-        * Slow, but doesn't suffer from a relativly unlikely race
-        * condition we're having since days 1.
-        */
-+      "       .set    mips32r2                                        \n"
-       "       beqz    \\flags, 1f                                     \n"
-       "        di                                                     \n"
-       "       ei                                                      \n"
-+      "       .set    mips0                                           \n"
-       "1:                                                             \n"
- #elif defined(CONFIG_CPU_MIPSR2)
-       /*
-diff --git a/include/asm-mips/r4kcache.h b/include/asm-mips/r4kcache.h
-index 0bcb79a..d9ee097 100644
---- a/include/asm-mips/r4kcache.h
-+++ b/include/asm-mips/r4kcache.h
-@@ -37,7 +37,7 @@ #define cache_op(op,addr)                                            \
-       "       cache   %0, %1                                  \n"     \
-       "       .set    pop                                     \n"     \
-       :                                                               \
--      : "i" (op), "m" (*(unsigned char *)(addr)))
-+      : "i" (op), "R" (*(unsigned char *)(addr)))
- static inline void flush_icache_line_indexed(unsigned long addr)
- {
-diff --git a/include/asm-powerpc/floppy.h b/include/asm-powerpc/floppy.h
-index e258778..608164c 100644
---- a/include/asm-powerpc/floppy.h
-+++ b/include/asm-powerpc/floppy.h
-@@ -35,6 +35,7 @@ #define fd_free_irq()           free_irq
- #ifdef CONFIG_PCI
- #include <linux/pci.h>
-+#include <asm/ppc-pci.h>      /* for ppc64_isabridge_dev */
- #define fd_dma_setup(addr,size,mode,io) powerpc_fd_dma_setup(addr,size,mode,io)
-@@ -52,12 +53,12 @@ static __inline__ int powerpc_fd_dma_set
-       if (bus_addr 
-           && (addr != prev_addr || size != prev_size || dir != prev_dir)) {
-               /* different from last time -- unmap prev */
--              pci_unmap_single(NULL, bus_addr, prev_size, prev_dir);
-+              pci_unmap_single(ppc64_isabridge_dev, bus_addr, prev_size, prev_dir);
-               bus_addr = 0;
-       }
-       if (!bus_addr)  /* need to map it */
--              bus_addr = pci_map_single(NULL, addr, size, dir);
-+              bus_addr = pci_map_single(ppc64_isabridge_dev, addr, size, dir);
-       /* remember this one as prev */
-       prev_addr = addr;
-diff --git a/include/asm-x86_64/cpufeature.h b/include/asm-x86_64/cpufeature.h
-index 76bb619..662964b 100644
---- a/include/asm-x86_64/cpufeature.h
-+++ b/include/asm-x86_64/cpufeature.h
-@@ -64,6 +64,7 @@ #define X86_FEATURE_CENTAUR_MCR      (3*32+ 3
- #define X86_FEATURE_REP_GOOD  (3*32+ 4) /* rep microcode works well on this CPU */
- #define X86_FEATURE_CONSTANT_TSC (3*32+5) /* TSC runs at constant rate */
- #define X86_FEATURE_SYNC_RDTSC  (3*32+6)  /* RDTSC syncs CPU core */
-+#define X86_FEATURE_FXSAVE_LEAK (3*32+7)  /* FIP/FOP/FDP leaks through FXSAVE */
- /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
- #define X86_FEATURE_XMM3      (4*32+ 0) /* Streaming SIMD Extensions-3 */
-diff --git a/include/asm-x86_64/i387.h b/include/asm-x86_64/i387.h
-index 876eb9a..cba8a3b 100644
---- a/include/asm-x86_64/i387.h
-+++ b/include/asm-x86_64/i387.h
-@@ -72,6 +72,23 @@ #define set_fpu_cwd(t,val) ((t)->thread.
- #define set_fpu_swd(t,val) ((t)->thread.i387.fxsave.swd = (val))
- #define set_fpu_fxsr_twd(t,val) ((t)->thread.i387.fxsave.twd = (val))
-+#define X87_FSW_ES (1 << 7)   /* Exception Summary */
-+
-+/* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception
-+   is pending. Clear the x87 state here by setting it to fixed
-+   values. The kernel data segment can be sometimes 0 and sometimes
-+   new user value. Both should be ok.
-+   Use the PDA as safe address because it should be already in L1. */
-+static inline void clear_fpu_state(struct i387_fxsave_struct *fx)
-+{
-+      if (unlikely(fx->swd & X87_FSW_ES))
-+               asm volatile("fnclex");
-+      alternative_input(ASM_NOP8 ASM_NOP2,
-+                   "    emms\n"               /* clear stack tags */
-+                   "    fildl %%gs:0",        /* load to clear state */
-+                   X86_FEATURE_FXSAVE_LEAK);
-+}
-+
- static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) 
- { 
-       int err;
-@@ -119,6 +136,7 @@ #else
- #endif
-       if (unlikely(err))
-               __clear_user(fx, sizeof(struct i387_fxsave_struct));
-+      /* No need to clear here because the caller clears USED_MATH */
-       return err;
- } 
-@@ -149,7 +167,7 @@ #else
-                               "i" (offsetof(__typeof__(*tsk),
-                                             thread.i387.fxsave)));
- #endif
--      __asm__ __volatile__("fnclex");
-+      clear_fpu_state(&tsk->thread.i387.fxsave);
- }
- static inline void kernel_fpu_begin(void)
-diff --git a/include/linux/cpu.h b/include/linux/cpu.h
-index 0ed1d48..d612b89 100644
---- a/include/linux/cpu.h
-+++ b/include/linux/cpu.h
-@@ -32,7 +32,7 @@ struct cpu {
- };
- extern int register_cpu(struct cpu *, int, struct node *);
--extern struct sys_device *get_cpu_sysdev(int cpu);
-+extern struct sys_device *get_cpu_sysdev(unsigned cpu);
- #ifdef CONFIG_HOTPLUG_CPU
- extern void unregister_cpu(struct cpu *, struct node *);
- #endif
-diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
-index 60e56c6..a47ad70 100644
---- a/include/linux/cpumask.h
-+++ b/include/linux/cpumask.h
-@@ -408,6 +408,7 @@ ({                                         \
- })
- #define for_each_cpu(cpu)       for_each_cpu_mask((cpu), cpu_possible_map)
-+#define for_each_possible_cpu(cpu)  for_each_cpu_mask((cpu), cpu_possible_map)
- #define for_each_online_cpu(cpu)  for_each_cpu_mask((cpu), cpu_online_map)
- #define for_each_present_cpu(cpu) for_each_cpu_mask((cpu), cpu_present_map)
-diff --git a/include/linux/fb.h b/include/linux/fb.h
-index 2cb19e6..2fdd8ae 100644
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -839,12 +839,10 @@ #if defined (__BIG_ENDIAN)
- #define FB_LEFT_POS(bpp)          (32 - bpp)
- #define FB_SHIFT_HIGH(val, bits)  ((val) >> (bits))
- #define FB_SHIFT_LOW(val, bits)   ((val) << (bits))
--#define FB_BIT_NR(b)              (7 - (b))
- #else
- #define FB_LEFT_POS(bpp)          (0)
- #define FB_SHIFT_HIGH(val, bits)  ((val) << (bits))
- #define FB_SHIFT_LOW(val, bits)   ((val) >> (bits))
--#define FB_BIT_NR(b)              (b)
- #endif
-     /*
-diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 128d008..872042f 100644
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1383,6 +1383,7 @@ extern int bd_claim(struct block_device 
- extern void bd_release(struct block_device *);
- /* fs/char_dev.c */
-+#define CHRDEV_MAJOR_HASH_SIZE        255
- extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
- extern int register_chrdev_region(dev_t, unsigned, const char *);
- extern int register_chrdev(unsigned int, const char *,
-@@ -1390,25 +1391,17 @@ extern int register_chrdev(unsigned int,
- extern int unregister_chrdev(unsigned int, const char *);
- extern void unregister_chrdev_region(dev_t, unsigned);
- extern int chrdev_open(struct inode *, struct file *);
--extern int get_chrdev_list(char *);
--extern void *acquire_chrdev_list(void);
--extern int count_chrdev_list(void);
--extern void *get_next_chrdev(void *);
--extern int get_chrdev_info(void *, int *, char **);
--extern void release_chrdev_list(void *);
-+extern void chrdev_show(struct seq_file *,off_t);
- /* fs/block_dev.c */
-+#define BLKDEV_MAJOR_HASH_SIZE        255
- #define BDEVNAME_SIZE 32      /* Largest string for a blockdev identifier */
- extern const char *__bdevname(dev_t, char *buffer);
- extern const char *bdevname(struct block_device *bdev, char *buffer);
- extern struct block_device *lookup_bdev(const char *);
- extern struct block_device *open_bdev_excl(const char *, int, void *);
- extern void close_bdev_excl(struct block_device *);
--extern void *acquire_blkdev_list(void);
--extern int count_blkdev_list(void);
--extern void *get_next_blkdev(void *);
--extern int get_blkdev_info(void *, int *, char **);
--extern void release_blkdev_list(void *);
-+extern void blkdev_show(struct seq_file *,off_t);
- extern void init_special_inode(struct inode *, umode_t, dev_t);
-diff --git a/include/linux/mm.h b/include/linux/mm.h
-index 498ff87..279446e 100644
---- a/include/linux/mm.h
-+++ b/include/linux/mm.h
-@@ -229,10 +229,9 @@ struct page {
-               unsigned long private;          /* Mapping-private opaque data:
-                                                * usually used for buffer_heads
-                                                * if PagePrivate set; used for
--                                               * swp_entry_t if PageSwapCache.
--                                               * When page is free, this
-+                                               * swp_entry_t if PageSwapCache;
-                                                * indicates order in the buddy
--                                               * system.
-+                                               * system if PG_buddy is set.
-                                                */
-               struct address_space *mapping;  /* If low bit clear, points to
-                                                * inode address_space, or NULL.
-diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
-index d52999c..d7ce72e 100644
---- a/include/linux/page-flags.h
-+++ b/include/linux/page-flags.h
-@@ -74,7 +74,9 @@ #define PG_swapcache         15      /* Swap page: s
- #define PG_mappedtodisk               16      /* Has blocks allocated on-disk */
- #define PG_reclaim            17      /* To be reclaimed asap */
- #define PG_nosave_free                18      /* Free, should not be written */
--#define PG_uncached           19      /* Page has been mapped as uncached */
-+#define PG_buddy              19      /* Page is free, on buddy lists */
-+
-+#define PG_uncached           20      /* Page has been mapped as uncached */
- /*
-  * Global page accounting.  One instance per CPU.  Only unsigned longs are
-@@ -319,6 +321,10 @@ #define PageNosaveFree(page)      test_bit(PG
- #define SetPageNosaveFree(page)       set_bit(PG_nosave_free, &(page)->flags)
- #define ClearPageNosaveFree(page)             clear_bit(PG_nosave_free, &(page)->flags)
-+#define PageBuddy(page)               test_bit(PG_buddy, &(page)->flags)
-+#define __SetPageBuddy(page)  __set_bit(PG_buddy, &(page)->flags)
-+#define __ClearPageBuddy(page)        __clear_bit(PG_buddy, &(page)->flags)
-+
- #define PageMappedToDisk(page)        test_bit(PG_mappedtodisk, &(page)->flags)
- #define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)
- #define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)
-diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
-index aa6322d..6c1e347 100644
---- a/include/linux/proc_fs.h
-+++ b/include/linux/proc_fs.h
-@@ -78,7 +78,7 @@ struct kcore_list {
- struct vmcore {
-       struct list_head list;
-       unsigned long long paddr;
--      unsigned long size;
-+      unsigned long long size;
-       loff_t offset;
- };
-diff --git a/include/linux/raid/raid1.h b/include/linux/raid/raid1.h
-index 9d5494a..3009c81 100644
---- a/include/linux/raid/raid1.h
-+++ b/include/linux/raid/raid1.h
-@@ -130,6 +130,6 @@ #define R1BIO_BarrierRetry 5
-  * with failure when last write completes (and all failed).
-  * Record that bi_end_io was called with this flag...
-  */
--#define       R1BIO_Returned 4
-+#define       R1BIO_Returned 6
- #endif
-diff --git a/include/linux/rtc.h b/include/linux/rtc.h
-index 0b2ba67..b739ac1 100644
---- a/include/linux/rtc.h
-+++ b/include/linux/rtc.h
-@@ -11,8 +11,6 @@
- #ifndef _LINUX_RTC_H_
- #define _LINUX_RTC_H_
--#include <linux/interrupt.h>
--
- /*
-  * The struct used to pass data via the following ioctl. Similar to the
-  * struct tm in <time.h>, but it needs to be here so that the kernel 
-@@ -95,6 +93,8 @@ #define RTC_PLL_SET  _IOW('p', 0x12, stru
- #ifdef __KERNEL__
-+#include <linux/interrupt.h>
-+
- typedef struct rtc_task {
-       void (*func)(void *private_data);
-       void *private_data;
-diff --git a/include/net/ip.h b/include/net/ip.h
-index fab3d5b..ed84d04 100644
---- a/include/net/ip.h
-+++ b/include/net/ip.h
-@@ -95,6 +95,7 @@ extern int           ip_local_deliver(struct sk_b
- extern int            ip_mr_input(struct sk_buff *skb);
- extern int            ip_output(struct sk_buff *skb);
- extern int            ip_mc_output(struct sk_buff *skb);
-+extern int            ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *));
- extern int            ip_do_nat(struct sk_buff *skb);
- extern void           ip_send_check(struct iphdr *ip);
- extern int            ip_queue_xmit(struct sk_buff *skb, int ipfragok);
-diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
-index e673b2c..aa6033c 100644
---- a/include/net/sctp/sctp.h
-+++ b/include/net/sctp/sctp.h
-@@ -461,12 +461,12 @@ static inline int sctp_frag_point(const 
-  * there is room for a param header too.
-  */
- #define sctp_walk_params(pos, chunk, member)\
--_sctp_walk_params((pos), (chunk), WORD_ROUND(ntohs((chunk)->chunk_hdr.length)), member)
-+_sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length), member)
- #define _sctp_walk_params(pos, chunk, end, member)\
- for (pos.v = chunk->member;\
-      pos.v <= (void *)chunk + end - sizeof(sctp_paramhdr_t) &&\
--     pos.v <= (void *)chunk + end - WORD_ROUND(ntohs(pos.p->length)) &&\
-+     pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\
-      ntohs(pos.p->length) >= sizeof(sctp_paramhdr_t);\
-      pos.v += WORD_ROUND(ntohs(pos.p->length)))
-@@ -477,7 +477,7 @@ #define _sctp_walk_errors(err, chunk_hdr
- for (err = (sctp_errhdr_t *)((void *)chunk_hdr + \
-           sizeof(sctp_chunkhdr_t));\
-      (void *)err <= (void *)chunk_hdr + end - sizeof(sctp_errhdr_t) &&\
--     (void *)err <= (void *)chunk_hdr + end - WORD_ROUND(ntohs(err->length)) &&\
-+     (void *)err <= (void *)chunk_hdr + end - ntohs(err->length) &&\
-      ntohs(err->length) >= sizeof(sctp_errhdr_t); \
-      err = (sctp_errhdr_t *)((void *)err + WORD_ROUND(ntohs(err->length))))
-diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
-index 072f407..acb2ce1 100644
---- a/include/net/sctp/structs.h
-+++ b/include/net/sctp/structs.h
-@@ -702,6 +702,7 @@ struct sctp_chunk {
-       __u8 tsn_gap_acked;     /* Is this chunk acked by a GAP ACK? */
-       __s8 fast_retransmit;    /* Is this chunk fast retransmitted? */
-       __u8 tsn_missing_report; /* Data chunk missing counter. */
-+      __u8 data_accepted;     /* At least 1 chunk in this packet accepted */
- };
- void sctp_chunk_hold(struct sctp_chunk *);
-diff --git a/ipc/shm.c b/ipc/shm.c
-index 9162123..f409726 100644
---- a/ipc/shm.c
-+++ b/ipc/shm.c
-@@ -161,6 +161,8 @@ static int shm_mmap(struct file * file, 
-       ret = shmem_mmap(file, vma);
-       if (ret == 0) {
-               vma->vm_ops = &shm_vm_ops;
-+              if (!(vma->vm_flags & VM_WRITE))
-+                      vma->vm_flags &= ~VM_MAYWRITE;
-               shm_inc(file->f_dentry->d_inode->i_ino);
-       }
-diff --git a/ipc/util.c b/ipc/util.c
-index 8626219..303b058 100644
---- a/ipc/util.c
-+++ b/ipc/util.c
-@@ -182,8 +182,7 @@ static int grow_ary(struct ipc_ids* ids,
-       if(new == NULL)
-               return size;
-       new->size = newsize;
--      memcpy(new->p, ids->entries->p, sizeof(struct kern_ipc_perm *)*size +
--                                      sizeof(struct ipc_id_ary));
-+      memcpy(new->p, ids->entries->p, sizeof(struct kern_ipc_perm *)*size);
-       for(i=size;i<newsize;i++) {
-               new->p[i] = NULL;
-       }
-diff --git a/kernel/auditsc.c b/kernel/auditsc.c
-index d7e7e63..cfaa4a2 100644
---- a/kernel/auditsc.c
-+++ b/kernel/auditsc.c
-@@ -966,11 +966,6 @@ void audit_syscall_entry(struct task_str
-       if (context->in_syscall) {
-               struct audit_context *newctx;
--#if defined(__NR_vm86) && defined(__NR_vm86old)
--              /* vm86 mode should only be entered once */
--              if (major == __NR_vm86 || major == __NR_vm86old)
--                      return;
--#endif
- #if AUDIT_DEBUG
-               printk(KERN_ERR
-                      "audit(:%d) pid=%d in syscall=%d;"
-diff --git a/kernel/exec_domain.c b/kernel/exec_domain.c
-index 867d6db..c01cead 100644
---- a/kernel/exec_domain.c
-+++ b/kernel/exec_domain.c
-@@ -140,6 +140,7 @@ __set_personality(u_long personality)
-       ep = lookup_exec_domain(personality);
-       if (ep == current_thread_info()->exec_domain) {
-               current->personality = personality;
-+              module_put(ep->module);
-               return 0;
-       }
-diff --git a/kernel/fork.c b/kernel/fork.c
-index b373322..9d4e0d8 100644
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -720,7 +720,7 @@ out_release:
-       free_fdset (new_fdt->open_fds, new_fdt->max_fdset);
-       free_fd_array(new_fdt->fd, new_fdt->max_fds);
-       kmem_cache_free(files_cachep, newf);
--      goto out;
-+      return NULL;
- }
- static int copy_files(unsigned long clone_flags, struct task_struct * tsk)
-diff --git a/kernel/power/process.c b/kernel/power/process.c
-index 28de118..67b2cdd 100644
---- a/kernel/power/process.c
-+++ b/kernel/power/process.c
-@@ -25,8 +25,7 @@ static inline int freezeable(struct task
-           (p->flags & PF_NOFREEZE) ||
-           (p->exit_state == EXIT_ZOMBIE) ||
-           (p->exit_state == EXIT_DEAD) ||
--          (p->state == TASK_STOPPED) ||
--          (p->state == TASK_TRACED))
-+          (p->state == TASK_STOPPED))
-               return 0;
-       return 1;
- }
-diff --git a/kernel/ptrace.c b/kernel/ptrace.c
-index d95a72c..48453c3 100644
---- a/kernel/ptrace.c
-+++ b/kernel/ptrace.c
-@@ -57,10 +57,6 @@ void ptrace_untrace(task_t *child)
-                       signal_wake_up(child, 1);
-               }
-       }
--      if (child->signal->flags & SIGNAL_GROUP_EXIT) {
--              sigaddset(&child->pending.signal, SIGKILL);
--              signal_wake_up(child, 1);
--      }
-       spin_unlock(&child->sighand->siglock);
- }
-@@ -82,7 +78,8 @@ void __ptrace_unlink(task_t *child)
-               SET_LINKS(child);
-       }
--      ptrace_untrace(child);
-+      if (child->state == TASK_TRACED)
-+              ptrace_untrace(child);
- }
- /*
-@@ -152,12 +149,34 @@ int ptrace_may_attach(struct task_struct
- int ptrace_attach(struct task_struct *task)
- {
-       int retval;
--      task_lock(task);
-+
-       retval = -EPERM;
-       if (task->pid <= 1)
--              goto bad;
-+              goto out;
-       if (task->tgid == current->tgid)
--              goto bad;
-+              goto out;
-+
-+repeat:
-+      /*
-+       * Nasty, nasty.
-+       *
-+       * We want to hold both the task-lock and the
-+       * tasklist_lock for writing at the same time.
-+       * But that's against the rules (tasklist_lock
-+       * is taken for reading by interrupts on other
-+       * cpu's that may have task_lock).
-+       */
-+      task_lock(task);
-+      local_irq_disable();
-+      if (!write_trylock(&tasklist_lock)) {
-+              local_irq_enable();
-+              task_unlock(task);
-+              do {
-+                      cpu_relax();
-+              } while (!write_can_lock(&tasklist_lock));
-+              goto repeat;
-+      }
-+
-       /* the same process cannot be attached many times */
-       if (task->ptrace & PT_PTRACED)
-               goto bad;
-@@ -170,17 +189,15 @@ int ptrace_attach(struct task_struct *ta
-                                     ? PT_ATTACHED : 0);
-       if (capable(CAP_SYS_PTRACE))
-               task->ptrace |= PT_PTRACE_CAP;
--      task_unlock(task);
--      write_lock_irq(&tasklist_lock);
-       __ptrace_link(task, current);
--      write_unlock_irq(&tasklist_lock);
-       force_sig_specific(SIGSTOP, task);
--      return 0;
- bad:
-+      write_unlock_irq(&tasklist_lock);
-       task_unlock(task);
-+out:
-       return retval;
- }
-@@ -421,21 +438,22 @@ #endif
-  */
- int ptrace_traceme(void)
- {
--      int ret;
-+      int ret = -EPERM;
-       /*
-        * Are we already being traced?
-        */
--      if (current->ptrace & PT_PTRACED)
--              return -EPERM;
--      ret = security_ptrace(current->parent, current);
--      if (ret)
--              return -EPERM;
--      /*
--       * Set the ptrace bit in the process ptrace flags.
--       */
--      current->ptrace |= PT_PTRACED;
--      return 0;
-+      task_lock(current);
-+      if (!(current->ptrace & PT_PTRACED)) {
-+              ret = security_ptrace(current->parent, current);
-+              /*
-+               * Set the ptrace bit in the process ptrace flags.
-+               */
-+              if (!ret)
-+                      current->ptrace |= PT_PTRACED;
-+      }
-+      task_unlock(current);
-+      return ret;
- }
- /**
-diff --git a/kernel/sched.c b/kernel/sched.c
-index 4d46e90..4e7efac 100644
---- a/kernel/sched.c
-+++ b/kernel/sched.c
-@@ -237,6 +237,7 @@ #ifdef CONFIG_SMP
-       task_t *migration_thread;
-       struct list_head migration_queue;
-+      int cpu;
- #endif
- #ifdef CONFIG_SCHEDSTATS
-@@ -1660,6 +1661,9 @@ #ifdef CONFIG_SMP
- /*
-  * double_rq_lock - safely lock two runqueues
-  *
-+ * We must take them in cpu order to match code in
-+ * dependent_sleeper and wake_dependent_sleeper.
-+ *
-  * Note this does not disable interrupts like task_rq_lock,
-  * you need to do so manually before calling.
-  */
-@@ -1671,7 +1675,7 @@ static void double_rq_lock(runqueue_t *r
-               spin_lock(&rq1->lock);
-               __acquire(rq2->lock);   /* Fake it out ;) */
-       } else {
--              if (rq1 < rq2) {
-+              if (rq1->cpu < rq2->cpu) {
-                       spin_lock(&rq1->lock);
-                       spin_lock(&rq2->lock);
-               } else {
-@@ -1707,7 +1711,7 @@ static void double_lock_balance(runqueue
-       __acquires(this_rq->lock)
- {
-       if (unlikely(!spin_trylock(&busiest->lock))) {
--              if (busiest < this_rq) {
-+              if (busiest->cpu < this_rq->cpu) {
-                       spin_unlock(&this_rq->lock);
-                       spin_lock(&busiest->lock);
-                       spin_lock(&this_rq->lock);
-@@ -6035,6 +6039,7 @@ #ifdef CONFIG_SMP
-               rq->push_cpu = 0;
-               rq->migration_thread = NULL;
-               INIT_LIST_HEAD(&rq->migration_queue);
-+              rq->cpu = i;
- #endif
-               atomic_set(&rq->nr_iowait, 0);
-diff --git a/kernel/signal.c b/kernel/signal.c
-index ea15410..acbccf7 100644
---- a/kernel/signal.c
-+++ b/kernel/signal.c
-@@ -975,7 +975,6 @@ __group_complete_signal(int sig, struct 
-               if (t == NULL)
-                       /* restart balancing at this thread */
-                       t = p->signal->curr_target = p;
--              BUG_ON(t->tgid != p->tgid);
-               while (!wants_signal(sig, t)) {
-                       t = next_thread(t);
-@@ -1689,6 +1688,7 @@ static void ptrace_stop(int exit_code, i
-       /* Let the debugger run.  */
-       set_current_state(TASK_TRACED);
-       spin_unlock_irq(&current->sighand->siglock);
-+      try_to_freeze();
-       read_lock(&tasklist_lock);
-       if (likely(current->ptrace & PT_PTRACED) &&
-           likely(current->parent != current->real_parent ||
-@@ -1942,9 +1942,9 @@ relock:
-                       /* Let the debugger run.  */
-                       ptrace_stop(signr, signr, info);
--                      /* We're back.  Did the debugger cancel the sig or group_exit? */
-+                      /* We're back.  Did the debugger cancel the sig?  */
-                       signr = current->exit_code;
--                      if (signr == 0 || current->signal->flags & SIGNAL_GROUP_EXIT)
-+                      if (signr == 0)
-                               continue;
-                       current->exit_code = 0;
-diff --git a/kernel/sys.c b/kernel/sys.c
-index f91218a..105e102 100644
---- a/kernel/sys.c
-+++ b/kernel/sys.c
-@@ -1657,7 +1657,19 @@ asmlinkage long sys_setrlimit(unsigned i
-           (cputime_eq(current->signal->it_prof_expires, cputime_zero) ||
-            new_rlim.rlim_cur <= cputime_to_secs(
-                    current->signal->it_prof_expires))) {
--              cputime_t cputime = secs_to_cputime(new_rlim.rlim_cur);
-+              unsigned long rlim_cur = new_rlim.rlim_cur;
-+              cputime_t cputime;
-+
-+              if (rlim_cur == 0) {
-+                      /*
-+                       * The caller is asking for an immediate RLIMIT_CPU
-+                       * expiry.  But we use the zero value to mean "it was
-+                       * never set".  So let's cheat and make it one second
-+                       * instead
-+                       */
-+                      rlim_cur = 1;
-+              }
-+              cputime = secs_to_cputime(rlim_cur);
-               read_lock(&tasklist_lock);
-               spin_lock_irq(&current->sighand->siglock);
-               set_process_cpu_timer(current, CPUCLOCK_PROF,
-diff --git a/kernel/uid16.c b/kernel/uid16.c
-index aa25605..187e2a4 100644
---- a/kernel/uid16.c
-+++ b/kernel/uid16.c
-@@ -20,43 +20,67 @@ #include <asm/uaccess.h>
- asmlinkage long sys_chown16(const char __user * filename, old_uid_t user, old_gid_t group)
- {
--      return sys_chown(filename, low2highuid(user), low2highgid(group));
-+      long ret = sys_chown(filename, low2highuid(user), low2highgid(group));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_lchown16(const char __user * filename, old_uid_t user, old_gid_t group)
- {
--      return sys_lchown(filename, low2highuid(user), low2highgid(group));
-+      long ret = sys_lchown(filename, low2highuid(user), low2highgid(group));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group)
- {
--      return sys_fchown(fd, low2highuid(user), low2highgid(group));
-+      long ret = sys_fchown(fd, low2highuid(user), low2highgid(group));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_setregid16(old_gid_t rgid, old_gid_t egid)
- {
--      return sys_setregid(low2highgid(rgid), low2highgid(egid));
-+      long ret = sys_setregid(low2highgid(rgid), low2highgid(egid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_setgid16(old_gid_t gid)
- {
--      return sys_setgid(low2highgid(gid));
-+      long ret = sys_setgid(low2highgid(gid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_setreuid16(old_uid_t ruid, old_uid_t euid)
- {
--      return sys_setreuid(low2highuid(ruid), low2highuid(euid));
-+      long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_setuid16(old_uid_t uid)
- {
--      return sys_setuid(low2highuid(uid));
-+      long ret = sys_setuid(low2highuid(uid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid)
- {
--      return sys_setresuid(low2highuid(ruid), low2highuid(euid),
--              low2highuid(suid));
-+      long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid),
-+                               low2highuid(suid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_getresuid16(old_uid_t __user *ruid, old_uid_t __user *euid, old_uid_t __user *suid)
-@@ -72,8 +96,11 @@ asmlinkage long sys_getresuid16(old_uid_
- asmlinkage long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid)
- {
--      return sys_setresgid(low2highgid(rgid), low2highgid(egid),
--              low2highgid(sgid));
-+      long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
-+                               low2highgid(sgid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_getresgid16(old_gid_t __user *rgid, old_gid_t __user *egid, old_gid_t __user *sgid)
-@@ -89,12 +116,18 @@ asmlinkage long sys_getresgid16(old_gid_
- asmlinkage long sys_setfsuid16(old_uid_t uid)
- {
--      return sys_setfsuid(low2highuid(uid));
-+      long ret = sys_setfsuid(low2highuid(uid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- asmlinkage long sys_setfsgid16(old_gid_t gid)
- {
--      return sys_setfsgid(low2highgid(gid));
-+      long ret = sys_setfsgid(low2highgid(gid));
-+      /* avoid REGPARM breakage on x86: */
-+      prevent_tail_call(ret);
-+      return ret;
- }
- static int groups16_to_user(old_gid_t __user *grouplist,
-diff --git a/mm/madvise.c b/mm/madvise.c
-index af3d573..4e19615 100644
---- a/mm/madvise.c
-+++ b/mm/madvise.c
-@@ -168,6 +168,9 @@ static long madvise_remove(struct vm_are
-                       return -EINVAL;
-       }
-+      if ((vma->vm_flags & (VM_SHARED|VM_WRITE)) != (VM_SHARED|VM_WRITE))
-+              return -EACCES;
-+
-       mapping = vma->vm_file->f_mapping;
-       offset = (loff_t)(start - vma->vm_start)
-diff --git a/mm/mempolicy.c b/mm/mempolicy.c
-index b21869a..8d7ddf0 100644
---- a/mm/mempolicy.c
-+++ b/mm/mempolicy.c
-@@ -1796,7 +1796,6 @@ static void gather_stats(struct page *pa
-               md->mapcount_max = count;
-       md->node[page_to_nid(page)]++;
--      cond_resched();
- }
- #ifdef CONFIG_HUGETLB_PAGE
-diff --git a/mm/page_alloc.c b/mm/page_alloc.c
-index 234bd48..8b3cde1 100644
---- a/mm/page_alloc.c
-+++ b/mm/page_alloc.c
-@@ -153,7 +153,8 @@ static void bad_page(struct page *page)
-                       1 << PG_reclaim |
-                       1 << PG_slab    |
-                       1 << PG_swapcache |
--                      1 << PG_writeback );
-+                      1 << PG_writeback |
-+                      1 << PG_buddy );
-       set_page_count(page, 0);
-       reset_page_mapcount(page);
-       page->mapping = NULL;
-@@ -224,12 +225,12 @@ static inline unsigned long page_order(s
- static inline void set_page_order(struct page *page, int order) {
-       set_page_private(page, order);
--      __SetPagePrivate(page);
-+      __SetPageBuddy(page);
- }
- static inline void rmv_page_order(struct page *page)
- {
--      __ClearPagePrivate(page);
-+      __ClearPageBuddy(page);
-       set_page_private(page, 0);
- }
-@@ -268,11 +269,13 @@ __find_combined_index(unsigned long page
-  * This function checks whether a page is free && is the buddy
-  * we can do coalesce a page and its buddy if
-  * (a) the buddy is not in a hole &&
-- * (b) the buddy is free &&
-- * (c) the buddy is on the buddy system &&
-- * (d) a page and its buddy have the same order.
-- * for recording page's order, we use page_private(page) and PG_private.
-+ * (b) the buddy is in the buddy system &&
-+ * (c) a page and its buddy have the same order.
-+ *
-+ * For recording whether a page is in the buddy system, we use PG_buddy.
-+ * Setting, clearing, and testing PG_buddy is serialized by zone->lock.
-  *
-+ * For recording page's order, we use page_private(page).
-  */
- static inline int page_is_buddy(struct page *page, int order)
- {
-@@ -281,10 +284,10 @@ #ifdef CONFIG_HOLES_IN_ZONE
-               return 0;
- #endif
--       if (PagePrivate(page)           &&
--           (page_order(page) == order) &&
--            page_count(page) == 0)
-+      if (PageBuddy(page) && page_order(page) == order) {
-+              BUG_ON(page_count(page) != 0);
-                return 1;
-+      }
-        return 0;
- }
-@@ -301,7 +304,7 @@ #endif
-  * as necessary, plus some accounting needed to play nicely with other
-  * parts of the VM system.
-  * At each level, we keep a list of pages, which are heads of continuous
-- * free pages of length of (1 << order) and marked with PG_Private.Page's
-+ * free pages of length of (1 << order) and marked with PG_buddy. Page's
-  * order is recorded in page_private(page) field.
-  * So when we are allocating or freeing one, we can derive the state of the
-  * other.  That is, if we allocate a small block, and both were   
-@@ -364,7 +367,8 @@ static inline int free_pages_check(struc
-                       1 << PG_slab    |
-                       1 << PG_swapcache |
-                       1 << PG_writeback |
--                      1 << PG_reserved ))))
-+                      1 << PG_reserved |
-+                      1 << PG_buddy ))))
-               bad_page(page);
-       if (PageDirty(page))
-               __ClearPageDirty(page);
-@@ -522,7 +526,8 @@ static int prep_new_page(struct page *pa
-                       1 << PG_slab    |
-                       1 << PG_swapcache |
-                       1 << PG_writeback |
--                      1 << PG_reserved ))))
-+                      1 << PG_reserved |
-+                      1 << PG_buddy ))))
-               bad_page(page);
-       /*
-@@ -944,7 +949,8 @@ restart:
-               alloc_flags |= ALLOC_HARDER;
-       if (gfp_mask & __GFP_HIGH)
-               alloc_flags |= ALLOC_HIGH;
--      alloc_flags |= ALLOC_CPUSET;
-+      if (wait)
-+              alloc_flags |= ALLOC_CPUSET;
-       /*
-        * Go through the zonelist again. Let __GFP_HIGH and allocations
-diff --git a/mm/shmem.c b/mm/shmem.c
-index 7c455fb..f0eb2f2 100644
---- a/mm/shmem.c
-+++ b/mm/shmem.c
-@@ -2172,6 +2172,7 @@ #ifdef CONFIG_TMPFS
-       .prepare_write  = shmem_prepare_write,
-       .commit_write   = simple_commit_write,
- #endif
-+      .migratepage    = migrate_page,
- };
- static struct file_operations shmem_file_operations = {
-diff --git a/mm/vmscan.c b/mm/vmscan.c
-index 4fe7e3a..1d64dc1 100644
---- a/mm/vmscan.c
-+++ b/mm/vmscan.c
-@@ -949,6 +949,17 @@ redo:
-                       goto unlock_both;
-                 }
-+              /* Make sure the dirty bit is up to date */
-+              if (try_to_unmap(page, 1) == SWAP_FAIL) {
-+                      rc = -EPERM;
-+                      goto unlock_both;
-+              }
-+
-+              if (page_mapcount(page)) {
-+                      rc = -EAGAIN;
-+                      goto unlock_both;
-+              }
-+
-               /*
-                * Default handling if a filesystem does not provide
-                * a migration function. We can only migrate clean
-diff --git a/net/atm/clip.c b/net/atm/clip.c
-index 73370de..1842a4e 100644
---- a/net/atm/clip.c
-+++ b/net/atm/clip.c
-@@ -613,12 +613,19 @@ static int clip_create(int number)
- static int clip_device_event(struct notifier_block *this,unsigned long event,
--    void *dev)
-+                           void *arg)
- {
-+      struct net_device *dev = arg;
-+
-+      if (event == NETDEV_UNREGISTER) {
-+              neigh_ifdown(&clip_tbl, dev);
-+              return NOTIFY_DONE;
-+      }
-+
-       /* ignore non-CLIP devices */
--      if (((struct net_device *) dev)->type != ARPHRD_ATM ||
--          ((struct net_device *) dev)->hard_start_xmit != clip_start_xmit)
-+      if (dev->type != ARPHRD_ATM || dev->hard_start_xmit != clip_start_xmit)
-               return NOTIFY_DONE;
-+
-       switch (event) {
-               case NETDEV_UP:
-                       DPRINTK("clip_device_event NETDEV_UP\n");
-@@ -686,14 +693,12 @@ static struct notifier_block clip_inet_n
- static void atmarpd_close(struct atm_vcc *vcc)
- {
-       DPRINTK("atmarpd_close\n");
--      atmarpd = NULL; /* assumed to be atomic */
--      barrier();
--      unregister_inetaddr_notifier(&clip_inet_notifier);
--      unregister_netdevice_notifier(&clip_dev_notifier);
--      if (skb_peek(&sk_atm(vcc)->sk_receive_queue))
--              printk(KERN_ERR "atmarpd_close: closing with requests "
--                  "pending\n");
-+
-+      rtnl_lock();
-+      atmarpd = NULL;
-       skb_queue_purge(&sk_atm(vcc)->sk_receive_queue);
-+      rtnl_unlock();
-+
-       DPRINTK("(done)\n");
-       module_put(THIS_MODULE);
- }
-@@ -714,7 +719,12 @@ static struct atm_dev atmarpd_dev = {
- static int atm_init_atmarp(struct atm_vcc *vcc)
- {
--      if (atmarpd) return -EADDRINUSE;
-+      rtnl_lock();
-+      if (atmarpd) {
-+              rtnl_unlock();
-+              return -EADDRINUSE;
-+      }
-+
-       if (start_timer) {
-               start_timer = 0;
-               init_timer(&idle_timer);
-@@ -731,10 +741,7 @@ static int atm_init_atmarp(struct atm_vc
-       vcc->push = NULL;
-       vcc->pop = NULL; /* crash */
-       vcc->push_oam = NULL; /* crash */
--      if (register_netdevice_notifier(&clip_dev_notifier))
--              printk(KERN_ERR "register_netdevice_notifier failed\n");
--      if (register_inetaddr_notifier(&clip_inet_notifier))
--              printk(KERN_ERR "register_inetaddr_notifier failed\n");
-+      rtnl_unlock();
-       return 0;
- }
-@@ -992,6 +999,8 @@ static int __init atm_clip_init(void)
-       clip_tbl_hook = &clip_tbl;
-       register_atm_ioctl(&clip_ioctl_ops);
-+      register_netdevice_notifier(&clip_dev_notifier);
-+      register_inetaddr_notifier(&clip_inet_notifier);
- #ifdef CONFIG_PROC_FS
- {
-@@ -1012,6 +1021,9 @@ static void __exit atm_clip_exit(void)
-       remove_proc_entry("arp", atm_proc_root);
-+      unregister_inetaddr_notifier(&clip_inet_notifier);
-+      unregister_netdevice_notifier(&clip_dev_notifier);
-+
-       deregister_atm_ioctl(&clip_ioctl_ops);
-       /* First, stop the idle timer, so it stops banging
-diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
-index e060aad..9e27373 100644
---- a/net/bridge/br_netfilter.c
-+++ b/net/bridge/br_netfilter.c
-@@ -739,6 +739,15 @@ out:
-       return NF_STOLEN;
- }
-+static int br_nf_dev_queue_xmit(struct sk_buff *skb)
-+{
-+      if (skb->protocol == htons(ETH_P_IP) &&
-+          skb->len > skb->dev->mtu &&
-+          !(skb_shinfo(skb)->ufo_size || skb_shinfo(skb)->tso_size))
-+              return ip_fragment(skb, br_dev_queue_push_xmit);
-+      else
-+              return br_dev_queue_push_xmit(skb);
-+}
- /* PF_BRIDGE/POST_ROUTING ********************************************/
- static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff **pskb,
-@@ -798,7 +807,7 @@ #if defined(CONFIG_VLAN_8021Q) || define
-               realoutdev = nf_bridge->netoutdev;
- #endif
-       NF_HOOK(pf, NF_IP_POST_ROUTING, skb, NULL, realoutdev,
--              br_dev_queue_push_xmit);
-+              br_nf_dev_queue_xmit);
-       return NF_STOLEN;
-@@ -843,7 +852,7 @@ static unsigned int ip_sabotage_out(unsi
-       if ((out->hard_start_xmit == br_dev_xmit &&
-           okfn != br_nf_forward_finish &&
-           okfn != br_nf_local_out_finish &&
--          okfn != br_dev_queue_push_xmit)
-+          okfn != br_nf_dev_queue_xmit)
- #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
-           || ((out->priv_flags & IFF_802_1Q_VLAN) &&
-           VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit)
-diff --git a/net/core/dev.c b/net/core/dev.c
-index 2afb0de..12a214c 100644
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -2932,11 +2932,11 @@ void netdev_run_todo(void)
-               switch(dev->reg_state) {
-               case NETREG_REGISTERING:
-+                      dev->reg_state = NETREG_REGISTERED;
-                       err = netdev_register_sysfs(dev);
-                       if (err)
-                               printk(KERN_ERR "%s: failed sysfs registration (%d)\n",
-                                      dev->name, err);
--                      dev->reg_state = NETREG_REGISTERED;
-                       break;
-               case NETREG_UNREGISTERING:
-diff --git a/net/core/sock.c b/net/core/sock.c
-index 6e00811..5621198 100644
---- a/net/core/sock.c
-+++ b/net/core/sock.c
-@@ -404,8 +404,9 @@ #ifdef CONFIG_NETDEVICES
-                       if (!valbool) {
-                               sk->sk_bound_dev_if = 0;
-                       } else {
--                              if (optlen > IFNAMSIZ) 
--                                      optlen = IFNAMSIZ; 
-+                              if (optlen > IFNAMSIZ - 1)
-+                                      optlen = IFNAMSIZ - 1;
-+                              memset(devname, 0, sizeof(devname));
-                               if (copy_from_user(devname, optval, optlen)) {
-                                       ret = -EFAULT;
-                                       break;
-diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
-index e320b32..24009be 100644
---- a/net/ipv4/fib_trie.c
-+++ b/net/ipv4/fib_trie.c
-@@ -314,11 +314,6 @@ static void __leaf_free_rcu(struct rcu_h
-       kfree(container_of(head, struct leaf, rcu));
- }
--static inline void free_leaf(struct leaf *leaf)
--{
--      call_rcu(&leaf->rcu, __leaf_free_rcu);
--}
--
- static void __leaf_info_free_rcu(struct rcu_head *head)
- {
-       kfree(container_of(head, struct leaf_info, rcu));
-@@ -357,7 +352,12 @@ static void __tnode_free_rcu(struct rcu_
- static inline void tnode_free(struct tnode *tn)
- {
--      call_rcu(&tn->rcu, __tnode_free_rcu);
-+      if(IS_LEAF(tn)) {
-+              struct leaf *l = (struct leaf *) tn;
-+              call_rcu_bh(&l->rcu, __leaf_free_rcu);
-+      }
-+        else
-+              call_rcu(&tn->rcu, __tnode_free_rcu);
- }
- static struct leaf *leaf_new(void)
-diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
-index 8ee4d01..8dcba38 100644
---- a/net/ipv4/ip_output.c
-+++ b/net/ipv4/ip_output.c
-@@ -86,8 +86,6 @@ #include <linux/tcp.h>
- int sysctl_ip_default_ttl = IPDEFTTL;
--static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*));
--
- /* Generate a checksum for an outgoing IP datagram. */
- __inline__ void ip_send_check(struct iphdr *iph)
- {
-@@ -421,7 +419,7 @@ #endif
-  *    single device frame, and queue such a frame for sending.
-  */
--static int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
-+int ip_fragment(struct sk_buff *skb, int (*output)(struct sk_buff*))
- {
-       struct iphdr *iph;
-       int raw = 0;
-@@ -673,6 +671,8 @@ fail:
-       return err;
- }
-+EXPORT_SYMBOL(ip_fragment);
-+
- int
- ip_generic_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb)
- {
-@@ -1249,11 +1249,7 @@ int ip_push_pending_frames(struct sock *
-       iph->tos = inet->tos;
-       iph->tot_len = htons(skb->len);
-       iph->frag_off = df;
--      if (!df) {
--              __ip_select_ident(iph, &rt->u.dst, 0);
--      } else {
--              iph->id = htons(inet->id++);
--      }
-+      ip_select_ident(iph, &rt->u.dst, sk);
-       iph->ttl = ttl;
-       iph->protocol = sk->sk_protocol;
-       iph->saddr = rt->rt_src;
-diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
-index 7d7ab94..12bfc25 100644
---- a/net/ipv4/netfilter/arp_tables.c
-+++ b/net/ipv4/netfilter/arp_tables.c
-@@ -941,7 +941,7 @@ static int do_add_counters(void __user *
-       write_lock_bh(&t->lock);
-       private = t->private;
--      if (private->number != paddc->num_counters) {
-+      if (private->number != tmp.num_counters) {
-               ret = -EINVAL;
-               goto unlock_up_free;
-       }
-diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c
-index 84c66db..43f6b45 100644
---- a/net/ipv4/netfilter/ip_conntrack_core.c
-+++ b/net/ipv4/netfilter/ip_conntrack_core.c
-@@ -1318,6 +1318,7 @@ getorigdst(struct sock *sk, int optval, 
-                       .tuple.dst.u.tcp.port;
-               sin.sin_addr.s_addr = ct->tuplehash[IP_CT_DIR_ORIGINAL]
-                       .tuple.dst.ip;
-+              memset(sin.sin_zero, 0, sizeof(sin.sin_zero));
-               DEBUGP("SO_ORIGINAL_DST: %u.%u.%u.%u %u\n",
-                      NIPQUAD(sin.sin_addr.s_addr), ntohs(sin.sin_port));
-diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c
-index e0b5926..d4e6d0a 100644
---- a/net/ipv4/netfilter/ip_conntrack_netlink.c
-+++ b/net/ipv4/netfilter/ip_conntrack_netlink.c
-@@ -1619,7 +1619,7 @@ static void __exit ctnetlink_exit(void)
-       printk("ctnetlink: unregistering from nfnetlink.\n");
- #ifdef CONFIG_IP_NF_CONNTRACK_EVENTS
--      ip_conntrack_unregister_notifier(&ctnl_notifier_exp);
-+      ip_conntrack_expect_unregister_notifier(&ctnl_notifier_exp);
-       ip_conntrack_unregister_notifier(&ctnl_notifier);
- #endif
-diff --git a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
-index be602e8..df67679 100644
---- a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
-+++ b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c
-@@ -235,12 +235,15 @@ static int do_basic_checks(struct ip_con
-                       flag = 1;
-               }
--              /* Cookie Ack/Echo chunks not the first OR 
--                 Init / Init Ack / Shutdown compl chunks not the only chunks */
--              if ((sch->type == SCTP_CID_COOKIE_ACK 
-+              /*
-+               * Cookie Ack/Echo chunks not the first OR
-+               * Init / Init Ack / Shutdown compl chunks not the only chunks
-+               * OR zero-length.
-+               */
-+              if (((sch->type == SCTP_CID_COOKIE_ACK
-                       || sch->type == SCTP_CID_COOKIE_ECHO
-                       || flag)
--                   && count !=0 ) {
-+                    && count !=0) || !sch->length) {
-                       DEBUGP("Basic checks failed\n");
-                       return 1;
-               }
-diff --git a/net/ipv4/netfilter/ip_nat_snmp_basic.c b/net/ipv4/netfilter/ip_nat_snmp_basic.c
-index 4f95d47..df57e7a 100644
---- a/net/ipv4/netfilter/ip_nat_snmp_basic.c
-+++ b/net/ipv4/netfilter/ip_nat_snmp_basic.c
-@@ -1000,12 +1000,12 @@ static unsigned char snmp_trap_decode(st
-               
-       return 1;
-+err_addr_free:
-+      kfree((unsigned long *)trap->ip_address);
-+
- err_id_free:
-       kfree(trap->id);
--err_addr_free:
--      kfree((unsigned long *)trap->ip_address);
--      
-       return 0;
- }
-@@ -1123,11 +1123,10 @@ static int snmp_parse_mangle(unsigned ch
-               struct snmp_v1_trap trap;
-               unsigned char ret = snmp_trap_decode(&ctx, &trap, map, check);
-               
--              /* Discard trap allocations regardless */
--              kfree(trap.id);
--              kfree((unsigned long *)trap.ip_address);
--              
--              if (!ret)
-+              if (ret) {
-+                      kfree(trap.id);
-+                      kfree((unsigned long *)trap.ip_address);
-+              } else 
-                       return ret;
-               
-       } else {
-diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
-index 16f47c6..735d5ff 100644
---- a/net/ipv4/netfilter/ip_tables.c
-+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -1063,7 +1063,7 @@ do_add_counters(void __user *user, unsig
-       write_lock_bh(&t->lock);
-       private = t->private;
--      if (private->number != paddc->num_counters) {
-+      if (private->number != tmp.num_counters) {
-               ret = -EINVAL;
-               goto unlock_up_free;
-       }
-diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
-index 6c8624a..62a0f52 100644
---- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
-+++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
-@@ -354,6 +354,7 @@ getorigdst(struct sock *sk, int optval, 
-                       .tuple.dst.u.tcp.port;
-               sin.sin_addr.s_addr = ct->tuplehash[IP_CT_DIR_ORIGINAL]
-                       .tuple.dst.u3.ip;
-+              memset(sin.sin_zero, 0, sizeof(sin.sin_zero));
-               DEBUGP("SO_ORIGINAL_DST: %u.%u.%u.%u %u\n",
-                      NIPQUAD(sin.sin_addr.s_addr), ntohs(sin.sin_port));
-diff --git a/net/ipv4/route.c b/net/ipv4/route.c
-index fca5fe0..a67955e 100644
---- a/net/ipv4/route.c
-+++ b/net/ipv4/route.c
-@@ -2750,7 +2750,10 @@ int inet_rtm_getroute(struct sk_buff *in
-       /* Reserve room for dummy headers, this skb can pass
-          through good chunk of routing engine.
-        */
--      skb->mac.raw = skb->data;
-+      skb->mac.raw = skb->nh.raw = skb->data;
-+
-+      /* Bugfix: need to give ip_route_input enough of an IP header to not gag. */
-+      skb->nh.iph->protocol = IPPROTO_ICMP;
-       skb_reserve(skb, MAX_HEADER + sizeof(struct iphdr));
-       if (rta[RTA_SRC - 1])
-diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
-index 9f498a6..310f2e6 100644
---- a/net/ipv4/tcp_output.c
-+++ b/net/ipv4/tcp_output.c
-@@ -537,7 +537,9 @@ int tcp_fragment(struct sock *sk, struct
-       buff = sk_stream_alloc_skb(sk, nsize, GFP_ATOMIC);
-       if (buff == NULL)
-               return -ENOMEM; /* We'll just try again later. */
--      sk_charge_skb(sk, buff);
-+
-+      buff->truesize = skb->len - len;
-+      skb->truesize -= buff->truesize;
-       /* Correct the sequence numbers. */
-       TCP_SKB_CB(buff)->seq = TCP_SKB_CB(skb)->seq + len;
-diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
-index 2a1e7e4..d88cab7 100644
---- a/net/ipv6/exthdrs.c
-+++ b/net/ipv6/exthdrs.c
-@@ -489,6 +489,18 @@ int ipv6_parse_hopopts(struct sk_buff *s
- {
-       struct inet6_skb_parm *opt = IP6CB(skb);
-+      /*
-+       * skb->nh.raw is equal to skb->data, and
-+       * skb->h.raw - skb->nh.raw is always equal to
-+       * sizeof(struct ipv6hdr) by definition of
-+       * hop-by-hop options.
-+       */
-+      if (!pskb_may_pull(skb, sizeof(struct ipv6hdr) + 8) ||
-+          !pskb_may_pull(skb, sizeof(struct ipv6hdr) + ((skb->h.raw[1] + 1) << 3))) {
-+              kfree_skb(skb);
-+              return -1;
-+      }
-+
-       opt->hop = sizeof(struct ipv6hdr);
-       if (ip6_parse_tlv(tlvprochopopt_lst, skb)) {
-               skb->h.raw += (skb->h.raw[1]+1)<<3;
-diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
-index 74ff56c..dd6ad42 100644
---- a/net/ipv6/netfilter/ip6_tables.c
-+++ b/net/ipv6/netfilter/ip6_tables.c
-@@ -1120,7 +1120,7 @@ do_add_counters(void __user *user, unsig
-       write_lock_bh(&t->lock);
-       private = t->private;
--      if (private->number != paddc->num_counters) {
-+      if (private->number != tmp.num_counters) {
-               ret = -EINVAL;
-               goto unlock_up_free;
-       }
-diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
-index 91cce8b..88c840f 100644
---- a/net/ipv6/xfrm6_policy.c
-+++ b/net/ipv6/xfrm6_policy.c
-@@ -191,16 +191,18 @@ error:
- static inline void
- _decode_session6(struct sk_buff *skb, struct flowi *fl)
- {
--      u16 offset = sizeof(struct ipv6hdr);
-+      u16 offset = skb->h.raw - skb->nh.raw;
-       struct ipv6hdr *hdr = skb->nh.ipv6h;
--      struct ipv6_opt_hdr *exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset);
--      u8 nexthdr = skb->nh.ipv6h->nexthdr;
-+      struct ipv6_opt_hdr *exthdr;
-+      u8 nexthdr = skb->nh.raw[IP6CB(skb)->nhoff];
-       memset(fl, 0, sizeof(struct flowi));
-       ipv6_addr_copy(&fl->fl6_dst, &hdr->daddr);
-       ipv6_addr_copy(&fl->fl6_src, &hdr->saddr);
-       while (pskb_may_pull(skb, skb->nh.raw + offset + 1 - skb->data)) {
-+              exthdr = (struct ipv6_opt_hdr*)(skb->nh.raw + offset);
-+
-               switch (nexthdr) {
-               case NEXTHDR_ROUTING:
-               case NEXTHDR_HOP:
-diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
-index 9ff3463..40edeef 100644
---- a/net/netfilter/nf_conntrack_netlink.c
-+++ b/net/netfilter/nf_conntrack_netlink.c
-@@ -1641,7 +1641,7 @@ static void __exit ctnetlink_exit(void)
-       printk("ctnetlink: unregistering from nfnetlink.\n");
- #ifdef CONFIG_NF_CONNTRACK_EVENTS
--      nf_conntrack_unregister_notifier(&ctnl_notifier_exp);
-+      nf_conntrack_expect_unregister_notifier(&ctnl_notifier_exp);
-       nf_conntrack_unregister_notifier(&ctnl_notifier);
- #endif
-diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c
-index cf798e6..cd2326d 100644
---- a/net/netfilter/nf_conntrack_proto_sctp.c
-+++ b/net/netfilter/nf_conntrack_proto_sctp.c
-@@ -240,12 +240,15 @@ static int do_basic_checks(struct nf_con
-                       flag = 1;
-               }
--              /* Cookie Ack/Echo chunks not the first OR 
--                 Init / Init Ack / Shutdown compl chunks not the only chunks */
--              if ((sch->type == SCTP_CID_COOKIE_ACK 
-+              /*
-+               * Cookie Ack/Echo chunks not the first OR
-+               * Init / Init Ack / Shutdown compl chunks not the only chunks
-+               * OR zero-length.
-+               */
-+              if (((sch->type == SCTP_CID_COOKIE_ACK
-                       || sch->type == SCTP_CID_COOKIE_ECHO
-                       || flag)
--                   && count !=0 ) {
-+                    && count !=0) || !sch->length) {
-                       DEBUGP("Basic checks failed\n");
-                       return 1;
-               }
-diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c
-index 297b895..cf0c767 100644
---- a/net/sctp/inqueue.c
-+++ b/net/sctp/inqueue.c
-@@ -149,6 +149,7 @@ struct sctp_chunk *sctp_inq_pop(struct s
-               /* This is the first chunk in the packet.  */
-               chunk->singleton = 1;
-               ch = (sctp_chunkhdr_t *) chunk->skb->data;
-+              chunk->data_accepted = 0;
-       }
-         chunk->chunk_hdr = ch;
-diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
-index 2b9a832..9395e09 100644
---- a/net/sctp/sm_statefuns.c
-+++ b/net/sctp/sm_statefuns.c
-@@ -636,8 +636,9 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(co
-        */
-         chunk->subh.cookie_hdr =
-               (struct sctp_signed_cookie *)chunk->skb->data;
--      skb_pull(chunk->skb,
--               ntohs(chunk->chunk_hdr->length) - sizeof(sctp_chunkhdr_t));
-+      if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
-+                                       sizeof(sctp_chunkhdr_t)))
-+              goto nomem;
-       /* 5.1 D) Upon reception of the COOKIE ECHO chunk, Endpoint
-        * "Z" will reply with a COOKIE ACK chunk after building a TCB
-@@ -965,7 +966,8 @@ sctp_disposition_t sctp_sf_beat_8_3(cons
-        */
-       chunk->subh.hb_hdr = (sctp_heartbeathdr_t *) chunk->skb->data;
-       paylen = ntohs(chunk->chunk_hdr->length) - sizeof(sctp_chunkhdr_t);
--      skb_pull(chunk->skb, paylen);
-+      if (!pskb_pull(chunk->skb, paylen))
-+              goto nomem;
-       reply = sctp_make_heartbeat_ack(asoc, chunk,
-                                       chunk->subh.hb_hdr, paylen);
-@@ -1028,6 +1030,12 @@ sctp_disposition_t sctp_sf_backbeat_8_3(
-                                                 commands);
-       hbinfo = (sctp_sender_hb_info_t *) chunk->skb->data;
-+      /* Make sure that the length of the parameter is what we expect */
-+      if (ntohs(hbinfo->param_hdr.length) !=
-+                                  sizeof(sctp_sender_hb_info_t)) {
-+              return SCTP_DISPOSITION_DISCARD;
-+      }
-+
-       from_addr = hbinfo->daddr;
-       link = sctp_assoc_lookup_paddr(asoc, &from_addr);
-@@ -1860,8 +1868,9 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupc
-        * are in good shape.
-        */
-         chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data;
--      skb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
--               sizeof(sctp_chunkhdr_t));
-+      if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
-+                                      sizeof(sctp_chunkhdr_t)))
-+              goto nomem;
-       /* In RFC 2960 5.2.4 3, if both Verification Tags in the State Cookie
-        * of a duplicate COOKIE ECHO match the Verification Tags of the
-@@ -5151,7 +5160,9 @@ static int sctp_eat_data(const struct sc
-       int tmp;
-       __u32 tsn;
-       int account_value;
-+      struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
-       struct sock *sk = asoc->base.sk;
-+      int rcvbuf_over = 0;
-       data_hdr = chunk->subh.data_hdr = (sctp_datahdr_t *)chunk->skb->data;
-       skb_pull(chunk->skb, sizeof(sctp_datahdr_t));
-@@ -5162,10 +5173,16 @@ static int sctp_eat_data(const struct sc
-       /* ASSERT:  Now skb->data is really the user data.  */
-       /*
--       * if we are established, and we have used up our receive
--       * buffer memory, drop the frame
--       */
--      if (asoc->state == SCTP_STATE_ESTABLISHED) {
-+       * If we are established, and we have used up our receive buffer
-+       * memory, think about droping the frame.
-+       * Note that we have an opportunity to improve performance here.
-+       * If we accept one chunk from an skbuff, we have to keep all the
-+       * memory of that skbuff around until the chunk is read into user
-+       * space. Therefore, once we accept 1 chunk we may as well accept all
-+       * remaining chunks in the skbuff. The data_accepted flag helps us do
-+       * that.
-+       */
-+      if ((asoc->state == SCTP_STATE_ESTABLISHED) && (!chunk->data_accepted)) {
-               /*
-                * If the receive buffer policy is 1, then each
-                * association can allocate up to sk_rcvbuf bytes
-@@ -5176,9 +5193,25 @@ static int sctp_eat_data(const struct sc
-                       account_value = atomic_read(&asoc->rmem_alloc);
-               else
-                       account_value = atomic_read(&sk->sk_rmem_alloc);
--
--              if (account_value > sk->sk_rcvbuf)
--                      return SCTP_IERROR_IGNORE_TSN;
-+              if (account_value > sk->sk_rcvbuf) {
-+                      /*
-+                       * We need to make forward progress, even when we are
-+                       * under memory pressure, so we always allow the
-+                       * next tsn after the ctsn ack point to be accepted.
-+                       * This lets us avoid deadlocks in which we have to
-+                       * drop frames that would otherwise let us drain the
-+                       * receive queue.
-+                       */
-+                      if ((sctp_tsnmap_get_ctsn(map) + 1) != tsn)
-+                              return SCTP_IERROR_IGNORE_TSN;
-+
-+                      /*
-+                       * We're going to accept the frame but we should renege
-+                       * to make space for it. This will send us down that
-+                       * path later in this function.
-+                       */
-+                      rcvbuf_over = 1;
-+              }
-       }
-       /* Process ECN based congestion.
-@@ -5226,6 +5259,7 @@ static int sctp_eat_data(const struct sc
-       datalen -= sizeof(sctp_data_chunk_t);
-       deliver = SCTP_CMD_CHUNK_ULP;
-+      chunk->data_accepted = 1;
-       /* Think about partial delivery. */
-       if ((datalen >= asoc->rwnd) && (!asoc->ulpq.pd_mode)) {
-@@ -5242,7 +5276,8 @@ static int sctp_eat_data(const struct sc
-        * large spill over.
-        */
-       if (!asoc->rwnd || asoc->rwnd_over ||
--          (datalen > asoc->rwnd + asoc->frag_point)) {
-+          (datalen > asoc->rwnd + asoc->frag_point) ||
-+          rcvbuf_over) {
-               /* If this is the next TSN, consider reneging to make
-                * room.   Note: Playing nice with a confused sender.  A
-@@ -5250,8 +5285,8 @@ static int sctp_eat_data(const struct sc
-                * space and in the future we may want to detect and
-                * do more drastic reneging.
-                */
--              if (sctp_tsnmap_has_gap(&asoc->peer.tsn_map) &&
--                  (sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map) + 1) == tsn) {
-+              if (sctp_tsnmap_has_gap(map) &&
-+                  (sctp_tsnmap_get_ctsn(map) + 1) == tsn) {
-                       SCTP_DEBUG_PRINTK("Reneging for tsn:%u\n", tsn);
-                       deliver = SCTP_CMD_RENEGE;
-               } else {
-diff --git a/net/sctp/sm_statetable.c b/net/sctp/sm_statetable.c
-index 75ef104..8bcca56 100644
---- a/net/sctp/sm_statetable.c
-+++ b/net/sctp/sm_statetable.c
-@@ -366,9 +366,9 @@ #define TYPE_SCTP_ECN_ECNE { \
-       /* SCTP_STATE_EMPTY */ \
-       {.fn = sctp_sf_ootb, .name = "sctp_sf_ootb"}, \
-       /* SCTP_STATE_CLOSED */ \
--      {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
-+      {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
-       /* SCTP_STATE_COOKIE_WAIT */ \
--      {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
-+      {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
-       /* SCTP_STATE_COOKIE_ECHOED */ \
-       {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
-       /* SCTP_STATE_ESTABLISHED */ \
-@@ -380,7 +380,7 @@ #define TYPE_SCTP_ECN_ECNE { \
-       /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
-       {.fn = sctp_sf_do_ecne, .name = "sctp_sf_do_ecne"}, \
-       /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
--      {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
-+      {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
- } /* TYPE_SCTP_ECN_ECNE */
- #define TYPE_SCTP_ECN_CWR { \
-@@ -401,7 +401,7 @@ #define TYPE_SCTP_ECN_CWR { \
-       /* SCTP_STATE_SHUTDOWN_RECEIVED */ \
-       {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
-       /* SCTP_STATE_SHUTDOWN_ACK_SENT */ \
--      {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
-+      {.fn = sctp_sf_discard_chunk, .name = "sctp_sf_discard_chunk"}, \
- } /* TYPE_SCTP_ECN_CWR */
- #define TYPE_SCTP_SHUTDOWN_COMPLETE { \
-@@ -647,7 +647,7 @@ #define TYPE_SCTP_PRIMITIVE_REQUESTHEART
-       /* SCTP_STATE_EMPTY */ \
-       {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
-       /* SCTP_STATE_CLOSED */ \
--      {.fn = sctp_sf_bug, .name = "sctp_sf_bug"}, \
-+      {.fn = sctp_sf_error_closed, .name = "sctp_sf_error_closed"}, \
-       /* SCTP_STATE_COOKIE_WAIT */ \
-       {.fn = sctp_sf_do_prm_requestheartbeat,               \
-        .name = "sctp_sf_do_prm_requestheartbeat"},          \
-diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c
-index 2080b2d..575e556 100644
---- a/net/sctp/ulpqueue.c
-+++ b/net/sctp/ulpqueue.c
-@@ -279,6 +279,7 @@ static inline void sctp_ulpq_store_reasm
- static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *queue, struct sk_buff *f_frag, struct sk_buff *l_frag)
- {
-       struct sk_buff *pos;
-+      struct sk_buff *new = NULL;
-       struct sctp_ulpevent *event;
-       struct sk_buff *pnext, *last;
-       struct sk_buff *list = skb_shinfo(f_frag)->frag_list;
-@@ -297,11 +298,33 @@ static struct sctp_ulpevent *sctp_make_r
-        */
-       if (last)
-               last->next = pos;
--      else
--              skb_shinfo(f_frag)->frag_list = pos;
-+      else {
-+              if (skb_cloned(f_frag)) {
-+                      /* This is a cloned skb, we can't just modify
-+                       * the frag_list.  We need a new skb to do that.
-+                       * Instead of calling skb_unshare(), we'll do it
-+                       * ourselves since we need to delay the free.
-+                       */
-+                      new = skb_copy(f_frag, GFP_ATOMIC);
-+                      if (!new)
-+                              return NULL;    /* try again later */
-+
-+                      new->sk = f_frag->sk;
-+
-+                      skb_shinfo(new)->frag_list = pos;
-+              } else
-+                      skb_shinfo(f_frag)->frag_list = pos;
-+      }
-       /* Remove the first fragment from the reassembly queue.  */
-       __skb_unlink(f_frag, queue);
-+
-+      /* if we did unshare, then free the old skb and re-assign */
-+      if (new) {
-+              kfree_skb(f_frag);
-+              f_frag = new;
-+      }
-+
-       while (pos) {
-               pnext = pos->next;
-diff --git a/security/keys/key.c b/security/keys/key.c
-index 99781b7..0e2584e 100644
---- a/security/keys/key.c
-+++ b/security/keys/key.c
-@@ -785,6 +785,10 @@ key_ref_t key_create_or_update(key_ref_t
-       key_check(keyring);
-+      key_ref = ERR_PTR(-ENOTDIR);
-+      if (keyring->type != &key_type_keyring)
-+              goto error_2;
-+
-       down_write(&keyring->sem);
-       /* if we're going to allocate a new key, we're going to have
-diff --git a/security/keys/keyring.c b/security/keys/keyring.c
-index d65a180..bffa924 100644
---- a/security/keys/keyring.c
-+++ b/security/keys/keyring.c
-@@ -437,6 +437,7 @@ EXPORT_SYMBOL(keyring_search);
- /*
-  * search the given keyring only (no recursion)
-  * - keyring must be locked by caller
-+ * - caller must guarantee that the keyring is a keyring
-  */
- key_ref_t __keyring_search_one(key_ref_t keyring_ref,
-                              const struct key_type *ktype,
-diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c
-index 640d0bf..84047f6 100644
---- a/security/selinux/ss/mls.c
-+++ b/security/selinux/ss/mls.c
-@@ -264,7 +264,7 @@ int mls_context_to_sid(char oldc,
-       if (!selinux_mls_enabled) {
-               if (def_sid != SECSID_NULL && oldc)
--                      *scontext += strlen(*scontext);
-+                      *scontext += strlen(*scontext)+1;
-               return 0;
-       }
-diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
-index 8a76492..6375dd5 100644
---- a/security/selinux/ss/services.c
-+++ b/security/selinux/ss/services.c
-@@ -592,6 +592,10 @@ int security_sid_to_context(u32 sid, cha
-                       *scontext_len = strlen(initial_sid_to_string[sid]) + 1;
-                       scontextp = kmalloc(*scontext_len,GFP_ATOMIC);
-+                      if (!scontextp) {
-+                              rc = -ENOMEM;
-+                              goto out;
-+                      }
-                       strcpy(scontextp, initial_sid_to_string[sid]);
-                       *scontext = scontextp;
-                       goto out;
-diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
-index 63d96be..65b28cb 100644
---- a/sound/isa/opti9xx/opti92x-ad1848.c
-+++ b/sound/isa/opti9xx/opti92x-ad1848.c
-@@ -2088,9 +2088,11 @@ static int __init alsa_card_opti9xx_init
-       int error;
-       struct platform_device *device;
-+#ifdef CONFIG_PNP
-       pnp_register_card_driver(&opti9xx_pnpc_driver);
-       if (snd_opti9xx_pnp_is_probed)
-               return 0;
-+#endif
-       if (! is_isapnp_selected()) {
-               error = platform_driver_register(&snd_opti9xx_driver);
-               if (error < 0)
-@@ -2102,7 +2104,9 @@ static int __init alsa_card_opti9xx_init
-               }
-               platform_driver_unregister(&snd_opti9xx_driver);
-       }
-+#ifdef CONFIG_PNP
-       pnp_unregister_card_driver(&opti9xx_pnpc_driver);
-+#endif
- #ifdef MODULE
-       printk(KERN_ERR "no OPTi " CHIP_NAME " soundcard found\n");
- #endif
-@@ -2115,7 +2119,9 @@ static void __exit alsa_card_opti9xx_exi
-               platform_device_unregister(snd_opti9xx_platform_device);
-               platform_driver_unregister(&snd_opti9xx_driver);
-       }
-+#ifdef CONFIG_PNP
-       pnp_unregister_card_driver(&opti9xx_pnpc_driver);
-+#endif
- }
- module_init(alsa_card_opti9xx_init)
-diff --git a/sound/oss/dmasound/tas_common.c b/sound/oss/dmasound/tas_common.c
-index 8131599..882ae98 100644
---- a/sound/oss/dmasound/tas_common.c
-+++ b/sound/oss/dmasound/tas_common.c
-@@ -195,8 +195,8 @@ tas_init(int driver_id, const char *driv
-       printk(KERN_INFO "tas driver [%s])\n", driver_name);
--#ifndef CONFIG_I2C_KEYWEST
--      request_module("i2c-keywest");
-+#ifndef CONFIG_I2C_POWERMAC
-+      request_module("i2c-powermac");
- #endif
-       tas_node = find_devices("deq");
-       if (tas_node == NULL)
-diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
-index b767552..d5cd3a1 100644
---- a/sound/pci/hda/patch_realtek.c
-+++ b/sound/pci/hda/patch_realtek.c
-@@ -2948,6 +2948,8 @@ static struct hda_board_config alc260_cf
-       { .modelname = "basic", .config = ALC260_BASIC },
-       { .pci_subvendor = 0x104d, .pci_subdevice = 0x81bb,
-         .config = ALC260_BASIC }, /* Sony VAIO */
-+      { .pci_subvendor = 0x152d, .pci_subdevice = 0x0729,
-+        .config = ALC260_BASIC }, /* CTL Travel Master U553W */
-       { .modelname = "hp", .config = ALC260_HP },
-       { .pci_subvendor = 0x103c, .pci_subdevice = 0x3010, .config = ALC260_HP },
-       { .pci_subvendor = 0x103c, .pci_subdevice = 0x3011, .config = ALC260_HP },
-diff --git a/sound/ppc/daca.c b/sound/ppc/daca.c
-index 08cde51..b96cd94 100644
---- a/sound/ppc/daca.c
-+++ b/sound/ppc/daca.c
-@@ -256,7 +256,7 @@ int __init snd_pmac_daca_init(struct snd
- #ifdef CONFIG_KMOD
-       if (current->fs->root)
--              request_module("i2c-keywest");
-+              request_module("i2c-powermac");
- #endif /* CONFIG_KMOD */      
-       mix = kmalloc(sizeof(*mix), GFP_KERNEL);
-diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c
-index 838fc11..39d4cde 100644
---- a/sound/ppc/tumbler.c
-+++ b/sound/ppc/tumbler.c
-@@ -1314,7 +1314,7 @@ int __init snd_pmac_tumbler_init(struct 
- #ifdef CONFIG_KMOD
-       if (current->fs->root)
--              request_module("i2c-keywest");
-+              request_module("i2c-powermac");
- #endif /* CONFIG_KMOD */      
-       mix = kmalloc(sizeof(*mix), GFP_KERNEL);
diff --git a/target/device/AMD/DBAu1500/kernel-patches/004-correct-toolchain.patch b/target/device/AMD/DBAu1500/kernel-patches/004-correct-toolchain.patch
deleted file mode 100644 (file)
index 13c6610..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
---- linux/arch/mips/Makefile.orig      2006-01-02 20:21:10.000000000 -0700
-+++ linux/arch/mips/Makefile   2006-03-19 17:25:29.000000000 -0700
-@@ -22,15 +22,15 @@
- # Select the object file format to substitute into the linker script.
- #
- ifdef CONFIG_CPU_LITTLE_ENDIAN
--32bit-tool-prefix     = mipsel-linux-
--64bit-tool-prefix     = mips64el-linux-
-+#32bit-tool-prefix    = mipsel-linux-
-+#64bit-tool-prefix    = mips64el-linux-
- 32bit-bfd             = elf32-tradlittlemips
- 64bit-bfd             = elf64-tradlittlemips
- 32bit-emul            = elf32ltsmip
- 64bit-emul            = elf64ltsmip
- else
--32bit-tool-prefix     = mips-linux-
--64bit-tool-prefix     = mips64-linux-
-+#32bit-tool-prefix    = mips-linux-
-+#64bit-tool-prefix    = mips64-linux-
- 32bit-bfd             = elf32-tradbigmips
- 64bit-bfd             = elf64-tradbigmips
- 32bit-emul            = elf32btsmip
-@@ -39,18 +39,18 @@
- ifdef CONFIG_32BIT
- gcc-abi                       = 32
--tool-prefix           = $(32bit-tool-prefix)
-+#tool-prefix          = $(32bit-tool-prefix)
- UTS_MACHINE           := mips
- endif
- ifdef CONFIG_64BIT
- gcc-abi                       = 64
--tool-prefix           = $(64bit-tool-prefix)
-+#tool-prefix          = $(64bit-tool-prefix)
- UTS_MACHINE           := mips64
- endif
--ifdef CONFIG_CROSSCOMPILE
--CROSS_COMPILE         := $(tool-prefix)
--endif
-+#ifdef CONFIG_CROSSCOMPILE
-+#CROSS_COMPILE                := $(tool-prefix)
-+#endif
- CHECKFLAGS-y                          += -D__linux__ -D__mips__ \
-                                          -D_ABIO32=1 \
diff --git a/target/device/AMD/DBAu1500/kernel-patches/006_init_unshare.patch b/target/device/AMD/DBAu1500/kernel-patches/006_init_unshare.patch
deleted file mode 100644 (file)
index 8b756f8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- orig/kernel/fork.c 2006-03-21 01:41:50.000000000 -0700
-+++ linux-2.6.16/kernel/fork.c 2006-03-21 01:41:50.000000000 -0700
-@@ -773,7 +773,7 @@
-       /* This can race but the race causes us to copy when we don't
-          need to and drop the copy */
--      if(atomic_read(&files->count) == 1)
-+      if(atomic_read(&files->count) == 1 || current->pid == 1)
-       {
-               atomic_inc(&files->count);
-               return 0;
diff --git a/target/device/AMD/DBAu1500/kernel-patches/008-ieee1394-fix.patch b/target/device/AMD/DBAu1500/kernel-patches/008-ieee1394-fix.patch
deleted file mode 100644 (file)
index e87c990..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- orig/drivers/ieee1394/nodemgr.c    2006-03-21 01:41:51.000000000 -0700
-+++ linux-2.6.16/drivers/ieee1394/nodemgr.c    2006-03-21 01:41:51.000000000 -0700
-@@ -1487,7 +1487,7 @@
-       /* If there is no bus manager then we should set the root node's
-        * force_root bit to promote bus stability per the 1394
-        * spec. (8.4.2.6) */
--      if (host->busmgr_id == 0xffff && host->node_count > 1)
-+      if (host->busmgr_id == 0x3f && host->node_count > 1)
-       {
-               u16 root_node = host->node_count - 1;
diff --git a/target/device/AMD/DBAu1500/kernel-patches/009-sysfs-n.patch b/target/device/AMD/DBAu1500/kernel-patches/009-sysfs-n.patch
deleted file mode 100644 (file)
index 61359fc..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
---- linux-2.6.16-rc6-mm1.orig/lib/kobject_uevent.c     2006-03-14 22:57:23.000000000 +0900
-+++ linux-2.6.16-rc6-mm1/lib/kobject_uevent.c  2006-03-15 08:39:33.000000000 +0900
-@@ -25,6 +25,11 @@
- #define BUFFER_SIZE   2048    /* buffer for the variables */
- #define NUM_ENVP      32      /* number of env pointers */
-+#ifdef CONFIG_HOTPLUG
-+u64 uevent_seqnum;
-+char uevent_helper[UEVENT_HELPER_PATH_LEN] = "/sbin/hotplug";
-+#endif
-+
- #if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET)
- static DEFINE_SPINLOCK(sequence_lock);
- static struct sock *uevent_sock;
---- linux-2.6.16-rc6-mm1.orig/kernel/ksysfs.c  2006-03-14 22:57:31.000000000 +0900
-+++ linux-2.6.16-rc6-mm1/kernel/ksysfs.c       2006-03-15 08:41:11.000000000 +0900
-@@ -15,9 +15,6 @@
- #include <linux/module.h>
- #include <linux/init.h>
--u64 uevent_seqnum;
--char uevent_helper[UEVENT_HELPER_PATH_LEN] = "/sbin/hotplug";
--
- #define KERNEL_ATTR_RO(_name) \
- static struct subsys_attribute _name##_attr = __ATTR_RO(_name)
-
-
diff --git a/target/device/AMD/DBAu1500/kernel-patches/028-cdrom_oexcl.patch b/target/device/AMD/DBAu1500/kernel-patches/028-cdrom_oexcl.patch
deleted file mode 100644 (file)
index 577cdb0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- orig/drivers/cdrom/cdrom.c 2004-12-07 22:55:38.000000000 -0700
-+++ linux-2.6.10-rc3/drivers/cdrom/cdrom.c     2004-12-07 22:55:38.000000000 -0700
-@@ -997,6 +997,10 @@
-       cdinfo(CD_OPEN, "entering cdrom_open\n"); 
-+      /* If the device is opened O_EXCL but there are other openers, return busy */
-+      if ( (fp->f_flags & O_EXCL) && (cdi->use_count>0) )
-+              return -EBUSY;
-+
-       /* if this was a O_NONBLOCK open and we should honor the flags,
-        * do a quick open without drive/disc integrity checks. */
-       cdi->use_count++;
diff --git a/target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch b/target/device/AMD/DBAu1500/kernel-patches/029-cdrom_blocksize.patch
deleted file mode 100644 (file)
index 90c2961..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
---- orig/include/linux/cdrom.h 2005-10-28 10:14:52.000000000 -0600
-+++ linux-2.6.14/include/linux/cdrom.h 2005-10-28 10:14:52.000000000 -0600
-@@ -946,7 +946,8 @@
-       char name[20];                  /* name of the device type */
- /* per-device flags */
-         __u8 sanyo_slot               : 2;    /* Sanyo 3 CD changer support */
--        __u8 reserved         : 6;    /* not used yet */
-+      __u8 use_read10         : 1;    /* Use READ10 instead of READCD */
-+      __u8 reserved           : 5;    /* not used yet */
-       int cdda_method;                /* see flags */
-       __u8 last_sense;
-       __u8 media_written;             /* dirty flag, DVD+RW bookkeeping */
---- orig/drivers/cdrom/cdrom.c 2005-10-28 10:14:52.000000000 -0600
-+++ linux-2.6.14/drivers/cdrom/cdrom.c 2005-10-28 10:14:52.000000000 -0600
-@@ -1982,6 +1982,8 @@
-       return 0;
- }
-+static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size);
-+
- /*
-  * Specific READ_10 interface
-  */
-@@ -1990,6 +1992,7 @@
-                        int blocksize, int nblocks)
- {
-       struct cdrom_device_ops *cdo = cdi->ops;
-+      int ret = 0;
-       memset(&cgc->cmd, 0, sizeof(cgc->cmd));
-       cgc->cmd[0] = GPCMD_READ_10;
-@@ -2001,7 +2004,22 @@
-       cgc->cmd[7] = (nblocks >>  8) & 0xff;
-       cgc->cmd[8] = nblocks & 0xff;
-       cgc->buflen = blocksize * nblocks;
--      return cdo->generic_packet(cdi, cgc);
-+
-+      if (blocksize != CD_FRAMESIZE) {
-+              ret = cdrom_switch_blocksize(cdi, blocksize);
-+              ret |= cdo->generic_packet(cdi, cgc);
-+              ret |= cdrom_switch_blocksize(cdi, CD_FRAMESIZE);
-+      } else ret = cdo->generic_packet(cdi, cgc);
-+
-+      /*
-+       * Switch cdrom_read_block back to default behaviour
-+       * if we get an error.
-+       * FIXME: Maybe this should not be done on all errors.
-+       */
-+      if (ret != 0)
-+              cdi->use_read10 = 0;
-+
-+      return ret;
- }
- /* very generic interface for reading the various types of blocks */
-@@ -2010,8 +2028,15 @@
-                           int lba, int nblocks, int format, int blksize)
- {
-       struct cdrom_device_ops *cdo = cdi->ops;
-+      int ret;
-+
-+      if (cdi->use_read10)
-+              return cdrom_read_cd(cdi, cgc, lba, blksize, nblocks);
-       memset(&cgc->cmd, 0, sizeof(cgc->cmd));
-+      /*
-+       * SCSI-II devices are not required to support READ_CD.
-+       */
-       cgc->cmd[0] = GPCMD_READ_CD;
-       /* expected sector size - cdda,mode1,etc. */
-       cgc->cmd[1] = format << 2;
-@@ -2034,7 +2059,15 @@
-       default                 : cgc->cmd[9] = 0x10;
-       }
-       
--      return cdo->generic_packet(cdi, cgc);
-+      ret = cdo->generic_packet(cdi, cgc);
-+      if (ret && cgc->sense && cgc->sense->sense_key==0x05 && cgc->sense->asc==0x20 && cgc->sense->ascq==0x00) {
-+              ret = cdrom_read_cd(cdi, cgc, lba, blksize, nblocks);
-+              if (ret == 0) {
-+                      cdi->use_read10 = 1;
-+                      printk(KERN_INFO "cdrom.c: drive does not like READ_CD for blksize=%d, switching to READ_10.\n", blksize);
-+              }
-+      }
-+      return ret;
- }
- static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf,
-@@ -2671,20 +2704,6 @@
-               cgc.sense = &sense;
-               cgc.data_direction = CGC_DATA_READ;
-               ret = cdrom_read_block(cdi, &cgc, lba, 1, format, blocksize);
--              if (ret && sense.sense_key==0x05 && sense.asc==0x20 && sense.ascq==0x00) {
--                      /*
--                       * SCSI-II devices are not required to support
--                       * READ_CD, so let's try switching block size
--                       */
--                      /* FIXME: switch back again... */
--                      if ((ret = cdrom_switch_blocksize(cdi, blocksize))) {
--                              kfree(cgc.buffer);
--                              return ret;
--                      }
--                      cgc.sense = NULL;
--                      ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1);
--                      ret |= cdrom_switch_blocksize(cdi, blocksize);
--              }
-               if (!ret && copy_to_user((char __user *)arg, cgc.buffer, blocksize))
-                       ret = -EFAULT;
-               kfree(cgc.buffer);
diff --git a/target/device/AMD/DBAu1500/kernel-patches/064-shutup-md.patch b/target/device/AMD/DBAu1500/kernel-patches/064-shutup-md.patch
deleted file mode 100644 (file)
index 018c4bc..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
---- orig/drivers/md/md.c       2006-03-21 01:43:49.000000000 -0700
-+++ linux-2.6.16/drivers/md/md.c       2006-03-21 01:43:49.000000000 -0700
-@@ -4860,7 +4860,7 @@
-       if ((code == SYS_DOWN) || (code == SYS_HALT) || (code == SYS_POWER_OFF)) {
--              printk(KERN_INFO "md: stopping all md devices.\n");
-+              //printk(KERN_INFO "md: stopping all md devices.\n");
-               ITERATE_MDDEV(mddev,tmp)
-                       if (mddev_trylock(mddev)==0)
diff --git a/target/device/AMD/DBAu1500/kernel-patches/098_scsi-warnings.patch b/target/device/AMD/DBAu1500/kernel-patches/098_scsi-warnings.patch
deleted file mode 100644 (file)
index 6a88d2e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
---- orig/drivers/scsi/scsi_ioctl.c     2005-12-03 02:10:27.000000000 -0700
-+++ linux-2.6.14/drivers/scsi/scsi_ioctl.c     2005-12-03 02:10:27.000000000 -0700
-@@ -374,6 +374,7 @@
-       if (!scsi_block_when_processing_errors(sdev))
-               return -ENODEV;
-+#if 0
-       /* Check for deprecated ioctls ... all the ioctls which don't
-        * follow the new unique numbering scheme are deprecated */
-       switch (cmd) {
-@@ -389,6 +390,7 @@
-       default:
-               break;
-       }
-+#endif
-       switch (cmd) {
-       case SCSI_IOCTL_GET_IDLUN:
diff --git a/target/device/AMD/DBAu1500/kernel-patches/100_VERSION.patch b/target/device/AMD/DBAu1500/kernel-patches/100_VERSION.patch
deleted file mode 100644 (file)
index 26ab03a..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
---- orig/Makefile      2005-12-03 09:22:07 +0000
-+++ linux-2.6.14/Makefile      2005-12-03 09:22:07 +0000
-@@ -1,7 +1,7 @@
- VERSION = 2
- PATCHLEVEL = 6
--SUBLEVEL = 16
--EXTRAVERSION = .20
-+SUBLEVEL = 16
-+EXTRAVERSION = .20-erik
- NAME=Sliding Snow Leopard
- # *DOCUMENTATION*
diff --git a/target/device/AMD/DBAu1500/linux.mk b/target/device/AMD/DBAu1500/linux.mk
deleted file mode 100644 (file)
index 423191c..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#############################################################
-#
-# Linux kernel targets
-#
-# Note:  If you have any patches to apply, create the directory
-# sources/kernel-patches and put your patches in there and number
-# them in the order you wish to apply them...  i.e.
-#
-#   sources/kernel-patches/001-my-special-stuff.bz2
-#   sources/kernel-patches/003-gcc-Os.bz2
-#   sources/kernel-patches/004_no-warnings.bz2
-#   sources/kernel-patches/030-lowlatency-mini.bz2
-#   sources/kernel-patches/031-lowlatency-fixes-5.bz2
-#   sources/kernel-patches/099-shutup.bz2
-#   etc...
-#
-# these patches will all be applied by the patch-kernel.sh
-# script (which will also abort the build if it finds rejects)
-#  -Erik
-#
-#############################################################
-ifneq ($(filter $(TARGETS),linux),)
-
-# Base version of Linux kernel that we need to download
-DOWNLOAD_LINUX_VERSION=2.6.16
-# Version of Linux kernel AFTER applying all patches
-LINUX_VERSION=2.6.16.20-erik
-
-
-# File name for the Linux kernel binary
-LINUX_KERNEL=linux-kernel-$(LINUX_VERSION)-$(ARCH).srec
-
-
-# Linux kernel configuration file
-LINUX_KCONFIG=$(ALCHEMY_DBAU1500_PATH)/linux.config
-
-# kernel patches
-LINUX_PATCH_DIR=target/device/AMD/DBAu1500/kernel-patches/
-
-
-
-
-LINUX_FORMAT=vmlinux
-LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \
-       -e 's/mipsel/mips/' \
-       -e 's/powerpc/ppc/' \
-       -e 's/sh[234]/sh/' \
-       )
-LINUX_BINLOC=$(LINUX_FORMAT)
-LINUX_DIR=$(BUILD_DIR)/linux-$(LINUX_VERSION)
-LINUX_SOURCE=linux-$(DOWNLOAD_LINUX_VERSION).tar.bz2
-LINUX_CAT:=$(BZCAT)
-LINUX_SITE=http://www.kernel.org/pub/linux/kernel/v2.6
-# Used by pcmcia-cs and others
-LINUX_SOURCE_DIR=$(LINUX_DIR)
-
-
-$(DL_DIR)/$(LINUX_SOURCE):
-       -mkdir -p $(DL_DIR)
-       $(WGET) -P $(DL_DIR) $(LINUX_SITE)/$(LINUX_SOURCE)
-
-$(LINUX_DIR)/.unpacked: $(DL_DIR)/$(LINUX_SOURCE)
-       -mkdir -p $(TOOL_BUILD_DIR)
-       -(cd $(TOOL_BUILD_DIR); ln -snf $(LINUX_DIR) linux)
-       $(LINUX_CAT) $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
-ifneq ($(DOWNLOAD_LINUX_VERSION),$(LINUX_VERSION))
-       # Rename the dir from the downloaded version to the AFTER patch version
-       mv -f $(BUILD_DIR)/linux-$(DOWNLOAD_LINUX_VERSION) $(BUILD_DIR)/linux-$(LINUX_VERSION)
-endif
-       toolchain/patch-kernel.sh $(LINUX_DIR) $(LINUX_PATCH_DIR)
-       touch $(LINUX_DIR)/.unpacked
-
-$(LINUX_KCONFIG):
-       @if [ ! -f "$(LINUX_KCONFIG)" ] ; then \
-               echo ""; \
-               echo "You should create a .config for your kernel"; \
-               echo "and install it as $(LINUX_KCONFIG)"; \
-               echo ""; \
-               sleep 5; \
-       fi;
-
-$(LINUX_DIR)/.configured $(BUILD_DIR)/linux/.configured:  $(LINUX_DIR)/.unpacked  $(LINUX_KCONFIG)
-       $(SED) "s,^ARCH.*,ARCH=$(LINUX_KARCH),g;" $(LINUX_DIR)/Makefile
-       $(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" $(LINUX_DIR)/Makefile
-       -cp $(LINUX_KCONFIG) $(LINUX_DIR)/.config
-ifeq ($(strip $(BR2_mips)),y)
-       $(SED) "s,CONFIG_CPU_LITTLE_ENDIAN=y,# CONFIG_CPU_LITTLE_ENDIAN is not set\n# CONFIG_BINFMT_IRIX is not set," $(LINUX_DIR)/.config
-endif
-       $(MAKE) PATH=$(TARGET_PATH) -C $(LINUX_DIR) oldconfig include/linux/version.h
-       touch $(LINUX_DIR)/.configured
-
-$(LINUX_DIR)/.depend_done:  $(LINUX_DIR)/.configured
-       $(MAKE) PATH=$(TARGET_PATH) -C $(LINUX_DIR) dep
-       touch $(LINUX_DIR)/.depend_done
-
-$(LINUX_DIR)/$(LINUX_BINLOC): $(LINUX_DIR)/.depend_done
-       $(MAKE) PATH=$(TARGET_PATH) -C $(LINUX_DIR) $(LINUX_FORMAT)
-       $(MAKE) PATH=$(TARGET_PATH) -C $(LINUX_DIR) modules
-
-$(LINUX_KERNEL): $(LINUX_DIR)/$(LINUX_BINLOC)
-       $(KERNEL_CROSS)objcopy -O srec $(LINUX_DIR)/$(LINUX_BINLOC) $(LINUX_KERNEL)
-       touch -c $(LINUX_KERNEL)
-
-$(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep: $(LINUX_KERNEL) cross-depmod
-       rm -rf $(TARGET_DIR)/lib/modules
-       rm -f $(TARGET_DIR)/sbin/cardmgr
-       $(MAKE) PATH=$(TARGET_PATH) -C $(LINUX_DIR) \
-               DEPMOD=$(STAGING_DIR)/usr/bin/$(GNU_TARGET_NAME)-depmod \
-               INSTALL_MOD_PATH=$(TARGET_DIR) modules_install
-
-$(STAGING_DIR)/include/linux/version.h: $(LINUX_DIR)/.configured
-       mkdir -p $(STAGING_DIR)/include
-       tar -ch -C $(LINUX_DIR)/include -f - linux | tar -xf - -C $(STAGING_DIR)/include/
-       tar -ch -C $(LINUX_DIR)/include -f - asm | tar -xf - -C $(STAGING_DIR)/include/
-
-linux: $(STAGING_DIR)/include/linux/version.h $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep
-
-linux-source: $(DL_DIR)/$(LINUX_SOURCE)
-
-# This has been renamed so we do _NOT_ by default run this on 'make clean'
-linuxclean: clean
-       rm -f $(LINUX_KERNEL)
-       -$(MAKE) PATH=$(TARGET_PATH) -C $(LINUX_DIR) clean
-
-linux-dirclean:
-       rm -rf $(LINUX_DIR)
-
-endif
diff --git a/target/device/AMD/DBAu1500/linux26.mk b/target/device/AMD/DBAu1500/linux26.mk
new file mode 100644 (file)
index 0000000..15678c0
--- /dev/null
@@ -0,0 +1,107 @@
+#############################################################
+#
+# Linux kernel 2.6 target
+#
+#############################################################
+ifneq ($(filter $(TARGETS),linux26),)
+
+
+# Version of Linux to download and then apply patches to
+DOWNLOAD_LINUX26_VERSION=2.6.19.1
+# Version of Linux after applying any patches
+LINUX26_VERSION=2.6.19.1
+
+
+
+LINUX26_SOURCE=linux-$(DOWNLOAD_LINUX26_VERSION).tar.bz2
+LINUX26_SITE=http://ftp.kernel.org/pub/linux/kernel/v2.6
+
+LINUX26_FORMAT=vmlinux
+LINUX26_BINLOC=$(LINUX26_FORMAT)
+
+# Linux kernel configuration file
+LINUX26_KCONFIG=$(ALCHEMY_DBAU1500_PATH)/linux26.config
+
+# File name for the Linux kernel binary
+LINUX26_KERNEL=linux-kernel-$(LINUX26_VERSION)-$(KERNEL_ARCH).srec
+
+# Version of Linux AFTER patches
+LINUX26_DIR=$(BUILD_DIR)/linux-$(LINUX26_VERSION)
+
+# kernel patches
+LINUX26_PATCH_DIR=target/device/AMD/DBAu1500/kernel-patches/
+
+LINUX26_MAKE_FLAGS = $(TARGET_CONFIGURE_OPTS) ARCH=$(KERNEL_ARCH) \
+       PATH=$(TARGET_PATH) INSTALL_MOD_PATH=$(TARGET_DIR) \
+       CROSS_COMPILE=$(KERNEL_CROSS)
+
+
+
+
+$(DL_DIR)/$(LINUX26_SOURCE):
+        $(WGET) -P $(DL_DIR) $(LINUX26_SITE)/$(LINUX26_SOURCE)
+
+$(LINUX26_DIR)/.unpacked: $(DL_DIR)/$(LINUX26_SOURCE)
+       rm -rf $(LINUX26_DIR)
+       bzcat $(DL_DIR)/$(LINUX26_SOURCE) | tar -C $(BUILD_DIR) -xvf -
+ifneq ($(DOWNLOAD_LINUX26_VERSION),$(LINUX26_VERSION))
+       # Rename the dir from the downloaded version to the AFTER patch version
+       mv -f $(BUILD_DIR)/linux-$(DOWNLOAD_LINUX26_VERSION) $(BUILD_DIR)/linux-$(LINUX26_VERSION)
+endif
+       touch $(LINUX26_DIR)/.unpacked
+
+$(LINUX26_KCONFIG):
+       @if [ ! -f "$(LINUX26_KCONFIG)" ] ; then \
+               echo ""; \
+               echo "You should create a .config for your kernel"; \
+               echo "and install it as $(LINUX26_KCONFIG)"; \
+               echo ""; \
+               sleep 5; \
+       fi;
+
+$(LINUX26_DIR)/.patched: $(LINUX26_DIR)/.unpacked
+       #toolchain/patch-kernel.sh $(LINUX26_DIR) $(LINUX26_PATCH_DIR)
+       touch $(LINUX26_DIR)/.patched
+
+$(LINUX26_DIR)/.configured:  $(LINUX26_DIR)/.patched  $(LINUX26_KCONFIG)
+       -cp $(LINUX26_KCONFIG) $(LINUX26_DIR)/.config
+       $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) oldconfig
+       touch $(LINUX26_DIR)/.configured
+
+linux26-menuconfig: $(LINUX26_DIR)/.patched
+       [ -f $(LINUX26_DIR)/.config ] || cp $(LINUX26_KCONFIG) $(LINUX26_DIR)/.config
+       $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) menuconfig
+       -[ -f $(LINUX26_DIR)/.config ] && touch $(LINUX26_DIR)/.configured
+
+$(LINUX26_DIR)/.depend_done:  $(LINUX26_DIR)/.configured
+       $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) prepare
+       touch $(LINUX26_DIR)/.depend_done
+
+$(LINUX26_KERNEL): $(LINUX26_DIR)/.depend_done
+       $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) $(LINUX26_FORMAT) bzImage
+       $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) modules
+       $(KERNEL_CROSS)objcopy -O srec $(LINUX26_DIR)/$(LINUX26_BINLOC) $(LINUX26_KERNEL)
+       touch -c $(LINUX26_KERNEL)
+
+$(TARGET_DIR)/lib/modules/$(LINUX26_VERSION)/modules.dep: $(LINUX26_KERNEL)
+       rm -rf $(TARGET_DIR)/lib/modules/$(LINUX26_VERSION)
+       rm -f $(TARGET_DIR)/sbin/cardmgr
+       $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) \
+               DEPMOD=$(STAGING_DIR)/bin/$(GNU_TARGET_NAME)-depmod26 \
+               INSTALL_MOD_PATH=$(TARGET_DIR) modules_install
+       rm -f $(TARGET_DIR)/lib/modules/$(LINUX26_VERSION)/build
+       touch -c $(TARGET_DIR)/lib/modules/$(LINUX26_VERSION)/modules.dep
+
+linux26: cross-depmod26 $(TARGET_DIR)/lib/modules/$(LINUX26_VERSION)/modules.dep
+
+linux26-source: $(DL_DIR)/$(LINUX26_SOURCE)
+
+# This has been renamed so we do _NOT_ by default run this on 'make clean'
+linux26clean:
+       rm -f $(LINUX26_KERNEL)
+       -$(MAKE) PATH=$(TARGET_PATH) -C $(LINUX26_DIR) clean
+
+linux26-dirclean:
+       rm -rf $(LINUX26_DIR)
+
+endif