[kernel] r14985 - in dists/trunk/linux-2.6/debian: . patches/bugfix/all patches/bugfix/all/stable patches/series

Ben Hutchings benh at alioth.debian.org
Sat Jan 23 02:21:39 UTC 2010


Author: benh
Date: Sat Jan 23 02:21:37 2010
New Revision: 14985

Log:
Add stable release 2.6.32.5; remove obsolete patch not yet released

Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.5.patch
Deleted:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/megaraid_sas-remove-poll_mode_io-world-write-perm.patch
Modified:
   dists/trunk/linux-2.6/debian/changelog
   dists/trunk/linux-2.6/debian/patches/series/6

Modified: dists/trunk/linux-2.6/debian/changelog
==============================================================================
--- dists/trunk/linux-2.6/debian/changelog	Sat Jan 23 02:13:23 2010	(r14984)
+++ dists/trunk/linux-2.6/debian/changelog	Sat Jan 23 02:21:37 2010	(r14985)
@@ -32,13 +32,15 @@
     - 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.

Added: dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.5.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/stable/2.6.32.5.patch	Sat Jan 23 02:21:37 2010	(r14985)
@@ -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;

Modified: dists/trunk/linux-2.6/debian/patches/series/6
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/6	Sat Jan 23 02:13:23 2010	(r14984)
+++ dists/trunk/linux-2.6/debian/patches/series/6	Sat Jan 23 02:21:37 2010	(r14985)
@@ -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



More information about the Kernel-svn-changes mailing list