diff options
Diffstat (limited to 'packages/linux/linux-ezx-2.6.21/patches/patch-2.6.21.4')
-rw-r--r-- | packages/linux/linux-ezx-2.6.21/patches/patch-2.6.21.4 | 2816 |
1 files changed, 0 insertions, 2816 deletions
diff --git a/packages/linux/linux-ezx-2.6.21/patches/patch-2.6.21.4 b/packages/linux/linux-ezx-2.6.21/patches/patch-2.6.21.4 deleted file mode 100644 index 2c2ed60433..0000000000 --- a/packages/linux/linux-ezx-2.6.21/patches/patch-2.6.21.4 +++ /dev/null @@ -1,2816 +0,0 @@ -diff --git a/Makefile b/Makefile -index d970cb1..e5c5531 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - VERSION = 2 - PATCHLEVEL = 6 - SUBLEVEL = 21 --EXTRAVERSION = -+EXTRAVERSION = .4 - NAME = Nocturnal Monster Puppy - - # *DOCUMENTATION* -diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c -index 2409560..7ed141f 100644 ---- a/arch/arm/kernel/traps.c -+++ b/arch/arm/kernel/traps.c -@@ -273,6 +273,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs) - struct undef_hook *hook; - siginfo_t info; - void __user *pc; -+ unsigned long flags; - - /* - * According to the ARM ARM, PC is 2 or 4 bytes ahead, -@@ -291,7 +292,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs) - get_user(instr, (u32 __user *)pc); - } - -- spin_lock_irq(&undef_lock); -+ spin_lock_irqsave(&undef_lock, flags); - list_for_each_entry(hook, &undef_hook, node) { - if ((instr & hook->instr_mask) == hook->instr_val && - (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { -@@ -301,7 +302,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs) - } - } - } -- spin_unlock_irq(&undef_lock); -+ spin_unlock_irqrestore(&undef_lock, flags); - - #ifdef CONFIG_DEBUG_USER - if (user_debug & UDBG_UNDEFINED) { -diff --git a/arch/arm/mach-iop13xx/pci.c b/arch/arm/mach-iop13xx/pci.c -index 89ec70e..d907a2a 100644 ---- a/arch/arm/mach-iop13xx/pci.c -+++ b/arch/arm/mach-iop13xx/pci.c -@@ -1023,7 +1023,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) - << IOP13XX_ATUX_PCIXSR_FUNC_NUM; - __raw_writel(pcixsr, IOP13XX_ATUX_PCIXSR); - -- res[0].start = IOP13XX_PCIX_LOWER_IO_PA; -+ res[0].start = IOP13XX_PCIX_LOWER_IO_PA + IOP13XX_PCIX_IO_BUS_OFFSET; - res[0].end = IOP13XX_PCIX_UPPER_IO_PA; - res[0].name = "IQ81340 ATUX PCI I/O Space"; - res[0].flags = IORESOURCE_IO; -@@ -1033,7 +1033,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) - res[1].name = "IQ81340 ATUX PCI Memory Space"; - res[1].flags = IORESOURCE_MEM; - sys->mem_offset = IOP13XX_PCIX_MEM_OFFSET; -- sys->io_offset = IOP13XX_PCIX_IO_OFFSET; -+ sys->io_offset = IOP13XX_PCIX_LOWER_IO_PA; - break; - case IOP13XX_INIT_ATU_ATUE: - /* Note: the function number field in the PCSR is ro */ -@@ -1044,7 +1044,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) - - __raw_writel(pcsr, IOP13XX_ATUE_PCSR); - -- res[0].start = IOP13XX_PCIE_LOWER_IO_PA; -+ res[0].start = IOP13XX_PCIE_LOWER_IO_PA + IOP13XX_PCIE_IO_BUS_OFFSET; - res[0].end = IOP13XX_PCIE_UPPER_IO_PA; - res[0].name = "IQ81340 ATUE PCI I/O Space"; - res[0].flags = IORESOURCE_IO; -@@ -1054,7 +1054,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys) - res[1].name = "IQ81340 ATUE PCI Memory Space"; - res[1].flags = IORESOURCE_MEM; - sys->mem_offset = IOP13XX_PCIE_MEM_OFFSET; -- sys->io_offset = IOP13XX_PCIE_IO_OFFSET; -+ sys->io_offset = IOP13XX_PCIE_LOWER_IO_PA; - sys->map_irq = iop13xx_pcie_map_irq; - break; - default: -diff --git a/arch/arm/plat-iop/time.c b/arch/arm/plat-iop/time.c -index 16300ad..0cc26da 100644 ---- a/arch/arm/plat-iop/time.c -+++ b/arch/arm/plat-iop/time.c -@@ -32,22 +32,22 @@ static unsigned long next_jiffy_time; - - unsigned long iop_gettimeoffset(void) - { -- unsigned long offset, temp1, temp2; -+ unsigned long offset, temp; - - /* enable cp6, if necessary, to avoid taking the overhead of an - * undefined instruction trap - */ - asm volatile ( - "mrc p15, 0, %0, c15, c1, 0\n\t" -- "ands %1, %0, #(1 << 6)\n\t" -+ "tst %0, #(1 << 6)\n\t" - "orreq %0, %0, #(1 << 6)\n\t" - "mcreq p15, 0, %0, c15, c1, 0\n\t" --#ifdef CONFIG_XSCALE -+#ifdef CONFIG_CPU_XSCALE - "mrceq p15, 0, %0, c15, c1, 0\n\t" - "moveq %0, %0\n\t" - "subeq pc, pc, #4\n\t" - #endif -- : "=r"(temp1), "=r"(temp2) : : "cc"); -+ : "=r"(temp) : : "cc"); - - offset = next_jiffy_time - read_tcr1(); - -diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c -index 837b041..ca3e1d3 100644 ---- a/arch/i386/kernel/cpu/cpufreq/powernow-k7.c -+++ b/arch/i386/kernel/cpu/cpufreq/powernow-k7.c -@@ -341,15 +341,17 @@ static int powernow_acpi_init(void) - pc.val = (unsigned long) acpi_processor_perf->states[0].control; - for (i = 0; i < number_scales; i++) { - u8 fid, vid; -- unsigned int speed; -+ struct acpi_processor_px *state = -+ &acpi_processor_perf->states[i]; -+ unsigned int speed, speed_mhz; - -- pc.val = (unsigned long) acpi_processor_perf->states[i].control; -+ pc.val = (unsigned long) state->control; - dprintk ("acpi: P%d: %d MHz %d mW %d uS control %08x SGTC %d\n", - i, -- (u32) acpi_processor_perf->states[i].core_frequency, -- (u32) acpi_processor_perf->states[i].power, -- (u32) acpi_processor_perf->states[i].transition_latency, -- (u32) acpi_processor_perf->states[i].control, -+ (u32) state->core_frequency, -+ (u32) state->power, -+ (u32) state->transition_latency, -+ (u32) state->control, - pc.bits.sgtc); - - vid = pc.bits.vid; -@@ -360,6 +362,18 @@ static int powernow_acpi_init(void) - powernow_table[i].index |= (vid << 8); /* upper 8 bits */ - - speed = powernow_table[i].frequency; -+ speed_mhz = speed / 1000; -+ -+ /* processor_perflib will multiply the MHz value by 1000 to -+ * get a KHz value (e.g. 1266000). However, powernow-k7 works -+ * with true KHz values (e.g. 1266768). To ensure that all -+ * powernow frequencies are available, we must ensure that -+ * ACPI doesn't restrict them, so we round up the MHz value -+ * to ensure that perflib's computed KHz value is greater than -+ * or equal to powernow's KHz value. -+ */ -+ if (speed % 1000 > 0) -+ speed_mhz++; - - if ((fid_codes[fid] % 10)==5) { - if (have_a0 == 1) -@@ -368,10 +382,16 @@ static int powernow_acpi_init(void) - - dprintk (" FID: 0x%x (%d.%dx [%dMHz]) " - "VID: 0x%x (%d.%03dV)\n", fid, fid_codes[fid] / 10, -- fid_codes[fid] % 10, speed/1000, vid, -+ fid_codes[fid] % 10, speed_mhz, vid, - mobile_vid_table[vid]/1000, - mobile_vid_table[vid]%1000); - -+ if (state->core_frequency != speed_mhz) { -+ state->core_frequency = speed_mhz; -+ dprintk(" Corrected ACPI frequency to %d\n", -+ speed_mhz); -+ } -+ - if (latency < pc.bits.sgtc) - latency = pc.bits.sgtc; - -@@ -602,7 +622,7 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy) - result = powernow_acpi_init(); - if (result) { - printk (KERN_INFO PFX "ACPI and legacy methods failed\n"); -- printk (KERN_INFO PFX "See http://www.codemonkey.org.uk/projects/cpufreq/powernow-k7.shtml\n"); -+ printk (KERN_INFO PFX "See http://www.codemonkey.org.uk/projects/cpufreq/powernow-k7.html\n"); - } - } else { - /* SGTC use the bus clock as timer */ -diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c -index fe3b670..e295d87 100644 ---- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c -+++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c -@@ -521,7 +521,7 @@ static int check_supported_cpu(unsigned int cpu) - - if ((eax & CPUID_XFAM) == CPUID_XFAM_K8) { - if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) || -- ((eax & CPUID_XMOD) > CPUID_XMOD_REV_G)) { -+ ((eax & CPUID_XMOD) > CPUID_XMOD_REV_MASK)) { - printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax); - goto out; - } -diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h -index 0fb2a30..575541f 100644 ---- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h -+++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h -@@ -46,8 +46,8 @@ struct powernow_k8_data { - #define CPUID_XFAM 0x0ff00000 /* extended family */ - #define CPUID_XFAM_K8 0 - #define CPUID_XMOD 0x000f0000 /* extended model */ --#define CPUID_XMOD_REV_G 0x00060000 --#define CPUID_XFAM_10H 0x00100000 /* family 0x10 */ -+#define CPUID_XMOD_REV_MASK 0x00080000 -+#define CPUID_XFAM_10H 0x00100000 /* family 0x10 */ - #define CPUID_USE_XFAM_XMOD 0x00000f00 - #define CPUID_GET_MAX_CAPABILITIES 0x80000000 - #define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007 -diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c -index fb9bf1e..f56569f 100644 ---- a/arch/sparc64/kernel/of_device.c -+++ b/arch/sparc64/kernel/of_device.c -@@ -508,6 +508,13 @@ static int __init build_one_resource(struct device_node *parent, - return 0; - } - -+ /* When we miss an I/O space match on PCI, just pass it up -+ * to the next PCI bridge and/or controller. -+ */ -+ if (!strcmp(bus->name, "pci") && -+ (addr[0] & 0x03000000) == 0x01000000) -+ return 0; -+ - return 1; - } - -diff --git a/arch/sparc64/kernel/prom.c b/arch/sparc64/kernel/prom.c -index 0917c24..3494adf 100644 ---- a/arch/sparc64/kernel/prom.c -+++ b/arch/sparc64/kernel/prom.c -@@ -1555,10 +1555,21 @@ static struct device_node * __init create_node(phandle node, struct device_node - - static struct device_node * __init build_tree(struct device_node *parent, phandle node, struct device_node ***nextp) - { -+ struct device_node *ret = NULL, *prev_sibling = NULL; - struct device_node *dp; - -- dp = create_node(node, parent); -- if (dp) { -+ while (1) { -+ dp = create_node(node, parent); -+ if (!dp) -+ break; -+ -+ if (prev_sibling) -+ prev_sibling->sibling = dp; -+ -+ if (!ret) -+ ret = dp; -+ prev_sibling = dp; -+ - *(*nextp) = dp; - *nextp = &dp->allnext; - -@@ -1567,10 +1578,10 @@ static struct device_node * __init build_tree(struct device_node *parent, phandl - - dp->child = build_tree(dp, prom_getchild(node), nextp); - -- dp->sibling = build_tree(parent, prom_getsibling(node), nextp); -+ node = prom_getsibling(node); - } - -- return dp; -+ return ret; - } - - void __init prom_build_devicetree(void) -diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c -index fc99f7b..8ad7bdb 100644 ---- a/arch/sparc64/kernel/smp.c -+++ b/arch/sparc64/kernel/smp.c -@@ -566,6 +566,9 @@ static void hypervisor_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t - unsigned long flags, status; - int cnt, retries, this_cpu, prev_sent, i; - -+ if (cpus_empty(mask)) -+ return; -+ - /* We have to do this whole thing with interrupts fully disabled. - * Otherwise if we send an xcall from interrupt context it will - * corrupt both our mondo block and cpu list state. -diff --git a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c -index b43c698..fc9f042 100644 ---- a/arch/x86_64/kernel/vsyscall.c -+++ b/arch/x86_64/kernel/vsyscall.c -@@ -132,7 +132,7 @@ static __always_inline void do_vgettimeofday(struct timeval * tv) - - /* convert to usecs and add to timespec: */ - tv->tv_usec += nsec_delta / NSEC_PER_USEC; -- while (tv->tv_usec > USEC_PER_SEC) { -+ while (tv->tv_usec >= USEC_PER_SEC) { - tv->tv_sec += 1; - tv->tv_usec -= USEC_PER_SEC; - } -diff --git a/crypto/api.c b/crypto/api.c -index 55af8bb..33734fd 100644 ---- a/crypto/api.c -+++ b/crypto/api.c -@@ -48,8 +48,10 @@ EXPORT_SYMBOL_GPL(crypto_mod_get); - - void crypto_mod_put(struct crypto_alg *alg) - { -+ struct module *module = alg->cra_module; -+ - crypto_alg_put(alg); -- module_put(alg->cra_module); -+ module_put(module); - } - EXPORT_SYMBOL_GPL(crypto_mod_put); - -diff --git a/drivers/acpi/tables/tbfadt.c b/drivers/acpi/tables/tbfadt.c -index 807c711..d341491 100644 ---- a/drivers/acpi/tables/tbfadt.c -+++ b/drivers/acpi/tables/tbfadt.c -@@ -347,6 +347,20 @@ static void acpi_tb_convert_fadt(void) - acpi_gbl_xpm1b_enable.space_id = acpi_gbl_FADT.xpm1a_event_block.space_id; - - } -+ /* -+ * _CST object and C States change notification start with -+ * ACPI 2.0 (FADT r3). Although the field should be Reserved -+ * and 0 before then, some pre-r3 FADT set this field and -+ * it results in SMM-related boot failures. For them, clear it. -+ */ -+ if ((acpi_gbl_FADT.header.revision < 3) && -+ (acpi_gbl_FADT.cst_control != 0)) { -+ ACPI_WARNING((AE_INFO, -+ "Ignoring BIOS FADT r%u C-state control", -+ acpi_gbl_FADT.header.revision)); -+ acpi_gbl_FADT.cst_control = 0; -+ } -+ - } - - /****************************************************************************** -diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c -index 2ffcca0..4d63974 100644 ---- a/drivers/ata/libata-sff.c -+++ b/drivers/ata/libata-sff.c -@@ -557,12 +557,30 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int - int i, p = 0; - void __iomem * const *iomap; - -+ /* Discard disabled ports. Some controllers show their -+ unused channels this way */ -+ if (ata_resources_present(pdev, 0) == 0) -+ ports &= ~ATA_PORT_PRIMARY; -+ if (ata_resources_present(pdev, 1) == 0) -+ ports &= ~ATA_PORT_SECONDARY; -+ - /* iomap BARs */ -- for (i = 0; i < 4; i++) { -- if (pcim_iomap(pdev, i, 0) == NULL) { -- dev_printk(KERN_ERR, &pdev->dev, -- "failed to iomap PCI BAR %d\n", i); -- return NULL; -+ if (ports & ATA_PORT_PRIMARY) { -+ for (i = 0; i <= 1; i++) { -+ if (pcim_iomap(pdev, i, 0) == NULL) { -+ dev_printk(KERN_ERR, &pdev->dev, -+ "failed to iomap PCI BAR %d\n", i); -+ return NULL; -+ } -+ } -+ } -+ if (ports & ATA_PORT_SECONDARY) { -+ for (i = 2; i <= 3; i++) { -+ if (pcim_iomap(pdev, i, 0) == NULL) { -+ dev_printk(KERN_ERR, &pdev->dev, -+ "failed to iomap PCI BAR %d\n", i); -+ return NULL; -+ } - } - } - -@@ -577,13 +595,6 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int - probe_ent->irq = pdev->irq; - probe_ent->irq_flags = IRQF_SHARED; - -- /* Discard disabled ports. Some controllers show their -- unused channels this way */ -- if (ata_resources_present(pdev, 0) == 0) -- ports &= ~ATA_PORT_PRIMARY; -- if (ata_resources_present(pdev, 1) == 0) -- ports &= ~ATA_PORT_SECONDARY; -- - if (ports & ATA_PORT_PRIMARY) { - probe_ent->port[p].cmd_addr = iomap[0]; - probe_ent->port[p].altstatus_addr = -diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c -index 598e6a2..ea6efca 100644 ---- a/drivers/ata/sata_via.c -+++ b/drivers/ata/sata_via.c -@@ -97,6 +97,10 @@ static struct pci_driver svia_pci_driver = { - .name = DRV_NAME, - .id_table = svia_pci_tbl, - .probe = svia_init_one, -+#ifdef CONFIG_PM -+ .suspend = ata_pci_device_suspend, -+ .resume = ata_pci_device_resume, -+#endif - .remove = ata_pci_remove_one, - }; - -@@ -116,6 +120,10 @@ static struct scsi_host_template svia_sht = { - .slave_configure = ata_scsi_slave_config, - .slave_destroy = ata_scsi_slave_destroy, - .bios_param = ata_std_bios_param, -+#ifdef CONFIG_PM -+ .suspend = ata_scsi_device_suspend, -+ .resume = ata_scsi_device_resume, -+#endif - }; - - static const struct ata_port_operations vt6420_sata_ops = { -diff --git a/drivers/base/core.c b/drivers/base/core.c -index d7fcf82..a8dfee2 100644 ---- a/drivers/base/core.c -+++ b/drivers/base/core.c -@@ -93,6 +93,9 @@ static void device_release(struct kobject * kobj) - { - struct device * dev = to_dev(kobj); - -+ kfree(dev->devt_attr); -+ dev->devt_attr = NULL; -+ - if (dev->release) - dev->release(dev); - else if (dev->type && dev->type->release) -@@ -765,10 +768,8 @@ void device_del(struct device * dev) - - if (parent) - klist_del(&dev->knode_parent); -- if (dev->devt_attr) { -+ if (dev->devt_attr) - device_remove_file(dev, dev->devt_attr); -- kfree(dev->devt_attr); -- } - if (dev->class) { - sysfs_remove_link(&dev->kobj, "subsystem"); - /* If this is not a "fake" compatible device, remove the -diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c -index e221465..cc13ebc 100644 ---- a/drivers/char/ipmi/ipmi_si_intf.c -+++ b/drivers/char/ipmi/ipmi_si_intf.c -@@ -1859,10 +1859,10 @@ static __devinit int try_init_acpi(struct SPMITable *spmi) - - if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { - info->io_setup = mem_setup; -- info->io.addr_type = IPMI_IO_ADDR_SPACE; -+ info->io.addr_type = IPMI_MEM_ADDR_SPACE; - } else if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_IO) { - info->io_setup = port_setup; -- info->io.addr_type = IPMI_MEM_ADDR_SPACE; -+ info->io.addr_type = IPMI_IO_ADDR_SPACE; - } else { - kfree(info); - printk("ipmi_si: Unknown ACPI I/O Address type\n"); -diff --git a/drivers/char/random.c b/drivers/char/random.c -index b9dc7aa..fa5b95b 100644 ---- a/drivers/char/random.c -+++ b/drivers/char/random.c -@@ -760,7 +760,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min, - - static void extract_buf(struct entropy_store *r, __u8 *out) - { -- int i, x; -+ int i; - __u32 data[16], buf[5 + SHA_WORKSPACE_WORDS]; - - sha_init(buf); -@@ -772,9 +772,11 @@ static void extract_buf(struct entropy_store *r, __u8 *out) - * attempts to find previous ouputs), unless the hash - * function can be inverted. - */ -- for (i = 0, x = 0; i < r->poolinfo->poolwords; i += 16, x+=2) { -- sha_transform(buf, (__u8 *)r->pool+i, buf + 5); -- add_entropy_words(r, &buf[x % 5], 1); -+ for (i = 0; i < r->poolinfo->poolwords; i += 16) { -+ /* hash blocks of 16 words = 512 bits */ -+ sha_transform(buf, (__u8 *)(r->pool + i), buf + 5); -+ /* feed back portion of the resulting hash */ -+ add_entropy_words(r, &buf[i % 5], 1); - } - - /* -@@ -782,7 +784,7 @@ static void extract_buf(struct entropy_store *r, __u8 *out) - * portion of the pool while mixing, and hash one - * final time. - */ -- __add_entropy_words(r, &buf[x % 5], 1, data); -+ __add_entropy_words(r, &buf[i % 5], 1, data); - sha_transform(buf, (__u8 *)data, buf + 5); - - /* -@@ -1022,37 +1024,44 @@ random_poll(struct file *file, poll_table * wait) - return mask; - } - --static ssize_t --random_write(struct file * file, const char __user * buffer, -- size_t count, loff_t *ppos) -+static int -+write_pool(struct entropy_store *r, const char __user *buffer, size_t count) - { -- int ret = 0; - size_t bytes; - __u32 buf[16]; - const char __user *p = buffer; -- size_t c = count; - -- while (c > 0) { -- bytes = min(c, sizeof(buf)); -+ while (count > 0) { -+ bytes = min(count, sizeof(buf)); -+ if (copy_from_user(&buf, p, bytes)) -+ return -EFAULT; - -- bytes -= copy_from_user(&buf, p, bytes); -- if (!bytes) { -- ret = -EFAULT; -- break; -- } -- c -= bytes; -+ count -= bytes; - p += bytes; - -- add_entropy_words(&input_pool, buf, (bytes + 3) / 4); -- } -- if (p == buffer) { -- return (ssize_t)ret; -- } else { -- struct inode *inode = file->f_path.dentry->d_inode; -- inode->i_mtime = current_fs_time(inode->i_sb); -- mark_inode_dirty(inode); -- return (ssize_t)(p - buffer); -+ add_entropy_words(r, buf, (bytes + 3) / 4); - } -+ -+ return 0; -+} -+ -+static ssize_t -+random_write(struct file * file, const char __user * buffer, -+ size_t count, loff_t *ppos) -+{ -+ size_t ret; -+ struct inode *inode = file->f_path.dentry->d_inode; -+ -+ ret = write_pool(&blocking_pool, buffer, count); -+ if (ret) -+ return ret; -+ ret = write_pool(&nonblocking_pool, buffer, count); -+ if (ret) -+ return ret; -+ -+ inode->i_mtime = current_fs_time(inode->i_sb); -+ mark_inode_dirty(inode); -+ return (ssize_t)count; - } - - static int -@@ -1091,8 +1100,8 @@ random_ioctl(struct inode * inode, struct file * file, - return -EINVAL; - if (get_user(size, p++)) - return -EFAULT; -- retval = random_write(file, (const char __user *) p, -- size, &file->f_pos); -+ retval = write_pool(&input_pool, (const char __user *)p, -+ size); - if (retval < 0) - return retval; - credit_entropy_store(&input_pool, ent_count); -diff --git a/drivers/crypto/geode-aes.c b/drivers/crypto/geode-aes.c -index 6d3840e..6a86958 100644 ---- a/drivers/crypto/geode-aes.c -+++ b/drivers/crypto/geode-aes.c -@@ -102,10 +102,15 @@ geode_aes_crypt(struct geode_aes_op *op) - u32 flags = 0; - unsigned long iflags; - -- if (op->len == 0 || op->src == op->dst) -+ if (op->len == 0) - return 0; - -- if (op->flags & AES_FLAGS_COHERENT) -+ /* If the source and destination is the same, then -+ * we need to turn on the coherent flags, otherwise -+ * we don't need to worry -+ */ -+ -+ if (op->src == op->dst) - flags |= (AES_CTRL_DCA | AES_CTRL_SCA); - - if (op->dir == AES_DIR_ENCRYPT) -@@ -120,7 +125,7 @@ geode_aes_crypt(struct geode_aes_op *op) - _writefield(AES_WRITEIV0_REG, op->iv); - } - -- if (op->flags & AES_FLAGS_USRKEY) { -+ if (!(op->flags & AES_FLAGS_HIDDENKEY)) { - flags |= AES_CTRL_WRKEY; - _writefield(AES_WRITEKEY0_REG, op->key); - } -@@ -289,6 +294,7 @@ static struct crypto_alg geode_cbc_alg = { - .setkey = geode_setkey, - .encrypt = geode_cbc_encrypt, - .decrypt = geode_cbc_decrypt, -+ .ivsize = AES_IV_LENGTH, - } - } - }; -diff --git a/drivers/crypto/geode-aes.h b/drivers/crypto/geode-aes.h -index 8003a36..f479686 100644 ---- a/drivers/crypto/geode-aes.h -+++ b/drivers/crypto/geode-aes.h -@@ -20,8 +20,7 @@ - #define AES_DIR_DECRYPT 0 - #define AES_DIR_ENCRYPT 1 - --#define AES_FLAGS_USRKEY (1 << 0) --#define AES_FLAGS_COHERENT (1 << 1) -+#define AES_FLAGS_HIDDENKEY (1 << 0) - - struct geode_aes_op { - -diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c -index 97ee870..3a95cc5 100644 ---- a/drivers/md/raid1.c -+++ b/drivers/md/raid1.c -@@ -271,21 +271,25 @@ static int raid1_end_read_request(struct bio *bio, unsigned int bytes_done, int - */ - update_head_pos(mirror, r1_bio); - -- if (uptodate || (conf->raid_disks - conf->mddev->degraded) <= 1) { -- /* -- * Set R1BIO_Uptodate in our master bio, so that -- * we will return a good error code for to the higher -- * levels even if IO on some other mirrored buffer fails. -- * -- * The 'master' represents the composite IO operation to -- * user-side. So if something waits for IO, then it will -- * wait for the 'master' bio. -+ if (uptodate) -+ set_bit(R1BIO_Uptodate, &r1_bio->state); -+ else { -+ /* If all other devices have failed, we want to return -+ * the error upwards rather than fail the last device. -+ * Here we redefine "uptodate" to mean "Don't want to retry" - */ -- if (uptodate) -- set_bit(R1BIO_Uptodate, &r1_bio->state); -+ unsigned long flags; -+ spin_lock_irqsave(&conf->device_lock, flags); -+ if (r1_bio->mddev->degraded == conf->raid_disks || -+ (r1_bio->mddev->degraded == conf->raid_disks-1 && -+ !test_bit(Faulty, &conf->mirrors[mirror].rdev->flags))) -+ uptodate = 1; -+ spin_unlock_irqrestore(&conf->device_lock, flags); -+ } - -+ if (uptodate) - raid_end_bio_io(r1_bio); -- } else { -+ else { - /* - * oops, read error: - */ -@@ -992,13 +996,14 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) - unsigned long flags; - spin_lock_irqsave(&conf->device_lock, flags); - mddev->degraded++; -+ set_bit(Faulty, &rdev->flags); - spin_unlock_irqrestore(&conf->device_lock, flags); - /* - * if recovery is running, make sure it aborts. - */ - set_bit(MD_RECOVERY_ERR, &mddev->recovery); -- } -- set_bit(Faulty, &rdev->flags); -+ } else -+ set_bit(Faulty, &rdev->flags); - set_bit(MD_CHANGE_DEVS, &mddev->flags); - printk(KERN_ALERT "raid1: Disk failure on %s, disabling device. \n" - " Operation continuing on %d devices\n", -diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c -index 85f21b5..2eb5741 100644 ---- a/drivers/message/fusion/mptspi.c -+++ b/drivers/message/fusion/mptspi.c -@@ -726,13 +726,15 @@ static int mptspi_slave_configure(struct scsi_device *sdev) - struct _MPT_SCSI_HOST *hd = - (struct _MPT_SCSI_HOST *)sdev->host->hostdata; - VirtTarget *vtarget = scsi_target(sdev)->hostdata; -- int ret = mptscsih_slave_configure(sdev); -+ int ret; -+ -+ mptspi_initTarget(hd, vtarget, sdev); -+ -+ ret = mptscsih_slave_configure(sdev); - - if (ret) - return ret; - -- mptspi_initTarget(hd, vtarget, sdev); -- - ddvprintk((MYIOC_s_INFO_FMT "id=%d min_period=0x%02x" - " max_offset=0x%02x max_width=%d\n", hd->ioc->name, - sdev->id, spi_min_period(scsi_target(sdev)), -diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig -index a3d46ea..32a3003 100644 ---- a/drivers/net/Kconfig -+++ b/drivers/net/Kconfig -@@ -2929,11 +2929,6 @@ endif #NETDEVICES - config NETPOLL - def_bool NETCONSOLE - --config NETPOLL_RX -- bool "Netpoll support for trapping incoming packets" -- default n -- depends on NETPOLL -- - config NETPOLL_TRAP - bool "Netpoll traffic trapping" - default n -diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c -index e85f5ec..5006c67 100644 ---- a/drivers/net/bnx2.c -+++ b/drivers/net/bnx2.c -@@ -54,8 +54,8 @@ - - #define DRV_MODULE_NAME "bnx2" - #define PFX DRV_MODULE_NAME ": " --#define DRV_MODULE_VERSION "1.5.8" --#define DRV_MODULE_RELDATE "April 24, 2007" -+#define DRV_MODULE_VERSION "1.5.8.1" -+#define DRV_MODULE_RELDATE "May 7, 2007" - - #define RUN_AT(x) (jiffies + (x)) - -@@ -4510,8 +4510,7 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) - vlan_tag_flags |= - (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); - } -- if ((mss = skb_shinfo(skb)->gso_size) && -- (skb->len > (bp->dev->mtu + ETH_HLEN))) { -+ if ((mss = skb_shinfo(skb)->gso_size)) { - u32 tcp_opt_len, ip_tcp_len; - - if (skb_header_cloned(skb) && -@@ -5565,6 +5564,9 @@ bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) - case SIOCGMIIREG: { - u32 mii_regval; - -+ if (!netif_running(dev)) -+ return -EAGAIN; -+ - spin_lock_bh(&bp->phy_lock); - err = bnx2_read_phy(bp, data->reg_num & 0x1f, &mii_regval); - spin_unlock_bh(&bp->phy_lock); -@@ -5578,6 +5580,9 @@ bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - -+ if (!netif_running(dev)) -+ return -EAGAIN; -+ - spin_lock_bh(&bp->phy_lock); - err = bnx2_write_phy(bp, data->reg_num & 0x1f, data->val_in); - spin_unlock_bh(&bp->phy_lock); -@@ -6143,6 +6148,7 @@ bnx2_suspend(struct pci_dev *pdev, pm_message_t state) - reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL; - bnx2_reset_chip(bp, reset_code); - bnx2_free_skbs(bp); -+ pci_save_state(pdev); - bnx2_set_power_state(bp, pci_choose_state(pdev, state)); - return 0; - } -@@ -6156,6 +6162,7 @@ bnx2_resume(struct pci_dev *pdev) - if (!netif_running(dev)) - return 0; - -+ pci_restore_state(pdev); - bnx2_set_power_state(bp, PCI_D0); - netif_device_attach(dev); - bnx2_init_nic(bp); -diff --git a/drivers/net/sis900.c b/drivers/net/sis900.c -index b2a3b19..ce547af 100644 ---- a/drivers/net/sis900.c -+++ b/drivers/net/sis900.c -@@ -1754,6 +1754,7 @@ static int sis900_rx(struct net_device *net_dev) - sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; - } else { - struct sk_buff * skb; -+ struct sk_buff * rx_skb; - - pci_unmap_single(sis_priv->pci_dev, - sis_priv->rx_ring[entry].bufptr, RX_BUF_SIZE, -@@ -1787,10 +1788,10 @@ static int sis900_rx(struct net_device *net_dev) - } - - /* give the socket buffer to upper layers */ -- skb = sis_priv->rx_skbuff[entry]; -- skb_put(skb, rx_size); -- skb->protocol = eth_type_trans(skb, net_dev); -- netif_rx(skb); -+ rx_skb = sis_priv->rx_skbuff[entry]; -+ skb_put(rx_skb, rx_size); -+ rx_skb->protocol = eth_type_trans(rx_skb, net_dev); -+ netif_rx(rx_skb); - - /* some network statistics */ - if ((rx_status & BCAST) == MCAST) -diff --git a/drivers/net/skge.c b/drivers/net/skge.c -index d476a3c..5ef9023 100644 ---- a/drivers/net/skge.c -+++ b/drivers/net/skge.c -@@ -135,10 +135,13 @@ static void skge_get_regs(struct net_device *dev, struct ethtool_regs *regs, - /* Wake on Lan only supported on Yukon chips with rev 1 or above */ - static u32 wol_supported(const struct skge_hw *hw) - { -- if (hw->chip_id == CHIP_ID_YUKON && hw->chip_rev != 0) -- return WAKE_MAGIC | WAKE_PHY; -- else -+ if (hw->chip_id == CHIP_ID_GENESIS) -+ return 0; -+ -+ if (hw->chip_id == CHIP_ID_YUKON && hw->chip_rev == 0) - return 0; -+ -+ return WAKE_MAGIC | WAKE_PHY; - } - - static u32 pci_wake_enabled(struct pci_dev *dev) -@@ -3583,7 +3586,9 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port, - skge->duplex = -1; - skge->speed = -1; - skge->advertising = skge_supported_modes(hw); -- skge->wol = pci_wake_enabled(hw->pdev) ? wol_supported(hw) : 0; -+ -+ if (pci_wake_enabled(hw->pdev)) -+ skge->wol = wol_supported(hw) & WAKE_MAGIC; - - hw->dev[port] = dev; - -@@ -3789,6 +3794,9 @@ static int skge_suspend(struct pci_dev *pdev, pm_message_t state) - struct skge_hw *hw = pci_get_drvdata(pdev); - int i, err, wol = 0; - -+ if (!hw) -+ return 0; -+ - err = pci_save_state(pdev); - if (err) - return err; -@@ -3817,6 +3825,9 @@ static int skge_resume(struct pci_dev *pdev) - struct skge_hw *hw = pci_get_drvdata(pdev); - int i, err; - -+ if (!hw) -+ return 0; -+ - err = pci_set_power_state(pdev, PCI_D0); - if (err) - goto out; -@@ -3855,6 +3866,9 @@ static void skge_shutdown(struct pci_dev *pdev) - struct skge_hw *hw = pci_get_drvdata(pdev); - int i, wol = 0; - -+ if (!hw) -+ return; -+ - for (i = 0; i < hw->ports; i++) { - struct net_device *dev = hw->dev[i]; - struct skge_port *skge = netdev_priv(dev); -diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c -index ac36152..b6b444b 100644 ---- a/drivers/net/sky2.c -+++ b/drivers/net/sky2.c -@@ -123,16 +123,13 @@ static const struct pci_device_id sky2_id_table[] = { - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) }, /* 88E8050 */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) }, /* 88E8053 */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) }, /* 88E8055 */ --#ifdef broken -- /* This device causes data corruption problems that are not resolved */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4364) }, /* 88E8056 */ --#endif - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4366) }, /* 88EC036 */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4367) }, /* 88EC032 */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4368) }, /* 88EC034 */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4369) }, /* 88EC042 */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436A) }, /* 88E8058 */ -- { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436B) }, /* 88E8071 */ -+// { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436B) }, /* 88E8071 */ - { 0 } - }; - -@@ -3722,6 +3719,7 @@ err_out_free_regions: - pci_release_regions(pdev); - pci_disable_device(pdev); - err_out: -+ pci_set_drvdata(pdev, NULL); - return err; - } - -@@ -3774,6 +3772,9 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state) - struct sky2_hw *hw = pci_get_drvdata(pdev); - int i, wol = 0; - -+ if (!hw) -+ return 0; -+ - del_timer_sync(&hw->idle_timer); - netif_poll_disable(hw->dev[0]); - -@@ -3805,6 +3806,9 @@ static int sky2_resume(struct pci_dev *pdev) - struct sky2_hw *hw = pci_get_drvdata(pdev); - int i, err; - -+ if (!hw) -+ return 0; -+ - err = pci_set_power_state(pdev, PCI_D0); - if (err) - goto out; -@@ -3851,6 +3855,9 @@ static void sky2_shutdown(struct pci_dev *pdev) - struct sky2_hw *hw = pci_get_drvdata(pdev); - int i, wol = 0; - -+ if (!hw) -+ return; -+ - del_timer_sync(&hw->idle_timer); - netif_poll_disable(hw->dev[0]); - -diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c -index c956141..0b89812 100644 ---- a/drivers/net/smc911x.c -+++ b/drivers/net/smc911x.c -@@ -499,7 +499,7 @@ static inline void smc911x_rcv(struct net_device *dev) - SMC_SET_RX_CFG(RX_CFG_RX_END_ALGN4_ | ((2<<8) & RX_CFG_RXDOFF_)); - SMC_PULL_DATA(data, pkt_len+2+3); - -- DBG(SMC_DEBUG_PKTS, "%s: Received packet\n", dev->name,); -+ DBG(SMC_DEBUG_PKTS, "%s: Received packet\n", dev->name); - PRINT_PKT(data, ((pkt_len - 4) <= 64) ? pkt_len - 4 : 64); - dev->last_rx = jiffies; - skb->dev = dev; -diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c -index 256969e..3d20115 100644 ---- a/drivers/net/tg3.c -+++ b/drivers/net/tg3.c -@@ -64,8 +64,8 @@ - - #define DRV_MODULE_NAME "tg3" - #define PFX DRV_MODULE_NAME ": " --#define DRV_MODULE_VERSION "3.75" --#define DRV_MODULE_RELDATE "March 23, 2007" -+#define DRV_MODULE_VERSION "3.75.1" -+#define DRV_MODULE_RELDATE "May 7, 2007" - - #define TG3_DEF_MAC_MODE 0 - #define TG3_DEF_RX_MODE 0 -@@ -3895,8 +3895,7 @@ static int tg3_start_xmit(struct sk_buff *skb, struct net_device *dev) - entry = tp->tx_prod; - base_flags = 0; - mss = 0; -- if (skb->len > (tp->dev->mtu + ETH_HLEN) && -- (mss = skb_shinfo(skb)->gso_size) != 0) { -+ if ((mss = skb_shinfo(skb)->gso_size) != 0) { - int tcp_opt_len, ip_tcp_len; - - if (skb_header_cloned(skb) && -@@ -4053,8 +4052,7 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev) - if (skb->ip_summed == CHECKSUM_PARTIAL) - base_flags |= TXD_FLAG_TCPUDP_CSUM; - mss = 0; -- if (skb->len > (tp->dev->mtu + ETH_HLEN) && -- (mss = skb_shinfo(skb)->gso_size) != 0) { -+ if ((mss = skb_shinfo(skb)->gso_size) != 0) { - int tcp_opt_len, ip_tcp_len, hdr_len; - - if (skb_header_cloned(skb) && -@@ -5936,7 +5934,7 @@ static int tg3_load_tso_firmware(struct tg3 *tp) - - - /* tp->lock is held. */ --static void __tg3_set_mac_addr(struct tg3 *tp) -+static void __tg3_set_mac_addr(struct tg3 *tp, int skip_mac_1) - { - u32 addr_high, addr_low; - int i; -@@ -5948,6 +5946,8 @@ static void __tg3_set_mac_addr(struct tg3 *tp) - (tp->dev->dev_addr[4] << 8) | - (tp->dev->dev_addr[5] << 0)); - for (i = 0; i < 4; i++) { -+ if (i == 1 && skip_mac_1) -+ continue; - tw32(MAC_ADDR_0_HIGH + (i * 8), addr_high); - tw32(MAC_ADDR_0_LOW + (i * 8), addr_low); - } -@@ -5974,7 +5974,7 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) - { - struct tg3 *tp = netdev_priv(dev); - struct sockaddr *addr = p; -- int err = 0; -+ int err = 0, skip_mac_1 = 0; - - if (!is_valid_ether_addr(addr->sa_data)) - return -EINVAL; -@@ -5985,22 +5985,21 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) - return 0; - - if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { -- /* Reset chip so that ASF can re-init any MAC addresses it -- * needs. -- */ -- tg3_netif_stop(tp); -- tg3_full_lock(tp, 1); -+ u32 addr0_high, addr0_low, addr1_high, addr1_low; - -- tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); -- err = tg3_restart_hw(tp, 0); -- if (!err) -- tg3_netif_start(tp); -- tg3_full_unlock(tp); -- } else { -- spin_lock_bh(&tp->lock); -- __tg3_set_mac_addr(tp); -- spin_unlock_bh(&tp->lock); -+ addr0_high = tr32(MAC_ADDR_0_HIGH); -+ addr0_low = tr32(MAC_ADDR_0_LOW); -+ addr1_high = tr32(MAC_ADDR_1_HIGH); -+ addr1_low = tr32(MAC_ADDR_1_LOW); -+ -+ /* Skip MAC addr 1 if ASF is using it. */ -+ if ((addr0_high != addr1_high || addr0_low != addr1_low) && -+ !(addr1_high == 0 && addr1_low == 0)) -+ skip_mac_1 = 1; - } -+ spin_lock_bh(&tp->lock); -+ __tg3_set_mac_addr(tp, skip_mac_1); -+ spin_unlock_bh(&tp->lock); - - return err; - } -@@ -6317,7 +6316,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) - tp->rx_jumbo_ptr); - - /* Initialize MAC address and backoff seed. */ -- __tg3_set_mac_addr(tp); -+ __tg3_set_mac_addr(tp, 0); - - /* MTU + ethernet header + FCS + optional VLAN tag */ - tw32(MAC_RX_MTU_SIZE, tp->dev->mtu + ETH_HLEN + 8); -@@ -6348,8 +6347,7 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) - tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) || - (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750)) { - if (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE && -- (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 || -- tp->pci_chip_rev_id == CHIPREV_ID_5705_A2)) { -+ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { - rdmac_mode |= RDMAC_MODE_FIFO_SIZE_128; - } else if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) && - !(tp->tg3_flags2 & TG3_FLG2_IS_5788)) { -diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c -index 65d6f23..5af9125 100644 ---- a/drivers/pci/quirks.c -+++ b/drivers/pci/quirks.c -@@ -1737,18 +1737,20 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, - quirk_nvidia_ck804_pcie_aer_ext_cap); - - #ifdef CONFIG_PCI_MSI --/* The Serverworks PCI-X chipset does not support MSI. We cannot easily rely -- * on setting PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually -- * some other busses controlled by the chipset even if Linux is not aware of it. -- * Instead of setting the flag on all busses in the machine, simply disable MSI -- * globally. -+/* Some chipsets do not support MSI. We cannot easily rely on setting -+ * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually -+ * some other busses controlled by the chipset even if Linux is not -+ * aware of it. Instead of setting the flag on all busses in the -+ * machine, simply disable MSI globally. - */ --static void __init quirk_svw_msi(struct pci_dev *dev) -+static void __init quirk_disable_all_msi(struct pci_dev *dev) - { - pci_no_msi(); - printk(KERN_WARNING "PCI: MSI quirk detected. MSI deactivated.\n"); - } --DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi); -+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi); -+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi); -+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi); - - /* Disable MSI on chipsets that are known to not support it */ - static void __devinit quirk_disable_msi(struct pci_dev *dev) -diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c -index 40d4856..c3a6bd2 100644 ---- a/drivers/serial/sunhv.c -+++ b/drivers/serial/sunhv.c -@@ -493,6 +493,10 @@ static struct of_device_id hv_match[] = { - .name = "console", - .compatible = "qcn", - }, -+ { -+ .name = "console", -+ .compatible = "SUNW,sun4v-console", -+ }, - {}, - }; - MODULE_DEVICE_TABLE(of, hv_match); -diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c -index 3dfa3e4..3257d94 100644 ---- a/drivers/usb/atm/cxacru.c -+++ b/drivers/usb/atm/cxacru.c -@@ -146,6 +146,12 @@ enum cxacru_info_idx { - CXINF_MAX = 0x1c, - }; - -+enum poll_state { -+ CX_INIT, -+ CX_POLLING, -+ CX_ABORT -+}; -+ - struct cxacru_modem_type { - u32 pll_f_clk; - u32 pll_b_clk; -@@ -159,6 +165,8 @@ struct cxacru_data { - - int line_status; - struct delayed_work poll_work; -+ struct mutex poll_state_serialize; -+ enum poll_state poll_state; - - /* contol handles */ - struct mutex cm_serialize; -@@ -356,7 +364,7 @@ static int cxacru_atm_start(struct usbatm_data *usbatm_instance, - /* - struct atm_dev *atm_dev = usbatm_instance->atm_dev; - */ -- int ret; -+ int ret, start_polling = 1; - - dbg("cxacru_atm_start"); - -@@ -376,7 +384,15 @@ static int cxacru_atm_start(struct usbatm_data *usbatm_instance, - } - - /* Start status polling */ -- cxacru_poll_status(&instance->poll_work.work); -+ mutex_lock(&instance->poll_state_serialize); -+ if (instance->poll_state == CX_INIT) -+ instance->poll_state = CX_POLLING; -+ else /* poll_state == CX_ABORT */ -+ start_polling = 0; -+ mutex_unlock(&instance->poll_state_serialize); -+ -+ if (start_polling) -+ cxacru_poll_status(&instance->poll_work.work); - return 0; - } - -@@ -685,6 +701,9 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance, - instance->usbatm = usbatm_instance; - instance->modem_type = (struct cxacru_modem_type *) id->driver_info; - -+ mutex_init(&instance->poll_state_serialize); -+ instance->poll_state = CX_INIT; -+ - instance->rcv_buf = (u8 *) __get_free_page(GFP_KERNEL); - if (!instance->rcv_buf) { - dbg("cxacru_bind: no memory for rcv_buf"); -@@ -744,6 +763,7 @@ static void cxacru_unbind(struct usbatm_data *usbatm_instance, - struct usb_interface *intf) - { - struct cxacru_data *instance = usbatm_instance->driver_data; -+ int stop_polling = 1; - - dbg("cxacru_unbind entered"); - -@@ -752,8 +772,20 @@ static void cxacru_unbind(struct usbatm_data *usbatm_instance, - return; - } - -- while (!cancel_delayed_work(&instance->poll_work)) -- flush_scheduled_work(); -+ mutex_lock(&instance->poll_state_serialize); -+ if (instance->poll_state != CX_POLLING) { -+ /* Polling hasn't started yet and with -+ * the mutex locked it can be prevented -+ * from starting. -+ */ -+ instance->poll_state = CX_ABORT; -+ stop_polling = 0; -+ } -+ mutex_unlock(&instance->poll_state_serialize); -+ -+ if (stop_polling) -+ while (!cancel_delayed_work(&instance->poll_work)) -+ flush_scheduled_work(); - - usb_kill_urb(instance->snd_urb); - usb_kill_urb(instance->rcv_urb); -diff --git a/drivers/usb/input/hiddev.c b/drivers/usb/input/hiddev.c -index a8b3d66..488d61b 100644 ---- a/drivers/usb/input/hiddev.c -+++ b/drivers/usb/input/hiddev.c -@@ -51,6 +51,7 @@ struct hiddev { - wait_queue_head_t wait; - struct hid_device *hid; - struct list_head list; -+ spinlock_t list_lock; - }; - - struct hiddev_list { -@@ -161,7 +162,9 @@ static void hiddev_send_event(struct hid_device *hid, - { - struct hiddev *hiddev = hid->hiddev; - struct hiddev_list *list; -+ unsigned long flags; - -+ spin_lock_irqsave(&hiddev->list_lock, flags); - list_for_each_entry(list, &hiddev->list, node) { - if (uref->field_index != HID_FIELD_INDEX_NONE || - (list->flags & HIDDEV_FLAG_REPORT) != 0) { -@@ -171,6 +174,7 @@ static void hiddev_send_event(struct hid_device *hid, - kill_fasync(&list->fasync, SIGIO, POLL_IN); - } - } -+ spin_unlock_irqrestore(&hiddev->list_lock, flags); - - wake_up_interruptible(&hiddev->wait); - } -@@ -235,9 +239,13 @@ static int hiddev_fasync(int fd, struct file *file, int on) - static int hiddev_release(struct inode * inode, struct file * file) - { - struct hiddev_list *list = file->private_data; -+ unsigned long flags; - - hiddev_fasync(-1, file, 0); -+ -+ spin_lock_irqsave(&list->hiddev->list_lock, flags); - list_del(&list->node); -+ spin_unlock_irqrestore(&list->hiddev->list_lock, flags); - - if (!--list->hiddev->open) { - if (list->hiddev->exist) -@@ -257,6 +265,7 @@ static int hiddev_release(struct inode * inode, struct file * file) - static int hiddev_open(struct inode *inode, struct file *file) - { - struct hiddev_list *list; -+ unsigned long flags; - - int i = iminor(inode) - HIDDEV_MINOR_BASE; - -@@ -267,7 +276,11 @@ static int hiddev_open(struct inode *inode, struct file *file) - return -ENOMEM; - - list->hiddev = hiddev_table[i]; -+ -+ spin_lock_irqsave(&list->hiddev->list_lock, flags); - list_add_tail(&list->node, &hiddev_table[i]->list); -+ spin_unlock_irqrestore(&list->hiddev->list_lock, flags); -+ - file->private_data = list; - - if (!list->hiddev->open++) -@@ -773,6 +786,7 @@ int hiddev_connect(struct hid_device *hid) - - init_waitqueue_head(&hiddev->wait); - INIT_LIST_HEAD(&hiddev->list); -+ spin_lock_init(&hiddev->list_lock); - hiddev->hid = hid; - hiddev->exist = 1; - -diff --git a/fs/fat/dir.c b/fs/fat/dir.c -index c16af24..ccf161d 100644 ---- a/fs/fat/dir.c -+++ b/fs/fat/dir.c -@@ -422,7 +422,7 @@ EODir: - EXPORT_SYMBOL_GPL(fat_search_long); - - struct fat_ioctl_filldir_callback { -- struct dirent __user *dirent; -+ void __user *dirent; - int result; - /* for dir ioctl */ - const char *longname; -@@ -647,62 +647,85 @@ static int fat_readdir(struct file *filp, void *dirent, filldir_t filldir) - return __fat_readdir(inode, filp, dirent, filldir, 0, 0); - } - --static int fat_ioctl_filldir(void *__buf, const char *name, int name_len, -- loff_t offset, u64 ino, unsigned int d_type) -+#define FAT_IOCTL_FILLDIR_FUNC(func, dirent_type) \ -+static int func(void *__buf, const char *name, int name_len, \ -+ loff_t offset, u64 ino, unsigned int d_type) \ -+{ \ -+ struct fat_ioctl_filldir_callback *buf = __buf; \ -+ struct dirent_type __user *d1 = buf->dirent; \ -+ struct dirent_type __user *d2 = d1 + 1; \ -+ \ -+ if (buf->result) \ -+ return -EINVAL; \ -+ buf->result++; \ -+ \ -+ if (name != NULL) { \ -+ /* dirent has only short name */ \ -+ if (name_len >= sizeof(d1->d_name)) \ -+ name_len = sizeof(d1->d_name) - 1; \ -+ \ -+ if (put_user(0, d2->d_name) || \ -+ put_user(0, &d2->d_reclen) || \ -+ copy_to_user(d1->d_name, name, name_len) || \ -+ put_user(0, d1->d_name + name_len) || \ -+ put_user(name_len, &d1->d_reclen)) \ -+ goto efault; \ -+ } else { \ -+ /* dirent has short and long name */ \ -+ const char *longname = buf->longname; \ -+ int long_len = buf->long_len; \ -+ const char *shortname = buf->shortname; \ -+ int short_len = buf->short_len; \ -+ \ -+ if (long_len >= sizeof(d1->d_name)) \ -+ long_len = sizeof(d1->d_name) - 1; \ -+ if (short_len >= sizeof(d1->d_name)) \ -+ short_len = sizeof(d1->d_name) - 1; \ -+ \ -+ if (copy_to_user(d2->d_name, longname, long_len) || \ -+ put_user(0, d2->d_name + long_len) || \ -+ put_user(long_len, &d2->d_reclen) || \ -+ put_user(ino, &d2->d_ino) || \ -+ put_user(offset, &d2->d_off) || \ -+ copy_to_user(d1->d_name, shortname, short_len) || \ -+ put_user(0, d1->d_name + short_len) || \ -+ put_user(short_len, &d1->d_reclen)) \ -+ goto efault; \ -+ } \ -+ return 0; \ -+efault: \ -+ buf->result = -EFAULT; \ -+ return -EFAULT; \ -+} -+ -+FAT_IOCTL_FILLDIR_FUNC(fat_ioctl_filldir, dirent) -+ -+static int fat_ioctl_readdir(struct inode *inode, struct file *filp, -+ void __user *dirent, filldir_t filldir, -+ int short_only, int both) - { -- struct fat_ioctl_filldir_callback *buf = __buf; -- struct dirent __user *d1 = buf->dirent; -- struct dirent __user *d2 = d1 + 1; -- -- if (buf->result) -- return -EINVAL; -- buf->result++; -- -- if (name != NULL) { -- /* dirent has only short name */ -- if (name_len >= sizeof(d1->d_name)) -- name_len = sizeof(d1->d_name) - 1; -- -- if (put_user(0, d2->d_name) || -- put_user(0, &d2->d_reclen) || -- copy_to_user(d1->d_name, name, name_len) || -- put_user(0, d1->d_name + name_len) || -- put_user(name_len, &d1->d_reclen)) -- goto efault; -- } else { -- /* dirent has short and long name */ -- const char *longname = buf->longname; -- int long_len = buf->long_len; -- const char *shortname = buf->shortname; -- int short_len = buf->short_len; -- -- if (long_len >= sizeof(d1->d_name)) -- long_len = sizeof(d1->d_name) - 1; -- if (short_len >= sizeof(d1->d_name)) -- short_len = sizeof(d1->d_name) - 1; -- -- if (copy_to_user(d2->d_name, longname, long_len) || -- put_user(0, d2->d_name + long_len) || -- put_user(long_len, &d2->d_reclen) || -- put_user(ino, &d2->d_ino) || -- put_user(offset, &d2->d_off) || -- copy_to_user(d1->d_name, shortname, short_len) || -- put_user(0, d1->d_name + short_len) || -- put_user(short_len, &d1->d_reclen)) -- goto efault; -+ struct fat_ioctl_filldir_callback buf; -+ int ret; -+ -+ buf.dirent = dirent; -+ buf.result = 0; -+ mutex_lock(&inode->i_mutex); -+ ret = -ENOENT; -+ if (!IS_DEADDIR(inode)) { -+ ret = __fat_readdir(inode, filp, &buf, filldir, -+ short_only, both); - } -- return 0; --efault: -- buf->result = -EFAULT; -- return -EFAULT; -+ mutex_unlock(&inode->i_mutex); -+ if (ret >= 0) -+ ret = buf.result; -+ return ret; - } - --static int fat_dir_ioctl(struct inode * inode, struct file * filp, -- unsigned int cmd, unsigned long arg) -+static int fat_dir_ioctl(struct inode *inode, struct file *filp, -+ unsigned int cmd, unsigned long arg) - { -- struct fat_ioctl_filldir_callback buf; -- struct dirent __user *d1; -- int ret, short_only, both; -+ struct dirent __user *d1 = (struct dirent __user *)arg; -+ int short_only, both; - - switch (cmd) { - case VFAT_IOCTL_READDIR_SHORT: -@@ -717,7 +740,6 @@ static int fat_dir_ioctl(struct inode * inode, struct file * filp, - return fat_generic_ioctl(inode, filp, cmd, arg); - } - -- d1 = (struct dirent __user *)arg; - if (!access_ok(VERIFY_WRITE, d1, sizeof(struct dirent[2]))) - return -EFAULT; - /* -@@ -728,69 +750,48 @@ static int fat_dir_ioctl(struct inode * inode, struct file * filp, - if (put_user(0, &d1->d_reclen)) - return -EFAULT; - -- buf.dirent = d1; -- buf.result = 0; -- mutex_lock(&inode->i_mutex); -- ret = -ENOENT; -- if (!IS_DEADDIR(inode)) { -- ret = __fat_readdir(inode, filp, &buf, fat_ioctl_filldir, -- short_only, both); -- } -- mutex_unlock(&inode->i_mutex); -- if (ret >= 0) -- ret = buf.result; -- return ret; -+ return fat_ioctl_readdir(inode, filp, d1, fat_ioctl_filldir, -+ short_only, both); - } - - #ifdef CONFIG_COMPAT - #define VFAT_IOCTL_READDIR_BOTH32 _IOR('r', 1, struct compat_dirent[2]) - #define VFAT_IOCTL_READDIR_SHORT32 _IOR('r', 2, struct compat_dirent[2]) - --static long fat_compat_put_dirent32(struct dirent *d, -- struct compat_dirent __user *d32) --{ -- if (!access_ok(VERIFY_WRITE, d32, sizeof(struct compat_dirent))) -- return -EFAULT; -- -- __put_user(d->d_ino, &d32->d_ino); -- __put_user(d->d_off, &d32->d_off); -- __put_user(d->d_reclen, &d32->d_reclen); -- if (__copy_to_user(d32->d_name, d->d_name, d->d_reclen)) -- return -EFAULT; -+FAT_IOCTL_FILLDIR_FUNC(fat_compat_ioctl_filldir, compat_dirent) - -- return 0; --} -- --static long fat_compat_dir_ioctl(struct file *file, unsigned cmd, -+static long fat_compat_dir_ioctl(struct file *filp, unsigned cmd, - unsigned long arg) - { -- struct compat_dirent __user *p = compat_ptr(arg); -- int ret; -- mm_segment_t oldfs = get_fs(); -- struct dirent d[2]; -+ struct inode *inode = filp->f_path.dentry->d_inode; -+ struct compat_dirent __user *d1 = compat_ptr(arg); -+ int short_only, both; - - switch (cmd) { -- case VFAT_IOCTL_READDIR_BOTH32: -- cmd = VFAT_IOCTL_READDIR_BOTH; -- break; - case VFAT_IOCTL_READDIR_SHORT32: -- cmd = VFAT_IOCTL_READDIR_SHORT; -+ short_only = 1; -+ both = 0; -+ break; -+ case VFAT_IOCTL_READDIR_BOTH32: -+ short_only = 0; -+ both = 1; - break; - default: - return -ENOIOCTLCMD; - } - -- set_fs(KERNEL_DS); -- lock_kernel(); -- ret = fat_dir_ioctl(file->f_path.dentry->d_inode, file, -- cmd, (unsigned long) &d); -- unlock_kernel(); -- set_fs(oldfs); -- if (ret >= 0) { -- ret |= fat_compat_put_dirent32(&d[0], p); -- ret |= fat_compat_put_dirent32(&d[1], p + 1); -- } -- return ret; -+ if (!access_ok(VERIFY_WRITE, d1, sizeof(struct compat_dirent[2]))) -+ return -EFAULT; -+ /* -+ * Yes, we don't need this put_user() absolutely. However old -+ * code didn't return the right value. So, app use this value, -+ * in order to check whether it is EOF. -+ */ -+ if (put_user(0, &d1->d_reclen)) -+ return -EFAULT; -+ -+ return fat_ioctl_readdir(inode, filp, d1, fat_compat_ioctl_filldir, -+ short_only, both); - } - #endif /* CONFIG_COMPAT */ - -diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c -index 5065baa..3760d02 100644 ---- a/fs/jfs/jfs_logmgr.c -+++ b/fs/jfs/jfs_logmgr.c -@@ -2354,12 +2354,13 @@ int jfsIOWait(void *arg) - lbmStartIO(bp); - spin_lock_irq(&log_redrive_lock); - } -- spin_unlock_irq(&log_redrive_lock); - - if (freezing(current)) { -+ spin_unlock_irq(&log_redrive_lock); - refrigerator(); - } else { - set_current_state(TASK_INTERRUPTIBLE); -+ spin_unlock_irq(&log_redrive_lock); - schedule(); - current->state = TASK_RUNNING; - } -diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c -index 6f24768..79bd03b 100644 ---- a/fs/nfsd/export.c -+++ b/fs/nfsd/export.c -@@ -469,6 +469,13 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) - nd.dentry = NULL; - exp.ex_path = NULL; - -+ /* fs locations */ -+ exp.ex_fslocs.locations = NULL; -+ exp.ex_fslocs.locations_count = 0; -+ exp.ex_fslocs.migrated = 0; -+ -+ exp.ex_uuid = NULL; -+ - if (mesg[mlen-1] != '\n') - return -EINVAL; - mesg[mlen-1] = 0; -@@ -509,13 +516,6 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen) - if (exp.h.expiry_time == 0) - goto out; - -- /* fs locations */ -- exp.ex_fslocs.locations = NULL; -- exp.ex_fslocs.locations_count = 0; -- exp.ex_fslocs.migrated = 0; -- -- exp.ex_uuid = NULL; -- - /* flags */ - err = get_int(&mesg, &an_int); - if (err == -ENOENT) -diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c -index c8178b7..2cac562 100644 ---- a/fs/reiserfs/xattr.c -+++ b/fs/reiserfs/xattr.c -@@ -68,7 +68,7 @@ static struct dentry *get_xa_root(struct super_block *sb, int flags) - if (!privroot) - return ERR_PTR(-ENODATA); - -- mutex_lock(&privroot->d_inode->i_mutex); -+ mutex_lock_nested(&privroot->d_inode->i_mutex, I_MUTEX_XATTR); - if (REISERFS_SB(sb)->xattr_root) { - xaroot = dget(REISERFS_SB(sb)->xattr_root); - goto out; -diff --git a/fs/udf/namei.c b/fs/udf/namei.c -index fe361cd..b254375 100644 ---- a/fs/udf/namei.c -+++ b/fs/udf/namei.c -@@ -878,7 +878,7 @@ static int udf_rmdir(struct inode * dir, struct dentry * dentry) - inode->i_nlink); - clear_nlink(inode); - inode->i_size = 0; -- inode_dec_link_count(inode); -+ inode_dec_link_count(dir); - inode->i_ctime = dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); - mark_inode_dirty(dir); - -diff --git a/include/asm-arm/arch-iop13xx/iop13xx.h b/include/asm-arm/arch-iop13xx/iop13xx.h -index d26b755..74d7498 100644 ---- a/include/asm-arm/arch-iop13xx/iop13xx.h -+++ b/include/asm-arm/arch-iop13xx/iop13xx.h -@@ -27,19 +27,24 @@ static inline int iop13xx_cpu_id(void) - #define IOP13XX_PCI_OFFSET IOP13XX_MAX_RAM_SIZE - - /* PCI MAP -- * 0x0000.0000 - 0x8000.0000 1:1 mapping with Physical RAM -- * 0x8000.0000 - 0x8800.0000 PCIX/PCIE memory window (128MB) --*/ -+ * bus range cpu phys cpu virt note -+ * 0x0000.0000 + 2GB (n/a) (n/a) inbound, 1:1 mapping with Physical RAM -+ * 0x8000.0000 + 928M 0x1.8000.0000 (ioremap) PCIX outbound memory window -+ * 0x8000.0000 + 928M 0x2.8000.0000 (ioremap) PCIE outbound memory window -+ * -+ * IO MAP -+ * 0x1000 + 64K 0x0.fffb.1000 0xfec6.1000 PCIX outbound i/o window -+ * 0x1000 + 64K 0x0.fffd.1000 0xfed7.1000 PCIE outbound i/o window -+ */ - #define IOP13XX_PCIX_IO_WINDOW_SIZE 0x10000UL - #define IOP13XX_PCIX_LOWER_IO_PA 0xfffb0000UL - #define IOP13XX_PCIX_LOWER_IO_VA 0xfec60000UL --#define IOP13XX_PCIX_LOWER_IO_BA 0x0fff0000UL -+#define IOP13XX_PCIX_LOWER_IO_BA 0x0UL /* OIOTVR */ -+#define IOP13XX_PCIX_IO_BUS_OFFSET 0x1000UL - #define IOP13XX_PCIX_UPPER_IO_PA (IOP13XX_PCIX_LOWER_IO_PA +\ - IOP13XX_PCIX_IO_WINDOW_SIZE - 1) - #define IOP13XX_PCIX_UPPER_IO_VA (IOP13XX_PCIX_LOWER_IO_VA +\ - IOP13XX_PCIX_IO_WINDOW_SIZE - 1) --#define IOP13XX_PCIX_IO_OFFSET (IOP13XX_PCIX_LOWER_IO_VA -\ -- IOP13XX_PCIX_LOWER_IO_BA) - #define IOP13XX_PCIX_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\ - (IOP13XX_PCIX_LOWER_IO_PA\ - - IOP13XX_PCIX_LOWER_IO_VA)) -@@ -65,15 +70,14 @@ static inline int iop13xx_cpu_id(void) - #define IOP13XX_PCIE_IO_WINDOW_SIZE 0x10000UL - #define IOP13XX_PCIE_LOWER_IO_PA 0xfffd0000UL - #define IOP13XX_PCIE_LOWER_IO_VA 0xfed70000UL --#define IOP13XX_PCIE_LOWER_IO_BA 0x0fff0000UL -+#define IOP13XX_PCIE_LOWER_IO_BA 0x0UL /* OIOTVR */ -+#define IOP13XX_PCIE_IO_BUS_OFFSET 0x1000UL - #define IOP13XX_PCIE_UPPER_IO_PA (IOP13XX_PCIE_LOWER_IO_PA +\ - IOP13XX_PCIE_IO_WINDOW_SIZE - 1) - #define IOP13XX_PCIE_UPPER_IO_VA (IOP13XX_PCIE_LOWER_IO_VA +\ - IOP13XX_PCIE_IO_WINDOW_SIZE - 1) - #define IOP13XX_PCIE_UPPER_IO_BA (IOP13XX_PCIE_LOWER_IO_BA +\ - IOP13XX_PCIE_IO_WINDOW_SIZE - 1) --#define IOP13XX_PCIE_IO_OFFSET (IOP13XX_PCIE_LOWER_IO_VA -\ -- IOP13XX_PCIE_LOWER_IO_BA) - #define IOP13XX_PCIE_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\ - (IOP13XX_PCIE_LOWER_IO_PA\ - - IOP13XX_PCIE_LOWER_IO_VA)) -diff --git a/include/asm-sparc64/openprom.h b/include/asm-sparc64/openprom.h -index e01b805..26ec046 100644 ---- a/include/asm-sparc64/openprom.h -+++ b/include/asm-sparc64/openprom.h -@@ -177,7 +177,7 @@ struct linux_nodeops { - /* More fun PROM structures for device probing. */ - #define PROMREG_MAX 24 - #define PROMVADDR_MAX 16 --#define PROMINTR_MAX 15 -+#define PROMINTR_MAX 32 - - struct linux_prom_registers { - unsigned which_io; /* hi part of physical address */ -diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h -index daa4940..bf92c26 100644 ---- a/include/linux/clocksource.h -+++ b/include/linux/clocksource.h -@@ -48,6 +48,7 @@ struct clocksource; - * @shift: cycle to nanosecond divisor (power of two) - * @flags: flags describing special properties - * @vread: vsyscall based read -+ * @resume: resume function for the clocksource, if necessary - * @cycle_interval: Used internally by timekeeping core, please ignore. - * @xtime_interval: Used internally by timekeeping core, please ignore. - */ -@@ -61,6 +62,7 @@ struct clocksource { - u32 shift; - unsigned long flags; - cycle_t (*vread)(void); -+ void (*resume)(void); - - /* timekeeping specific data, ignore */ - cycle_t cycle_last, cycle_interval; -@@ -198,6 +200,7 @@ static inline void clocksource_calculate_interval(struct clocksource *c, - extern int clocksource_register(struct clocksource*); - extern struct clocksource* clocksource_get_next(void); - extern void clocksource_change_rating(struct clocksource *cs, int rating); -+extern void clocksource_resume(void); - - #ifdef CONFIG_GENERIC_TIME_VSYSCALL - extern void update_vsyscall(struct timespec *ts, struct clocksource *c); -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index 1a52854..b1b0f68 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -647,8 +647,10 @@ static inline void netif_start_queue(struct net_device *dev) - static inline void netif_wake_queue(struct net_device *dev) - { - #ifdef CONFIG_NETPOLL_TRAP -- if (netpoll_trap()) -+ if (netpoll_trap()) { -+ clear_bit(__LINK_STATE_XOFF, &dev->state); - return; -+ } - #endif - if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state)) - __netif_schedule(dev); -@@ -656,10 +658,6 @@ static inline void netif_wake_queue(struct net_device *dev) - - static inline void netif_stop_queue(struct net_device *dev) - { --#ifdef CONFIG_NETPOLL_TRAP -- if (netpoll_trap()) -- return; --#endif - set_bit(__LINK_STATE_XOFF, &dev->state); - } - -diff --git a/include/linux/netfilter/nf_conntrack_proto_gre.h b/include/linux/netfilter/nf_conntrack_proto_gre.h -index 4e6bbce..535e421 100644 ---- a/include/linux/netfilter/nf_conntrack_proto_gre.h -+++ b/include/linux/netfilter/nf_conntrack_proto_gre.h -@@ -87,24 +87,6 @@ int nf_ct_gre_keymap_add(struct nf_conn *ct, enum ip_conntrack_dir dir, - /* delete keymap entries */ - void nf_ct_gre_keymap_destroy(struct nf_conn *ct); - --/* get pointer to gre key, if present */ --static inline __be32 *gre_key(struct gre_hdr *greh) --{ -- if (!greh->key) -- return NULL; -- if (greh->csum || greh->routing) -- return (__be32 *)(greh+sizeof(*greh)+4); -- return (__be32 *)(greh+sizeof(*greh)); --} -- --/* get pointer ot gre csum, if present */ --static inline __sum16 *gre_csum(struct gre_hdr *greh) --{ -- if (!greh->csum) -- return NULL; -- return (__sum16 *)(greh+sizeof(*greh)); --} -- - extern void nf_ct_gre_keymap_flush(void); - extern void nf_nat_need_gre(void); - -diff --git a/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h b/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h -index e371e0f..d0f36f5 100644 ---- a/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h -+++ b/include/linux/netfilter_ipv4/ip_conntrack_proto_gre.h -@@ -90,25 +90,6 @@ int ip_ct_gre_keymap_add(struct ip_conntrack *ct, - /* delete keymap entries */ - void ip_ct_gre_keymap_destroy(struct ip_conntrack *ct); - -- --/* get pointer to gre key, if present */ --static inline __be32 *gre_key(struct gre_hdr *greh) --{ -- if (!greh->key) -- return NULL; -- if (greh->csum || greh->routing) -- return (__be32 *) (greh+sizeof(*greh)+4); -- return (__be32 *) (greh+sizeof(*greh)); --} -- --/* get pointer ot gre csum, if present */ --static inline __sum16 *gre_csum(struct gre_hdr *greh) --{ -- if (!greh->csum) -- return NULL; -- return (__sum16 *) (greh+sizeof(*greh)); --} -- - #endif /* __KERNEL__ */ - - #endif /* _CONNTRACK_PROTO_GRE_H */ -diff --git a/kernel/cpuset.c b/kernel/cpuset.c -index f382b0f..9e45dd1 100644 ---- a/kernel/cpuset.c -+++ b/kernel/cpuset.c -@@ -1751,12 +1751,7 @@ static ssize_t cpuset_tasks_read(struct file *file, char __user *buf, - { - struct ctr_struct *ctr = file->private_data; - -- if (*ppos + nbytes > ctr->bufsz) -- nbytes = ctr->bufsz - *ppos; -- if (copy_to_user(buf, ctr->buf + *ppos, nbytes)) -- return -EFAULT; -- *ppos += nbytes; -- return nbytes; -+ return simple_read_from_buffer(buf, nbytes, ppos, ctr->buf, ctr->bufsz); - } - - static int cpuset_tasks_release(struct inode *unused_inode, struct file *file) -diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c -index fe5c7db..5baee91 100644 ---- a/kernel/time/clocksource.c -+++ b/kernel/time/clocksource.c -@@ -74,6 +74,8 @@ static struct clocksource *watchdog; - static struct timer_list watchdog_timer; - static DEFINE_SPINLOCK(watchdog_lock); - static cycle_t watchdog_last; -+static int watchdog_resumed; -+ - /* - * Interval: 0.5sec Treshold: 0.0625s - */ -@@ -98,15 +100,26 @@ static void clocksource_watchdog(unsigned long data) - struct clocksource *cs, *tmp; - cycle_t csnow, wdnow; - int64_t wd_nsec, cs_nsec; -+ int resumed; - - spin_lock(&watchdog_lock); - -+ resumed = watchdog_resumed; -+ if (unlikely(resumed)) -+ watchdog_resumed = 0; -+ - wdnow = watchdog->read(); - wd_nsec = cyc2ns(watchdog, (wdnow - watchdog_last) & watchdog->mask); - watchdog_last = wdnow; - - list_for_each_entry_safe(cs, tmp, &watchdog_list, wd_list) { - csnow = cs->read(); -+ -+ if (unlikely(resumed)) { -+ cs->wd_last = csnow; -+ continue; -+ } -+ - /* Initialized ? */ - if (!(cs->flags & CLOCK_SOURCE_WATCHDOG)) { - if ((cs->flags & CLOCK_SOURCE_IS_CONTINUOUS) && -@@ -136,6 +149,13 @@ static void clocksource_watchdog(unsigned long data) - } - spin_unlock(&watchdog_lock); - } -+static void clocksource_resume_watchdog(void) -+{ -+ spin_lock(&watchdog_lock); -+ watchdog_resumed = 1; -+ spin_unlock(&watchdog_lock); -+} -+ - static void clocksource_check_watchdog(struct clocksource *cs) - { - struct clocksource *cse; -@@ -182,9 +202,34 @@ static void clocksource_check_watchdog(struct clocksource *cs) - if (cs->flags & CLOCK_SOURCE_IS_CONTINUOUS) - cs->flags |= CLOCK_SOURCE_VALID_FOR_HRES; - } -+ -+static inline void clocksource_resume_watchdog(void) { } - #endif - - /** -+ * clocksource_resume - resume the clocksource(s) -+ */ -+void clocksource_resume(void) -+{ -+ struct list_head *tmp; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&clocksource_lock, flags); -+ -+ list_for_each(tmp, &clocksource_list) { -+ struct clocksource *cs; -+ -+ cs = list_entry(tmp, struct clocksource, list); -+ if (cs->resume) -+ cs->resume(); -+ } -+ -+ clocksource_resume_watchdog(); -+ -+ spin_unlock_irqrestore(&clocksource_lock, flags); -+} -+ -+/** - * clocksource_get_next - Returns the selected clocksource - * - */ -diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c -index bfda3f7..a96ec9a 100644 ---- a/kernel/time/tick-common.c -+++ b/kernel/time/tick-common.c -@@ -31,7 +31,7 @@ DEFINE_PER_CPU(struct tick_device, tick_cpu_device); - */ - ktime_t tick_next_period; - ktime_t tick_period; --static int tick_do_timer_cpu = -1; -+int tick_do_timer_cpu __read_mostly = -1; - DEFINE_SPINLOCK(tick_device_lock); - - /* -@@ -295,6 +295,12 @@ static void tick_shutdown(unsigned int *cpup) - clockevents_exchange_device(dev, NULL); - td->evtdev = NULL; - } -+ /* Transfer the do_timer job away from this cpu */ -+ if (*cpup == tick_do_timer_cpu) { -+ int cpu = first_cpu(cpu_online_map); -+ -+ tick_do_timer_cpu = (cpu != NR_CPUS) ? cpu : -1; -+ } - spin_unlock_irqrestore(&tick_device_lock, flags); - } - -diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h -index c9d203b..bb13f27 100644 ---- a/kernel/time/tick-internal.h -+++ b/kernel/time/tick-internal.h -@@ -5,6 +5,7 @@ DECLARE_PER_CPU(struct tick_device, tick_cpu_device); - extern spinlock_t tick_device_lock; - extern ktime_t tick_next_period; - extern ktime_t tick_period; -+extern int tick_do_timer_cpu __read_mostly; - - extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast); - extern void tick_handle_periodic(struct clock_event_device *dev); -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 51556b9..f4fc867 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -221,6 +221,18 @@ void tick_nohz_stop_sched_tick(void) - ts->tick_stopped = 1; - ts->idle_jiffies = last_jiffies; - } -+ -+ /* -+ * If this cpu is the one which updates jiffies, then -+ * give up the assignment and let it be taken by the -+ * cpu which runs the tick timer next, which might be -+ * this cpu as well. If we don't drop this here the -+ * jiffies might be stale and do_timer() never -+ * invoked. -+ */ -+ if (cpu == tick_do_timer_cpu) -+ tick_do_timer_cpu = -1; -+ - /* - * calculate the expiry time for the next timer wheel - * timer -@@ -338,12 +350,24 @@ static void tick_nohz_handler(struct clock_event_device *dev) - { - struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched); - struct pt_regs *regs = get_irq_regs(); -+ int cpu = smp_processor_id(); - ktime_t now = ktime_get(); - - dev->next_event.tv64 = KTIME_MAX; - -+ /* -+ * Check if the do_timer duty was dropped. We don't care about -+ * concurrency: This happens only when the cpu in charge went -+ * into a long sleep. If two cpus happen to assign themself to -+ * this duty, then the jiffies update is still serialized by -+ * xtime_lock. -+ */ -+ if (unlikely(tick_do_timer_cpu == -1)) -+ tick_do_timer_cpu = cpu; -+ - /* Check, if the jiffies need an update */ -- tick_do_update_jiffies64(now); -+ if (tick_do_timer_cpu == cpu) -+ tick_do_update_jiffies64(now); - - /* - * When we are idle and the tick is stopped, we have to touch -@@ -431,9 +455,23 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer) - struct hrtimer_cpu_base *base = timer->base->cpu_base; - struct pt_regs *regs = get_irq_regs(); - ktime_t now = ktime_get(); -+ int cpu = smp_processor_id(); -+ -+#ifdef CONFIG_NO_HZ -+ /* -+ * Check if the do_timer duty was dropped. We don't care about -+ * concurrency: This happens only when the cpu in charge went -+ * into a long sleep. If two cpus happen to assign themself to -+ * this duty, then the jiffies update is still serialized by -+ * xtime_lock. -+ */ -+ if (unlikely(tick_do_timer_cpu == -1)) -+ tick_do_timer_cpu = cpu; -+#endif - - /* Check, if the jiffies need an update */ -- tick_do_update_jiffies64(now); -+ if (tick_do_timer_cpu == cpu) -+ tick_do_update_jiffies64(now); - - /* - * Do not call, when we are not in irq context and have -diff --git a/kernel/timer.c b/kernel/timer.c -index dd6c2c1..e045774 100644 ---- a/kernel/timer.c -+++ b/kernel/timer.c -@@ -1903,6 +1903,8 @@ unregister_time_interpolator(struct time_interpolator *ti) - prev = &curr->next; - } - -+ clocksource_resume(); -+ - write_seqlock_irqsave(&xtime_lock, flags); - if (ti == time_interpolator) { - /* we lost the best time-interpolator: */ -diff --git a/lib/zlib_inflate/inflate.c b/lib/zlib_inflate/inflate.c -index fceb97c..7e1e311 100644 ---- a/lib/zlib_inflate/inflate.c -+++ b/lib/zlib_inflate/inflate.c -@@ -743,12 +743,14 @@ int zlib_inflate(z_streamp strm, int flush) - - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); -- if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) -- ret = Z_BUF_ERROR; - - if (flush == Z_PACKET_FLUSH && ret == Z_OK && -- (strm->avail_out != 0 || strm->avail_in == 0)) -+ strm->avail_out != 0 && strm->avail_in == 0) - return zlib_inflateSyncPacket(strm); -+ -+ if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) -+ ret = Z_BUF_ERROR; -+ - return ret; - } - -diff --git a/mm/hugetlb.c b/mm/hugetlb.c -index 36db012..88e708b 100644 ---- a/mm/hugetlb.c -+++ b/mm/hugetlb.c -@@ -140,6 +140,8 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, - return page; - - fail: -+ if (vma->vm_flags & VM_MAYSHARE) -+ resv_huge_pages++; - spin_unlock(&hugetlb_lock); - return NULL; - } -diff --git a/mm/oom_kill.c b/mm/oom_kill.c -index 3791edf..b3a3dd6 100644 ---- a/mm/oom_kill.c -+++ b/mm/oom_kill.c -@@ -397,6 +397,7 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order) - struct task_struct *p; - unsigned long points = 0; - unsigned long freed = 0; -+ int constraint; - - blocking_notifier_call_chain(&oom_notify_list, 0, &freed); - if (freed > 0) -@@ -411,14 +412,15 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order) - show_mem(); - } - -- cpuset_lock(); -- read_lock(&tasklist_lock); -- - /* - * Check if there were limitations on the allocation (only relevant for - * NUMA) that may require different handling. - */ -- switch (constrained_alloc(zonelist, gfp_mask)) { -+ constraint = constrained_alloc(zonelist, gfp_mask); -+ cpuset_lock(); -+ read_lock(&tasklist_lock); -+ -+ switch (constraint) { - case CONSTRAINT_MEMORY_POLICY: - oom_kill_process(current, points, - "No available memory (MPOL_BIND)"); -diff --git a/mm/slob.c b/mm/slob.c -index 5adc29c..c683d35 100644 ---- a/mm/slob.c -+++ b/mm/slob.c -@@ -150,15 +150,6 @@ static void slob_free(void *block, int size) - spin_unlock_irqrestore(&slob_lock, flags); - } - --static int FASTCALL(find_order(int size)); --static int fastcall find_order(int size) --{ -- int order = 0; -- for ( ; size > 4096 ; size >>=1) -- order++; -- return order; --} -- - void *__kmalloc(size_t size, gfp_t gfp) - { - slob_t *m; -@@ -174,7 +165,7 @@ void *__kmalloc(size_t size, gfp_t gfp) - if (!bb) - return 0; - -- bb->order = find_order(size); -+ bb->order = get_order(size); - bb->pages = (void *)__get_free_pages(gfp, bb->order); - - if (bb->pages) { -@@ -284,7 +275,7 @@ void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags) - if (c->size < PAGE_SIZE) - b = slob_alloc(c->size, flags, c->align); - else -- b = (void *)__get_free_pages(flags, find_order(c->size)); -+ b = (void *)__get_free_pages(flags, get_order(c->size)); - - if (c->ctor) - c->ctor(b, c, SLAB_CTOR_CONSTRUCTOR); -@@ -311,7 +302,7 @@ void kmem_cache_free(struct kmem_cache *c, void *b) - if (c->size < PAGE_SIZE) - slob_free(b, c->size); - else -- free_pages((unsigned long)b, find_order(c->size)); -+ free_pages((unsigned long)b, get_order(c->size)); - } - EXPORT_SYMBOL(kmem_cache_free); - -diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c -index cac06c4..444a56b 100644 ---- a/net/ipv4/fib_frontend.c -+++ b/net/ipv4/fib_frontend.c -@@ -777,6 +777,10 @@ static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb ) - .tos = frn->fl_tos, - .scope = frn->fl_scope } } }; - -+#ifdef CONFIG_IP_MULTIPLE_TABLES -+ res.r = NULL; -+#endif -+ - frn->err = -ENOENT; - if (tb) { - local_bh_disable(); -diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c -index 23b99ae..75bd597 100644 ---- a/net/ipv4/netfilter/ip_conntrack_core.c -+++ b/net/ipv4/netfilter/ip_conntrack_core.c -@@ -302,7 +302,6 @@ destroy_conntrack(struct nf_conntrack *nfct) - { - struct ip_conntrack *ct = (struct ip_conntrack *)nfct; - struct ip_conntrack_protocol *proto; -- struct ip_conntrack_helper *helper; - typeof(ip_conntrack_destroyed) destroyed; - - DEBUGP("destroy_conntrack(%p)\n", ct); -@@ -312,10 +311,6 @@ destroy_conntrack(struct nf_conntrack *nfct) - ip_conntrack_event(IPCT_DESTROY, ct); - set_bit(IPS_DYING_BIT, &ct->status); - -- helper = ct->helper; -- if (helper && helper->destroy) -- helper->destroy(ct); -- - /* To make sure we don't get any weird locking issues here: - * destroy_conntrack() MUST NOT be called with a write lock - * to ip_conntrack_lock!!! -HW */ -@@ -356,6 +351,11 @@ destroy_conntrack(struct nf_conntrack *nfct) - static void death_by_timeout(unsigned long ul_conntrack) - { - struct ip_conntrack *ct = (void *)ul_conntrack; -+ struct ip_conntrack_helper *helper; -+ -+ helper = ct->helper; -+ if (helper && helper->destroy) -+ helper->destroy(ct); - - write_lock_bh(&ip_conntrack_lock); - /* Inside lock so preempt is disabled on module removal path. -diff --git a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c -index e694299..b86479a 100644 ---- a/net/ipv4/netfilter/ip_conntrack_proto_sctp.c -+++ b/net/ipv4/netfilter/ip_conntrack_proto_sctp.c -@@ -460,7 +460,8 @@ static int sctp_new(struct ip_conntrack *conntrack, - SCTP_CONNTRACK_NONE, sch->type); - - /* Invalid: delete conntrack */ -- if (newconntrack == SCTP_CONNTRACK_MAX) { -+ if (newconntrack == SCTP_CONNTRACK_NONE || -+ newconntrack == SCTP_CONNTRACK_MAX) { - DEBUGP("ip_conntrack_sctp: invalid new deleting.\n"); - return 0; - } -diff --git a/net/ipv4/netfilter/ip_nat_proto_gre.c b/net/ipv4/netfilter/ip_nat_proto_gre.c -index 9581020..e3146a3 100644 ---- a/net/ipv4/netfilter/ip_nat_proto_gre.c -+++ b/net/ipv4/netfilter/ip_nat_proto_gre.c -@@ -70,6 +70,11 @@ gre_unique_tuple(struct ip_conntrack_tuple *tuple, - __be16 *keyptr; - unsigned int min, i, range_size; - -+ /* If there is no master conntrack we are not PPTP, -+ do not change tuples */ -+ if (!conntrack->master) -+ return 0; -+ - if (maniptype == IP_NAT_MANIP_SRC) - keyptr = &tuple->src.u.gre.key; - else -@@ -122,18 +127,9 @@ gre_manip_pkt(struct sk_buff **pskb, - if (maniptype == IP_NAT_MANIP_DST) { - /* key manipulation is always dest */ - switch (greh->version) { -- case 0: -- if (!greh->key) { -- DEBUGP("can't nat GRE w/o key\n"); -- break; -- } -- if (greh->csum) { -- /* FIXME: Never tested this code... */ -- nf_proto_csum_replace4(gre_csum(greh), *pskb, -- *(gre_key(greh)), -- tuple->dst.u.gre.key, 0); -- } -- *(gre_key(greh)) = tuple->dst.u.gre.key; -+ case GRE_VERSION_1701: -+ /* We do not currently NAT any GREv0 packets. -+ * Try to behave like "ip_nat_proto_unknown" */ - break; - case GRE_VERSION_PPTP: - DEBUGP("call_id -> 0x%04x\n", -diff --git a/net/ipv4/netfilter/nf_nat_proto_gre.c b/net/ipv4/netfilter/nf_nat_proto_gre.c -index e5a34c1..ca3ff84 100644 ---- a/net/ipv4/netfilter/nf_nat_proto_gre.c -+++ b/net/ipv4/netfilter/nf_nat_proto_gre.c -@@ -72,6 +72,11 @@ gre_unique_tuple(struct nf_conntrack_tuple *tuple, - __be16 *keyptr; - unsigned int min, i, range_size; - -+ /* If there is no master conntrack we are not PPTP, -+ do not change tuples */ -+ if (!conntrack->master) -+ return 0; -+ - if (maniptype == IP_NAT_MANIP_SRC) - keyptr = &tuple->src.u.gre.key; - else -@@ -122,18 +127,9 @@ gre_manip_pkt(struct sk_buff **pskb, unsigned int iphdroff, - if (maniptype != IP_NAT_MANIP_DST) - return 1; - switch (greh->version) { -- case 0: -- if (!greh->key) { -- DEBUGP("can't nat GRE w/o key\n"); -- break; -- } -- if (greh->csum) { -- /* FIXME: Never tested this code... */ -- nf_proto_csum_replace4(gre_csum(greh), *pskb, -- *(gre_key(greh)), -- tuple->dst.u.gre.key, 0); -- } -- *(gre_key(greh)) = tuple->dst.u.gre.key; -+ case GRE_VERSION_1701: -+ /* We do not currently NAT any GREv0 packets. -+ * Try to behave like "nf_nat_proto_unknown" */ - break; - case GRE_VERSION_PPTP: - DEBUGP("call_id -> 0x%04x\n", ntohs(tuple->dst.u.gre.key)); -diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c -index 3834b10..824c6b9 100644 ---- a/net/ipv4/tcp.c -+++ b/net/ipv4/tcp.c -@@ -1759,8 +1759,7 @@ int tcp_disconnect(struct sock *sk, int flags) - tcp_clear_retrans(tp); - inet_csk_delack_init(sk); - sk->sk_send_head = NULL; -- tp->rx_opt.saw_tstamp = 0; -- tcp_sack_reset(&tp->rx_opt); -+ memset(&tp->rx_opt, 0, sizeof(tp->rx_opt)); - __sk_dst_reset(sk); - - BUG_TRAP(!inet->num || icsk->icsk_bind_hash); -diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c -index 452a82c..a541137 100644 ---- a/net/ipv6/addrconf.c -+++ b/net/ipv6/addrconf.c -@@ -2281,8 +2281,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, - break; - - case NETDEV_CHANGENAME: --#ifdef CONFIG_SYSCTL - if (idev) { -+ snmp6_unregister_dev(idev); -+#ifdef CONFIG_SYSCTL - addrconf_sysctl_unregister(&idev->cnf); - neigh_sysctl_unregister(idev->nd_parms); - neigh_sysctl_register(dev, idev->nd_parms, -@@ -2290,8 +2291,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event, - &ndisc_ifinfo_sysctl_change, - NULL); - addrconf_sysctl_register(idev, &idev->cnf); -- } - #endif -+ snmp6_register_dev(idev); -+ } - break; - }; - -@@ -4060,6 +4062,10 @@ int __init addrconf_init(void) - return err; - - ip6_null_entry.rt6i_idev = in6_dev_get(&loopback_dev); -+#ifdef CONFIG_IPV6_MULTIPLE_TABLES -+ ip6_prohibit_entry.rt6i_idev = in6_dev_get(&loopback_dev); -+ ip6_blk_hole_entry.rt6i_idev = in6_dev_get(&loopback_dev); -+#endif - - register_netdevice_notifier(&ipv6_dev_notf); - -diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c -index fb39604..794b930 100644 ---- a/net/ipv6/exthdrs.c -+++ b/net/ipv6/exthdrs.c -@@ -396,6 +396,7 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp) - - switch (hdr->type) { - #ifdef CONFIG_IPV6_MIP6 -+ case IPV6_SRCRT_TYPE_2: - break; - #endif - case IPV6_SRCRT_TYPE_0: -@@ -651,6 +652,14 @@ EXPORT_SYMBOL_GPL(ipv6_invert_rthdr); - Hop-by-hop options. - **********************************/ - -+/* -+ * Note: we cannot rely on skb->dst before we assign it in ip6_route_input(). -+ */ -+static inline struct inet6_dev *ipv6_skb_idev(struct sk_buff *skb) -+{ -+ return skb->dst ? ip6_dst_idev(skb->dst) : __in6_dev_get(skb->dev); -+} -+ - /* Router Alert as of RFC 2711 */ - - static int ipv6_hop_ra(struct sk_buff **skbp, int optoff) -@@ -677,25 +686,25 @@ static int ipv6_hop_jumbo(struct sk_buff **skbp, int optoff) - if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) { - LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", - skb->nh.raw[optoff+1]); -- IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), -+ IP6_INC_STATS_BH(ipv6_skb_idev(skb), - IPSTATS_MIB_INHDRERRORS); - goto drop; - } - - pkt_len = ntohl(*(__be32*)(skb->nh.raw+optoff+2)); - if (pkt_len <= IPV6_MAXPLEN) { -- IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); -+ IP6_INC_STATS_BH(ipv6_skb_idev(skb), IPSTATS_MIB_INHDRERRORS); - icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); - return 0; - } - if (skb->nh.ipv6h->payload_len) { -- IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INHDRERRORS); -+ IP6_INC_STATS_BH(ipv6_skb_idev(skb), IPSTATS_MIB_INHDRERRORS); - icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff); - return 0; - } - - if (pkt_len > skb->len - sizeof(struct ipv6hdr)) { -- IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INTRUNCATEDPKTS); -+ IP6_INC_STATS_BH(ipv6_skb_idev(skb), IPSTATS_MIB_INTRUNCATEDPKTS); - goto drop; - } - -diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c -index 61e7a6c..1b34ee5 100644 ---- a/net/ipv6/ip6_input.c -+++ b/net/ipv6/ip6_input.c -@@ -235,7 +235,7 @@ int ip6_mc_input(struct sk_buff *skb) - IP6_INC_STATS_BH(ip6_dst_idev(skb->dst), IPSTATS_MIB_INMCASTPKTS); - - hdr = skb->nh.ipv6h; -- deliver = likely(!(skb->dev->flags & (IFF_PROMISC|IFF_ALLMULTI))) || -+ deliver = unlikely(skb->dev->flags & (IFF_PROMISC|IFF_ALLMULTI)) || - ipv6_chk_mcast_addr(skb->dev, &hdr->daddr, NULL); - - /* -diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c -index 3055169..9fa3ffb 100644 ---- a/net/ipv6/ip6_output.c -+++ b/net/ipv6/ip6_output.c -@@ -449,10 +449,17 @@ int ip6_forward(struct sk_buff *skb) - */ - if (xrlim_allow(dst, 1*HZ)) - ndisc_send_redirect(skb, n, target); -- } else if (ipv6_addr_type(&hdr->saddr)&(IPV6_ADDR_MULTICAST|IPV6_ADDR_LOOPBACK -- |IPV6_ADDR_LINKLOCAL)) { -+ } else { -+ int addrtype = ipv6_addr_type(&hdr->saddr); -+ - /* This check is security critical. */ -- goto error; -+ if (addrtype & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LOOPBACK)) -+ goto error; -+ if (addrtype & IPV6_ADDR_LINKLOCAL) { -+ icmpv6_send(skb, ICMPV6_DEST_UNREACH, -+ ICMPV6_NOT_NEIGHBOUR, 0, skb->dev); -+ goto error; -+ } - } - - if (skb->len > dst_mtu(dst)) { -diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c -index fa3fb50..d57853d 100644 ---- a/net/ipv6/proc.c -+++ b/net/ipv6/proc.c -@@ -236,6 +236,7 @@ int snmp6_unregister_dev(struct inet6_dev *idev) - return -EINVAL; - remove_proc_entry(idev->stats.proc_dir_entry->name, - proc_net_devsnmp6); -+ idev->stats.proc_dir_entry = NULL; - return 0; - } - -diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c -index 93c4223..dff33cc 100644 ---- a/net/ipv6/xfrm6_tunnel.c -+++ b/net/ipv6/xfrm6_tunnel.c -@@ -261,7 +261,7 @@ static int xfrm6_tunnel_rcv(struct sk_buff *skb) - __be32 spi; - - spi = xfrm6_tunnel_spi_lookup((xfrm_address_t *)&iph->saddr); -- return xfrm6_rcv_spi(skb, spi); -+ return xfrm6_rcv_spi(skb, spi) > 0 ? : 0; - } - - static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt, -diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c -index b3a70eb..ce28fdd 100644 ---- a/net/netfilter/nf_conntrack_core.c -+++ b/net/netfilter/nf_conntrack_core.c -@@ -315,7 +315,6 @@ static void - destroy_conntrack(struct nf_conntrack *nfct) - { - struct nf_conn *ct = (struct nf_conn *)nfct; -- struct nf_conn_help *help = nfct_help(ct); - struct nf_conntrack_l3proto *l3proto; - struct nf_conntrack_l4proto *l4proto; - typeof(nf_conntrack_destroyed) destroyed; -@@ -327,9 +326,6 @@ destroy_conntrack(struct nf_conntrack *nfct) - nf_conntrack_event(IPCT_DESTROY, ct); - set_bit(IPS_DYING_BIT, &ct->status); - -- if (help && help->helper && help->helper->destroy) -- help->helper->destroy(ct); -- - /* To make sure we don't get any weird locking issues here: - * destroy_conntrack() MUST NOT be called with a write lock - * to nf_conntrack_lock!!! -HW */ -@@ -375,6 +371,10 @@ destroy_conntrack(struct nf_conntrack *nfct) - static void death_by_timeout(unsigned long ul_conntrack) - { - struct nf_conn *ct = (void *)ul_conntrack; -+ struct nf_conn_help *help = nfct_help(ct); -+ -+ if (help && help->helper && help->helper->destroy) -+ help->helper->destroy(ct); - - write_lock_bh(&nf_conntrack_lock); - /* Inside lock so preempt is disabled on module removal path. -diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c -index 3c80558..b53bc64 100644 ---- a/net/netfilter/nf_conntrack_proto_sctp.c -+++ b/net/netfilter/nf_conntrack_proto_sctp.c -@@ -469,7 +469,8 @@ static int sctp_new(struct nf_conn *conntrack, const struct sk_buff *skb, - SCTP_CONNTRACK_NONE, sch->type); - - /* Invalid: delete conntrack */ -- if (newconntrack == SCTP_CONNTRACK_MAX) { -+ if (newconntrack == SCTP_CONNTRACK_NONE || -+ newconntrack == SCTP_CONNTRACK_MAX) { - DEBUGP("nf_conntrack_sctp: invalid new deleting.\n"); - return 0; - } -diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c -index de889f2..a86f36b 100644 ---- a/net/sched/sch_prio.c -+++ b/net/sched/sch_prio.c -@@ -74,7 +74,7 @@ prio_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) - band = res.classid; - } - band = TC_H_MIN(band) - 1; -- if (band > q->bands) -+ if (band >= q->bands) - return q->queues[q->prio2band[0]]; - - return q->queues[band]; -diff --git a/net/sctp/socket.c b/net/sctp/socket.c -index a1d026f..843c928 100644 ---- a/net/sctp/socket.c -+++ b/net/sctp/socket.c -@@ -3847,7 +3847,7 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, - memcpy(&temp, &from->ipaddr, sizeof(temp)); - sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); - addrlen = sctp_get_af_specific(sk->sk_family)->sockaddr_len; -- if(space_left < addrlen) -+ if (space_left < addrlen) - return -ENOMEM; - if (copy_to_user(to, &temp, addrlen)) - return -EFAULT; -@@ -3936,8 +3936,9 @@ done: - /* Helper function that copies local addresses to user and returns the number - * of addresses copied. - */ --static int sctp_copy_laddrs_to_user_old(struct sock *sk, __u16 port, int max_addrs, -- void __user *to) -+static int sctp_copy_laddrs_old(struct sock *sk, __u16 port, -+ int max_addrs, void *to, -+ int *bytes_copied) - { - struct list_head *pos, *next; - struct sctp_sockaddr_entry *addr; -@@ -3954,10 +3955,10 @@ static int sctp_copy_laddrs_to_user_old(struct sock *sk, __u16 port, int max_add - sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), - &temp); - addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; -- if (copy_to_user(to, &temp, addrlen)) -- return -EFAULT; -+ memcpy(to, &temp, addrlen); - - to += addrlen; -+ *bytes_copied += addrlen; - cnt ++; - if (cnt >= max_addrs) break; - } -@@ -3965,8 +3966,8 @@ static int sctp_copy_laddrs_to_user_old(struct sock *sk, __u16 port, int max_add - return cnt; - } - --static int sctp_copy_laddrs_to_user(struct sock *sk, __u16 port, -- void __user **to, size_t space_left) -+static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to, -+ size_t space_left, int *bytes_copied) - { - struct list_head *pos, *next; - struct sctp_sockaddr_entry *addr; -@@ -3983,14 +3984,14 @@ static int sctp_copy_laddrs_to_user(struct sock *sk, __u16 port, - sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), - &temp); - addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; -- if(space_left<addrlen) -+ if (space_left < addrlen) - return -ENOMEM; -- if (copy_to_user(*to, &temp, addrlen)) -- return -EFAULT; -+ memcpy(to, &temp, addrlen); - -- *to += addrlen; -+ to += addrlen; - cnt ++; - space_left -= addrlen; -+ bytes_copied += addrlen; - } - - return cnt; -@@ -4014,6 +4015,9 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len, - int addrlen; - rwlock_t *addr_lock; - int err = 0; -+ void *addrs; -+ void *buf; -+ int bytes_copied = 0; - - if (len != sizeof(struct sctp_getaddrs_old)) - return -EINVAL; -@@ -4041,6 +4045,15 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len, - - to = getaddrs.addrs; - -+ /* Allocate space for a local instance of packed array to hold all -+ * the data. We store addresses here first and then put write them -+ * to the user in one shot. -+ */ -+ addrs = kmalloc(sizeof(union sctp_addr) * getaddrs.addr_num, -+ GFP_KERNEL); -+ if (!addrs) -+ return -ENOMEM; -+ - sctp_read_lock(addr_lock); - - /* If the endpoint is bound to 0.0.0.0 or ::0, get the valid -@@ -4050,38 +4063,42 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len, - addr = list_entry(bp->address_list.next, - struct sctp_sockaddr_entry, list); - if (sctp_is_any(&addr->a)) { -- cnt = sctp_copy_laddrs_to_user_old(sk, bp->port, -- getaddrs.addr_num, -- to); -- if (cnt < 0) { -- err = cnt; -- goto unlock; -- } -+ cnt = sctp_copy_laddrs_old(sk, bp->port, -+ getaddrs.addr_num, -+ addrs, &bytes_copied); - goto copy_getaddrs; - } - } - -+ buf = addrs; - list_for_each(pos, &bp->address_list) { - addr = list_entry(pos, struct sctp_sockaddr_entry, list); - memcpy(&temp, &addr->a, sizeof(temp)); - sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); - addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; -- if (copy_to_user(to, &temp, addrlen)) { -- err = -EFAULT; -- goto unlock; -- } -- to += addrlen; -+ memcpy(buf, &temp, addrlen); -+ buf += addrlen; -+ bytes_copied += addrlen; - cnt ++; - if (cnt >= getaddrs.addr_num) break; - } - - copy_getaddrs: -+ sctp_read_unlock(addr_lock); -+ -+ /* copy the entire address list into the user provided space */ -+ if (copy_to_user(to, addrs, bytes_copied)) { -+ err = -EFAULT; -+ goto error; -+ } -+ -+ /* copy the leading structure back to user */ - getaddrs.addr_num = cnt; - if (copy_to_user(optval, &getaddrs, sizeof(struct sctp_getaddrs_old))) - err = -EFAULT; - --unlock: -- sctp_read_unlock(addr_lock); -+error: -+ kfree(addrs); - return err; - } - -@@ -4101,7 +4118,9 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len, - rwlock_t *addr_lock; - int err = 0; - size_t space_left; -- int bytes_copied; -+ int bytes_copied = 0; -+ void *addrs; -+ void *buf; - - if (len <= sizeof(struct sctp_getaddrs)) - return -EINVAL; -@@ -4129,6 +4148,9 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len, - to = optval + offsetof(struct sctp_getaddrs,addrs); - space_left = len - sizeof(struct sctp_getaddrs) - - offsetof(struct sctp_getaddrs,addrs); -+ addrs = kmalloc(space_left, GFP_KERNEL); -+ if (!addrs) -+ return -ENOMEM; - - sctp_read_lock(addr_lock); - -@@ -4139,41 +4161,47 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len, - addr = list_entry(bp->address_list.next, - struct sctp_sockaddr_entry, list); - if (sctp_is_any(&addr->a)) { -- cnt = sctp_copy_laddrs_to_user(sk, bp->port, -- &to, space_left); -+ cnt = sctp_copy_laddrs(sk, bp->port, addrs, -+ space_left, &bytes_copied); - if (cnt < 0) { - err = cnt; -- goto unlock; -+ goto error; - } - goto copy_getaddrs; - } - } - -+ buf = addrs; - list_for_each(pos, &bp->address_list) { - addr = list_entry(pos, struct sctp_sockaddr_entry, list); - memcpy(&temp, &addr->a, sizeof(temp)); - sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); - addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; -- if(space_left < addrlen) -- return -ENOMEM; /*fixme: right error?*/ -- if (copy_to_user(to, &temp, addrlen)) { -- err = -EFAULT; -- goto unlock; -+ if (space_left < addrlen) { -+ err = -ENOMEM; /*fixme: right error?*/ -+ goto error; - } -- to += addrlen; -+ memcpy(buf, &temp, addrlen); -+ buf += addrlen; -+ bytes_copied += addrlen; - cnt ++; - space_left -= addrlen; - } - - copy_getaddrs: -+ sctp_read_unlock(addr_lock); -+ -+ if (copy_to_user(to, addrs, bytes_copied)) { -+ err = -EFAULT; -+ goto error; -+ } - if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) - return -EFAULT; -- bytes_copied = ((char __user *)to) - optval; - if (put_user(bytes_copied, optlen)) - return -EFAULT; - --unlock: -- sctp_read_unlock(addr_lock); -+error: -+ kfree(addrs); - return err; - } - -@@ -4961,7 +4989,12 @@ int sctp_inet_listen(struct socket *sock, int backlog) - /* Allocate HMAC for generating cookie. */ - if (sctp_hmac_alg) { - tfm = crypto_alloc_hash(sctp_hmac_alg, 0, CRYPTO_ALG_ASYNC); -- if (!tfm) { -+ if (IS_ERR(tfm)) { -+ if (net_ratelimit()) { -+ printk(KERN_INFO -+ "SCTP: failed to load transform for %s: %ld\n", -+ sctp_hmac_alg, PTR_ERR(tfm)); -+ } - err = -ENOSYS; - goto out; - } -diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c -index db298b5..c678f5f 100644 ---- a/net/sunrpc/auth_gss/svcauth_gss.c -+++ b/net/sunrpc/auth_gss/svcauth_gss.c -@@ -1196,13 +1196,7 @@ svcauth_gss_wrap_resp_integ(struct svc_rqst *rqstp) - if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, - integ_len)) - BUG(); -- if (resbuf->page_len == 0 -- && resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE -- < PAGE_SIZE) { -- BUG_ON(resbuf->tail[0].iov_len); -- /* Use head for everything */ -- resv = &resbuf->head[0]; -- } else if (resbuf->tail[0].iov_base == NULL) { -+ if (resbuf->tail[0].iov_base == NULL) { - if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE > PAGE_SIZE) - goto out_err; - resbuf->tail[0].iov_base = resbuf->head[0].iov_base -diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c -index 785c3e3..ba89293 100644 ---- a/net/xfrm/xfrm_policy.c -+++ b/net/xfrm/xfrm_policy.c -@@ -782,6 +782,10 @@ struct xfrm_policy *xfrm_policy_byid(u8 type, int dir, u32 id, int delete, - struct hlist_head *chain; - struct hlist_node *entry; - -+ *err = -ENOENT; -+ if (xfrm_policy_id2dir(id) != dir) -+ return NULL; -+ - *err = 0; - write_lock_bh(&xfrm_policy_lock); - chain = xfrm_policy_byidx + idx_hash(id); -diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c -index 6bc7e7c..8912c0f 100644 ---- a/scripts/basic/fixdep.c -+++ b/scripts/basic/fixdep.c -@@ -249,6 +249,8 @@ void parse_config_file(char *map, size_t len) - found: - if (!memcmp(q - 7, "_MODULE", 7)) - q -= 7; -+ if( (q-p-7) < 0 ) -+ continue; - use_config(p+7, q-p-7); - } - } -diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c -index c94291b..a6f8992 100644 ---- a/sound/pci/hda/patch_sigmatel.c -+++ b/sound/pci/hda/patch_sigmatel.c -@@ -1751,6 +1751,7 @@ static int stac92xx_resume(struct hda_codec *codec) - - stac92xx_init(codec); - stac92xx_set_config_regs(codec); -+ snd_hda_resume_ctls(codec, spec->mixer); - for (i = 0; i < spec->num_mixers; i++) - snd_hda_resume_ctls(codec, spec->mixers[i]); - if (spec->multiout.dig_out_nid) |