From 5c0353aa487a28074d07b232f07823d2a2da068b Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Sat, 23 Jan 2010 02:21:37 +0000 Subject: [PATCH] Add stable release 2.6.32.5; remove obsolete patch not yet released svn path=/dists/trunk/linux-2.6/; revision=14985 --- debian/changelog | 6 +- ...remove-poll_mode_io-world-write-perm.patch | 23 - .../patches/bugfix/all/stable/2.6.32.5.patch | 1021 +++++++++++++++++ debian/patches/series/6 | 2 +- 4 files changed, 1026 insertions(+), 26 deletions(-) delete mode 100644 debian/patches/bugfix/all/megaraid_sas-remove-poll_mode_io-world-write-perm.patch create mode 100644 debian/patches/bugfix/all/stable/2.6.32.5.patch diff --git a/debian/changelog b/debian/changelog index 4beaa9031..a3e90687a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -32,13 +32,15 @@ linux-2.6 (2.6.32-6) UNRELEASED; urgency=low - Fix DMA mapping for i915 driver (Closes: #558237) + drm: remove address mask param for drm_pci_alloc() + agp/intel-agp: Clear entire GTT on startup - * SCSI/megaraid_sas: remove sysfs poll_mode_io world writeable permissions - (CVE-2009-3939) * e1000,e1000e: Discard all fragments of received over-length packets (CVE-2009-4536, CVE-2009-4538) * Enable the '686' configuration options in '686-vserver' packages and the '686-bigmem' configuration options in '686-bigmem-vserver' packages (Closes: #566213) + * Add stable release 2.6.32.5: + - inotify: do not reuse watch descriptors (Closes: #561880) + - megaraid_sas: remove sysfs poll_mode_io world writeable permissions + (CVE-2009-3939) (Closes: #562975) [ Ian Campbell ] * xen: Enable up to 32G of guest memory on i386. diff --git a/debian/patches/bugfix/all/megaraid_sas-remove-poll_mode_io-world-write-perm.patch b/debian/patches/bugfix/all/megaraid_sas-remove-poll_mode_io-world-write-perm.patch deleted file mode 100644 index 76ef8e139..000000000 --- a/debian/patches/bugfix/all/megaraid_sas-remove-poll_mode_io-world-write-perm.patch +++ /dev/null @@ -1,23 +0,0 @@ -Based on: - -From: Bryn M. Reeves -Subject: [PATCH] [SCSI] megaraid_sas: remove sysfs poll_mode_io world writeable permissions - -/sys/bus/pci/drivers/megaraid_sas/poll_mode_io defaults to being -world-writable, which seems bad (letting any user affect kernel driver -behavior). - -This turns off group and user write permissions, so that on typical -production systems only root can write to it. - ---- a/drivers/scsi/megaraid/megaraid_sas.c -+++ b/drivers/scsi/megaraid/megaraid_sas.c -@@ -3451,7 +3451,7 @@ - return retval; - } - --static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUGO, -+static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUSR, - megasas_sysfs_show_poll_mode_io, - megasas_sysfs_set_poll_mode_io); - diff --git a/debian/patches/bugfix/all/stable/2.6.32.5.patch b/debian/patches/bugfix/all/stable/2.6.32.5.patch new file mode 100644 index 000000000..5857bbe74 --- /dev/null +++ b/debian/patches/bugfix/all/stable/2.6.32.5.patch @@ -0,0 +1,1021 @@ +diff --git a/Makefile b/Makefile +index 6d13598..4ebd3f1 100644 +diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c +index e8dfdbd..cadbed6 100644 +--- a/arch/powerpc/kernel/pci-common.c ++++ b/arch/powerpc/kernel/pci-common.c +@@ -1107,6 +1107,12 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus) + list_for_each_entry(dev, &bus->devices, bus_list) { + struct dev_archdata *sd = &dev->dev.archdata; + ++ /* Cardbus can call us to add new devices to a bus, so ignore ++ * those who are already fully discovered ++ */ ++ if (dev->is_added) ++ continue; ++ + /* Setup OF node pointer in archdata */ + sd->of_node = pci_device_to_OF_node(dev); + +@@ -1147,6 +1153,13 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) + } + EXPORT_SYMBOL(pcibios_fixup_bus); + ++void __devinit pci_fixup_cardbus(struct pci_bus *bus) ++{ ++ /* Now fixup devices on that bus */ ++ pcibios_setup_bus_devices(bus); ++} ++ ++ + static int skip_isa_ioresource_align(struct pci_dev *dev) + { + if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) && +diff --git a/arch/sparc/kernel/nmi.c b/arch/sparc/kernel/nmi.c +index b129611..4771274 100644 +--- a/arch/sparc/kernel/nmi.c ++++ b/arch/sparc/kernel/nmi.c +@@ -96,7 +96,6 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) + int cpu = smp_processor_id(); + + clear_softint(1 << irq); +- pcr_ops->write(PCR_PIC_PRIV); + + local_cpu_data().__nmi_count++; + +@@ -105,6 +104,8 @@ notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) + if (notify_die(DIE_NMI, "nmi", regs, 0, + pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP) + touched = 1; ++ else ++ pcr_ops->write(PCR_PIC_PRIV); + + sum = kstat_irqs_cpu(0, cpu); + if (__get_cpu_var(nmi_touch)) { +diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c +index fa5936e..198fb4e 100644 +--- a/arch/sparc/kernel/perf_event.c ++++ b/arch/sparc/kernel/perf_event.c +@@ -986,6 +986,17 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self, + data.addr = 0; + + cpuc = &__get_cpu_var(cpu_hw_events); ++ ++ /* If the PMU has the TOE IRQ enable bits, we need to do a ++ * dummy write to the %pcr to clear the overflow bits and thus ++ * the interrupt. ++ * ++ * Do this before we peek at the counters to determine ++ * overflow so we don't lose any events. ++ */ ++ if (sparc_pmu->irq_bit) ++ pcr_ops->write(cpuc->pcr); ++ + for (idx = 0; idx < MAX_HWEVENTS; idx++) { + struct perf_event *event = cpuc->events[idx]; + struct hw_perf_event *hwc; +diff --git a/arch/x86/kernel/apic/apic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c +index d0c99ab..873f81f 100644 +--- a/arch/x86/kernel/apic/apic_flat_64.c ++++ b/arch/x86/kernel/apic/apic_flat_64.c +@@ -240,6 +240,11 @@ static int physflat_acpi_madt_oem_check(char *oem_id, char *oem_table_id) + printk(KERN_DEBUG "system APIC only can use physical flat"); + return 1; + } ++ ++ if (!strncmp(oem_id, "IBM", 3) && !strncmp(oem_table_id, "EXA", 3)) { ++ printk(KERN_DEBUG "IBM Summit detected, will use apic physical"); ++ return 1; ++ } + #endif + + return 0; +diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c +index 2ab3535..9ee87cf 100644 +--- a/arch/x86/kernel/apic/x2apic_uv_x.c ++++ b/arch/x86/kernel/apic/x2apic_uv_x.c +@@ -364,13 +364,13 @@ static __init void get_lowmem_redirect(unsigned long *base, unsigned long *size) + + enum map_type {map_wb, map_uc}; + +-static __init void map_high(char *id, unsigned long base, int shift, +- int max_pnode, enum map_type map_type) ++static __init void map_high(char *id, unsigned long base, int pshift, ++ int bshift, int max_pnode, enum map_type map_type) + { + unsigned long bytes, paddr; + +- paddr = base << shift; +- bytes = (1UL << shift) * (max_pnode + 1); ++ paddr = base << pshift; ++ bytes = (1UL << bshift) * (max_pnode + 1); + printk(KERN_INFO "UV: Map %s_HI 0x%lx - 0x%lx\n", id, paddr, + paddr + bytes); + if (map_type == map_uc) +@@ -386,7 +386,7 @@ static __init void map_gru_high(int max_pnode) + + gru.v = uv_read_local_mmr(UVH_RH_GAM_GRU_OVERLAY_CONFIG_MMR); + if (gru.s.enable) +- map_high("GRU", gru.s.base, shift, max_pnode, map_wb); ++ map_high("GRU", gru.s.base, shift, shift, max_pnode, map_wb); + } + + static __init void map_mmr_high(int max_pnode) +@@ -396,7 +396,7 @@ static __init void map_mmr_high(int max_pnode) + + mmr.v = uv_read_local_mmr(UVH_RH_GAM_MMR_OVERLAY_CONFIG_MMR); + if (mmr.s.enable) +- map_high("MMR", mmr.s.base, shift, max_pnode, map_uc); ++ map_high("MMR", mmr.s.base, shift, shift, max_pnode, map_uc); + } + + static __init void map_mmioh_high(int max_pnode) +@@ -406,7 +406,8 @@ static __init void map_mmioh_high(int max_pnode) + + mmioh.v = uv_read_local_mmr(UVH_RH_GAM_MMIOH_OVERLAY_CONFIG_MMR); + if (mmioh.s.enable) +- map_high("MMIOH", mmioh.s.base, shift, max_pnode, map_uc); ++ map_high("MMIOH", mmioh.s.base, shift, mmioh.s.m_io, ++ max_pnode, map_uc); + } + + static __init void uv_rtc_init(void) +diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c +index 4fef985..687638e 100644 +--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c ++++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c +@@ -274,8 +274,9 @@ void intel_init_thermal(struct cpuinfo_x86 *c) + int tm2 = 0; + u32 l, h; + +- /* Thermal monitoring depends on ACPI and clock modulation*/ +- if (!cpu_has(c, X86_FEATURE_ACPI) || !cpu_has(c, X86_FEATURE_ACC)) ++ /* Thermal monitoring depends on APIC, ACPI and clock modulation */ ++ if (!cpu_has_apic || !cpu_has(c, X86_FEATURE_ACPI) || ++ !cpu_has(c, X86_FEATURE_ACC)) + return; + + /* +diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c +index 77a9579..adc10a2 100644 +--- a/drivers/edac/i5000_edac.c ++++ b/drivers/edac/i5000_edac.c +@@ -577,7 +577,13 @@ static void i5000_process_nonfatal_error_info(struct mem_ctl_info *mci, + debugf0("\tUncorrected bits= 0x%x\n", ue_errors); + + branch = EXTRACT_FBDCHAN_INDX(info->ferr_nf_fbd); +- channel = branch; ++ ++ /* ++ * According with i5000 datasheet, bit 28 has no significance ++ * for errors M4Err-M12Err and M17Err-M21Err, on FERR_NF_FBD ++ */ ++ channel = branch & 2; ++ + bank = NREC_BANK(info->nrecmema); + rank = NREC_RANK(info->nrecmema); + rdwr = NREC_RDWR(info->nrecmema); +diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c +index aa7fd82..7d1357e 100644 +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -255,7 +255,6 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev) + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + int ret = IRQ_NONE; + u32 de_iir, gt_iir, de_ier; +- u32 new_de_iir, new_gt_iir; + struct drm_i915_master_private *master_priv; + + /* disable master interrupt before clearing iir */ +@@ -266,35 +265,29 @@ irqreturn_t igdng_irq_handler(struct drm_device *dev) + de_iir = I915_READ(DEIIR); + gt_iir = I915_READ(GTIIR); + +- for (;;) { +- if (de_iir == 0 && gt_iir == 0) +- break; +- +- ret = IRQ_HANDLED; +- +- I915_WRITE(DEIIR, de_iir); +- new_de_iir = I915_READ(DEIIR); +- I915_WRITE(GTIIR, gt_iir); +- new_gt_iir = I915_READ(GTIIR); ++ if (de_iir == 0 && gt_iir == 0) ++ goto done; + +- if (dev->primary->master) { +- master_priv = dev->primary->master->driver_priv; +- if (master_priv->sarea_priv) +- master_priv->sarea_priv->last_dispatch = +- READ_BREADCRUMB(dev_priv); +- } ++ ret = IRQ_HANDLED; + +- if (gt_iir & GT_USER_INTERRUPT) { +- u32 seqno = i915_get_gem_seqno(dev); +- dev_priv->mm.irq_gem_seqno = seqno; +- trace_i915_gem_request_complete(dev, seqno); +- DRM_WAKEUP(&dev_priv->irq_queue); +- } ++ if (dev->primary->master) { ++ master_priv = dev->primary->master->driver_priv; ++ if (master_priv->sarea_priv) ++ master_priv->sarea_priv->last_dispatch = ++ READ_BREADCRUMB(dev_priv); ++ } + +- de_iir = new_de_iir; +- gt_iir = new_gt_iir; ++ if (gt_iir & GT_USER_INTERRUPT) { ++ u32 seqno = i915_get_gem_seqno(dev); ++ dev_priv->mm.irq_gem_seqno = seqno; ++ trace_i915_gem_request_complete(dev, seqno); ++ DRM_WAKEUP(&dev_priv->irq_queue); + } + ++ I915_WRITE(GTIIR, gt_iir); ++ I915_WRITE(DEIIR, de_iir); ++ ++done: + I915_WRITE(DEIER, de_ier); + (void)I915_READ(DEIER); + +diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c +index 4b96e7a..5b4d66d 100644 +--- a/drivers/hid/hid-apple.c ++++ b/drivers/hid/hid-apple.c +@@ -431,6 +431,13 @@ static const struct hid_device_id apple_devices[] = { + .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), + .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), ++ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), ++ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | ++ APPLE_ISO_KEYBOARD }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS), ++ .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), + .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 7d05c4b..9678354 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1287,6 +1287,9 @@ static const struct hid_device_id hid_blacklist[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) }, ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) }, + { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) }, +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index adbef5d..e380e7b 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -88,6 +88,9 @@ + #define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 + #define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 + #define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 ++#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239 ++#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a ++#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b + #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a + #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b + #define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 +diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c +index 0ed68e2..f7346a9 100644 +--- a/drivers/i2c/busses/i2c-pca-isa.c ++++ b/drivers/i2c/busses/i2c-pca-isa.c +@@ -75,7 +75,7 @@ static int pca_isa_waitforcompletion(void *pd) + unsigned long timeout; + + if (irq > -1) { +- ret = wait_event_interruptible_timeout(pca_wait, ++ ret = wait_event_timeout(pca_wait, + pca_isa_readbyte(pd, I2C_PCA_CON) + & I2C_PCA_CON_SI, pca_isa_ops.timeout); + } else { +@@ -96,7 +96,7 @@ static void pca_isa_resetchip(void *pd) + } + + static irqreturn_t pca_handler(int this_irq, void *dev_id) { +- wake_up_interruptible(&pca_wait); ++ wake_up(&pca_wait); + return IRQ_HANDLED; + } + +diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c +index c4df9d4..5b2213d 100644 +--- a/drivers/i2c/busses/i2c-pca-platform.c ++++ b/drivers/i2c/busses/i2c-pca-platform.c +@@ -84,7 +84,7 @@ static int i2c_pca_pf_waitforcompletion(void *pd) + unsigned long timeout; + + if (i2c->irq) { +- ret = wait_event_interruptible_timeout(i2c->wait, ++ ret = wait_event_timeout(i2c->wait, + i2c->algo_data.read_byte(i2c, I2C_PCA_CON) + & I2C_PCA_CON_SI, i2c->adap.timeout); + } else { +@@ -122,7 +122,7 @@ static irqreturn_t i2c_pca_pf_handler(int this_irq, void *dev_id) + if ((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0) + return IRQ_NONE; + +- wake_up_interruptible(&i2c->wait); ++ wake_up(&i2c->wait); + + return IRQ_HANDLED; + } +diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c +index 2965043..3bf7b0a 100644 +--- a/drivers/i2c/i2c-core.c ++++ b/drivers/i2c/i2c-core.c +@@ -801,6 +801,9 @@ int i2c_del_adapter(struct i2c_adapter *adap) + adap->dev.parent); + #endif + ++ /* device name is gone after device_unregister */ ++ dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); ++ + /* clean up the sysfs representation */ + init_completion(&adap->dev_released); + device_unregister(&adap->dev); +@@ -813,8 +816,6 @@ int i2c_del_adapter(struct i2c_adapter *adap) + idr_remove(&i2c_adapter_idr, adap->nr); + mutex_unlock(&core_lock); + +- dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); +- + /* Clear the device structure in case this adapter is ever going to be + added again */ + memset(&adap->dev, 0, sizeof(adap->dev)); +diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c +index 07c5379..0876d82 100644 +--- a/drivers/input/mouse/psmouse-base.c ++++ b/drivers/input/mouse/psmouse-base.c +@@ -667,19 +667,6 @@ static int psmouse_extensions(struct psmouse *psmouse, + max_proto = PSMOUSE_IMEX; + } + +-/* +- * Try Finger Sensing Pad +- */ +- if (max_proto > PSMOUSE_IMEX) { +- if (fsp_detect(psmouse, set_properties) == 0) { +- if (!set_properties || fsp_init(psmouse) == 0) +- return PSMOUSE_FSP; +-/* +- * Init failed, try basic relative protocols +- */ +- max_proto = PSMOUSE_IMEX; +- } +- } + + if (max_proto > PSMOUSE_IMEX) { + if (genius_detect(psmouse, set_properties) == 0) +@@ -696,6 +683,21 @@ static int psmouse_extensions(struct psmouse *psmouse, + } + + /* ++ * Try Finger Sensing Pad. We do it here because its probe upsets ++ * Trackpoint devices (causing TP_READ_ID command to time out). ++ */ ++ if (max_proto > PSMOUSE_IMEX) { ++ if (fsp_detect(psmouse, set_properties) == 0) { ++ if (!set_properties || fsp_init(psmouse) == 0) ++ return PSMOUSE_FSP; ++/* ++ * Init failed, try basic relative protocols ++ */ ++ max_proto = PSMOUSE_IMEX; ++ } ++ } ++ ++/* + * Reset to defaults in case the device got confused by extended + * protocol probes. Note that we follow up with full reset because + * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS. +diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c +index cdad3db..e0a3b75 100644 +--- a/drivers/media/video/gspca/sn9c20x.c ++++ b/drivers/media/video/gspca/sn9c20x.c +@@ -2319,7 +2319,7 @@ static void do_autogain(struct gspca_dev *gspca_dev, u16 avg_lum) + } + } + if (avg_lum > MAX_AVG_LUM) { +- if (sd->gain - 1 >= 0) { ++ if (sd->gain >= 1) { + sd->gain--; + set_gain(gspca_dev); + } +diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c +index ba27c9d..ca6b098 100644 +--- a/drivers/mfd/wm8350-core.c ++++ b/drivers/mfd/wm8350-core.c +@@ -134,8 +134,7 @@ static inline int is_reg_locked(struct wm8350 *wm8350, u8 reg) + wm8350->reg_cache[WM8350_SECURITY] == WM8350_UNLOCK_KEY) + return 0; + +- if ((reg == WM8350_GPIO_CONFIGURATION_I_O) || +- (reg >= WM8350_GPIO_FUNCTION_SELECT_1 && ++ if ((reg >= WM8350_GPIO_FUNCTION_SELECT_1 && + reg <= WM8350_GPIO_FUNCTION_SELECT_4) || + (reg >= WM8350_BATTERY_CHARGER_CONTROL_1 && + reg <= WM8350_BATTERY_CHARGER_CONTROL_3)) +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 4e4c295..6477722 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -2723,6 +2723,11 @@ int __attribute__ ((weak)) pci_ext_cfg_avail(struct pci_dev *dev) + return 1; + } + ++void __weak pci_fixup_cardbus(struct pci_bus *bus) ++{ ++} ++EXPORT_SYMBOL(pci_fixup_cardbus); ++ + static int __init pci_setup(char *str) + { + while (str) { +diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c +index db77e1f..5c26793 100644 +--- a/drivers/pcmcia/cardbus.c ++++ b/drivers/pcmcia/cardbus.c +@@ -214,7 +214,7 @@ int __ref cb_alloc(struct pcmcia_socket * s) + unsigned int max, pass; + + s->functions = pci_scan_slot(bus, PCI_DEVFN(0, 0)); +-// pcibios_fixup_bus(bus); ++ pci_fixup_cardbus(bus); + + max = bus->secondary; + for (pass = 0; pass < 2; pass++) +diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c +index 849359a..767cb61 100644 +--- a/drivers/platform/x86/asus-laptop.c ++++ b/drivers/platform/x86/asus-laptop.c +@@ -221,6 +221,7 @@ static struct asus_hotk *hotk; + */ + static const struct acpi_device_id asus_device_ids[] = { + {"ATK0100", 0}, ++ {"ATK0101", 0}, + {"", 0}, + }; + MODULE_DEVICE_TABLE(acpi, asus_device_ids); +@@ -293,6 +294,11 @@ struct key_entry { + enum { KE_KEY, KE_END }; + + static struct key_entry asus_keymap[] = { ++ {KE_KEY, 0x02, KEY_SCREENLOCK}, ++ {KE_KEY, 0x05, KEY_WLAN}, ++ {KE_KEY, 0x08, BTN_TOUCH}, ++ {KE_KEY, 0x17, KEY_ZOOM}, ++ {KE_KEY, 0x1f, KEY_BATTERY}, + {KE_KEY, 0x30, KEY_VOLUMEUP}, + {KE_KEY, 0x31, KEY_VOLUMEDOWN}, + {KE_KEY, 0x32, KEY_MUTE}, +@@ -312,6 +318,8 @@ static struct key_entry asus_keymap[] = { + {KE_KEY, 0x5F, KEY_WLAN}, + {KE_KEY, 0x60, KEY_SWITCHVIDEOMODE}, + {KE_KEY, 0x61, KEY_SWITCHVIDEOMODE}, ++ {KE_KEY, 0x62, KEY_SWITCHVIDEOMODE}, ++ {KE_KEY, 0x63, KEY_SWITCHVIDEOMODE}, + {KE_KEY, 0x6B, BTN_TOUCH}, /* Lock Mouse */ + {KE_KEY, 0x82, KEY_CAMERA}, + {KE_KEY, 0x8A, KEY_PROG1}, +diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c +index 507ccc6..518712c 100644 +--- a/drivers/scsi/megaraid/megaraid_sas.c ++++ b/drivers/scsi/megaraid/megaraid_sas.c +@@ -3451,7 +3451,7 @@ out: + return retval; + } + +-static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUGO, ++static DRIVER_ATTR(poll_mode_io, S_IRUGO|S_IWUSR, + megasas_sysfs_show_poll_mode_io, + megasas_sysfs_set_poll_mode_io); + +diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c +index d71dfe3..0cce8a4 100644 +--- a/drivers/serial/8250_pnp.c ++++ b/drivers/serial/8250_pnp.c +@@ -354,6 +354,8 @@ static const struct pnp_device_id pnp_dev_table[] = { + { "FUJ02E5", 0 }, + /* Fujitsu P-series tablet PC device */ + { "FUJ02E6", 0 }, ++ /* Fujitsu Wacom 2FGT Tablet PC device */ ++ { "FUJ02E7", 0 }, + /* + * LG C1 EXPRESS DUAL (C1-PB11A3) touch screen (actually a FUJ02E6 in + * disguise) +diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c +index adf9632..53cb722 100644 +--- a/drivers/video/s3c-fb.c ++++ b/drivers/video/s3c-fb.c +@@ -211,21 +211,23 @@ static int s3c_fb_check_var(struct fb_var_screeninfo *var, + + /** + * s3c_fb_calc_pixclk() - calculate the divider to create the pixel clock. +- * @id: window id. + * @sfb: The hardware state. + * @pixclock: The pixel clock wanted, in picoseconds. + * + * Given the specified pixel clock, work out the necessary divider to get + * close to the output frequency. + */ +-static int s3c_fb_calc_pixclk(unsigned char id, struct s3c_fb *sfb, unsigned int pixclk) ++static int s3c_fb_calc_pixclk(struct s3c_fb *sfb, unsigned int pixclk) + { +- struct s3c_fb_pd_win *win = sfb->pdata->win[id]; + unsigned long clk = clk_get_rate(sfb->bus_clk); ++ unsigned long long tmp; + unsigned int result; + +- pixclk *= win->win_mode.refresh; +- result = clk / pixclk; ++ tmp = (unsigned long long)clk; ++ tmp *= pixclk; ++ ++ do_div(tmp, 1000000000UL); ++ result = (unsigned int)tmp / 1000; + + dev_dbg(sfb->dev, "pixclk=%u, clk=%lu, div=%d (%lu)\n", + pixclk, clk, result, clk / result); +@@ -301,7 +303,7 @@ static int s3c_fb_set_par(struct fb_info *info) + /* use window 0 as the basis for the lcd output timings */ + + if (win_no == 0) { +- clkdiv = s3c_fb_calc_pixclk(win_no, sfb, var->pixclock); ++ clkdiv = s3c_fb_calc_pixclk(sfb, var->pixclock); + + data = sfb->pdata->vidcon0; + data &= ~(VIDCON0_CLKVAL_F_MASK | VIDCON0_CLKDIR); +diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c +index c9ee67b..1afb0a1 100644 +--- a/fs/notify/inotify/inotify_fsnotify.c ++++ b/fs/notify/inotify/inotify_fsnotify.c +@@ -121,7 +121,7 @@ static int idr_callback(int id, void *p, void *data) + if (warned) + return 0; + +- warned = false; ++ warned = true; + entry = p; + ientry = container_of(entry, struct inotify_inode_mark_entry, fsn_entry); + +diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c +index dcd2040..ca44337 100644 +--- a/fs/notify/inotify/inotify_user.c ++++ b/fs/notify/inotify/inotify_user.c +@@ -558,7 +558,7 @@ retry: + + spin_lock(&group->inotify_data.idr_lock); + ret = idr_get_new_above(&group->inotify_data.idr, &tmp_ientry->fsn_entry, +- group->inotify_data.last_wd, ++ group->inotify_data.last_wd+1, + &tmp_ientry->wd); + spin_unlock(&group->inotify_data.idr_lock); + if (ret) { +@@ -638,7 +638,7 @@ static struct fsnotify_group *inotify_new_group(struct user_struct *user, unsign + + spin_lock_init(&group->inotify_data.idr_lock); + idr_init(&group->inotify_data.idr); +- group->inotify_data.last_wd = 1; ++ group->inotify_data.last_wd = 0; + group->inotify_data.user = user; + group->inotify_data.fa = NULL; + +diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c +index a14d6cd..d240c15 100644 +--- a/fs/reiserfs/inode.c ++++ b/fs/reiserfs/inode.c +@@ -2531,6 +2531,12 @@ static int reiserfs_writepage(struct page *page, struct writeback_control *wbc) + return reiserfs_write_full_page(page, wbc); + } + ++static void reiserfs_truncate_failed_write(struct inode *inode) ++{ ++ truncate_inode_pages(inode->i_mapping, inode->i_size); ++ reiserfs_truncate_file(inode, 0); ++} ++ + static int reiserfs_write_begin(struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, +@@ -2597,6 +2603,8 @@ static int reiserfs_write_begin(struct file *file, + if (ret) { + unlock_page(page); + page_cache_release(page); ++ /* Truncate allocated blocks */ ++ reiserfs_truncate_failed_write(inode); + } + return ret; + } +@@ -2689,8 +2697,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, + ** transaction tracking stuff when the size changes. So, we have + ** to do the i_size updates here. + */ +- pos += copied; +- if (pos > inode->i_size) { ++ if (pos + copied > inode->i_size) { + struct reiserfs_transaction_handle myth; + reiserfs_write_lock(inode->i_sb); + /* If the file have grown beyond the border where it +@@ -2708,7 +2715,7 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, + goto journal_error; + } + reiserfs_update_inode_transaction(inode); +- inode->i_size = pos; ++ inode->i_size = pos + copied; + /* + * this will just nest into our transaction. It's important + * to use mark_inode_dirty so the inode gets pushed around on the +@@ -2735,6 +2742,10 @@ static int reiserfs_write_end(struct file *file, struct address_space *mapping, + out: + unlock_page(page); + page_cache_release(page); ++ ++ if (pos + len > inode->i_size) ++ reiserfs_truncate_failed_write(inode); ++ + return ret == 0 ? copied : ret; + + journal_error: +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 221cecd..adf99c6 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -1114,11 +1114,18 @@ static inline int queue_alignment_offset(struct request_queue *q) + return q->limits.alignment_offset; + } + ++static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t offset) ++{ ++ unsigned int granularity = max(lim->physical_block_size, lim->io_min); ++ ++ offset &= granularity - 1; ++ return (granularity + lim->alignment_offset - offset) & (granularity - 1); ++} ++ + static inline int queue_sector_alignment_offset(struct request_queue *q, + sector_t sector) + { +- return ((sector << 9) - q->limits.alignment_offset) +- & (q->limits.io_min - 1); ++ return queue_limit_alignment_offset(&q->limits, sector << 9); + } + + static inline int bdev_alignment_offset(struct block_device *bdev) +diff --git a/include/linux/mfd/wm8350/pmic.h b/include/linux/mfd/wm8350/pmic.h +index be3264e..e786fe9 100644 +--- a/include/linux/mfd/wm8350/pmic.h ++++ b/include/linux/mfd/wm8350/pmic.h +@@ -666,20 +666,20 @@ + #define WM8350_ISINK_FLASH_DUR_64MS (1 << 8) + #define WM8350_ISINK_FLASH_DUR_96MS (2 << 8) + #define WM8350_ISINK_FLASH_DUR_1024MS (3 << 8) +-#define WM8350_ISINK_FLASH_ON_INSTANT (0 << 4) +-#define WM8350_ISINK_FLASH_ON_0_25S (1 << 4) +-#define WM8350_ISINK_FLASH_ON_0_50S (2 << 4) +-#define WM8350_ISINK_FLASH_ON_1_00S (3 << 4) +-#define WM8350_ISINK_FLASH_ON_1_95S (1 << 4) +-#define WM8350_ISINK_FLASH_ON_3_91S (2 << 4) +-#define WM8350_ISINK_FLASH_ON_7_80S (3 << 4) +-#define WM8350_ISINK_FLASH_OFF_INSTANT (0 << 0) +-#define WM8350_ISINK_FLASH_OFF_0_25S (1 << 0) +-#define WM8350_ISINK_FLASH_OFF_0_50S (2 << 0) +-#define WM8350_ISINK_FLASH_OFF_1_00S (3 << 0) +-#define WM8350_ISINK_FLASH_OFF_1_95S (1 << 0) +-#define WM8350_ISINK_FLASH_OFF_3_91S (2 << 0) +-#define WM8350_ISINK_FLASH_OFF_7_80S (3 << 0) ++#define WM8350_ISINK_FLASH_ON_INSTANT (0 << 0) ++#define WM8350_ISINK_FLASH_ON_0_25S (1 << 0) ++#define WM8350_ISINK_FLASH_ON_0_50S (2 << 0) ++#define WM8350_ISINK_FLASH_ON_1_00S (3 << 0) ++#define WM8350_ISINK_FLASH_ON_1_95S (1 << 0) ++#define WM8350_ISINK_FLASH_ON_3_91S (2 << 0) ++#define WM8350_ISINK_FLASH_ON_7_80S (3 << 0) ++#define WM8350_ISINK_FLASH_OFF_INSTANT (0 << 4) ++#define WM8350_ISINK_FLASH_OFF_0_25S (1 << 4) ++#define WM8350_ISINK_FLASH_OFF_0_50S (2 << 4) ++#define WM8350_ISINK_FLASH_OFF_1_00S (3 << 4) ++#define WM8350_ISINK_FLASH_OFF_1_95S (1 << 4) ++#define WM8350_ISINK_FLASH_OFF_3_91S (2 << 4) ++#define WM8350_ISINK_FLASH_OFF_7_80S (3 << 4) + + /* + * Regulator Interrupts. +diff --git a/include/linux/pci.h b/include/linux/pci.h +index f5c7cd3..2547515 100644 +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -564,6 +564,9 @@ void pcibios_align_resource(void *, struct resource *, resource_size_t, + resource_size_t); + void pcibios_update_irq(struct pci_dev *, int irq); + ++/* Weak but can be overriden by arch */ ++void pci_fixup_cardbus(struct pci_bus *); ++ + /* Generic PCI functions used internally */ + + extern struct pci_bus *pci_find_bus(int domain, int busnr); +diff --git a/kernel/futex.c b/kernel/futex.c +index d73ef1f..3b74909 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -203,8 +203,6 @@ static void drop_futex_key_refs(union futex_key *key) + * @uaddr: virtual address of the futex + * @fshared: 0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED + * @key: address where result is stored. +- * @rw: mapping needs to be read/write (values: VERIFY_READ, +- * VERIFY_WRITE) + * + * Returns a negative error code or 0 + * The key words are stored in *key on success. +@@ -216,7 +214,7 @@ static void drop_futex_key_refs(union futex_key *key) + * lock_page() might sleep, the caller should not hold a spinlock. + */ + static int +-get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) ++get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key) + { + unsigned long address = (unsigned long)uaddr; + struct mm_struct *mm = current->mm; +@@ -239,7 +237,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) + * but access_ok() should be faster than find_vma() + */ + if (!fshared) { +- if (unlikely(!access_ok(rw, uaddr, sizeof(u32)))) ++ if (unlikely(!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))) + return -EFAULT; + key->private.mm = mm; + key->private.address = address; +@@ -248,7 +246,7 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) + } + + again: +- err = get_user_pages_fast(address, 1, rw == VERIFY_WRITE, &page); ++ err = get_user_pages_fast(address, 1, 1, &page); + if (err < 0) + return err; + +@@ -867,7 +865,7 @@ static int futex_wake(u32 __user *uaddr, int fshared, int nr_wake, u32 bitset) + if (!bitset) + return -EINVAL; + +- ret = get_futex_key(uaddr, fshared, &key, VERIFY_READ); ++ ret = get_futex_key(uaddr, fshared, &key); + if (unlikely(ret != 0)) + goto out; + +@@ -913,10 +911,10 @@ futex_wake_op(u32 __user *uaddr1, int fshared, u32 __user *uaddr2, + int ret, op_ret; + + retry: +- ret = get_futex_key(uaddr1, fshared, &key1, VERIFY_READ); ++ ret = get_futex_key(uaddr1, fshared, &key1); + if (unlikely(ret != 0)) + goto out; +- ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE); ++ ret = get_futex_key(uaddr2, fshared, &key2); + if (unlikely(ret != 0)) + goto out_put_key1; + +@@ -1175,11 +1173,10 @@ retry: + pi_state = NULL; + } + +- ret = get_futex_key(uaddr1, fshared, &key1, VERIFY_READ); ++ ret = get_futex_key(uaddr1, fshared, &key1); + if (unlikely(ret != 0)) + goto out; +- ret = get_futex_key(uaddr2, fshared, &key2, +- requeue_pi ? VERIFY_WRITE : VERIFY_READ); ++ ret = get_futex_key(uaddr2, fshared, &key2); + if (unlikely(ret != 0)) + goto out_put_key1; + +@@ -1738,7 +1735,7 @@ static int futex_wait_setup(u32 __user *uaddr, u32 val, int fshared, + */ + retry: + q->key = FUTEX_KEY_INIT; +- ret = get_futex_key(uaddr, fshared, &q->key, VERIFY_READ); ++ ret = get_futex_key(uaddr, fshared, &q->key); + if (unlikely(ret != 0)) + return ret; + +@@ -1904,7 +1901,7 @@ static int futex_lock_pi(u32 __user *uaddr, int fshared, + q.requeue_pi_key = NULL; + retry: + q.key = FUTEX_KEY_INIT; +- ret = get_futex_key(uaddr, fshared, &q.key, VERIFY_WRITE); ++ ret = get_futex_key(uaddr, fshared, &q.key); + if (unlikely(ret != 0)) + goto out; + +@@ -2023,7 +2020,7 @@ retry: + if ((uval & FUTEX_TID_MASK) != task_pid_vnr(current)) + return -EPERM; + +- ret = get_futex_key(uaddr, fshared, &key, VERIFY_WRITE); ++ ret = get_futex_key(uaddr, fshared, &key); + if (unlikely(ret != 0)) + goto out; + +@@ -2215,7 +2212,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, int fshared, + rt_waiter.task = NULL; + + key2 = FUTEX_KEY_INIT; +- ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE); ++ ret = get_futex_key(uaddr2, fshared, &key2); + if (unlikely(ret != 0)) + goto out; + +diff --git a/kernel/sched.c b/kernel/sched.c +index dd0dccd..bf841d8 100644 +--- a/kernel/sched.c ++++ b/kernel/sched.c +@@ -3177,10 +3177,6 @@ static void pull_task(struct rq *src_rq, struct task_struct *p, + deactivate_task(src_rq, p, 0); + set_task_cpu(p, this_cpu); + activate_task(this_rq, p, 0); +- /* +- * Note that idle threads have a prio of MAX_PRIO, for this test +- * to be always true for them. +- */ + check_preempt_curr(this_rq, p, 0); + } + +@@ -6982,7 +6978,6 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) + __sched_fork(idle); + idle->se.exec_start = sched_clock(); + +- idle->prio = idle->normal_prio = MAX_PRIO; + cpumask_copy(&idle->cpus_allowed, cpumask_of(cpu)); + __set_task_cpu(idle, cpu); + +@@ -7686,7 +7681,6 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) + spin_lock_irq(&rq->lock); + update_rq_clock(rq); + deactivate_task(rq, rq->idle, 0); +- rq->idle->static_prio = MAX_PRIO; + __setscheduler(rq, rq->idle, SCHED_NORMAL, 0); + rq->idle->sched_class = &idle_sched_class; + migrate_dead_tasks(cpu); +diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c +index 479ce56..5b49613 100644 +--- a/kernel/sched_clock.c ++++ b/kernel/sched_clock.c +@@ -236,6 +236,18 @@ void sched_clock_idle_wakeup_event(u64 delta_ns) + } + EXPORT_SYMBOL_GPL(sched_clock_idle_wakeup_event); + ++unsigned long long cpu_clock(int cpu) ++{ ++ unsigned long long clock; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ clock = sched_clock_cpu(cpu); ++ local_irq_restore(flags); ++ ++ return clock; ++} ++ + #else /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */ + + void sched_clock_init(void) +@@ -251,17 +263,12 @@ u64 sched_clock_cpu(int cpu) + return sched_clock(); + } + +-#endif /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */ + + unsigned long long cpu_clock(int cpu) + { +- unsigned long long clock; +- unsigned long flags; ++ return sched_clock_cpu(cpu); ++} + +- local_irq_save(flags); +- clock = sched_clock_cpu(cpu); +- local_irq_restore(flags); ++#endif /* CONFIG_HAVE_UNSTABLE_SCHED_CLOCK */ + +- return clock; +-} + EXPORT_SYMBOL_GPL(cpu_clock); +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index 5dc1037..66035bf 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -2381,7 +2381,7 @@ static int mem_cgroup_force_empty(struct mem_cgroup *mem, bool free_all) + if (free_all) + goto try_to_free; + move_account: +- while (mem->res.usage > 0) { ++ do { + ret = -EBUSY; + if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children)) + goto out; +@@ -2408,8 +2408,8 @@ move_account: + if (ret == -ENOMEM) + goto try_to_free; + cond_resched(); +- } +- ret = 0; ++ /* "ret" should also be checked to ensure all lists are empty. */ ++ } while (mem->res.usage > 0 || ret); + out: + css_put(&mem->css); + return ret; +@@ -2442,10 +2442,7 @@ try_to_free: + } + lru_add_drain(); + /* try move_account...there may be some *locked* pages. */ +- if (mem->res.usage) +- goto move_account; +- ret = 0; +- goto out; ++ goto move_account; + } + + int mem_cgroup_force_empty_write(struct cgroup *cont, unsigned int event) +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index 2bc2ac6..3a78e2e 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -1225,10 +1225,10 @@ again: + } + spin_lock_irqsave(&zone->lock, flags); + page = __rmqueue(zone, order, migratetype); +- __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); + spin_unlock(&zone->lock); + if (!page) + goto failed; ++ __mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order)); + } + + __count_zone_vm_events(PGALLOC, zone, 1 << order); +diff --git a/mm/truncate.c b/mm/truncate.c +index 450cebd..258bda7 100644 +--- a/mm/truncate.c ++++ b/mm/truncate.c +@@ -516,22 +516,20 @@ EXPORT_SYMBOL_GPL(invalidate_inode_pages2); + */ + void truncate_pagecache(struct inode *inode, loff_t old, loff_t new) + { +- if (new < old) { +- struct address_space *mapping = inode->i_mapping; +- +- /* +- * unmap_mapping_range is called twice, first simply for +- * efficiency so that truncate_inode_pages does fewer +- * single-page unmaps. However after this first call, and +- * before truncate_inode_pages finishes, it is possible for +- * private pages to be COWed, which remain after +- * truncate_inode_pages finishes, hence the second +- * unmap_mapping_range call must be made for correctness. +- */ +- unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1); +- truncate_inode_pages(mapping, new); +- unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1); +- } ++ struct address_space *mapping = inode->i_mapping; ++ ++ /* ++ * unmap_mapping_range is called twice, first simply for ++ * efficiency so that truncate_inode_pages does fewer ++ * single-page unmaps. However after this first call, and ++ * before truncate_inode_pages finishes, it is possible for ++ * private pages to be COWed, which remain after ++ * truncate_inode_pages finishes, hence the second ++ * unmap_mapping_range call must be made for correctness. ++ */ ++ unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1); ++ truncate_inode_pages(mapping, new); ++ unmap_mapping_range(mapping, new + PAGE_SIZE - 1, 0, 1); + } + EXPORT_SYMBOL(truncate_pagecache); + +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index a4cb183..075c3a6 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -14685,6 +14685,8 @@ static int patch_alc861(struct hda_codec *codec) + spec->stream_digital_playback = &alc861_pcm_digital_playback; + spec->stream_digital_capture = &alc861_pcm_digital_capture; + ++ if (!spec->cap_mixer) ++ set_capture_mixer(codec); + set_beep_amp(spec, 0x23, 0, HDA_OUTPUT); + + spec->vmaster_nid = 0x03; diff --git a/debian/patches/series/6 b/debian/patches/series/6 index 1f29a84ae..8d59e3f15 100644 --- a/debian/patches/series/6 +++ b/debian/patches/series/6 @@ -26,6 +26,6 @@ - bugfix/all/ath5k-Fix-eeprom-checksum-check-for-custom-sized-eeproms.patch + bugfix/all/stable/2.6.32.4.patch + debian/mremap-fix-conflict-between-2.6.32.4-and-vserver.patch -+ bugfix/all/megaraid_sas-remove-poll_mode_io-world-write-perm.patch + bugfix/all/e1000-enhance-fragment-detection.patch + bugfix/all/e1000e-enhance-fragment-detection.patch ++ bugfix/all/stable/2.6.32.5.patch