From c8a0c884e0e0113fbccaf45a777c9126120f69dc Mon Sep 17 00:00:00 2001 From: Maximilian Attems Date: Sat, 20 Dec 2008 21:03:40 +0000 Subject: [PATCH] add stable 2.6.27.10 ah how nice without external patches ;) svn path=/dists/trunk/linux-2.6/; revision=12516 --- debian/changelog | 2 +- .../patches/bugfix/all/stable/patch-2.6.27.10 | 1256 +++++++++++++++++ debian/patches/series/1~experimental.1 | 1 + 3 files changed, 1258 insertions(+), 1 deletion(-) create mode 100644 debian/patches/bugfix/all/stable/patch-2.6.27.10 diff --git a/debian/changelog b/debian/changelog index 10c6b6b6e..7aa022be2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,7 +18,7 @@ linux-2.6 (2.6.27-1~experimental.1) UNRELEASED; urgency=low EDAC_I5100, RTC_DRV_M41T94, RTC_DRV_DS1305, UBIFS. * [x86] set MOUSE_BCM5974, X86_RESERVE_LOW_64K. * [x86_64] set AMD_IOMMU, MTRR_SANITIZER. - * Add stable releases 2.6.27.1-2.6.27.9. + * Add stable releases 2.6.27.1-2.6.27.10. [ Martin Michlmayr ] * [mips/r4k-ip22, mips/sb1-bcm91250a] Don't build in ISO9660. diff --git a/debian/patches/bugfix/all/stable/patch-2.6.27.10 b/debian/patches/bugfix/all/stable/patch-2.6.27.10 new file mode 100644 index 000000000..992b5583f --- /dev/null +++ b/debian/patches/bugfix/all/stable/patch-2.6.27.10 @@ -0,0 +1,1256 @@ +diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt +index 1150444..792be86 100644 +--- a/Documentation/kernel-parameters.txt ++++ b/Documentation/kernel-parameters.txt +@@ -283,7 +283,7 @@ and is between 256 and 4096 characters. It is defined in the file + Possible values are: + isolate - enable device isolation (each device, as far + as possible, will get its own protection +- domain) ++ domain) [default] + amd_iommu_size= [HW,X86-64] + Define the size of the aperture for the AMD IOMMU + driver. Possible values are: +diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c +index bccd0ef..a1378c4 100644 +--- a/arch/x86/kernel/amd_iommu_init.c ++++ b/arch/x86/kernel/amd_iommu_init.c +@@ -120,7 +120,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have + LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings + we find in ACPI */ + unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */ +-int amd_iommu_isolate; /* if 1, device isolation is enabled */ ++int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */ + + LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the + system */ +diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c +index 7667443..6d5a3c4 100644 +--- a/arch/x86/kernel/setup.c ++++ b/arch/x86/kernel/setup.c +@@ -634,6 +634,9 @@ void __init setup_arch(char **cmdline_p) + printk(KERN_INFO "Command line: %s\n", boot_command_line); + #endif + ++ /* VMI may relocate the fixmap; do this before touching ioremap area */ ++ vmi_init(); ++ + early_cpu_init(); + early_ioremap_init(); + +@@ -707,13 +710,8 @@ void __init setup_arch(char **cmdline_p) + check_efer(); + #endif + +-#if defined(CONFIG_VMI) && defined(CONFIG_X86_32) +- /* +- * Must be before kernel pagetables are setup +- * or fixmap area is touched. +- */ +- vmi_init(); +-#endif ++ /* Must be before kernel pagetables are setup */ ++ vmi_activate(); + + /* after early param, so could get panic from serial */ + reserve_early_setup_data(); +diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c +index 7985c5b..259569f 100644 +--- a/arch/x86/kernel/smpboot.c ++++ b/arch/x86/kernel/smpboot.c +@@ -289,9 +289,7 @@ static void __cpuinit start_secondary(void *unused) + * fragile that we want to limit the things done here to the + * most necessary things. + */ +-#ifdef CONFIG_VMI + vmi_bringup(); +-#endif + cpu_init(); + preempt_disable(); + smp_callin(); +diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c +index edfb09f..f370d38 100644 +--- a/arch/x86/kernel/vmi_32.c ++++ b/arch/x86/kernel/vmi_32.c +@@ -960,8 +960,6 @@ static inline int __init activate_vmi(void) + + void __init vmi_init(void) + { +- unsigned long flags; +- + if (!vmi_rom) + probe_vmi_rom(); + else +@@ -973,13 +971,21 @@ void __init vmi_init(void) + + reserve_top_address(-vmi_rom->virtual_top); + +- local_irq_save(flags); +- activate_vmi(); +- + #ifdef CONFIG_X86_IO_APIC + /* This is virtual hardware; timer routing is wired correctly */ + no_timer_check = 1; + #endif ++} ++ ++void vmi_activate(void) ++{ ++ unsigned long flags; ++ ++ if (!vmi_rom) ++ return; ++ ++ local_irq_save(flags); ++ activate_vmi(); + local_irq_restore(flags & X86_EFLAGS_IF); + } + +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c +index b551cda..f38e2af 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -3979,17 +3979,70 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { + { "ST3160023AS", "3.42", ATA_HORKAGE_NONCQ }, + + /* Seagate NCQ + FLUSH CACHE firmware bug */ +- { "ST31500341AS", "9JU138", ATA_HORKAGE_NONCQ | ++ { "ST31500341AS", "SD15", ATA_HORKAGE_NONCQ | + ATA_HORKAGE_FIRMWARE_WARN }, +- { "ST31000333AS", "9FZ136", ATA_HORKAGE_NONCQ | ++ { "ST31500341AS", "SD16", ATA_HORKAGE_NONCQ | + ATA_HORKAGE_FIRMWARE_WARN }, +- { "ST3640623AS", "9FZ164", ATA_HORKAGE_NONCQ | ++ { "ST31500341AS", "SD17", ATA_HORKAGE_NONCQ | + ATA_HORKAGE_FIRMWARE_WARN }, +- { "ST3640323AS", "9FZ134", ATA_HORKAGE_NONCQ | ++ { "ST31500341AS", "SD18", ATA_HORKAGE_NONCQ | + ATA_HORKAGE_FIRMWARE_WARN }, +- { "ST3320813AS", "9FZ182", ATA_HORKAGE_NONCQ | ++ { "ST31500341AS", "SD19", ATA_HORKAGE_NONCQ | + ATA_HORKAGE_FIRMWARE_WARN }, +- { "ST3320613AS", "9FZ162", ATA_HORKAGE_NONCQ | ++ ++ { "ST31000333AS", "SD15", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST31000333AS", "SD16", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST31000333AS", "SD17", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST31000333AS", "SD18", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST31000333AS", "SD19", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ ++ { "ST3640623AS", "SD15", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640623AS", "SD16", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640623AS", "SD17", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640623AS", "SD18", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640623AS", "SD19", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ ++ { "ST3640323AS", "SD15", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640323AS", "SD16", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640323AS", "SD17", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640323AS", "SD18", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3640323AS", "SD19", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ ++ { "ST3320813AS", "SD15", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320813AS", "SD16", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320813AS", "SD17", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320813AS", "SD18", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320813AS", "SD19", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ ++ { "ST3320613AS", "SD15", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320613AS", "SD16", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320613AS", "SD17", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320613AS", "SD18", ATA_HORKAGE_NONCQ | ++ ATA_HORKAGE_FIRMWARE_WARN }, ++ { "ST3320613AS", "SD19", ATA_HORKAGE_NONCQ | + ATA_HORKAGE_FIRMWARE_WARN }, + + /* Blacklist entries taken from Silicon Image 3124/3132 +diff --git a/drivers/char/cp437.uni b/drivers/char/cp437.uni +index 1f06889..bc61634 100644 +--- a/drivers/char/cp437.uni ++++ b/drivers/char/cp437.uni +@@ -27,7 +27,7 @@ + 0x0c U+2640 + 0x0d U+266a + 0x0e U+266b +-0x0f U+263c ++0x0f U+263c U+00a4 + 0x10 U+25b6 U+25ba + 0x11 U+25c0 U+25c4 + 0x12 U+2195 +@@ -55,7 +55,7 @@ + 0x24 U+0024 + 0x25 U+0025 + 0x26 U+0026 +-0x27 U+0027 ++0x27 U+0027 U+00b4 + 0x28 U+0028 + 0x29 U+0029 + 0x2a U+002a +@@ -84,7 +84,7 @@ + 0x41 U+0041 U+00c0 U+00c1 U+00c2 U+00c3 + 0x42 U+0042 + 0x43 U+0043 U+00a9 +-0x44 U+0044 ++0x44 U+0044 U+00d0 + 0x45 U+0045 U+00c8 U+00ca U+00cb + 0x46 U+0046 + 0x47 U+0047 +@@ -140,7 +140,7 @@ + 0x79 U+0079 U+00fd + 0x7a U+007a + 0x7b U+007b +-0x7c U+007c U+00a5 ++0x7c U+007c U+00a6 + 0x7d U+007d + 0x7e U+007e + # +@@ -263,10 +263,10 @@ + 0xe8 U+03a6 U+00d8 + 0xe9 U+0398 + 0xea U+03a9 U+2126 +-0xeb U+03b4 ++0xeb U+03b4 U+00f0 + 0xec U+221e + 0xed U+03c6 U+00f8 +-0xee U+03b5 ++0xee U+03b5 U+2208 + 0xef U+2229 + 0xf0 U+2261 + 0xf1 U+00b1 +diff --git a/drivers/char/vt.c b/drivers/char/vt.c +index 60359c3..d429499 100644 +--- a/drivers/char/vt.c ++++ b/drivers/char/vt.c +@@ -2287,7 +2287,7 @@ rescan_last_byte: + continue; /* nothing to display */ + } + /* Glyph not found */ +- if ((!(vc->vc_utf && !vc->vc_disp_ctrl) || c < 128) && !(c & ~charmask)) { ++ if ((!(vc->vc_utf && !vc->vc_disp_ctrl) && c < 128) && !(c & ~charmask)) { + /* In legacy mode use the glyph we get by a 1:1 mapping. + This would make absolutely no sense with Unicode in mind, + but do this for ASCII characters since a font may lack +diff --git a/drivers/char/xilinx_hwicap/buffer_icap.c b/drivers/char/xilinx_hwicap/buffer_icap.c +index aa7f796..05d8977 100644 +--- a/drivers/char/xilinx_hwicap/buffer_icap.c ++++ b/drivers/char/xilinx_hwicap/buffer_icap.c +@@ -21,9 +21,6 @@ + * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * +- * Xilinx products are not intended for use in life support appliances, +- * devices, or systems. Use in such applications is expressly prohibited. +- * + * (c) Copyright 2003-2008 Xilinx Inc. + * All rights reserved. + * +diff --git a/drivers/char/xilinx_hwicap/buffer_icap.h b/drivers/char/xilinx_hwicap/buffer_icap.h +index 8b0252b..d4f419e 100644 +--- a/drivers/char/xilinx_hwicap/buffer_icap.h ++++ b/drivers/char/xilinx_hwicap/buffer_icap.h +@@ -21,9 +21,6 @@ + * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * +- * Xilinx products are not intended for use in life support appliances, +- * devices, or systems. Use in such applications is expressly prohibited. +- * + * (c) Copyright 2003-2008 Xilinx Inc. + * All rights reserved. + * +diff --git a/drivers/char/xilinx_hwicap/fifo_icap.c b/drivers/char/xilinx_hwicap/fifo_icap.c +index 776b505..02225eb 100644 +--- a/drivers/char/xilinx_hwicap/fifo_icap.c ++++ b/drivers/char/xilinx_hwicap/fifo_icap.c +@@ -21,9 +21,6 @@ + * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * +- * Xilinx products are not intended for use in life support appliances, +- * devices, or systems. Use in such applications is expressly prohibited. +- * + * (c) Copyright 2007-2008 Xilinx Inc. + * All rights reserved. + * +diff --git a/drivers/char/xilinx_hwicap/fifo_icap.h b/drivers/char/xilinx_hwicap/fifo_icap.h +index 62bda45..4c9dd9a 100644 +--- a/drivers/char/xilinx_hwicap/fifo_icap.h ++++ b/drivers/char/xilinx_hwicap/fifo_icap.h +@@ -21,9 +21,6 @@ + * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * +- * Xilinx products are not intended for use in life support appliances, +- * devices, or systems. Use in such applications is expressly prohibited. +- * + * (c) Copyright 2007-2008 Xilinx Inc. + * All rights reserved. + * +diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c +index 278c985..15ead99 100644 +--- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c ++++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c +@@ -21,9 +21,6 @@ + * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * +- * Xilinx products are not intended for use in life support appliances, +- * devices, or systems. Use in such applications is expressly prohibited. +- * + * (c) Copyright 2002 Xilinx Inc., Systems Engineering Group + * (c) Copyright 2004 Xilinx Inc., Systems Engineering Group + * (c) Copyright 2007-2008 Xilinx Inc. +diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.h b/drivers/char/xilinx_hwicap/xilinx_hwicap.h +index 24d0d9b..8cca119 100644 +--- a/drivers/char/xilinx_hwicap/xilinx_hwicap.h ++++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.h +@@ -21,9 +21,6 @@ + * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * +- * Xilinx products are not intended for use in life support appliances, +- * devices, or systems. Use in such applications is expressly prohibited. +- * + * (c) Copyright 2003-2007 Xilinx Inc. + * All rights reserved. + * +diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c +index 251416f..595759c 100644 +--- a/drivers/firewire/fw-ohci.c ++++ b/drivers/firewire/fw-ohci.c +@@ -958,6 +958,7 @@ at_context_queue_packet(struct context *ctx, struct fw_packet *packet) + packet->ack = RCODE_SEND_ERROR; + return -1; + } ++ packet->payload_bus = payload_bus; + + d[2].req_count = cpu_to_le16(packet->payload_length); + d[2].data_address = cpu_to_le32(payload_bus); +@@ -1009,7 +1010,6 @@ static int handle_at_packet(struct context *context, + struct driver_data *driver_data; + struct fw_packet *packet; + struct fw_ohci *ohci = context->ohci; +- dma_addr_t payload_bus; + int evt; + + if (last->transfer_status == 0) +@@ -1022,9 +1022,8 @@ static int handle_at_packet(struct context *context, + /* This packet was cancelled, just continue. */ + return 1; + +- payload_bus = le32_to_cpu(last->data_address); +- if (payload_bus != 0) +- dma_unmap_single(ohci->card.device, payload_bus, ++ if (packet->payload_bus) ++ dma_unmap_single(ohci->card.device, packet->payload_bus, + packet->payload_length, DMA_TO_DEVICE); + + evt = le16_to_cpu(last->transfer_status) & 0x1f; +@@ -1681,6 +1680,10 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet) + if (packet->ack != 0) + goto out; + ++ if (packet->payload_bus) ++ dma_unmap_single(ohci->card.device, packet->payload_bus, ++ packet->payload_length, DMA_TO_DEVICE); ++ + log_ar_at_event('T', packet->speed, packet->header, 0x20); + driver_data->packet = NULL; + packet->ack = RCODE_CANCELLED; +diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c +index e5d1a0b..27f7c7e 100644 +--- a/drivers/firewire/fw-transaction.c ++++ b/drivers/firewire/fw-transaction.c +@@ -207,6 +207,7 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel, + packet->speed = speed; + packet->generation = generation; + packet->ack = 0; ++ packet->payload_bus = 0; + } + + /** +@@ -541,6 +542,8 @@ fw_fill_response(struct fw_packet *response, u32 *request_header, + BUG(); + return; + } ++ ++ response->payload_bus = 0; + } + EXPORT_SYMBOL(fw_fill_response); + +diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h +index 81b15ba..04cc9b0 100644 +--- a/drivers/firewire/fw-transaction.h ++++ b/drivers/firewire/fw-transaction.h +@@ -27,6 +27,7 @@ + #include + #include + #include ++#include + #include + + #define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) +@@ -153,6 +154,7 @@ struct fw_packet { + size_t header_length; + void *payload; + size_t payload_length; ++ dma_addr_t payload_bus; + u32 timestamp; + + /* +diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c +index 16240a7..3d3c3bc 100644 +--- a/drivers/ieee1394/nodemgr.c ++++ b/drivers/ieee1394/nodemgr.c +@@ -115,8 +115,14 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length, + return error; + } + ++#define OUI_FREECOM_TECHNOLOGIES_GMBH 0x0001db ++ + static int nodemgr_get_max_rom(quadlet_t *bus_info_data, void *__ci) + { ++ /* Freecom FireWire Hard Drive firmware bug */ ++ if (be32_to_cpu(bus_info_data[3]) >> 8 == OUI_FREECOM_TECHNOLOGIES_GMBH) ++ return 0; ++ + return (be32_to_cpu(bus_info_data[2]) >> 8) & 0x3; + } + +diff --git a/drivers/isdn/hardware/avm/b1isa.c b/drivers/isdn/hardware/avm/b1isa.c +index 1e288ee..6461a32 100644 +--- a/drivers/isdn/hardware/avm/b1isa.c ++++ b/drivers/isdn/hardware/avm/b1isa.c +@@ -233,10 +233,8 @@ static void __exit b1isa_exit(void) + int i; + + for (i = 0; i < MAX_CARDS; i++) { +- if (!io[i]) +- break; +- +- b1isa_remove(&isa_dev[i]); ++ if (isa_dev[i].resource[0].start) ++ b1isa_remove(&isa_dev[i]); + } + unregister_capi_driver(&capi_driver_b1isa); + } +diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c +index d74df58..bec489e 100644 +--- a/drivers/media/video/tvaudio.c ++++ b/drivers/media/video/tvaudio.c +@@ -152,7 +152,7 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) + { + unsigned char buffer[2]; + +- if (-1 == subaddr) { ++ if (subaddr < 0) { + v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n", + chip->c->name, val); + chip->shadow.bytes[1] = val; +@@ -163,6 +163,13 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) + return -1; + } + } else { ++ if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { ++ v4l_info(chip->c, ++ "Tried to access a non-existent register: %d\n", ++ subaddr); ++ return -EINVAL; ++ } ++ + v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n", + chip->c->name, subaddr, val); + chip->shadow.bytes[subaddr+1] = val; +@@ -177,12 +184,20 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val) + return 0; + } + +-static int chip_write_masked(struct CHIPSTATE *chip, int subaddr, int val, int mask) ++static int chip_write_masked(struct CHIPSTATE *chip, ++ int subaddr, int val, int mask) + { + if (mask != 0) { +- if (-1 == subaddr) { ++ if (subaddr < 0) { + val = (chip->shadow.bytes[1] & ~mask) | (val & mask); + } else { ++ if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) { ++ v4l_info(chip->c, ++ "Tried to access a non-existent register: %d\n", ++ subaddr); ++ return -EINVAL; ++ } ++ + val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask); + } + } +@@ -228,6 +243,15 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd) + if (0 == cmd->count) + return 0; + ++ if (cmd->count + cmd->bytes[0] - 1 >= ARRAY_SIZE(chip->shadow.bytes)) { ++ v4l_info(chip->c, ++ "Tried to access a non-existent register range: %d to %d\n", ++ cmd->bytes[0] + 1, cmd->bytes[0] + cmd->count - 1); ++ return -EINVAL; ++ } ++ ++ /* FIXME: it seems that the shadow bytes are wrong bellow !*/ ++ + /* update our shadow register set; print bytes if (debug > 0) */ + v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:", + chip->c->name, name,cmd->bytes[0]); +diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c +index c792138..1b9c4dc 100644 +--- a/drivers/net/bonding/bond_main.c ++++ b/drivers/net/bonding/bond_main.c +@@ -2370,6 +2370,9 @@ static void bond_miimon_commit(struct bonding *bond) + continue; + + case BOND_LINK_DOWN: ++ if (slave->link_failure_count < UINT_MAX) ++ slave->link_failure_count++; ++ + slave->link = BOND_LINK_DOWN; + + if (bond->params.mode == BOND_MODE_ACTIVEBACKUP || +diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c +index bcd2bc4..79be768 100644 +--- a/drivers/net/e1000e/ich8lan.c ++++ b/drivers/net/e1000e/ich8lan.c +@@ -1791,12 +1791,17 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) + ctrl |= E1000_CTRL_PHY_RST; + } + ret_val = e1000_acquire_swflag_ich8lan(hw); ++ /* Whether or not the swflag was acquired, we need to reset the part */ + hw_dbg(hw, "Issuing a global reset to ich8lan"); + ew32(CTRL, (ctrl | E1000_CTRL_RST)); + msleep(20); + +- /* release the swflag because it is not reset by hardware reset */ +- e1000_release_swflag_ich8lan(hw); ++ if (!ret_val) { ++ /* release the swflag because it is not reset by ++ * hardware reset ++ */ ++ e1000_release_swflag_ich8lan(hw); ++ } + + ret_val = e1000e_get_auto_rd_done(hw); + if (ret_val) { +diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c +index cf7056e..79b7ae3 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-agn.c ++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c +@@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv) + + rxq->queue[i] = NULL; + +- pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr, ++ pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr, + priv->hw_params.rx_buf_size, + PCI_DMA_FROMDEVICE); + pkt = (struct iwl_rx_packet *)rxb->skb->data; +@@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv) + rxb->skb = NULL; + } + +- pci_unmap_single(priv->pci_dev, rxb->dma_addr, +- priv->hw_params.rx_buf_size, ++ pci_unmap_single(priv->pci_dev, rxb->real_dma_addr, ++ priv->hw_params.rx_buf_size + 256, + PCI_DMA_FROMDEVICE); + spin_lock_irqsave(&rxq->lock, flags); + list_add_tail(&rxb->list, &priv->rxq.rx_used); +diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c +index 1383fd1..b346268 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-core.c ++++ b/drivers/net/wireless/iwlwifi/iwl-core.c +@@ -290,6 +290,9 @@ void iwl_clear_stations_table(struct iwl_priv *priv) + priv->num_stations = 0; + memset(priv->stations, 0, sizeof(priv->stations)); + ++ /* clean ucode key table bit map */ ++ priv->ucode_key_table = 0; ++ + spin_unlock_irqrestore(&priv->sta_lock, flags); + } + EXPORT_SYMBOL(iwl_clear_stations_table); +diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h +index 09bdf8e..cf7757f 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-dev.h ++++ b/drivers/net/wireless/iwlwifi/iwl-dev.h +@@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg; + #define DEFAULT_LONG_RETRY_LIMIT 4U + + struct iwl_rx_mem_buffer { +- dma_addr_t dma_addr; ++ dma_addr_t real_dma_addr; ++ dma_addr_t aligned_dma_addr; + struct sk_buff *skb; + struct list_head list; + }; +diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c +index e81bfc4..ce25379 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-rx.c ++++ b/drivers/net/wireless/iwlwifi/iwl-rx.c +@@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv) + list_del(element); + + /* Point to Rx buffer via next RBD in circular buffer */ +- rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr); ++ rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr); + rxq->queue[rxq->write] = rxb; + rxq->write = (rxq->write + 1) & RX_QUEUE_MASK; + rxq->free_count--; +@@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv) + rxb = list_entry(element, struct iwl_rx_mem_buffer, list); + + /* Alloc a new receive buffer */ +- rxb->skb = alloc_skb(priv->hw_params.rx_buf_size, ++ rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256, + __GFP_NOWARN | GFP_ATOMIC); + if (!rxb->skb) { + if (net_ratelimit()) +@@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv) + list_del(element); + + /* Get physical address of RB/SKB */ +- rxb->dma_addr = +- pci_map_single(priv->pci_dev, rxb->skb->data, +- priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE); ++ rxb->real_dma_addr = pci_map_single( ++ priv->pci_dev, ++ rxb->skb->data, ++ priv->hw_params.rx_buf_size + 256, ++ PCI_DMA_FROMDEVICE); ++ /* dma address must be no more than 36 bits */ ++ BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36)); ++ /* and also 256 byte aligned! */ ++ rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256); ++ skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr); ++ + list_add_tail(&rxb->list, &rxq->rx_free); + rxq->free_count++; + } +@@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq) + for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) { + if (rxq->pool[i].skb != NULL) { + pci_unmap_single(priv->pci_dev, +- rxq->pool[i].dma_addr, +- priv->hw_params.rx_buf_size, ++ rxq->pool[i].real_dma_addr, ++ priv->hw_params.rx_buf_size + 256, + PCI_DMA_FROMDEVICE); + dev_kfree_skb(rxq->pool[i].skb); + } +@@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq) + * to an SKB, so we need to unmap and free potential storage */ + if (rxq->pool[i].skb != NULL) { + pci_unmap_single(priv->pci_dev, +- rxq->pool[i].dma_addr, +- priv->hw_params.rx_buf_size, ++ rxq->pool[i].real_dma_addr, ++ priv->hw_params.rx_buf_size + 256, + PCI_DMA_FROMDEVICE); + priv->alloc_rxb_skb--; + dev_kfree_skb(rxq->pool[i].skb); +diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c +index 6283a3a..f2d473c 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-sta.c ++++ b/drivers/net/wireless/iwlwifi/iwl-sta.c +@@ -475,7 +475,7 @@ static int iwl_get_free_ucode_key_index(struct iwl_priv *priv) + if (!test_and_set_bit(i, &priv->ucode_key_table)) + return i; + +- return -1; ++ return WEP_INVALID_OFFSET; + } + + int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty) +@@ -620,6 +620,9 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv, + /* else, we are overriding an existing key => no need to allocated room + * in uCode. */ + ++ WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, ++ "no space for new kew"); ++ + priv->stations[sta_id].sta.key.key_flags = key_flags; + priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; + priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; +@@ -637,6 +640,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv, + { + unsigned long flags; + __le16 key_flags = 0; ++ int ret; + + key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK); + key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); +@@ -664,14 +668,18 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv, + /* else, we are overriding an existing key => no need to allocated room + * in uCode. */ + ++ WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, ++ "no space for new kew"); ++ + priv->stations[sta_id].sta.key.key_flags = key_flags; + priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK; + priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; + ++ ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); ++ + spin_unlock_irqrestore(&priv->sta_lock, flags); + +- IWL_DEBUG_INFO("hwcrypto: modify ucode station key info\n"); +- return iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC); ++ return ret; + } + + static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv, +@@ -696,6 +704,9 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv, + /* else, we are overriding an existing key => no need to allocated room + * in uCode. */ + ++ WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET, ++ "no space for new kew"); ++ + /* This copy is acutally not needed: we get the key with each TX */ + memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16); + +@@ -734,6 +745,13 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv, + return 0; + } + ++ if (priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) { ++ IWL_WARNING("Removing wrong key %d 0x%x\n", ++ keyconf->keyidx, key_flags); ++ spin_unlock_irqrestore(&priv->sta_lock, flags); ++ return 0; ++ } ++ + if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset, + &priv->ucode_key_table)) + IWL_ERROR("index %d not used in uCode key table.\n", +diff --git a/drivers/video/macfb.c b/drivers/video/macfb.c +index b790ddf..ee380d5 100644 +--- a/drivers/video/macfb.c ++++ b/drivers/video/macfb.c +@@ -164,7 +164,6 @@ static struct fb_var_screeninfo macfb_defined = { + }; + + static struct fb_fix_screeninfo macfb_fix = { +- .id = "Macintosh ", + .type = FB_TYPE_PACKED_PIXELS, + .accel = FB_ACCEL_NONE, + }; +@@ -760,22 +759,22 @@ static int __init macfb_init(void) + + switch(ndev->dr_hw) { + case NUBUS_DRHW_APPLE_MDC: +- strcat( macfb_fix.id, "Display Card" ); ++ strcpy(macfb_fix.id, "Mac Disp. Card"); + macfb_setpalette = mdc_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; + break; + case NUBUS_DRHW_APPLE_TFB: +- strcat( macfb_fix.id, "Toby" ); ++ strcpy(macfb_fix.id, "Toby"); + macfb_setpalette = toby_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; + break; + case NUBUS_DRHW_APPLE_JET: +- strcat( macfb_fix.id, "Jet"); ++ strcpy(macfb_fix.id, "Jet"); + macfb_setpalette = jet_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; + break; + default: +- strcat( macfb_fix.id, "Generic NuBus" ); ++ strcpy(macfb_fix.id, "Generic NuBus"); + break; + } + } +@@ -786,21 +785,11 @@ static int __init macfb_init(void) + if (!video_is_nubus) + switch( mac_bi_data.id ) + { +- /* These don't have onboard video. Eventually, we may +- be able to write separate framebuffer drivers for +- them (tobyfb.c, hiresfb.c, etc, etc) */ +- case MAC_MODEL_II: +- case MAC_MODEL_IIX: +- case MAC_MODEL_IICX: +- case MAC_MODEL_IIFX: +- strcat( macfb_fix.id, "Generic NuBus" ); +- break; +- + /* Valkyrie Quadras */ + case MAC_MODEL_Q630: + /* I'm not sure about this one */ + case MAC_MODEL_P588: +- strcat( macfb_fix.id, "Valkyrie built-in" ); ++ strcpy(macfb_fix.id, "Valkyrie"); + macfb_setpalette = valkyrie_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; + valkyrie_cmap_regs = ioremap(DAC_BASE, 0x1000); +@@ -823,7 +812,7 @@ static int __init macfb_init(void) + case MAC_MODEL_Q700: + case MAC_MODEL_Q900: + case MAC_MODEL_Q950: +- strcat( macfb_fix.id, "DAFB built-in" ); ++ strcpy(macfb_fix.id, "DAFB"); + macfb_setpalette = dafb_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; + dafb_cmap_regs = ioremap(DAFB_BASE, 0x1000); +@@ -831,7 +820,7 @@ static int __init macfb_init(void) + + /* LC II uses the V8 framebuffer */ + case MAC_MODEL_LCII: +- strcat( macfb_fix.id, "V8 built-in" ); ++ strcpy(macfb_fix.id, "V8"); + macfb_setpalette = v8_brazil_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; + v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); +@@ -843,7 +832,7 @@ static int __init macfb_init(void) + case MAC_MODEL_IIVI: + case MAC_MODEL_IIVX: + case MAC_MODEL_P600: +- strcat( macfb_fix.id, "Brazil built-in" ); ++ strcpy(macfb_fix.id, "Brazil"); + macfb_setpalette = v8_brazil_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; + v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); +@@ -860,7 +849,7 @@ static int __init macfb_init(void) + case MAC_MODEL_P460: + macfb_setpalette = v8_brazil_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; +- strcat( macfb_fix.id, "Sonora built-in" ); ++ strcpy(macfb_fix.id, "Sonora"); + v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000); + break; + +@@ -871,7 +860,7 @@ static int __init macfb_init(void) + case MAC_MODEL_IISI: + macfb_setpalette = rbv_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; +- strcat( macfb_fix.id, "RBV built-in" ); ++ strcpy(macfb_fix.id, "RBV"); + rbv_cmap_regs = ioremap(DAC_BASE, 0x1000); + break; + +@@ -880,7 +869,7 @@ static int __init macfb_init(void) + case MAC_MODEL_C660: + macfb_setpalette = civic_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; +- strcat( macfb_fix.id, "Civic built-in" ); ++ strcpy(macfb_fix.id, "Civic"); + civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000); + break; + +@@ -901,7 +890,7 @@ static int __init macfb_init(void) + v8_brazil_cmap_regs = + ioremap(DAC_BASE, 0x1000); + } +- strcat( macfb_fix.id, "LC built-in" ); ++ strcpy(macfb_fix.id, "LC"); + break; + /* We think this may be like the LC II */ + case MAC_MODEL_CCL: +@@ -911,18 +900,18 @@ static int __init macfb_init(void) + v8_brazil_cmap_regs = + ioremap(DAC_BASE, 0x1000); + } +- strcat( macfb_fix.id, "Color Classic built-in" ); ++ strcpy(macfb_fix.id, "Color Classic"); + break; + + /* And we *do* mean "weirdos" */ + case MAC_MODEL_TV: +- strcat( macfb_fix.id, "Mac TV built-in" ); ++ strcpy(macfb_fix.id, "Mac TV"); + break; + + /* These don't have colour, so no need to worry */ + case MAC_MODEL_SE30: + case MAC_MODEL_CLII: +- strcat( macfb_fix.id, "Monochrome built-in" ); ++ strcpy(macfb_fix.id, "Monochrome"); + break; + + /* Powerbooks are particularly difficult. Many of +@@ -935,7 +924,7 @@ static int __init macfb_init(void) + case MAC_MODEL_PB140: + case MAC_MODEL_PB145: + case MAC_MODEL_PB170: +- strcat( macfb_fix.id, "DDC built-in" ); ++ strcpy(macfb_fix.id, "DDC"); + break; + + /* Internal is GSC, External (if present) is ViSC */ +@@ -945,13 +934,13 @@ static int __init macfb_init(void) + case MAC_MODEL_PB180: + case MAC_MODEL_PB210: + case MAC_MODEL_PB230: +- strcat( macfb_fix.id, "GSC built-in" ); ++ strcpy(macfb_fix.id, "GSC"); + break; + + /* Internal is TIM, External is ViSC */ + case MAC_MODEL_PB165C: + case MAC_MODEL_PB180C: +- strcat( macfb_fix.id, "TIM built-in" ); ++ strcpy(macfb_fix.id, "TIM"); + break; + + /* Internal is CSC, External is Keystone+Ariel. */ +@@ -963,12 +952,12 @@ static int __init macfb_init(void) + case MAC_MODEL_PB280C: + macfb_setpalette = csc_setpalette; + macfb_defined.activate = FB_ACTIVATE_NOW; +- strcat( macfb_fix.id, "CSC built-in" ); ++ strcpy(macfb_fix.id, "CSC"); + csc_cmap_regs = ioremap(CSC_BASE, 0x1000); + break; + + default: +- strcat( macfb_fix.id, "Unknown/Unsupported built-in" ); ++ strcpy(macfb_fix.id, "Unknown"); + break; + } + +@@ -978,16 +967,23 @@ static int __init macfb_init(void) + fb_info.pseudo_palette = pseudo_palette; + fb_info.flags = FBINFO_DEFAULT; + +- fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0); ++ err = fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0); ++ if (err) ++ goto fail_unmap; + + err = register_framebuffer(&fb_info); +- if (!err) +- printk("fb%d: %s frame buffer device\n", +- fb_info.node, fb_info.fix.id); +- else { +- iounmap(fb_info.screen_base); +- iounmap_macfb(); +- } ++ if (err) ++ goto fail_dealloc; ++ ++ printk("fb%d: %s frame buffer device\n", ++ fb_info.node, fb_info.fix.id); ++ return 0; ++ ++fail_dealloc: ++ fb_dealloc_cmap(&fb_info.cmap); ++fail_unmap: ++ iounmap(fb_info.screen_base); ++ iounmap_macfb(); + return err; + } + +diff --git a/include/asm-x86/vmi.h b/include/asm-x86/vmi.h +index b7c0dea..61e08c0 100644 +--- a/include/asm-x86/vmi.h ++++ b/include/asm-x86/vmi.h +@@ -223,9 +223,15 @@ struct pci_header { + } __attribute__((packed)); + + /* Function prototypes for bootstrapping */ ++#ifdef CONFIG_VMI + extern void vmi_init(void); ++extern void vmi_activate(void); + extern void vmi_bringup(void); +-extern void vmi_apply_boot_page_allocations(void); ++#else ++static inline void vmi_init(void) {} ++static inline void vmi_activate(void) {} ++static inline void vmi_bringup(void) {} ++#endif + + /* State needed to start an application processor in an SMP system. */ + struct vmi_ap_state { +diff --git a/include/linux/can/core.h b/include/linux/can/core.h +index e9ca210..f50785a 100644 +--- a/include/linux/can/core.h ++++ b/include/linux/can/core.h +@@ -19,7 +19,7 @@ + #include + #include + +-#define CAN_VERSION "20071116" ++#define CAN_VERSION "20081130" + + /* increment this number each time you change some user-space interface */ + #define CAN_ABI_VERSION "8" +diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c +index 8178724..e8ab096 100644 +--- a/kernel/sched_clock.c ++++ b/kernel/sched_clock.c +@@ -118,13 +118,13 @@ static u64 __update_sched_clock(struct sched_clock_data *scd, u64 now) + + /* + * scd->clock = clamp(scd->tick_gtod + delta, +- * max(scd->tick_gtod, scd->clock), +- * max(scd->clock, scd->tick_gtod + TICK_NSEC)); ++ * max(scd->tick_gtod, scd->clock), ++ * scd->tick_gtod + TICK_NSEC); + */ + + clock = scd->tick_gtod + delta; + min_clock = wrap_max(scd->tick_gtod, scd->clock); +- max_clock = wrap_max(scd->clock, scd->tick_gtod + TICK_NSEC); ++ max_clock = scd->tick_gtod + TICK_NSEC; + + clock = wrap_max(clock, min_clock); + clock = wrap_min(clock, max_clock); +diff --git a/lib/idr.c b/lib/idr.c +index 7a785a0..1c4f928 100644 +--- a/lib/idr.c ++++ b/lib/idr.c +@@ -220,8 +220,14 @@ build_up: + */ + while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) { + layers++; +- if (!p->count) ++ if (!p->count) { ++ /* special case: if the tree is currently empty, ++ * then we grow the tree by moving the top node ++ * upwards. ++ */ ++ p->layer++; + continue; ++ } + if (!(new = get_from_free_list(idp))) { + /* + * The allocation failed. If we built part of +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index ed5cdae..51daae5 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -4224,7 +4224,7 @@ void setup_per_zone_pages_min(void) + for_each_zone(zone) { + u64 tmp; + +- spin_lock_irqsave(&zone->lru_lock, flags); ++ spin_lock_irqsave(&zone->lock, flags); + tmp = (u64)pages_min * zone->present_pages; + do_div(tmp, lowmem_pages); + if (is_highmem(zone)) { +@@ -4256,7 +4256,7 @@ void setup_per_zone_pages_min(void) + zone->pages_low = zone->pages_min + (tmp >> 2); + zone->pages_high = zone->pages_min + (tmp >> 1); + setup_zone_migrate_reserve(zone); +- spin_unlock_irqrestore(&zone->lru_lock, flags); ++ spin_unlock_irqrestore(&zone->lock, flags); + } + + /* update totalreserve_pages */ +diff --git a/net/can/af_can.c b/net/can/af_can.c +index 8035fbf..150f0b2 100644 +--- a/net/can/af_can.c ++++ b/net/can/af_can.c +@@ -319,23 +319,52 @@ static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev) + return n ? d : NULL; + } + ++/** ++ * find_rcv_list - determine optimal filterlist inside device filter struct ++ * @can_id: pointer to CAN identifier of a given can_filter ++ * @mask: pointer to CAN mask of a given can_filter ++ * @d: pointer to the device filter struct ++ * ++ * Description: ++ * Returns the optimal filterlist to reduce the filter handling in the ++ * receive path. This function is called by service functions that need ++ * to register or unregister a can_filter in the filter lists. ++ * ++ * A filter matches in general, when ++ * ++ * & mask == can_id & mask ++ * ++ * so every bit set in the mask (even CAN_EFF_FLAG, CAN_RTR_FLAG) describe ++ * relevant bits for the filter. ++ * ++ * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can ++ * filter for error frames (CAN_ERR_FLAG bit set in mask). For error frames ++ * there is a special filterlist and a special rx path filter handling. ++ * ++ * Return: ++ * Pointer to optimal filterlist for the given can_id/mask pair. ++ * Constistency checked mask. ++ * Reduced can_id to have a preprocessed filter compare value. ++ */ + static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask, + struct dev_rcv_lists *d) + { + canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking */ + +- /* filter error frames */ ++ /* filter for error frames in extra filterlist */ + if (*mask & CAN_ERR_FLAG) { +- /* clear CAN_ERR_FLAG in list entry */ ++ /* clear CAN_ERR_FLAG in filter entry */ + *mask &= CAN_ERR_MASK; + return &d->rx[RX_ERR]; + } + +- /* ensure valid values in can_mask */ +- if (*mask & CAN_EFF_FLAG) +- *mask &= (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG); +- else +- *mask &= (CAN_SFF_MASK | CAN_RTR_FLAG); ++ /* with cleared CAN_ERR_FLAG we have a simple mask/value filterpair */ ++ ++#define CAN_EFF_RTR_FLAGS (CAN_EFF_FLAG | CAN_RTR_FLAG) ++ ++ /* ensure valid values in can_mask for 'SFF only' frame filtering */ ++ if ((*mask & CAN_EFF_FLAG) && !(*can_id & CAN_EFF_FLAG)) ++ *mask &= (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS); + + /* reduce condition testing at receive time */ + *can_id &= *mask; +@@ -348,15 +377,19 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask, + if (!(*mask)) + return &d->rx[RX_ALL]; + +- /* use extra filterset for the subscription of exactly *ONE* can_id */ +- if (*can_id & CAN_EFF_FLAG) { +- if (*mask == (CAN_EFF_MASK | CAN_EFF_FLAG)) { +- /* RFC: a use-case for hash-tables in the future? */ +- return &d->rx[RX_EFF]; ++ /* extra filterlists for the subscription of a single non-RTR can_id */ ++ if (((*mask & CAN_EFF_RTR_FLAGS) == CAN_EFF_RTR_FLAGS) ++ && !(*can_id & CAN_RTR_FLAG)) { ++ ++ if (*can_id & CAN_EFF_FLAG) { ++ if (*mask == (CAN_EFF_MASK | CAN_EFF_RTR_FLAGS)) { ++ /* RFC: a future use-case for hash-tables? */ ++ return &d->rx[RX_EFF]; ++ } ++ } else { ++ if (*mask == (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS)) ++ return &d->rx_sff[*can_id]; + } +- } else { +- if (*mask == CAN_SFF_MASK) +- return &d->rx_sff[*can_id]; + } + + /* default: filter via can_id/can_mask */ +@@ -589,7 +622,10 @@ static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb) + } + } + +- /* check CAN_ID specific entries */ ++ /* check filterlists for single non-RTR can_ids */ ++ if (can_id & CAN_RTR_FLAG) ++ return matches; ++ + if (can_id & CAN_EFF_FLAG) { + hlist_for_each_entry_rcu(r, n, &d->rx[RX_EFF], list) { + if (r->can_id == can_id) { +diff --git a/net/can/bcm.c b/net/can/bcm.c +index d0dd382..da0d426 100644 +--- a/net/can/bcm.c ++++ b/net/can/bcm.c +@@ -64,10 +64,11 @@ + #define BCM_CAN_DLC_MASK 0x0F /* clean private flags in can_dlc by masking */ + + /* get best masking value for can_rx_register() for a given single can_id */ +-#define REGMASK(id) ((id & CAN_RTR_FLAG) | ((id & CAN_EFF_FLAG) ? \ +- (CAN_EFF_MASK | CAN_EFF_FLAG) : CAN_SFF_MASK)) ++#define REGMASK(id) ((id & CAN_EFF_FLAG) ? \ ++ (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \ ++ (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG)) + +-#define CAN_BCM_VERSION "20080415" ++#define CAN_BCM_VERSION CAN_VERSION + static __initdata const char banner[] = KERN_INFO + "can: broadcast manager protocol (rev " CAN_BCM_VERSION ")\n"; + +diff --git a/net/core/dev.c b/net/core/dev.c +index 0ae08d3..5a25896 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -3990,7 +3990,7 @@ int register_netdevice(struct net_device *dev) + dev->features &= ~NETIF_F_TSO; + } + if (dev->features & NETIF_F_UFO) { +- if (!(dev->features & NETIF_F_HW_CSUM)) { ++ if (!(dev->features & NETIF_F_GEN_CSUM)) { + printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no " + "NETIF_F_HW_CSUM feature.\n", + dev->name); +diff --git a/net/key/af_key.c b/net/key/af_key.c +index b7f5a1c..ef3b4d5 100644 +--- a/net/key/af_key.c ++++ b/net/key/af_key.c +@@ -2051,7 +2051,6 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in + req_size += socklen * 2; + } else { + size -= 2*socklen; +- socklen = 0; + } + rq = (void*)skb_put(skb, req_size); + pol->sadb_x_policy_len += req_size/8; +diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c +index 744b79f..4028502 100644 +--- a/net/sunrpc/auth_generic.c ++++ b/net/sunrpc/auth_generic.c +@@ -133,13 +133,29 @@ static int + generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) + { + struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); ++ int i; + + if (gcred->acred.uid != acred->uid || + gcred->acred.gid != acred->gid || +- gcred->acred.group_info != acred->group_info || + gcred->acred.machine_cred != acred->machine_cred) +- return 0; ++ goto out_nomatch; ++ ++ /* Optimisation in the case where pointers are identical... */ ++ if (gcred->acred.group_info == acred->group_info) ++ goto out_match; ++ ++ /* Slow path... */ ++ if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) ++ goto out_nomatch; ++ for (i = 0; i < gcred->acred.group_info->ngroups; i++) { ++ if (GROUP_AT(gcred->acred.group_info, i) != ++ GROUP_AT(acred->group_info, i)) ++ goto out_nomatch; ++ } ++out_match: + return 1; ++out_nomatch: ++ return 0; + } + + void __init rpc_init_generic_auth(void) diff --git a/debian/patches/series/1~experimental.1 b/debian/patches/series/1~experimental.1 index 9ed3e603e..ea65598b7 100644 --- a/debian/patches/series/1~experimental.1 +++ b/debian/patches/series/1~experimental.1 @@ -34,3 +34,4 @@ + bugfix/all/stable/patch-2.6.27.7 + bugfix/all/stable/patch-2.6.27.8 + bugfix/all/stable/patch-2.6.27.9 ++ bugfix/all/stable/patch-2.6.27.10