public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Mike Pagano (mpagano)" <mpagano@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] linux-patches r1597 - genpatches-2.6/trunk/2.6.30
Date: Mon, 17 Aug 2009 00:54:13 +0000	[thread overview]
Message-ID: <E1McqUH-0003fM-0X@stork.gentoo.org> (raw)

Author: mpagano
Date: 2009-08-17 00:54:12 +0000 (Mon, 17 Aug 2009)
New Revision: 1597

Added:
   genpatches-2.6/trunk/2.6.30/1004_linux-2.6.30.5.patch
Removed:
   genpatches-2.6/trunk/2.6.30/1500_Make-sock-sendpage-use-kernel-sendpage.patch
   genpatches-2.6/trunk/2.6.30/2700_init-fence-regs-to-zero-on-GEM-load.patch
Modified:
   genpatches-2.6/trunk/2.6.30/0000_README
Log:
Adding linux patch 2.6.30.5 and removing redundant patches

Modified: genpatches-2.6/trunk/2.6.30/0000_README
===================================================================
--- genpatches-2.6/trunk/2.6.30/0000_README	2009-08-14 11:27:21 UTC (rev 1596)
+++ genpatches-2.6/trunk/2.6.30/0000_README	2009-08-17 00:54:12 UTC (rev 1597)
@@ -55,9 +55,9 @@
 From:   http://www.kernel.org
 Desc:   Linux 2.6.30.4
 
-Patch:  1500_Make-sock-sendpage-use-kernel-sendpage.patch
-From:   https://bugs.gentoo.org/281391
-Desc:   proper default case handling when the socket doesn't have a native sendpage
+Patch:  1004_linux-2.6.30.4.patch
+From:   http://www.kernel.org
+Desc:   Linux 2.6.30.4
 
 Patch:  1505_fix-oops-in-clock-nanosleep.patch
 From:   http://bugs.gentoo.org/281180
@@ -71,10 +71,6 @@
 From:	http://bugs.gentoo.org/show_bug.cgi?id=274182
 Desc:	ide-cd: handle fragmented packet commands gracefully
 
-Patch:	2700_init-fence-regs-to-zero-on-GEM-load.patch
-From:	http://bugs.gentoo.org/show_bug.cgi?id=269554
-Desc:	drm/i915: initialize fence registers to zero when loading GEM
-
 Patch:	2900_makefile-no-delete-null-pointer-checks-fix.patch
 From:	http://www.kernel.org
 Desc:	Add compiler flag to not remove useless null ptr checks on optimization

Added: genpatches-2.6/trunk/2.6.30/1004_linux-2.6.30.5.patch
===================================================================
--- genpatches-2.6/trunk/2.6.30/1004_linux-2.6.30.5.patch	                        (rev 0)
+++ genpatches-2.6/trunk/2.6.30/1004_linux-2.6.30.5.patch	2009-08-17 00:54:12 UTC (rev 1597)
@@ -0,0 +1,2668 @@
+diff --git a/arch/powerpc/boot/dts/asp834x-redboot.dts b/arch/powerpc/boot/dts/asp834x-redboot.dts
+index 7da84fd..261d10c 100644
+--- a/arch/powerpc/boot/dts/asp834x-redboot.dts
++++ b/arch/powerpc/boot/dts/asp834x-redboot.dts
+@@ -167,7 +167,7 @@
+ 			interrupt-parent = <&ipic>;
+ 			interrupts = <39 0x8>;
+ 			phy_type = "ulpi";
+-			port1;
++			port0;
+ 		};
+ 		/* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
+ 		usb@23000 {
+diff --git a/arch/powerpc/boot/dts/mpc8349emitx.dts b/arch/powerpc/boot/dts/mpc8349emitx.dts
+index 1ae38f0..e540d44 100644
+--- a/arch/powerpc/boot/dts/mpc8349emitx.dts
++++ b/arch/powerpc/boot/dts/mpc8349emitx.dts
+@@ -156,7 +156,7 @@
+ 			interrupt-parent = <&ipic>;
+ 			interrupts = <39 0x8>;
+ 			phy_type = "ulpi";
+-			port1;
++			port0;
+ 		};
+ 
+ 		usb@23000 {
+diff --git a/arch/powerpc/boot/dts/mpc834x_mds.dts b/arch/powerpc/boot/dts/mpc834x_mds.dts
+index d9f0a23..a667fe7 100644
+--- a/arch/powerpc/boot/dts/mpc834x_mds.dts
++++ b/arch/powerpc/boot/dts/mpc834x_mds.dts
+@@ -153,7 +153,7 @@
+ 			interrupt-parent = <&ipic>;
+ 			interrupts = <39 0x8>;
+ 			phy_type = "ulpi";
+-			port1;
++			port0;
+ 		};
+ 		/* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
+ 		usb@23000 {
+diff --git a/arch/powerpc/boot/dts/sbc8349.dts b/arch/powerpc/boot/dts/sbc8349.dts
+index a36dbbc..c7e1c4b 100644
+--- a/arch/powerpc/boot/dts/sbc8349.dts
++++ b/arch/powerpc/boot/dts/sbc8349.dts
+@@ -144,7 +144,7 @@
+ 			interrupt-parent = <&ipic>;
+ 			interrupts = <39 0x8>;
+ 			phy_type = "ulpi";
+-			port1;
++			port0;
+ 		};
+ 		/* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
+ 		usb@23000 {
+diff --git a/arch/powerpc/platforms/83xx/mpc83xx.h b/arch/powerpc/platforms/83xx/mpc83xx.h
+index 83cfe51..d1dc5b0 100644
+--- a/arch/powerpc/platforms/83xx/mpc83xx.h
++++ b/arch/powerpc/platforms/83xx/mpc83xx.h
+@@ -22,8 +22,8 @@
+ /* system i/o configuration register low */
+ #define MPC83XX_SICRL_OFFS         0x114
+ #define MPC834X_SICRL_USB_MASK     0x60000000
+-#define MPC834X_SICRL_USB0         0x40000000
+-#define MPC834X_SICRL_USB1         0x20000000
++#define MPC834X_SICRL_USB0         0x20000000
++#define MPC834X_SICRL_USB1         0x40000000
+ #define MPC831X_SICRL_USB_MASK     0x00000c00
+ #define MPC831X_SICRL_USB_ULPI     0x00000800
+ #define MPC8315_SICRL_USB_MASK     0x000000fc
+diff --git a/arch/powerpc/platforms/83xx/usb.c b/arch/powerpc/platforms/83xx/usb.c
+index 11e1fac..3ba4bb7 100644
+--- a/arch/powerpc/platforms/83xx/usb.c
++++ b/arch/powerpc/platforms/83xx/usb.c
+@@ -47,25 +47,25 @@ int mpc834x_usb_cfg(void)
+ 		sccr |= MPC83XX_SCCR_USB_DRCM_11;  /* 1:3 */
+ 
+ 		prop = of_get_property(np, "phy_type", NULL);
++		port1_is_dr = 1;
+ 		if (prop && (!strcmp(prop, "utmi") ||
+ 					!strcmp(prop, "utmi_wide"))) {
+ 			sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1;
+ 			sicrh |= MPC834X_SICRH_USB_UTMI;
+-			port1_is_dr = 1;
++			port0_is_dr = 1;
+ 		} else if (prop && !strcmp(prop, "serial")) {
+ 			dr_mode = of_get_property(np, "dr_mode", NULL);
+ 			if (dr_mode && !strcmp(dr_mode, "otg")) {
+ 				sicrl |= MPC834X_SICRL_USB0 | MPC834X_SICRL_USB1;
+-				port1_is_dr = 1;
++				port0_is_dr = 1;
+ 			} else {
+-				sicrl |= MPC834X_SICRL_USB0;
++				sicrl |= MPC834X_SICRL_USB1;
+ 			}
+ 		} else if (prop && !strcmp(prop, "ulpi")) {
+-			sicrl |= MPC834X_SICRL_USB0;
++			sicrl |= MPC834X_SICRL_USB1;
+ 		} else {
+ 			printk(KERN_WARNING "834x USB PHY type not supported\n");
+ 		}
+-		port0_is_dr = 1;
+ 		of_node_put(np);
+ 	}
+ 	np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph");
+diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h
+index 2bdab21..c6ccbe7 100644
+--- a/arch/x86/include/asm/irqflags.h
++++ b/arch/x86/include/asm/irqflags.h
+@@ -12,9 +12,15 @@ static inline unsigned long native_save_fl(void)
+ {
+ 	unsigned long flags;
+ 
++	/*
++	 * Note: this needs to be "=r" not "=rm", because we have the
++	 * stack offset from what gcc expects at the time the "pop" is
++	 * executed, and so a memory reference with respect to the stack
++	 * would end up using the wrong address.
++	 */
+ 	asm volatile("# __raw_save_flags\n\t"
+ 		     "pushf ; pop %0"
+-		     : "=g" (flags)
++		     : "=r" (flags)
+ 		     : /* no input */
+ 		     : "memory");
+ 
+diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c
+index 95deb9f..c6a61d2 100644
+--- a/arch/x86/kernel/vmi_32.c
++++ b/arch/x86/kernel/vmi_32.c
+@@ -441,7 +441,7 @@ vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip,
+ 	ap.ds = __USER_DS;
+ 	ap.es = __USER_DS;
+ 	ap.fs = __KERNEL_PERCPU;
+-	ap.gs = 0;
++	ap.gs = __KERNEL_STACK_CANARY;
+ 
+ 	ap.eflags = 0;
+ 
+diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
+index e17efed..133bdba 100644
+--- a/arch/x86/mm/pageattr.c
++++ b/arch/x86/mm/pageattr.c
+@@ -590,9 +590,12 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)
+ 	unsigned int level;
+ 	pte_t *kpte, old_pte;
+ 
+-	if (cpa->flags & CPA_PAGES_ARRAY)
+-		address = (unsigned long)page_address(cpa->pages[cpa->curpage]);
+-	else if (cpa->flags & CPA_ARRAY)
++	if (cpa->flags & CPA_PAGES_ARRAY) {
++		struct page *page = cpa->pages[cpa->curpage];
++		if (unlikely(PageHighMem(page)))
++			return 0;
++		address = (unsigned long)page_address(page);
++	} else if (cpa->flags & CPA_ARRAY)
+ 		address = cpa->vaddr[cpa->curpage];
+ 	else
+ 		address = *cpa->vaddr;
+@@ -695,9 +698,12 @@ static int cpa_process_alias(struct cpa_data *cpa)
+ 	 * No need to redo, when the primary call touched the direct
+ 	 * mapping already:
+ 	 */
+-	if (cpa->flags & CPA_PAGES_ARRAY)
+-		vaddr = (unsigned long)page_address(cpa->pages[cpa->curpage]);
+-	else if (cpa->flags & CPA_ARRAY)
++	if (cpa->flags & CPA_PAGES_ARRAY) {
++		struct page *page = cpa->pages[cpa->curpage];
++		if (unlikely(PageHighMem(page)))
++			return 0;
++		vaddr = (unsigned long)page_address(page);
++	} else if (cpa->flags & CPA_ARRAY)
+ 		vaddr = cpa->vaddr[cpa->curpage];
+ 	else
+ 		vaddr = *cpa->vaddr;
+@@ -996,12 +1002,15 @@ EXPORT_SYMBOL(set_memory_array_uc);
+ int _set_memory_wc(unsigned long addr, int numpages)
+ {
+ 	int ret;
++	unsigned long addr_copy = addr;
++
+ 	ret = change_page_attr_set(&addr, numpages,
+ 				    __pgprot(_PAGE_CACHE_UC_MINUS), 0);
+-
+ 	if (!ret) {
+-		ret = change_page_attr_set(&addr, numpages,
+-				    __pgprot(_PAGE_CACHE_WC), 0);
++		ret = change_page_attr_set_clr(&addr_copy, numpages,
++					       __pgprot(_PAGE_CACHE_WC),
++					       __pgprot(_PAGE_CACHE_MASK),
++					       0, 0, NULL);
+ 	}
+ 	return ret;
+ }
+@@ -1118,7 +1127,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray)
+ 	int free_idx;
+ 
+ 	for (i = 0; i < addrinarray; i++) {
+-		start = (unsigned long)page_address(pages[i]);
++		if (PageHighMem(pages[i]))
++			continue;
++		start = page_to_pfn(pages[i]) << PAGE_SHIFT;
+ 		end = start + PAGE_SIZE;
+ 		if (reserve_memtype(start, end, _PAGE_CACHE_UC_MINUS, NULL))
+ 			goto err_out;
+@@ -1131,7 +1142,9 @@ int set_pages_array_uc(struct page **pages, int addrinarray)
+ err_out:
+ 	free_idx = i;
+ 	for (i = 0; i < free_idx; i++) {
+-		start = (unsigned long)page_address(pages[i]);
++		if (PageHighMem(pages[i]))
++			continue;
++		start = page_to_pfn(pages[i]) << PAGE_SHIFT;
+ 		end = start + PAGE_SIZE;
+ 		free_memtype(start, end);
+ 	}
+@@ -1160,7 +1173,9 @@ int set_pages_array_wb(struct page **pages, int addrinarray)
+ 		return retval;
+ 
+ 	for (i = 0; i < addrinarray; i++) {
+-		start = (unsigned long)page_address(pages[i]);
++		if (PageHighMem(pages[i]))
++			continue;
++		start = page_to_pfn(pages[i]) << PAGE_SHIFT;
+ 		end = start + PAGE_SIZE;
+ 		free_memtype(start, end);
+ 	}
+diff --git a/block/Kconfig b/block/Kconfig
+index e7d1278..f817911 100644
+--- a/block/Kconfig
++++ b/block/Kconfig
+@@ -45,9 +45,9 @@ config LBD
+ 	  If unsure, say N.
+ 
+ config BLK_DEV_BSG
+-	bool "Block layer SG support v4 (EXPERIMENTAL)"
+-	depends on EXPERIMENTAL
+-	---help---
++	bool "Block layer SG support v4"
++	default y
++	help
+ 	  Saying Y here will enable generic SG (SCSI generic) v4 support
+ 	  for any block device.
+ 
+@@ -57,7 +57,10 @@ config BLK_DEV_BSG
+ 	  protocols (e.g. Task Management Functions and SMP in Serial
+ 	  Attached SCSI).
+ 
+-	  If unsure, say N.
++	  This option is required by recent UDEV versions to properly
++	  access device serial numbers, etc.
++
++	  If unsure, say Y.
+ 
+ config BLK_DEV_INTEGRITY
+ 	bool "Block layer data integrity support"
+diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
+index 01574a0..42159a2 100644
+--- a/drivers/acpi/sleep.c
++++ b/drivers/acpi/sleep.c
+@@ -397,6 +397,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+ 		},
+ 	},
+ 	{
++	.callback = init_set_sci_en_on_resume,
++	.ident = "Hewlett-Packard HP G7000 Notebook PC",
++	.matches = {
++		DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++		DMI_MATCH(DMI_PRODUCT_NAME, "HP G7000 Notebook PC"),
++		},
++	},
++	{
+ 	.callback = init_old_suspend_ordering,
+ 	.ident = "Panasonic CF51-2L",
+ 	.matches = {
+diff --git a/drivers/edac/x38_edac.c b/drivers/edac/x38_edac.c
+index 2406c2c..d4ec605 100644
+--- a/drivers/edac/x38_edac.c
++++ b/drivers/edac/x38_edac.c
+@@ -30,7 +30,7 @@
+ /* Intel X38 register addresses - device 0 function 0 - DRAM Controller */
+ 
+ #define X38_MCHBAR_LOW	0x48	/* MCH Memory Mapped Register BAR */
+-#define X38_MCHBAR_HIGH	0x4b
++#define X38_MCHBAR_HIGH	0x4c
+ #define X38_MCHBAR_MASK	0xfffffc000ULL	/* bits 35:14 */
+ #define X38_MMR_WINDOW_SIZE	16384
+ 
+diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
+index 2bcf515..9b0a094 100644
+--- a/drivers/firewire/fw-sbp2.c
++++ b/drivers/firewire/fw-sbp2.c
+@@ -190,6 +190,12 @@ struct sbp2_target {
+ #define SBP2_CYCLE_LIMIT		(0xc8 << 12)	/* 200 125us cycles */
+ 
+ /*
++ * There is no transport protocol limit to the CDB length,  but we implement
++ * a fixed length only.  16 bytes is enough for disks larger than 2 TB.
++ */
++#define SBP2_MAX_CDB_SIZE		16
++
++/*
+  * The default maximum s/g segment size of a FireWire controller is
+  * usually 0x10000, but SBP-2 only allows 0xffff. Since buffers have to
+  * be quadlet-aligned, we set the length limit to 0xffff & ~3.
+@@ -301,7 +307,7 @@ struct sbp2_command_orb {
+ 		struct sbp2_pointer next;
+ 		struct sbp2_pointer data_descriptor;
+ 		__be32 misc;
+-		u8 command_block[12];
++		u8 command_block[SBP2_MAX_CDB_SIZE];
+ 	} request;
+ 	struct scsi_cmnd *cmd;
+ 	scsi_done_fn_t done;
+@@ -1135,6 +1141,8 @@ static int sbp2_probe(struct device *dev)
+ 	if (fw_device_enable_phys_dma(device) < 0)
+ 		goto fail_shost_put;
+ 
++	shost->max_cmd_len = SBP2_MAX_CDB_SIZE;
++
+ 	if (scsi_add_host(shost, &unit->device) < 0)
+ 		goto fail_shost_put;
+ 
+diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
+index 0ccb63e..bb58797 100644
+--- a/drivers/gpu/drm/i915/i915_dma.c
++++ b/drivers/gpu/drm/i915/i915_dma.c
+@@ -1153,8 +1153,11 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
+ #endif
+ 
+ 	dev->driver->get_vblank_counter = i915_get_vblank_counter;
+-	if (IS_GM45(dev))
++	dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
++	if (IS_G4X(dev)) {
++		dev->max_vblank_count = 0xffffffff; /* full 32 bit counter */
+ 		dev->driver->get_vblank_counter = gm45_get_vblank_counter;
++	}
+ 
+ 	i915_gem_load(dev);
+ 
+diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
+index c431fa5..fcaa544 100644
+--- a/drivers/gpu/drm/i915/i915_drv.h
++++ b/drivers/gpu/drm/i915/i915_drv.h
+@@ -285,6 +285,13 @@ typedef struct drm_i915_private {
+ 	u8 saveDACMASK;
+ 	u8 saveCR[37];
+ 	uint64_t saveFENCE[16];
++	u32 saveCURACNTR;
++	u32 saveCURAPOS;
++	u32 saveCURABASE;
++	u32 saveCURBCNTR;
++	u32 saveCURBPOS;
++	u32 saveCURBBASE;
++	u32 saveCURSIZE;
+ 
+ 	struct {
+ 		struct drm_mm gtt_space;
+@@ -642,6 +649,7 @@ void i915_gem_detach_phys_object(struct drm_device *dev,
+ void i915_gem_free_all_phys_object(struct drm_device *dev);
+ int i915_gem_object_get_pages(struct drm_gem_object *obj);
+ void i915_gem_object_put_pages(struct drm_gem_object *obj);
++void i915_gem_release(struct drm_device * dev, struct drm_file *file_priv);
+ 
+ /* i915_gem_tiling.c */
+ void i915_gem_detect_bit_6_swizzle(struct drm_device *dev);
+diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
+index 39f5c65..91ad93d 100644
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -4154,6 +4154,7 @@ i915_gem_lastclose(struct drm_device *dev)
+ void
+ i915_gem_load(struct drm_device *dev)
+ {
++	int i;
+ 	drm_i915_private_t *dev_priv = dev->dev_private;
+ 
+ 	spin_lock_init(&dev_priv->mm.active_list_lock);
+@@ -4173,6 +4174,18 @@ i915_gem_load(struct drm_device *dev)
+ 	else
+ 		dev_priv->num_fence_regs = 8;
+ 
++	/* Initialize fence registers to zero */
++	if (IS_I965G(dev)) {
++		for (i = 0; i < 16; i++)
++			I915_WRITE64(FENCE_REG_965_0 + (i * 8), 0);
++	} else {
++		for (i = 0; i < 8; i++)
++			I915_WRITE(FENCE_REG_830_0 + (i * 4), 0);
++		if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
++			for (i = 0; i < 8; i++)
++				I915_WRITE(FENCE_REG_945_8 + (i * 4), 0);
++	}
++
+ 	i915_gem_detect_bit_6_swizzle(dev);
+ }
+ 
+diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
+index 98bb4c8..8ee0969 100644
+--- a/drivers/gpu/drm/i915/i915_irq.c
++++ b/drivers/gpu/drm/i915/i915_irq.c
+@@ -572,8 +572,6 @@ int i915_driver_irq_postinstall(struct drm_device *dev)
+ 
+ 	dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A | DRM_I915_VBLANK_PIPE_B;
+ 
+-	dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
+-
+ 	/* Unmask the interrupts that we always want on. */
+ 	dev_priv->irq_mask_reg = ~I915_INTERRUPT_ENABLE_FIX;
+ 
+diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
+index ce8a213..a98e283 100644
+--- a/drivers/gpu/drm/i915/i915_suspend.c
++++ b/drivers/gpu/drm/i915/i915_suspend.c
+@@ -295,6 +295,16 @@ int i915_save_state(struct drm_device *dev)
+ 	i915_save_palette(dev, PIPE_B);
+ 	dev_priv->savePIPEBSTAT = I915_READ(PIPEBSTAT);
+ 
++	/* Cursor state */
++	dev_priv->saveCURACNTR = I915_READ(CURACNTR);
++	dev_priv->saveCURAPOS = I915_READ(CURAPOS);
++	dev_priv->saveCURABASE = I915_READ(CURABASE);
++	dev_priv->saveCURBCNTR = I915_READ(CURBCNTR);
++	dev_priv->saveCURBPOS = I915_READ(CURBPOS);
++	dev_priv->saveCURBBASE = I915_READ(CURBBASE);
++	if (!IS_I9XX(dev))
++		dev_priv->saveCURSIZE = I915_READ(CURSIZE);
++
+ 	/* CRT state */
+ 	dev_priv->saveADPA = I915_READ(ADPA);
+ 
+@@ -480,6 +490,16 @@ int i915_restore_state(struct drm_device *dev)
+ 	I915_WRITE(DSPBCNTR, dev_priv->saveDSPBCNTR);
+ 	I915_WRITE(DSPBADDR, I915_READ(DSPBADDR));
+ 
++	/* Cursor state */
++	I915_WRITE(CURAPOS, dev_priv->saveCURAPOS);
++	I915_WRITE(CURACNTR, dev_priv->saveCURACNTR);
++	I915_WRITE(CURABASE, dev_priv->saveCURABASE);
++	I915_WRITE(CURBPOS, dev_priv->saveCURBPOS);
++	I915_WRITE(CURBCNTR, dev_priv->saveCURBCNTR);
++	I915_WRITE(CURBBASE, dev_priv->saveCURBBASE);
++	if (!IS_I9XX(dev))
++		I915_WRITE(CURSIZE, dev_priv->saveCURSIZE);
++
+ 	/* CRT state */
+ 	I915_WRITE(ADPA, dev_priv->saveADPA);
+ 
+diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
+index 9d78cff..cf2a971 100644
+--- a/drivers/gpu/drm/i915/intel_bios.c
++++ b/drivers/gpu/drm/i915/intel_bios.c
+@@ -185,10 +185,12 @@ parse_general_features(struct drm_i915_private *dev_priv,
+ 		dev_priv->lvds_use_ssc = general->enable_ssc;
+ 
+ 		if (dev_priv->lvds_use_ssc) {
+-		  if (IS_I855(dev_priv->dev))
+-		    dev_priv->lvds_ssc_freq = general->ssc_freq ? 66 : 48;
+-		  else
+-		    dev_priv->lvds_ssc_freq = general->ssc_freq ? 100 : 96;
++			if (IS_I85X(dev_priv->dev))
++				dev_priv->lvds_ssc_freq =
++					general->ssc_freq ? 66 : 48;
++			else
++				dev_priv->lvds_ssc_freq =
++					general->ssc_freq ? 100 : 96;
+ 		}
+ 	}
+ }
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index c9d6f10..5469f2c 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -1590,6 +1590,7 @@ struct drm_crtc *intel_get_load_detect_pipe(struct intel_output *intel_output,
+ 	}
+ 
+ 	encoder->crtc = crtc;
++	intel_output->base.encoder = encoder;
+ 	intel_output->load_detect_temp = true;
+ 
+ 	intel_crtc = to_intel_crtc(crtc);
+@@ -1625,6 +1626,7 @@ void intel_release_load_detect_pipe(struct intel_output *intel_output, int dpms_
+ 
+ 	if (intel_output->load_detect_temp) {
+ 		encoder->crtc = NULL;
++		intel_output->base.encoder = NULL;
+ 		intel_output->load_detect_temp = false;
+ 		crtc->enabled = drm_helper_crtc_in_use(crtc);
+ 		drm_helper_disable_unused_functions(dev);
+diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
+index e4652dc..7a66b91 100644
+--- a/drivers/gpu/drm/i915/intel_fb.c
++++ b/drivers/gpu/drm/i915/intel_fb.c
+@@ -857,9 +857,15 @@ void intelfb_restore(void)
+ 	drm_crtc_helper_set_config(&kernelfb_mode);
+ }
+ 
++static void intelfb_restore_work_fn(struct work_struct *ignored)
++{
++	intelfb_restore();
++}
++static DECLARE_WORK(intelfb_restore_work, intelfb_restore_work_fn);
++
+ static void intelfb_sysrq(int dummy1, struct tty_struct *dummy3)
+ {
+-        intelfb_restore();
++        schedule_work(&intelfb_restore_work);
+ }
+ 
+ static struct sysrq_key_op sysrq_intelfb_restore_op = {
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
+index 53cccfa..1e06379 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -420,8 +420,21 @@ static const struct dmi_system_id intel_no_lvds[] = {
+ 			DMI_MATCH(DMI_PRODUCT_NAME, "Studio Hybrid 140g"),
+ 		},
+ 	},
+-
+-	/* FIXME: add a check for the Aopen Mini PC */
++	{
++		.callback = intel_no_lvds_dmi_callback,
++		.ident = "AOpen Mini PC",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "AOpen"),
++			DMI_MATCH(DMI_PRODUCT_NAME, "i965GMx-IF"),
++		},
++	},
++	{
++		.callback = intel_no_lvds_dmi_callback,
++		.ident = "Aopen i945GTt-VFA",
++		.matches = {
++			DMI_MATCH(DMI_PRODUCT_VERSION, "AO00001JW"),
++		},
++	},
+ 
+ 	{ }	/* terminating entry */
+ };
+diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c
+index bff0103..fe4fa29 100644
+--- a/drivers/hwmon/asus_atk0110.c
++++ b/drivers/hwmon/asus_atk0110.c
+@@ -593,7 +593,11 @@ static int atk_add_sensor(struct atk_data *data, union acpi_object *obj)
+ 	sensor->data = data;
+ 	sensor->id = flags->integer.value;
+ 	sensor->limit1 = limit1->integer.value;
+-	sensor->limit2 = limit2->integer.value;
++	if (data->old_interface)
++		sensor->limit2 = limit2->integer.value;
++	else
++		/* The upper limit is expressed as delta from lower limit */
++		sensor->limit2 = sensor->limit1 + limit2->integer.value;
+ 
+ 	snprintf(sensor->input_attr_name, ATTR_NAME_SIZE,
+ 			"%s%d_input", base_name, start + *num);
+diff --git a/drivers/hwmon/smsc47m1.c b/drivers/hwmon/smsc47m1.c
+index a92dbb9..ba75bfc 100644
+--- a/drivers/hwmon/smsc47m1.c
++++ b/drivers/hwmon/smsc47m1.c
+@@ -86,6 +86,7 @@ superio_exit(void)
+ #define SUPERIO_REG_ACT		0x30
+ #define SUPERIO_REG_BASE	0x60
+ #define SUPERIO_REG_DEVID	0x20
++#define SUPERIO_REG_DEVREV	0x21
+ 
+ /* Logical device registers */
+ 
+@@ -429,6 +430,9 @@ static int __init smsc47m1_find(unsigned short *addr,
+ 	 * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
+ 	 * supports a 3rd fan, and the pin configuration registers are
+ 	 * unfortunately different.
++	 * The LPC47M233 has the same device id (0x6B) but is not compatible.
++	 * We check the high bit of the device revision register to
++	 * differentiate them.
+ 	 */
+ 	switch (val) {
+ 	case 0x51:
+@@ -448,6 +452,13 @@ static int __init smsc47m1_find(unsigned short *addr,
+ 		sio_data->type = smsc47m1;
+ 		break;
+ 	case 0x6B:
++		if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
++			pr_debug(DRVNAME ": "
++				 "Found SMSC LPC47M233, unsupported\n");
++			superio_exit();
++			return -ENODEV;
++		}
++
+ 		pr_info(DRVNAME ": Found SMSC LPC47M292\n");
+ 		sio_data->type = smsc47m2;
+ 		break;
+diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c
+index 1a9cc13..b96f302 100644
+--- a/drivers/i2c/chips/tsl2550.c
++++ b/drivers/i2c/chips/tsl2550.c
+@@ -27,7 +27,7 @@
+ #include <linux/delay.h>
+ 
+ #define TSL2550_DRV_NAME	"tsl2550"
+-#define DRIVER_VERSION		"1.1.1"
++#define DRIVER_VERSION		"1.1.2"
+ 
+ /*
+  * Defines
+@@ -189,13 +189,16 @@ static int tsl2550_calculate_lux(u8 ch0, u8 ch1)
+ 	u8 r = 128;
+ 
+ 	/* Avoid division by 0 and count 1 cannot be greater than count 0 */
+-	if (c0 && (c1 <= c0))
+-		r = c1 * 128 / c0;
++	if (c1 <= c0)
++		if (c0) {
++			r = c1 * 128 / c0;
++
++			/* Calculate LUX */
++			lux = ((c0 - c1) * ratio_lut[r]) / 256;
++		} else
++			lux = 0;
+ 	else
+-		return -1;
+-
+-	/* Calculate LUX */
+-	lux = ((c0 - c1) * ratio_lut[r]) / 256;
++		return -EAGAIN;
+ 
+ 	/* LUX range check */
+ 	return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
+diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
+index a9fbe2c..08f0fe0 100644
+--- a/drivers/ide/ide-disk.c
++++ b/drivers/ide/ide-disk.c
+@@ -413,6 +413,7 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
+ 	rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
+ 	rq->cmd_flags |= REQ_SOFTBARRIER;
+ 	rq->special = cmd;
++	cmd->rq = rq;
+ }
+ 
+ ide_devset_get(multcount, mult_count);
+diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
+index a0b8cab..3194e1d 100644
+--- a/drivers/ide/ide-dma.c
++++ b/drivers/ide/ide-dma.c
+@@ -362,9 +362,6 @@ static int ide_tune_dma(ide_drive_t *drive)
+ 	if (__ide_dma_bad_drive(drive))
+ 		return 0;
+ 
+-	if (ide_id_dma_bug(drive))
+-		return 0;
+-
+ 	if (hwif->host_flags & IDE_HFLAG_TRUST_BIOS_FOR_DMA)
+ 		return config_drive_for_dma(drive);
+ 
+@@ -395,24 +392,6 @@ static int ide_dma_check(ide_drive_t *drive)
+ 	return -1;
+ }
+ 
+-int ide_id_dma_bug(ide_drive_t *drive)
+-{
+-	u16 *id = drive->id;
+-
+-	if (id[ATA_ID_FIELD_VALID] & 4) {
+-		if ((id[ATA_ID_UDMA_MODES] >> 8) &&
+-		    (id[ATA_ID_MWDMA_MODES] >> 8))
+-			goto err_out;
+-	} else if ((id[ATA_ID_MWDMA_MODES] >> 8) &&
+-		   (id[ATA_ID_SWDMA_MODES] >> 8))
+-		goto err_out;
+-
+-	return 0;
+-err_out:
+-	printk(KERN_ERR "%s: bad DMA info in identify block\n", drive->name);
+-	return 1;
+-}
+-
+ int ide_set_dma(ide_drive_t *drive)
+ {
+ 	int rc;
+diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
+index 06fe002..dd5c557 100644
+--- a/drivers/ide/ide-iops.c
++++ b/drivers/ide/ide-iops.c
+@@ -306,9 +306,6 @@ int ide_driveid_update(ide_drive_t *drive)
+ 
+ 	kfree(id);
+ 
+-	if ((drive->dev_flags & IDE_DFLAG_USING_DMA) && ide_id_dma_bug(drive))
+-		ide_dma_off(drive);
+-
+ 	return 1;
+ out_err:
+ 	SELECT_MASK(drive, 0);
+diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
+index c895ed5..34846cc 100644
+--- a/drivers/ide/ide-probe.c
++++ b/drivers/ide/ide-probe.c
+@@ -830,6 +830,24 @@ static int ide_port_setup_devices(ide_hwif_t *hwif)
+ 	return j;
+ }
+ 
++static void ide_host_enable_irqs(struct ide_host *host)
++{
++	ide_hwif_t *hwif;
++	int i;
++
++	ide_host_for_each_port(i, hwif, host) {
++		if (hwif == NULL)
++			continue;
++
++		/* clear any pending IRQs */
++		hwif->tp_ops->read_status(hwif);
++
++		/* unmask IRQs */
++		if (hwif->io_ports.ctl_addr)
++			hwif->tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS);
++	}
++}
++
+ /*
+  * This routine sets up the IRQ for an IDE interface.
+  */
+@@ -843,9 +861,6 @@ static int init_irq (ide_hwif_t *hwif)
+ 	if (irq_handler == NULL)
+ 		irq_handler = ide_intr;
+ 
+-	if (io_ports->ctl_addr)
+-		hwif->tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS);
+-
+ 	if (request_irq(hwif->irq, irq_handler, sa, hwif->name, hwif))
+ 		goto out_up;
+ 
+@@ -1389,6 +1404,8 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
+ 			ide_port_tune_devices(hwif);
+ 	}
+ 
++	ide_host_enable_irqs(host);
++
+ 	ide_host_for_each_port(i, hwif, host) {
+ 		if (hwif == NULL)
+ 			continue;
+diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
+index a51ab23..f599f49 100644
+--- a/drivers/ieee1394/sbp2.c
++++ b/drivers/ieee1394/sbp2.c
+@@ -880,6 +880,7 @@ static struct sbp2_lu *sbp2_alloc_device(struct unit_directory *ud)
+ 	}
+ 
+ 	shost->hostdata[0] = (unsigned long)lu;
++	shost->max_cmd_len = SBP2_MAX_CDB_SIZE;
+ 
+ 	if (!scsi_add_host(shost, &ud->device)) {
+ 		lu->shost = shost;
+diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
+index c5036f1..64a3a66 100644
+--- a/drivers/ieee1394/sbp2.h
++++ b/drivers/ieee1394/sbp2.h
+@@ -25,6 +25,12 @@
+ #define SBP2_DEVICE_NAME		"sbp2"
+ 
+ /*
++ * There is no transport protocol limit to the CDB length,  but we implement
++ * a fixed length only.  16 bytes is enough for disks larger than 2 TB.
++ */
++#define SBP2_MAX_CDB_SIZE		16
++
++/*
+  * SBP-2 specific definitions
+  */
+ 
+@@ -51,7 +57,7 @@ struct sbp2_command_orb {
+ 	u32 data_descriptor_hi;
+ 	u32 data_descriptor_lo;
+ 	u32 misc;
+-	u8 cdb[12];
++	u8 cdb[SBP2_MAX_CDB_SIZE];
+ } __attribute__((packed));
+ 
+ #define SBP2_LOGIN_REQUEST		0x0
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index eb1b73f..751a315 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -1410,8 +1410,14 @@ static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
+ 		if (rdev2->desc_nr+1 > max_dev)
+ 			max_dev = rdev2->desc_nr+1;
+ 
+-	if (max_dev > le32_to_cpu(sb->max_dev))
++	if (max_dev > le32_to_cpu(sb->max_dev)) {
++		int bmask;
+ 		sb->max_dev = cpu_to_le32(max_dev);
++		rdev->sb_size = max_dev * 2 + 256;
++		bmask = queue_hardsect_size(rdev->bdev->bd_disk->queue)-1;
++		if (rdev->sb_size & bmask)
++			rdev->sb_size = (rdev->sb_size | bmask) + 1;
++	}
+ 	for (i=0; i<max_dev;i++)
+ 		sb->dev_roles[i] = cpu_to_le16(0xfffe);
+ 	
+@@ -2680,6 +2686,7 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
+ 	ssize_t rv = len;
+ 	struct mdk_personality *pers;
+ 	void *priv;
++	mdk_rdev_t *rdev;
+ 
+ 	if (mddev->pers == NULL) {
+ 		if (len == 0)
+@@ -2759,6 +2766,12 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
+ 	mddev_suspend(mddev);
+ 	mddev->pers->stop(mddev);
+ 	module_put(mddev->pers->owner);
++	/* Invalidate devices that are now superfluous */
++	list_for_each_entry(rdev, &mddev->disks, same_set)
++		if (rdev->raid_disk >= mddev->raid_disks) {
++			rdev->raid_disk = -1;
++			clear_bit(In_sync, &rdev->flags);
++		}
+ 	mddev->pers = pers;
+ 	mddev->private = priv;
+ 	strlcpy(mddev->clevel, pers->name, sizeof(mddev->clevel));
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 1f98ea4..75e0ecc 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -4310,6 +4310,15 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+ 	return sectors * (raid_disks - conf->max_degraded);
+ }
+ 
++static void free_conf(raid5_conf_t *conf)
++{
++	shrink_stripes(conf);
++	safe_put_page(conf->spare_page);
++	kfree(conf->disks);
++	kfree(conf->stripe_hashtbl);
++	kfree(conf);
++}
++
+ static raid5_conf_t *setup_conf(mddev_t *mddev)
+ {
+ 	raid5_conf_t *conf;
+@@ -4439,11 +4448,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)
+ 
+  abort:
+ 	if (conf) {
+-		shrink_stripes(conf);
+-		safe_put_page(conf->spare_page);
+-		kfree(conf->disks);
+-		kfree(conf->stripe_hashtbl);
+-		kfree(conf);
++		free_conf(conf);
+ 		return ERR_PTR(-EIO);
+ 	} else
+ 		return ERR_PTR(-ENOMEM);
+@@ -4609,12 +4614,8 @@ abort:
+ 	md_unregister_thread(mddev->thread);
+ 	mddev->thread = NULL;
+ 	if (conf) {
+-		shrink_stripes(conf);
+ 		print_raid5_conf(conf);
+-		safe_put_page(conf->spare_page);
+-		kfree(conf->disks);
+-		kfree(conf->stripe_hashtbl);
+-		kfree(conf);
++		free_conf(conf);
+ 	}
+ 	mddev->private = NULL;
+ 	printk(KERN_ALERT "raid5: failed to run raid set %s\n", mdname(mddev));
+@@ -4629,13 +4630,10 @@ static int stop(mddev_t *mddev)
+ 
+ 	md_unregister_thread(mddev->thread);
+ 	mddev->thread = NULL;
+-	shrink_stripes(conf);
+-	kfree(conf->stripe_hashtbl);
+ 	mddev->queue->backing_dev_info.congested_fn = NULL;
+ 	blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
+ 	sysfs_remove_group(&mddev->kobj, &raid5_attrs_group);
+-	kfree(conf->disks);
+-	kfree(conf);
++	free_conf(conf);
+ 	mddev->private = NULL;
+ 	return 0;
+ }
+diff --git a/drivers/net/atl1c/atl1c.h b/drivers/net/atl1c/atl1c.h
+index e1658ef..2a1120a 100644
+--- a/drivers/net/atl1c/atl1c.h
++++ b/drivers/net/atl1c/atl1c.h
+@@ -188,14 +188,14 @@ struct atl1c_tpd_ext_desc {
+ #define RRS_HDS_TYPE_DATA	2
+ 
+ #define RRS_IS_NO_HDS_TYPE(flag) \
+-	(((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == 0)
++	((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == 0)
+ 
+ #define RRS_IS_HDS_HEAD(flag) \
+-	(((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
++	((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == \
+ 			RRS_HDS_TYPE_HEAD)
+ 
+ #define RRS_IS_HDS_DATA(flag) \
+-	(((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK == \
++	((((flag) >> (RRS_HDS_TYPE_SHIFT)) & RRS_HDS_TYPE_MASK) == \
+ 			RRS_HDS_TYPE_DATA)
+ 
+ /* rrs word 3 bit 0:31 */
+@@ -245,7 +245,7 @@ struct atl1c_tpd_ext_desc {
+ #define RRS_PACKET_TYPE_802_3  	1
+ #define RRS_PACKET_TYPE_ETH	0
+ #define RRS_PACKET_IS_ETH(word) \
+-	(((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK == \
++	((((word) >> RRS_PACKET_TYPE_SHIFT) & RRS_PACKET_TYPE_MASK) == \
+ 			RRS_PACKET_TYPE_ETH)
+ #define RRS_RXD_IS_VALID(word) \
+ 	((((word) >> RRS_RXD_UPDATED_SHIFT) & RRS_RXD_UPDATED_MASK) == 1)
+diff --git a/drivers/net/atl1c/atl1c_ethtool.c b/drivers/net/atl1c/atl1c_ethtool.c
+index 45c5b73..e4afbd6 100644
+--- a/drivers/net/atl1c/atl1c_ethtool.c
++++ b/drivers/net/atl1c/atl1c_ethtool.c
+@@ -271,7 +271,7 @@ static int atl1c_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
+ 	struct atl1c_adapter *adapter = netdev_priv(netdev);
+ 
+ 	if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE |
+-			    WAKE_MCAST | WAKE_BCAST | WAKE_MCAST))
++			    WAKE_UCAST | WAKE_BCAST | WAKE_MCAST))
+ 		return -EOPNOTSUPP;
+ 	/* these settings will always override what we currently have */
+ 	adapter->wol = 0;
+diff --git a/drivers/net/atl1c/atl1c_main.c b/drivers/net/atl1c/atl1c_main.c
+index 83a1212..6cf3608 100644
+--- a/drivers/net/atl1c/atl1c_main.c
++++ b/drivers/net/atl1c/atl1c_main.c
+@@ -1701,7 +1701,7 @@ static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter, u8 que,
+ 		if (likely(RRS_RXD_IS_VALID(rrs->word3))) {
+ 			rfd_num = (rrs->word0 >> RRS_RX_RFD_CNT_SHIFT) &
+ 				RRS_RX_RFD_CNT_MASK;
+-			if (unlikely(rfd_num) != 1)
++			if (unlikely(rfd_num != 1))
+ 				/* TODO support mul rfd*/
+ 				if (netif_msg_rx_err(adapter))
+ 					dev_warn(&pdev->dev,
+diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
+index b4bb06f..97e45e0 100644
+--- a/drivers/net/benet/be.h
++++ b/drivers/net/benet/be.h
+@@ -73,7 +73,7 @@ static inline char *nic_name(struct pci_dev *pdev)
+ #define RX_FRAGS_REFILL_WM	(RX_Q_LEN - MAX_RX_POST)
+ 
+ #define BE_MAX_LRO_DESCRIPTORS  16
+-#define BE_MAX_FRAGS_PER_FRAME  16
++#define BE_MAX_FRAGS_PER_FRAME  (min((u32) 16, (u32) MAX_SKB_FRAGS))
+ 
+ struct be_dma_mem {
+ 	void *va;
+diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c
+index 9592f22..cccc541 100644
+--- a/drivers/net/benet/be_ethtool.c
++++ b/drivers/net/benet/be_ethtool.c
+@@ -162,8 +162,8 @@ be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce)
+ 		return -EINVAL;
+ 
+ 	adapter->max_rx_coal = coalesce->rx_max_coalesced_frames;
+-	if (adapter->max_rx_coal > MAX_SKB_FRAGS)
+-		adapter->max_rx_coal = MAX_SKB_FRAGS - 1;
++	if (adapter->max_rx_coal > BE_MAX_FRAGS_PER_FRAME)
++		adapter->max_rx_coal = BE_MAX_FRAGS_PER_FRAME;
+ 
+ 	/* if AIC is being turned on now, start with an EQD of 0 */
+ 	if (rx_eq->enable_aic == 0 &&
+diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
+index 5c378b5..db19d17 100644
+--- a/drivers/net/benet/be_main.c
++++ b/drivers/net/benet/be_main.c
+@@ -682,7 +682,7 @@ static void skb_fill_rx_data(struct be_adapter *adapter,
+ {
+ 	struct be_queue_info *rxq = &adapter->rx_obj.q;
+ 	struct be_rx_page_info *page_info;
+-	u16 rxq_idx, i, num_rcvd;
++	u16 rxq_idx, i, num_rcvd, j;
+ 	u32 pktsize, hdr_len, curr_frag_len;
+ 	u8 *start;
+ 
+@@ -725,22 +725,33 @@ static void skb_fill_rx_data(struct be_adapter *adapter,
+ 
+ 	/* More frags present for this completion */
+ 	pktsize -= curr_frag_len; /* account for above copied frag */
+-	for (i = 1; i < num_rcvd; i++) {
++	for (i = 1, j = 0; i < num_rcvd; i++) {
+ 		index_inc(&rxq_idx, rxq->len);
+ 		page_info = get_rx_page_info(adapter, rxq_idx);
+ 
+ 		curr_frag_len = min(pktsize, rx_frag_size);
+ 
+-		skb_shinfo(skb)->frags[i].page = page_info->page;
+-		skb_shinfo(skb)->frags[i].page_offset = page_info->page_offset;
+-		skb_shinfo(skb)->frags[i].size = curr_frag_len;
++		/* Coalesce all frags from the same physical page in one slot */
++		if (page_info->page_offset == 0) {
++			/* Fresh page */
++			j++;
++			skb_shinfo(skb)->frags[j].page = page_info->page;
++			skb_shinfo(skb)->frags[j].page_offset =
++							page_info->page_offset;
++			skb_shinfo(skb)->frags[j].size = 0;
++			skb_shinfo(skb)->nr_frags++;
++		} else {
++			put_page(page_info->page);
++		}
++
++		skb_shinfo(skb)->frags[j].size += curr_frag_len;
+ 		skb->len += curr_frag_len;
+ 		skb->data_len += curr_frag_len;
+-		skb_shinfo(skb)->nr_frags++;
+ 		pktsize -= curr_frag_len;
+ 
+ 		memset(page_info, 0, sizeof(*page_info));
+ 	}
++	BUG_ON(j > MAX_SKB_FRAGS);
+ 
+ 	be_rx_stats_update(adapter, pktsize, num_rcvd);
+ 	return;
+@@ -803,7 +814,7 @@ static void be_rx_compl_process_lro(struct be_adapter *adapter,
+ 	struct skb_frag_struct rx_frags[BE_MAX_FRAGS_PER_FRAME];
+ 	struct be_queue_info *rxq = &adapter->rx_obj.q;
+ 	u32 num_rcvd, pkt_size, remaining, vlanf, curr_frag_len;
+-	u16 i, rxq_idx = 0, vid;
++	u16 i, rxq_idx = 0, vid, j;
+ 
+ 	num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
+ 	pkt_size = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp);
+@@ -811,20 +822,28 @@ static void be_rx_compl_process_lro(struct be_adapter *adapter,
+ 	rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
+ 
+ 	remaining = pkt_size;
+-	for (i = 0; i < num_rcvd; i++) {
++	for (i = 0, j = -1; i < num_rcvd; i++) {
+ 		page_info = get_rx_page_info(adapter, rxq_idx);
+ 
+ 		curr_frag_len = min(remaining, rx_frag_size);
+ 
+-		rx_frags[i].page = page_info->page;
+-		rx_frags[i].page_offset = page_info->page_offset;
+-		rx_frags[i].size = curr_frag_len;
+-		remaining -= curr_frag_len;
++		/* Coalesce all frags from the same physical page in one slot */
++		if (i == 0 || page_info->page_offset == 0) {
++			/* First frag or Fresh page */
++			j++;
++			rx_frags[j].page = page_info->page;
++			rx_frags[j].page_offset = page_info->page_offset;
++			rx_frags[j].size = 0;
++		} else {
++			put_page(page_info->page);
++		}
++		rx_frags[j].size += curr_frag_len;
+ 
++		remaining -= curr_frag_len;
+ 		index_inc(&rxq_idx, rxq->len);
+-
+ 		memset(page_info, 0, sizeof(*page_info));
+ 	}
++	BUG_ON(j > MAX_SKB_FRAGS);
+ 
+ 	if (likely(!vlanf)) {
+ 		lro_receive_frags(&adapter->rx_obj.lro_mgr, rx_frags, pkt_size,
+diff --git a/drivers/net/e100.c b/drivers/net/e100.c
+index 0f9ee13..014dfb6 100644
+--- a/drivers/net/e100.c
++++ b/drivers/net/e100.c
+@@ -1762,6 +1762,9 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
+ 
+ 			if (ioread8(&nic->csr->scb.status) & rus_no_res)
+ 				nic->ru_running = RU_SUSPENDED;
++		pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
++					       sizeof(struct rfd),
++					       PCI_DMA_BIDIRECTIONAL);
+ 		return -ENODATA;
+ 	}
+ 
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index 6714a9d..bb59ba4 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -2441,7 +2441,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
+ 			if (likely(status >> 16 == (status & 0xffff))) {
+ 				skb = sky2->rx_ring[sky2->rx_next].skb;
+ 				skb->ip_summed = CHECKSUM_COMPLETE;
+-				skb->csum = status & 0xffff;
++				skb->csum = le16_to_cpu(status);
+ 			} else {
+ 				printk(KERN_NOTICE PFX "%s: hardware receive "
+ 				       "checksum problem (status = %#x)\n",
+diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c
+index c66b9c3..ca39ace 100644
+--- a/drivers/net/usb/cdc_subset.c
++++ b/drivers/net/usb/cdc_subset.c
+@@ -307,9 +307,10 @@ static const struct usb_device_id	products [] = {
+ 	USB_DEVICE (0x1286, 0x8001),    // "blob" bootloader
+ 	.driver_info =  (unsigned long) &blob_info,
+ }, {
+-	// Linux Ethernet/RNDIS gadget on pxa210/25x/26x, second config
+-	// e.g. Gumstix, current OpenZaurus, ...
+-	USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203),
++	// Linux Ethernet/RNDIS gadget, mostly on PXA, second config
++	// e.g. Gumstix, current OpenZaurus, ... or anything else
++	// that just enables this gadget option.
++	USB_DEVICE (0x0525, 0xa4a2),
+ 	.driver_info =	(unsigned long) &linuxdev_info,
+ },
+ #endif
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
+index f46ba24..cd20df1 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -3101,27 +3101,10 @@ static ssize_t show_power_level(struct device *d,
+ 				struct device_attribute *attr, char *buf)
+ {
+ 	struct iwl_priv *priv = dev_get_drvdata(d);
+-	int mode = priv->power_data.user_power_setting;
+-	int system = priv->power_data.system_power_setting;
+ 	int level = priv->power_data.power_mode;
+ 	char *p = buf;
+ 
+-	switch (system) {
+-	case IWL_POWER_SYS_AUTO:
+-		p += sprintf(p, "SYSTEM:auto");
+-		break;
+-	case IWL_POWER_SYS_AC:
+-		p += sprintf(p, "SYSTEM:ac");
+-		break;
+-	case IWL_POWER_SYS_BATTERY:
+-		p += sprintf(p, "SYSTEM:battery");
+-		break;
+-	}
+-
+-	p += sprintf(p, "\tMODE:%s", (mode < IWL_POWER_AUTO) ?
+-			"fixed" : "auto");
+-	p += sprintf(p, "\tINDEX:%d", level);
+-	p += sprintf(p, "\n");
++	p += sprintf(p, "%d\n", level);
+ 	return p - buf + 1;
+ }
+ 
+diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+index ff4d0e4..f7cdae6 100644
+--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+@@ -4623,27 +4623,10 @@ static ssize_t show_power_level(struct device *d,
+ 				struct device_attribute *attr, char *buf)
+ {
+ 	struct iwl_priv *priv = dev_get_drvdata(d);
+-	int mode = priv->power_data.user_power_setting;
+-	int system = priv->power_data.system_power_setting;
+ 	int level = priv->power_data.power_mode;
+ 	char *p = buf;
+ 
+-	switch (system) {
+-	case IWL_POWER_SYS_AUTO:
+-		p += sprintf(p, "SYSTEM:auto");
+-		break;
+-	case IWL_POWER_SYS_AC:
+-		p += sprintf(p, "SYSTEM:ac");
+-		break;
+-	case IWL_POWER_SYS_BATTERY:
+-		p += sprintf(p, "SYSTEM:battery");
+-		break;
+-	}
+-
+-	p += sprintf(p, "\tMODE:%s", (mode < IWL_POWER_AUTO) ?
+-			"fixed" : "auto");
+-	p += sprintf(p, "\tINDEX:%d", level);
+-	p += sprintf(p, "\n");
++	p += sprintf(p, "%d\n", level);
+ 	return p - buf + 1;
+ }
+ 
+diff --git a/drivers/parisc/eisa_eeprom.c b/drivers/parisc/eisa_eeprom.c
+index 685d94e..8c0b26e 100644
+--- a/drivers/parisc/eisa_eeprom.c
++++ b/drivers/parisc/eisa_eeprom.c
+@@ -55,7 +55,7 @@ static ssize_t eisa_eeprom_read(struct file * file,
+ 	ssize_t ret;
+ 	int i;
+ 	
+-	if (*ppos >= HPEE_MAX_LENGTH)
++	if (*ppos < 0 || *ppos >= HPEE_MAX_LENGTH)
+ 		return 0;
+ 	
+ 	count = *ppos + count < HPEE_MAX_LENGTH ? count : HPEE_MAX_LENGTH - *ppos;
+diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
+index 284ebac..0b159b5 100644
+--- a/drivers/platform/x86/Kconfig
++++ b/drivers/platform/x86/Kconfig
+@@ -265,6 +265,7 @@ config THINKPAD_ACPI_DOCK
+ 	bool "Legacy Docking Station Support"
+ 	depends on THINKPAD_ACPI
+ 	depends on ACPI_DOCK=n
++	depends on BROKEN
+ 	default n
+ 	---help---
+ 	  Allows the thinkpad_acpi driver to handle docking station events.
+@@ -278,7 +279,8 @@ config THINKPAD_ACPI_DOCK
+ config THINKPAD_ACPI_BAY
+ 	bool "Legacy Removable Bay Support"
+ 	depends on THINKPAD_ACPI
+-	default y
++	depends on BROKEN
++	default n
+ 	---help---
+ 	  Allows the thinkpad_acpi driver to handle removable bays.  It will
+ 	  electrically disable the device in the bay, and also generate
+diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
+index e6ac59c..fe8b74c 100644
+--- a/drivers/scsi/libsas/sas_port.c
++++ b/drivers/scsi/libsas/sas_port.c
+@@ -56,7 +56,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
+ 		}
+ 	}
+ 
+-	/* find a port */
++	/* see if the phy should be part of a wide port */
+ 	spin_lock_irqsave(&sas_ha->phy_port_lock, flags);
+ 	for (i = 0; i < sas_ha->num_phys; i++) {
+ 		port = sas_ha->sas_port[i];
+@@ -69,12 +69,23 @@ static void sas_form_port(struct asd_sas_phy *phy)
+ 			SAS_DPRINTK("phy%d matched wide port%d\n", phy->id,
+ 				    port->id);
+ 			break;
+-		} else if (*(u64 *) port->sas_addr == 0 && port->num_phys==0) {
+-			memcpy(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE);
+-			break;
+ 		}
+ 		spin_unlock(&port->phy_list_lock);
+ 	}
++	/* The phy does not match any existing port, create a new one */
++	if (i == sas_ha->num_phys) {
++		for (i = 0; i < sas_ha->num_phys; i++) {
++			port = sas_ha->sas_port[i];
++			spin_lock(&port->phy_list_lock);
++			if (*(u64 *)port->sas_addr == 0
++				&& port->num_phys == 0) {
++				memcpy(port->sas_addr, phy->sas_addr,
++					SAS_ADDR_SIZE);
++				break;
++			}
++			spin_unlock(&port->phy_list_lock);
++		}
++	}
+ 
+ 	if (i >= sas_ha->num_phys) {
+ 		printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n",
+diff --git a/drivers/staging/rt2870/2870_main_dev.c b/drivers/staging/rt2870/2870_main_dev.c
+index 9d59e31..04c764d 100644
+--- a/drivers/staging/rt2870/2870_main_dev.c
++++ b/drivers/staging/rt2870/2870_main_dev.c
+@@ -265,7 +265,7 @@ INT MlmeThread(
+ 	 */
+ 	DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__));
+ 
+-	pObj->MLMEThr_task = NULL;
++	pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE;
+ 
+ 	complete_and_exit (&pAd->mlmeComplete, 0);
+ 	return 0;
+@@ -373,7 +373,7 @@ INT RTUSBCmdThread(
+ 	 */
+ 	DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n"));
+ 
+-	pObj->RTUSBCmdThr_task = NULL;
++	pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE;
+ 
+ 	complete_and_exit (&pAd->CmdQComplete, 0);
+ 	return 0;
+@@ -467,7 +467,7 @@ INT TimerQThread(
+ 	 */
+ 	DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__));
+ 
+-	pObj->TimerQThr_task = NULL;
++	pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE;
+ 
+ 	complete_and_exit(&pAd->TimerQComplete, 0);
+ 	return 0;
+@@ -944,46 +944,69 @@ VOID RT28xxThreadTerminate(
+ 	RTUSBCancelPendingIRPs(pAd);
+ 
+ 	// Terminate Threads
+-	BUG_ON(pObj->TimerQThr_task == NULL);
+-	CHECK_PID_LEGALITY(task_pid(pObj->TimerQThr_task))
++	CHECK_PID_LEGALITY(pObj->TimerQThr_pid)
+ 	{
+ 		POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
+ 
+-		printk(KERN_DEBUG "Terminate the TimerQThr pid=%d!\n",
+-			pid_nr(task_pid(pObj->TimerQThr_task)));
++		printk("Terminate the TimerQThr_pid=%d!\n", GET_PID_NUMBER(pObj->TimerQThr_pid));
+ 		mb();
+ 		pAd->TimerFunc_kill = 1;
+ 		mb();
+-		kthread_stop(pObj->TimerQThr_task);
+-		pObj->TimerQThr_task = NULL;
++		ret = KILL_THREAD_PID(pObj->TimerQThr_pid, SIGTERM, 1);
++		if (ret)
++		{
++			printk(KERN_WARNING "%s: unable to stop TimerQThread, pid=%d, ret=%d!\n",
++					pAd->net_dev->name, GET_PID_NUMBER(pObj->TimerQThr_pid), ret);
++		}
++		else
++		{
++			wait_for_completion(&pAd->TimerQComplete);
++			pObj->TimerQThr_pid = THREAD_PID_INIT_VALUE;
++		}
+ 	}
+ 
+-	BUG_ON(pObj->MLMEThr_task == NULL);
+-	CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task))
++	CHECK_PID_LEGALITY(pObj->MLMEThr_pid)
+ 	{
+-		printk(KERN_DEBUG "Terminate the MLMEThr pid=%d!\n",
+-			pid_nr(task_pid(pObj->MLMEThr_task)));
++		printk("Terminate the MLMEThr_pid=%d!\n", GET_PID_NUMBER(pObj->MLMEThr_pid));
+ 		mb();
+ 		pAd->mlme_kill = 1;
+ 		//RT28XX_MLME_HANDLER(pAd);
+ 		mb();
+-		kthread_stop(pObj->MLMEThr_task);
+-		pObj->MLMEThr_task = NULL;
++		ret = KILL_THREAD_PID(pObj->MLMEThr_pid, SIGTERM, 1);
++		if (ret)
++		{
++			printk (KERN_WARNING "%s: unable to Mlme thread, pid=%d, ret=%d!\n",
++					pAd->net_dev->name, GET_PID_NUMBER(pObj->MLMEThr_pid), ret);
++		}
++		else
++		{
++			//wait_for_completion (&pAd->notify);
++			wait_for_completion (&pAd->mlmeComplete);
++			pObj->MLMEThr_pid = THREAD_PID_INIT_VALUE;
++		}
+ 	}
+ 
+-	BUG_ON(pObj->RTUSBCmdThr_task == NULL);
+-	CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task))
++	CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid)
+ 	{
+-		printk(KERN_DEBUG "Terminate the RTUSBCmdThr pid=%d!\n",
+-			pid_nr(task_pid(pObj->RTUSBCmdThr_task)));
++		printk("Terminate the RTUSBCmdThr_pid=%d!\n", GET_PID_NUMBER(pObj->RTUSBCmdThr_pid));
+ 		mb();
+ 		NdisAcquireSpinLock(&pAd->CmdQLock);
+ 		pAd->CmdQ.CmdQState = RT2870_THREAD_STOPED;
+ 		NdisReleaseSpinLock(&pAd->CmdQLock);
+ 		mb();
+ 		//RTUSBCMDUp(pAd);
+-		kthread_stop(pObj->RTUSBCmdThr_task);
+-		pObj->RTUSBCmdThr_task = NULL;
++		ret = KILL_THREAD_PID(pObj->RTUSBCmdThr_pid, SIGTERM, 1);
++		if (ret)
++		{
++			printk(KERN_WARNING "%s: unable to RTUSBCmd thread, pid=%d, ret=%d!\n",
++					pAd->net_dev->name, GET_PID_NUMBER(pObj->RTUSBCmdThr_pid), ret);
++		}
++		else
++		{
++			//wait_for_completion (&pAd->notify);
++			wait_for_completion (&pAd->CmdQComplete);
++			pObj->RTUSBCmdThr_pid = THREAD_PID_INIT_VALUE;
++	}
+ 	}
+ 
+ 
+@@ -1044,7 +1067,7 @@ BOOLEAN RT28XXChipsetCheck(
+ 		if (dev_p->descriptor.idVendor == rtusb_usb_id[i].idVendor &&
+ 			dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct)
+ 		{
+-			printk(KERN_DEBUG "rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
++			printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
+ 					dev_p->descriptor.idVendor, dev_p->descriptor.idProduct);
+ 			break;
+ 		}
+diff --git a/drivers/staging/rt2870/common/2870_rtmp_init.c b/drivers/staging/rt2870/common/2870_rtmp_init.c
+index cb16d2f..9f5143b 100644
+--- a/drivers/staging/rt2870/common/2870_rtmp_init.c
++++ b/drivers/staging/rt2870/common/2870_rtmp_init.c
+@@ -727,8 +727,8 @@ NDIS_STATUS AdapterBlockAllocateMemory(
+ 
+ 	usb_dev = pObj->pUsb_Dev;
+ 
+-	pObj->MLMEThr_task		= NULL;
+-	pObj->RTUSBCmdThr_task	= NULL;
++	pObj->MLMEThr_pid		= THREAD_PID_INIT_VALUE;
++	pObj->RTUSBCmdThr_pid	= THREAD_PID_INIT_VALUE;
+ 
+ 	*ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER));
+ 
+@@ -765,7 +765,7 @@ NDIS_STATUS	 CreateThreads(
+ {
+ 	PRTMP_ADAPTER pAd = net_dev->ml_priv;
+ 	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
+-	struct task_struct *tsk;
++	pid_t pid_number = -1;
+ 
+ 	//init_MUTEX(&(pAd->usbdev_semaphore));
+ 
+@@ -779,39 +779,36 @@ NDIS_STATUS	 CreateThreads(
+ 	init_completion (&pAd->TimerQComplete);
+ 
+ 	// Creat MLME Thread
+-	pObj->MLMEThr_task = NULL;
+-	tsk = kthread_run(MlmeThread, pAd, pAd->net_dev->name);
+-
+-	if (IS_ERR(tsk)) {
++	pObj->MLMEThr_pid= THREAD_PID_INIT_VALUE;
++	pid_number = kernel_thread(MlmeThread, pAd, CLONE_VM);
++	if (pid_number < 0)
++	{
+ 		printk (KERN_WARNING "%s: unable to start Mlme thread\n",pAd->net_dev->name);
+ 		return NDIS_STATUS_FAILURE;
+ 	}
+-
+-	pObj->MLMEThr_task = tsk;
++	pObj->MLMEThr_pid = GET_PID(pid_number);
+ 	// Wait for the thread to start
+ 	wait_for_completion(&(pAd->mlmeComplete));
+ 
+ 	// Creat Command Thread
+-	pObj->RTUSBCmdThr_task = NULL;
+-	tsk = kthread_run(RTUSBCmdThread, pAd, pAd->net_dev->name);
+-
+-	if (IS_ERR(tsk) < 0)
++	pObj->RTUSBCmdThr_pid= THREAD_PID_INIT_VALUE;
++	pid_number = kernel_thread(RTUSBCmdThread, pAd, CLONE_VM);
++	if (pid_number < 0)
+ 	{
+ 		printk (KERN_WARNING "%s: unable to start RTUSBCmd thread\n",pAd->net_dev->name);
+ 		return NDIS_STATUS_FAILURE;
+ 	}
+-
+-	pObj->RTUSBCmdThr_task = tsk;
++	pObj->RTUSBCmdThr_pid = GET_PID(pid_number);
+ 	wait_for_completion(&(pAd->CmdQComplete));
+ 
+-	pObj->TimerQThr_task = NULL;
+-	tsk = kthread_run(TimerQThread, pAd, pAd->net_dev->name);
+-	if (IS_ERR(tsk) < 0)
++	pObj->TimerQThr_pid= THREAD_PID_INIT_VALUE;
++	pid_number = kernel_thread(TimerQThread, pAd, CLONE_VM);
++	if (pid_number < 0)
+ 	{
+ 		printk (KERN_WARNING "%s: unable to start TimerQThread\n",pAd->net_dev->name);
+ 		return NDIS_STATUS_FAILURE;
+ 	}
+-	pObj->TimerQThr_task = tsk;
++	pObj->TimerQThr_pid = GET_PID(pid_number);
+ 	// Wait for the thread to start
+ 	wait_for_completion(&(pAd->TimerQComplete));
+ 
+diff --git a/drivers/staging/rt2870/common/cmm_data.c b/drivers/staging/rt2870/common/cmm_data.c
+index f8e0ebd..fd809ab 100644
+--- a/drivers/staging/rt2870/common/cmm_data.c
++++ b/drivers/staging/rt2870/common/cmm_data.c
+@@ -709,6 +709,9 @@ BOOLEAN RTMP_FillTxBlkInfo(
+ 	}
+ 
+ 	return TRUE;
++
++FillTxBlkErr:
++	return FALSE;
+ }
+ 
+ 
+diff --git a/drivers/staging/rt2870/common/rtmp_init.c b/drivers/staging/rt2870/common/rtmp_init.c
+index 099b6a8..870a00d 100644
+--- a/drivers/staging/rt2870/common/rtmp_init.c
++++ b/drivers/staging/rt2870/common/rtmp_init.c
+@@ -3655,7 +3655,7 @@ VOID	UserCfgInit(
+ #ifdef RALINK_28xx_QA
+ 	//pAd->ate.Repeat = 0;
+ 	pAd->ate.TxStatus = 0;
+-	pAd->ate.AtePid = NULL;
++	pAd->ate.AtePid = THREAD_PID_INIT_VALUE;
+ #endif // RALINK_28xx_QA //
+ #endif // RALINK_ATE //
+ 
+diff --git a/drivers/staging/rt2870/common/rtusb_io.c b/drivers/staging/rt2870/common/rtusb_io.c
+index afde136..6db443e 100644
+--- a/drivers/staging/rt2870/common/rtusb_io.c
++++ b/drivers/staging/rt2870/common/rtusb_io.c
+@@ -958,8 +958,7 @@ NDIS_STATUS	RTUSBEnqueueCmdFromNdis(
+ 	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
+ 
+ 
+-	BUG_ON(pObj->RTUSBCmdThr_task == NULL);
+-	CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task))
++	CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid)
+ 		return (NDIS_STATUS_RESOURCES);
+ 
+ 	status = RTMPAllocateMemory((PVOID *)&cmdqelmt, sizeof(CmdQElmt));
+diff --git a/drivers/staging/rt2870/rt2870.h b/drivers/staging/rt2870/rt2870.h
+index fef14a4..39fa918 100644
+--- a/drivers/staging/rt2870/rt2870.h
++++ b/drivers/staging/rt2870/rt2870.h
+@@ -580,16 +580,14 @@ VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs);
+ #define RTUSBMlmeUp(pAd)	        \
+ {								    \
+ 	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;	\
+-	BUG_ON(pObj->MLMEThr_task == NULL);		    \
+-	CHECK_PID_LEGALITY(task_pid(pObj->MLMEThr_task))		    \
++	CHECK_PID_LEGALITY(pObj->MLMEThr_pid)		    \
+         up(&(pAd->mlme_semaphore)); \
+ }
+ 
+ #define RTUSBCMDUp(pAd)	                \
+ {									    \
+ 	POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;	\
+-	BUG_ON(pObj->RTUSBCmdThr_task == NULL);	    \
+-	CHECK_PID_LEGALITY(task_pid(pObj->RTUSBCmdThr_task))	    \
++	CHECK_PID_LEGALITY(pObj->RTUSBCmdThr_pid)	    \
+ 	    up(&(pAd->RTUSBCmd_semaphore)); \
+ }
+ 
+diff --git a/drivers/staging/rt2870/rt_linux.h b/drivers/staging/rt2870/rt_linux.h
+index 5a6ee6a..49ad37f 100644
+--- a/drivers/staging/rt2870/rt_linux.h
++++ b/drivers/staging/rt2870/rt_linux.h
+@@ -44,7 +44,6 @@
+ #include <linux/module.h>
+ #include <linux/version.h>
+ #include <linux/kernel.h>
+-#include <linux/kthread.h>
+ 
+ #include <linux/spinlock.h>
+ #include <linux/init.h>
+@@ -166,12 +165,14 @@ typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_
+ 
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+ typedef	struct pid *	THREAD_PID;
++#define	THREAD_PID_INIT_VALUE	NULL
+ #define	GET_PID(_v)	find_get_pid(_v)
+ #define	GET_PID_NUMBER(_v)	pid_nr(_v)
+ #define CHECK_PID_LEGALITY(_pid)	if (pid_nr(_pid) >= 0)
+ #define KILL_THREAD_PID(_A, _B, _C)	kill_pid(_A, _B, _C)
+ #else
+ typedef	pid_t	THREAD_PID;
++#define	THREAD_PID_INIT_VALUE	-1
+ #define	GET_PID(_v)	_v
+ #define	GET_PID_NUMBER(_v)	_v
+ #define CHECK_PID_LEGALITY(_pid)	if (_pid >= 0)
+@@ -187,11 +188,11 @@ struct os_lock  {
+ struct os_cookie {
+ 
+ #ifdef RT2870
+-	struct usb_device	*pUsb_Dev;
++	struct usb_device		*pUsb_Dev;
+ 
+-	struct task_struct	*MLMEThr_task;
+-	struct task_struct	*RTUSBCmdThr_task;
+-	struct task_struct	*TimerQThr_task;
++	THREAD_PID				MLMEThr_pid;
++	THREAD_PID				RTUSBCmdThr_pid;
++	THREAD_PID				TimerQThr_pid;
+ #endif // RT2870 //
+ 
+ 	struct tasklet_struct 	rx_done_task;
+diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
+index ef03927..096badf 100644
+--- a/drivers/usb/core/devio.c
++++ b/drivers/usb/core/devio.c
+@@ -582,7 +582,7 @@ static int usbdev_open(struct inode *inode, struct file *file)
+ 	if (!ps)
+ 		goto out;
+ 
+-	ret = -ENOENT;
++	ret = -ENODEV;
+ 
+ 	/* usbdev device-node */
+ 	if (imajor(inode) == USB_DEVICE_MAJOR)
+@@ -1308,7 +1308,8 @@ static int get_urb32(struct usbdevfs_urb *kurb,
+ 		     struct usbdevfs_urb32 __user *uurb)
+ {
+ 	__u32  uptr;
+-	if (get_user(kurb->type, &uurb->type) ||
++	if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) ||
++	    __get_user(kurb->type, &uurb->type) ||
+ 	    __get_user(kurb->endpoint, &uurb->endpoint) ||
+ 	    __get_user(kurb->status, &uurb->status) ||
+ 	    __get_user(kurb->flags, &uurb->flags) ||
+@@ -1523,8 +1524,9 @@ static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
+ 	u32 udata;
+ 
+ 	uioc = compat_ptr((long)arg);
+-	if (get_user(ctrl.ifno, &uioc->ifno) ||
+-	    get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
++	if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) ||
++	    __get_user(ctrl.ifno, &uioc->ifno) ||
++	    __get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
+ 	    __get_user(udata, &uioc->data))
+ 		return -EFAULT;
+ 	ctrl.data = compat_ptr(udata);
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 9722512..91c0e01 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -672,6 +672,9 @@ static struct usb_device_id id_table_combined [] = {
+ 	{ USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
+ 	{ USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
+ 		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++	{ USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
++	{ USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
++		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+ 	{ },					/* Optional parameter entry */
+ 	{ }					/* Terminating entry */
+ };
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index 12330fa..3f89e3c 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -926,6 +926,20 @@
+ #define MARVELL_SHEEVAPLUG_PID	0x9e8f
+ 
+ /*
++ * Bayer Ascensia Contour blood glucose meter USB-converter cable.
++ * http://winglucofacts.com/cables/
++ */
++#define BAYER_VID                      0x1A79
++#define BAYER_CONTOUR_CABLE_PID        0x6001
++
++/*
++ * Marvell OpenRD Base, Client
++ * http://www.open-rd.org
++ * OpenRD Base, Client use VID 0x0403
++ */
++#define MARVELL_OPENRD_PID	0x9e90
++
++/*
+  *   BmRequestType:  1100 0000b
+  *   bRequest:       FTDI_E2_READ
+  *   wValue:         0
+diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
+index fcb3202..e20dc52 100644
+--- a/drivers/usb/storage/transport.c
++++ b/drivers/usb/storage/transport.c
+@@ -961,7 +961,7 @@ int usb_stor_Bulk_max_lun(struct us_data *us)
+ 				 US_BULK_GET_MAX_LUN, 
+ 				 USB_DIR_IN | USB_TYPE_CLASS | 
+ 				 USB_RECIP_INTERFACE,
+-				 0, us->ifnum, us->iobuf, 1, HZ);
++				 0, us->ifnum, us->iobuf, 1, 10*HZ);
+ 
+ 	US_DEBUGP("GetMaxLUN command result is %d, data is %d\n", 
+ 		  result, us->iobuf[0]);
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 4b8b690..1d76bf0 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -838,6 +838,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,
+ 		US_SC_DEVICE, US_PR_DEVICE, NULL,
+ 		US_FL_FIX_CAPACITY ),
+ 
++/* Reported by Rogerio Brito <rbrito@ime.usp.br> */
++UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
++		"Prolific Technology, Inc.",
++		"Mass Storage Device",
++		US_SC_DEVICE, US_PR_DEVICE, NULL,
++		US_FL_NOT_LOCKABLE ),
++
+ /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
+ /* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
+  * Thomas Bartosik <tbartdev@gmx-topmail.de> */
+diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
+index 697f6b5..e92f229 100644
+--- a/fs/binfmt_flat.c
++++ b/fs/binfmt_flat.c
+@@ -828,15 +828,22 @@ static int load_flat_shared_library(int id, struct lib_info *libs)
+ 	if (IS_ERR(bprm.file))
+ 		return res;
+ 
++	bprm.cred = prepare_exec_creds();
++	res = -ENOMEM;
++	if (!bprm.cred)
++		goto out;
++
+ 	res = prepare_binprm(&bprm);
+ 
+ 	if (res <= (unsigned long)-4096)
+ 		res = load_flat_file(&bprm, libs, id, NULL);
+-	if (bprm.file) {
+-		allow_write_access(bprm.file);
+-		fput(bprm.file);
+-		bprm.file = NULL;
+-	}
++
++	abort_creds(bprm.cred);
++
++out:
++	allow_write_access(bprm.file);
++	fput(bprm.file);
++
+ 	return(res);
+ }
+ 
+diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c
+index 83d6275..3236d1a 100644
+--- a/fs/cifs/cifs_dfs_ref.c
++++ b/fs/cifs/cifs_dfs_ref.c
+@@ -55,7 +55,7 @@ void cifs_dfs_release_automount_timer(void)
+  * i.e. strips from UNC trailing path that is not part of share
+  * name and fixup missing '\' in the begining of DFS node refferal
+  * if neccessary.
+- * Returns pointer to share name on success or NULL on error.
++ * Returns pointer to share name on success or ERR_PTR on error.
+  * Caller is responsible for freeing returned string.
+  */
+ static char *cifs_get_share_name(const char *node_name)
+@@ -68,7 +68,7 @@ static char *cifs_get_share_name(const char *node_name)
+ 	UNC = kmalloc(len+2 /*for term null and additional \ if it's missed */,
+ 			 GFP_KERNEL);
+ 	if (!UNC)
+-		return NULL;
++		return ERR_PTR(-ENOMEM);
+ 
+ 	/* get share name and server name */
+ 	if (node_name[1] != '\\') {
+@@ -87,7 +87,7 @@ static char *cifs_get_share_name(const char *node_name)
+ 		cERROR(1, ("%s: no server name end in node name: %s",
+ 			__func__, node_name));
+ 		kfree(UNC);
+-		return NULL;
++		return ERR_PTR(-EINVAL);
+ 	}
+ 
+ 	/* find sharename end */
+@@ -133,6 +133,12 @@ char *cifs_compose_mount_options(const char *sb_mountdata,
+ 		return ERR_PTR(-EINVAL);
+ 
+ 	*devname = cifs_get_share_name(ref->node_name);
++	if (IS_ERR(*devname)) {
++		rc = PTR_ERR(*devname);
++		*devname = NULL;
++		goto compose_mount_options_err;
++	}
++
+ 	rc = dns_resolve_server_name_to_ip(*devname, &srvIP);
+ 	if (rc != 0) {
+ 		cERROR(1, ("%s: Failed to resolve server part of %s to IP: %d",
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index 1dc14f2..0b0b9df 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -2563,11 +2563,20 @@ remote_path_check:
+ 
+ 			if (mount_data != mount_data_global)
+ 				kfree(mount_data);
++
+ 			mount_data = cifs_compose_mount_options(
+ 					cifs_sb->mountdata, full_path + 1,
+ 					referrals, &fake_devname);
+-			kfree(fake_devname);
++
+ 			free_dfs_info_array(referrals, num_referrals);
++			kfree(fake_devname);
++			kfree(full_path);
++
++			if (IS_ERR(mount_data)) {
++				rc = PTR_ERR(mount_data);
++				mount_data = NULL;
++				goto mount_fail_check;
++			}
+ 
+ 			if (tcon)
+ 				cifs_put_tcon(tcon);
+@@ -2575,8 +2584,6 @@ remote_path_check:
+ 				cifs_put_smb_ses(pSesInfo);
+ 
+ 			cleanup_volume_info(&volume_info);
+-			FreeXid(xid);
+-			kfree(full_path);
+ 			referral_walks_count++;
+ 			goto try_mount_again;
+ 		}
+diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
+index b83f6bc..e2a82c1 100644
+--- a/fs/compat_ioctl.c
++++ b/fs/compat_ioctl.c
+@@ -1915,6 +1915,7 @@ COMPATIBLE_IOCTL(FIONCLEX)
+ COMPATIBLE_IOCTL(FIOASYNC)
+ COMPATIBLE_IOCTL(FIONBIO)
+ COMPATIBLE_IOCTL(FIONREAD)  /* This is also TIOCINQ */
++COMPATIBLE_IOCTL(FS_IOC_FIEMAP)
+ /* 0x00 */
+ COMPATIBLE_IOCTL(FIBMAP)
+ COMPATIBLE_IOCTL(FIGETBSZ)
+diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
+index 08f6b04..630feb3 100644
+--- a/fs/nfs/direct.c
++++ b/fs/nfs/direct.c
+@@ -255,7 +255,7 @@ static void nfs_direct_read_release(void *calldata)
+ 
+ 	if (put_dreq(dreq))
+ 		nfs_direct_complete(dreq);
+-	nfs_readdata_release(calldata);
++	nfs_readdata_free(data);
+ }
+ 
+ static const struct rpc_call_ops nfs_read_direct_ops = {
+@@ -311,14 +311,14 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
+ 					data->npages, 1, 0, data->pagevec, NULL);
+ 		up_read(&current->mm->mmap_sem);
+ 		if (result < 0) {
+-			nfs_readdata_release(data);
++			nfs_readdata_free(data);
+ 			break;
+ 		}
+ 		if ((unsigned)result < data->npages) {
+ 			bytes = result * PAGE_SIZE;
+ 			if (bytes <= pgbase) {
+ 				nfs_direct_release_pages(data->pagevec, result);
+-				nfs_readdata_release(data);
++				nfs_readdata_free(data);
+ 				break;
+ 			}
+ 			bytes -= pgbase;
+@@ -331,7 +331,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
+ 		data->inode = inode;
+ 		data->cred = msg.rpc_cred;
+ 		data->args.fh = NFS_FH(inode);
+-		data->args.context = get_nfs_open_context(ctx);
++		data->args.context = ctx;
+ 		data->args.offset = pos;
+ 		data->args.pgbase = pgbase;
+ 		data->args.pages = data->pagevec;
+@@ -438,7 +438,7 @@ static void nfs_direct_free_writedata(struct nfs_direct_req *dreq)
+ 		struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages);
+ 		list_del(&data->pages);
+ 		nfs_direct_release_pages(data->pagevec, data->npages);
+-		nfs_writedata_release(data);
++		nfs_writedata_free(data);
+ 	}
+ }
+ 
+@@ -531,7 +531,7 @@ static void nfs_direct_commit_release(void *calldata)
+ 
+ 	dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status);
+ 	nfs_direct_write_complete(dreq, data->inode);
+-	nfs_commitdata_release(calldata);
++	nfs_commit_free(data);
+ }
+ 
+ static const struct rpc_call_ops nfs_commit_direct_ops = {
+@@ -564,7 +564,7 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
+ 	data->args.fh = NFS_FH(data->inode);
+ 	data->args.offset = 0;
+ 	data->args.count = 0;
+-	data->args.context = get_nfs_open_context(dreq->ctx);
++	data->args.context = dreq->ctx;
+ 	data->res.count = 0;
+ 	data->res.fattr = &data->fattr;
+ 	data->res.verf = &data->verf;
+@@ -725,14 +725,14 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
+ 					data->npages, 0, 0, data->pagevec, NULL);
+ 		up_read(&current->mm->mmap_sem);
+ 		if (result < 0) {
+-			nfs_writedata_release(data);
++			nfs_writedata_free(data);
+ 			break;
+ 		}
+ 		if ((unsigned)result < data->npages) {
+ 			bytes = result * PAGE_SIZE;
+ 			if (bytes <= pgbase) {
+ 				nfs_direct_release_pages(data->pagevec, result);
+-				nfs_writedata_release(data);
++				nfs_writedata_free(data);
+ 				break;
+ 			}
+ 			bytes -= pgbase;
+@@ -747,7 +747,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
+ 		data->inode = inode;
+ 		data->cred = msg.rpc_cred;
+ 		data->args.fh = NFS_FH(inode);
+-		data->args.context = get_nfs_open_context(ctx);
++		data->args.context = ctx;
+ 		data->args.offset = pos;
+ 		data->args.pgbase = pgbase;
+ 		data->args.pages = data->pagevec;
+diff --git a/fs/nfs/read.c b/fs/nfs/read.c
+index 4ace3c5..eea5bd2 100644
+--- a/fs/nfs/read.c
++++ b/fs/nfs/read.c
+@@ -59,17 +59,15 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
+ 	return p;
+ }
+ 
+-static void nfs_readdata_free(struct nfs_read_data *p)
++void nfs_readdata_free(struct nfs_read_data *p)
+ {
+ 	if (p && (p->pagevec != &p->page_array[0]))
+ 		kfree(p->pagevec);
+ 	mempool_free(p, nfs_rdata_mempool);
+ }
+ 
+-void nfs_readdata_release(void *data)
++static void nfs_readdata_release(struct nfs_read_data *rdata)
+ {
+-	struct nfs_read_data *rdata = data;
+-
+ 	put_nfs_open_context(rdata->args.context);
+ 	nfs_readdata_free(rdata);
+ }
+diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+index e560a78..9cce370 100644
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -84,17 +84,15 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
+ 	return p;
+ }
+ 
+-static void nfs_writedata_free(struct nfs_write_data *p)
++void nfs_writedata_free(struct nfs_write_data *p)
+ {
+ 	if (p && (p->pagevec != &p->page_array[0]))
+ 		kfree(p->pagevec);
+ 	mempool_free(p, nfs_wdata_mempool);
+ }
+ 
+-void nfs_writedata_release(void *data)
++static void nfs_writedata_release(struct nfs_write_data *wdata)
+ {
+-	struct nfs_write_data *wdata = data;
+-
+ 	put_nfs_open_context(wdata->args.context);
+ 	nfs_writedata_free(wdata);
+ }
+diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
+index 1779ddc..18ffb2e 100644
+--- a/fs/nilfs2/segment.c
++++ b/fs/nilfs2/segment.c
+@@ -1876,12 +1876,26 @@ static void nilfs_end_page_io(struct page *page, int err)
+ 	if (!page)
+ 		return;
+ 
+-	if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page))
++	if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page)) {
+ 		/*
+ 		 * For b-tree node pages, this function may be called twice
+ 		 * or more because they might be split in a segment.
+ 		 */
++		if (PageDirty(page)) {
++			/*
++			 * For pages holding split b-tree node buffers, dirty
++			 * flag on the buffers may be cleared discretely.
++			 * In that case, the page is once redirtied for
++			 * remaining buffers, and it must be cancelled if
++			 * all the buffers get cleaned later.
++			 */
++			lock_page(page);
++			if (nilfs_page_buffers_clean(page))
++				__nilfs_clear_page_dirty(page);
++			unlock_page(page);
++		}
+ 		return;
++	}
+ 
+ 	__nilfs_end_page_io(page, err);
+ }
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index 3326bbf..f705cfd 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -234,23 +234,20 @@ static int check_mem_permission(struct task_struct *task)
+ 
+ struct mm_struct *mm_for_maps(struct task_struct *task)
+ {
+-	struct mm_struct *mm = get_task_mm(task);
+-	if (!mm)
++	struct mm_struct *mm;
++
++	if (mutex_lock_killable(&task->cred_exec_mutex))
+ 		return NULL;
+-	down_read(&mm->mmap_sem);
+-	task_lock(task);
+-	if (task->mm != mm)
+-		goto out;
+-	if (task->mm != current->mm &&
+-	    __ptrace_may_access(task, PTRACE_MODE_READ) < 0)
+-		goto out;
+-	task_unlock(task);
++
++	mm = get_task_mm(task);
++	if (mm && mm != current->mm &&
++			!ptrace_may_access(task, PTRACE_MODE_READ)) {
++		mmput(mm);
++		mm = NULL;
++	}
++	mutex_unlock(&task->cred_exec_mutex);
++
+ 	return mm;
+-out:
+-	task_unlock(task);
+-	up_read(&mm->mmap_sem);
+-	mmput(mm);
+-	return NULL;
+ }
+ 
+ static int proc_pid_cmdline(struct task_struct *task, char * buffer)
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index 6f61b7c..9bd8be1 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -119,6 +119,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
+ 	mm = mm_for_maps(priv->task);
+ 	if (!mm)
+ 		return NULL;
++	down_read(&mm->mmap_sem);
+ 
+ 	tail_vma = get_gate_vma(priv->task);
+ 	priv->tail_vma = tail_vma;
+diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
+index 64a72e2..8f5c05d 100644
+--- a/fs/proc/task_nommu.c
++++ b/fs/proc/task_nommu.c
+@@ -189,6 +189,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
+ 		priv->task = NULL;
+ 		return NULL;
+ 	}
++	down_read(&mm->mmap_sem);
+ 
+ 	/* start from the Nth VMA */
+ 	for (p = rb_first(&mm->mm_rb); p; p = rb_next(p))
+diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
+index d88d0fa..14f2d71 100644
+--- a/fs/sysfs/dir.c
++++ b/fs/sysfs/dir.c
+@@ -939,8 +939,10 @@ again:
+ 	/* Remove from old parent's list and insert into new parent's list. */
+ 	sysfs_unlink_sibling(sd);
+ 	sysfs_get(new_parent_sd);
++	drop_nlink(old_parent->d_inode);
+ 	sysfs_put(sd->s_parent);
+ 	sd->s_parent = new_parent_sd;
++	inc_nlink(new_parent->d_inode);
+ 	sysfs_link_sibling(sd);
+ 
+  out_unlock:
+diff --git a/include/linux/ide.h b/include/linux/ide.h
+index 9fed365..ca051f3 100644
+--- a/include/linux/ide.h
++++ b/include/linux/ide.h
+@@ -1384,7 +1384,6 @@ int ide_in_drive_list(u16 *, const struct drive_list_entry *);
+ #ifdef CONFIG_BLK_DEV_IDEDMA
+ int ide_dma_good_drive(ide_drive_t *);
+ int __ide_dma_bad_drive(ide_drive_t *);
+-int ide_id_dma_bug(ide_drive_t *);
+ 
+ u8 ide_find_dma_mode(ide_drive_t *, u8);
+ 
+@@ -1425,7 +1424,6 @@ void ide_dma_lost_irq(ide_drive_t *);
+ ide_startstop_t ide_dma_timeout_retry(ide_drive_t *, int);
+ 
+ #else
+-static inline int ide_id_dma_bug(ide_drive_t *drive) { return 0; }
+ static inline u8 ide_find_dma_mode(ide_drive_t *drive, u8 speed) { return 0; }
+ static inline u8 ide_max_dma_mode(ide_drive_t *drive) { return 0; }
+ static inline void ide_dma_off_quietly(ide_drive_t *drive) { ; }
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index 5a96a1a..a28daad 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -1856,15 +1856,14 @@ static inline int net_gso_ok(int features, int gso_type)
+ 
+ static inline int skb_gso_ok(struct sk_buff *skb, int features)
+ {
+-	return net_gso_ok(features, skb_shinfo(skb)->gso_type);
++	return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&
++	       (!skb_shinfo(skb)->frag_list || (features & NETIF_F_FRAGLIST));
+ }
+ 
+ static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
+ {
+ 	return skb_is_gso(skb) &&
+ 	       (!skb_gso_ok(skb, dev->features) ||
+-	        (skb_shinfo(skb)->frag_list &&
+-	         !(dev->features & NETIF_F_FRAGLIST)) ||
+ 		unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
+ }
+ 
+diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
+index fdffb41..f6b9024 100644
+--- a/include/linux/nfs_fs.h
++++ b/include/linux/nfs_fs.h
+@@ -473,7 +473,6 @@ extern int  nfs_writepages(struct address_space *, struct writeback_control *);
+ extern int  nfs_flush_incompatible(struct file *file, struct page *page);
+ extern int  nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
+ extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
+-extern void nfs_writedata_release(void *);
+ 
+ /*
+  * Try to write back everything synchronously (but check the
+@@ -488,7 +487,6 @@ extern int nfs_wb_page_cancel(struct inode *inode, struct page* page);
+ extern int  nfs_commit_inode(struct inode *, int);
+ extern struct nfs_write_data *nfs_commitdata_alloc(void);
+ extern void nfs_commit_free(struct nfs_write_data *wdata);
+-extern void nfs_commitdata_release(void *wdata);
+ #else
+ static inline int
+ nfs_commit_inode(struct inode *inode, int how)
+@@ -507,6 +505,7 @@ nfs_have_writebacks(struct inode *inode)
+  * Allocate nfs_write_data structures
+  */
+ extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages);
++extern void nfs_writedata_free(struct nfs_write_data *);
+ 
+ /*
+  * linux/fs/nfs/read.c
+@@ -515,7 +514,6 @@ extern int  nfs_readpage(struct file *, struct page *);
+ extern int  nfs_readpages(struct file *, struct address_space *,
+ 		struct list_head *, unsigned);
+ extern int  nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
+-extern void nfs_readdata_release(void *data);
+ extern int  nfs_readpage_async(struct nfs_open_context *, struct inode *,
+ 			       struct page *);
+ 
+@@ -523,6 +521,7 @@ extern int  nfs_readpage_async(struct nfs_open_context *, struct inode *,
+  * Allocate nfs_read_data structures
+  */
+ extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages);
++extern void nfs_readdata_free(struct nfs_read_data *);
+ 
+ /*
+  * linux/fs/nfs3proc.c
+diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
+index 9f80a76..d16a304 100644
+--- a/include/net/sctp/sctp.h
++++ b/include/net/sctp/sctp.h
+@@ -448,6 +448,7 @@ static inline void sctp_skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
+ {
+ 	struct sctp_ulpevent *event = sctp_skb2event(skb);
+ 
++	skb_orphan(skb);
+ 	skb->sk = sk;
+ 	skb->destructor = sctp_sock_rfree;
+ 	atomic_add(event->rmem_len, &sk->sk_rmem_alloc);
+diff --git a/include/net/sock.h b/include/net/sock.h
+index 4bb1ff9..9bc2c83 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -103,15 +103,15 @@ struct net;
+ 
+ /**
+  *	struct sock_common - minimal network layer representation of sockets
++ *	@skc_node: main hash linkage for various protocol lookup tables
++ *	@skc_nulls_node: main hash linkage for UDP/UDP-Lite protocol
++ *	@skc_refcnt: reference count
++ *	@skc_hash: hash value used with various protocol lookup tables
+  *	@skc_family: network address family
+  *	@skc_state: Connection state
+  *	@skc_reuse: %SO_REUSEADDR setting
+  *	@skc_bound_dev_if: bound device index if != 0
+- *	@skc_node: main hash linkage for various protocol lookup tables
+- *	@skc_nulls_node: main hash linkage for UDP/UDP-Lite protocol
+  *	@skc_bind_node: bind hash linkage for various protocol lookup tables
+- *	@skc_refcnt: reference count
+- *	@skc_hash: hash value used with various protocol lookup tables
+  *	@skc_prot: protocol handlers inside a network family
+  *	@skc_net: reference to the network namespace of this socket
+  *
+@@ -119,17 +119,21 @@ struct net;
+  *	for struct sock and struct inet_timewait_sock.
+  */
+ struct sock_common {
+-	unsigned short		skc_family;
+-	volatile unsigned char	skc_state;
+-	unsigned char		skc_reuse;
+-	int			skc_bound_dev_if;
++	/*
++	 * first fields are not copied in sock_copy()
++	 */
+ 	union {
+ 		struct hlist_node	skc_node;
+ 		struct hlist_nulls_node skc_nulls_node;
+ 	};
+-	struct hlist_node	skc_bind_node;
+ 	atomic_t		skc_refcnt;
++
+ 	unsigned int		skc_hash;
++	unsigned short		skc_family;
++	volatile unsigned char	skc_state;
++	unsigned char		skc_reuse;
++	int			skc_bound_dev_if;
++	struct hlist_node	skc_bind_node;
+ 	struct proto		*skc_prot;
+ #ifdef CONFIG_NET_NS
+ 	struct net	 	*skc_net;
+@@ -207,15 +211,17 @@ struct sock {
+ 	 * don't add nothing before this first member (__sk_common) --acme
+ 	 */
+ 	struct sock_common	__sk_common;
++#define sk_node			__sk_common.skc_node
++#define sk_nulls_node		__sk_common.skc_nulls_node
++#define sk_refcnt		__sk_common.skc_refcnt
++
++#define sk_copy_start		__sk_common.skc_hash
++#define sk_hash			__sk_common.skc_hash
+ #define sk_family		__sk_common.skc_family
+ #define sk_state		__sk_common.skc_state
+ #define sk_reuse		__sk_common.skc_reuse
+ #define sk_bound_dev_if		__sk_common.skc_bound_dev_if
+-#define sk_node			__sk_common.skc_node
+-#define sk_nulls_node		__sk_common.skc_nulls_node
+ #define sk_bind_node		__sk_common.skc_bind_node
+-#define sk_refcnt		__sk_common.skc_refcnt
+-#define sk_hash			__sk_common.skc_hash
+ #define sk_prot			__sk_common.skc_prot
+ #define sk_net			__sk_common.skc_net
+ 	unsigned char		sk_shutdown : 2,
+@@ -1225,6 +1231,8 @@ static inline void skb_set_owner_w(struct sk_buff *skb, struct sock *sk)
+ 
+ static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
+ {
++	skb_orphan(skb);
++	skb_orphan(skb);
+ 	skb->sk = sk;
+ 	skb->destructor = sock_rfree;
+ 	atomic_add(skb->truesize, &sk->sk_rmem_alloc);
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 875ffbd..9c1f52d 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -568,18 +568,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
+ 	 * the value intact in a core dump, and to save the unnecessary
+ 	 * trouble otherwise.  Userland only wants this done for a sys_exit.
+ 	 */
+-	if (tsk->clear_child_tid
+-	    && !(tsk->flags & PF_SIGNALED)
+-	    && atomic_read(&mm->mm_users) > 1) {
+-		u32 __user * tidptr = tsk->clear_child_tid;
++	if (tsk->clear_child_tid) {
++		if (!(tsk->flags & PF_SIGNALED) &&
++		    atomic_read(&mm->mm_users) > 1) {
++			/*
++			 * We don't check the error code - if userspace has
++			 * not set up a proper pointer then tough luck.
++			 */
++			put_user(0, tsk->clear_child_tid);
++			sys_futex(tsk->clear_child_tid, FUTEX_WAKE,
++					1, NULL, NULL, 0);
++		}
+ 		tsk->clear_child_tid = NULL;
+-
+-		/*
+-		 * We don't check the error code - if userspace has
+-		 * not set up a proper pointer then tough luck.
+-		 */
+-		put_user(0, tidptr);
+-		sys_futex(tidptr, FUTEX_WAKE, 1, NULL, NULL, 0);
+ 	}
+ }
+ 
+diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
+index 052ec4d..d089d05 100644
+--- a/kernel/posix-timers.c
++++ b/kernel/posix-timers.c
+@@ -202,6 +202,12 @@ static int no_timer_create(struct k_itimer *new_timer)
+ 	return -EOPNOTSUPP;
+ }
+ 
++static int no_nsleep(const clockid_t which_clock, int flags,
++		     struct timespec *tsave, struct timespec __user *rmtp)
++{
++	return -EOPNOTSUPP;
++}
++
+ /*
+  * Return nonzero if we know a priori this clockid_t value is bogus.
+  */
+diff --git a/kernel/smp.c b/kernel/smp.c
+index ad63d85..94188b8 100644
+--- a/kernel/smp.c
++++ b/kernel/smp.c
+@@ -57,7 +57,7 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu)
+ 			return NOTIFY_BAD;
+ 		break;
+ 
+-#ifdef CONFIG_CPU_HOTPLUG
++#ifdef CONFIG_HOTPLUG_CPU
+ 	case CPU_UP_CANCELED:
+ 	case CPU_UP_CANCELED_FROZEN:
+ 
+diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
+index 960cbf4..f99b792 100644
+--- a/kernel/trace/ring_buffer.c
++++ b/kernel/trace/ring_buffer.c
+@@ -695,6 +695,7 @@ ring_buffer_free(struct ring_buffer *buffer)
+ 
+ 	put_online_cpus();
+ 
++	kfree(buffer->buffers);
+ 	free_cpumask_var(buffer->cpumask);
+ 
+ 	kfree(buffer);
+@@ -2101,7 +2102,6 @@ rb_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
+ 		 * the box. Return the padding, and we will release
+ 		 * the current locks, and try again.
+ 		 */
+-		rb_advance_reader(cpu_buffer);
+ 		return event;
+ 
+ 	case RINGBUF_TYPE_TIME_EXTEND:
+@@ -2218,6 +2218,8 @@ ring_buffer_peek(struct ring_buffer *buffer, int cpu, u64 *ts)
+  again:
+ 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
+ 	event = rb_buffer_peek(buffer, cpu, ts);
++	if (event && event->type == RINGBUF_TYPE_PADDING)
++		rb_advance_reader(cpu_buffer);
+ 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
+ 
+ 	if (event && event->type == RINGBUF_TYPE_PADDING) {
+@@ -2282,12 +2284,9 @@ ring_buffer_consume(struct ring_buffer *buffer, int cpu, u64 *ts)
+ 	spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
+ 
+ 	event = rb_buffer_peek(buffer, cpu, ts);
+-	if (!event)
+-		goto out_unlock;
+-
+-	rb_advance_reader(cpu_buffer);
++	if (event)
++		rb_advance_reader(cpu_buffer);
+ 
+- out_unlock:
+ 	spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
+ 
+  out:
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index cda81ec..3928aee 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -2993,7 +2993,8 @@ tracing_fill_pipe_page(size_t rem, struct trace_iterator *iter)
+ 			break;
+ 		}
+ 
+-		trace_consume(iter);
++		if (ret != TRACE_TYPE_NO_CONSUME)
++			trace_consume(iter);
+ 		rem -= count;
+ 		if (!find_next_entry_inc(iter))	{
+ 			rem = 0;
+@@ -4122,8 +4123,11 @@ static void __ftrace_dump(bool disable_tracing)
+ 		iter.pos = -1;
+ 
+ 		if (find_next_entry_inc(&iter) != NULL) {
+-			print_trace_line(&iter);
+-			trace_consume(&iter);
++			int ret;
++
++			ret = print_trace_line(&iter);
++			if (ret != TRACE_TYPE_NO_CONSUME)
++				trace_consume(&iter);
+ 		}
+ 
+ 		trace_printk_seq(&iter.seq);
+diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
+index d28687e..8ef6a93 100644
+--- a/kernel/trace/trace_functions_graph.c
++++ b/kernel/trace/trace_functions_graph.c
+@@ -798,9 +798,16 @@ print_graph_function(struct trace_iterator *iter)
+ 
+ 	switch (entry->type) {
+ 	case TRACE_GRAPH_ENT: {
+-		struct ftrace_graph_ent_entry *field;
++		/*
++		 * print_graph_entry() may consume the current event,
++		 * thus @field may become invalid, so we need to save it.
++		 * sizeof(struct ftrace_graph_ent_entry) is very small,
++		 * it can be safely saved at the stack.
++		 */
++		struct ftrace_graph_ent_entry *field, saved;
+ 		trace_assign_type(field, entry);
+-		return print_graph_entry(field, s, iter);
++		saved = *field;
++		return print_graph_entry(&saved, s, iter);
+ 	}
+ 	case TRACE_GRAPH_RET: {
+ 		struct ftrace_graph_ret_entry *field;
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index e83ad2c..2403eb9 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -2341,7 +2341,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed)
+ 	long chg = region_truncate(&inode->i_mapping->private_list, offset);
+ 
+ 	spin_lock(&inode->i_lock);
+-	inode->i_blocks -= blocks_per_huge_page(h);
++	inode->i_blocks -= (blocks_per_huge_page(h) * freed);
+ 	spin_unlock(&inode->i_lock);
+ 
+ 	hugetlb_put_quota(inode->i_mapping, (chg - freed));
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 480907c..6bf3cc4 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -858,7 +858,7 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order,
+  */
+ static int rmqueue_bulk(struct zone *zone, unsigned int order, 
+ 			unsigned long count, struct list_head *list,
+-			int migratetype)
++			int migratetype, int cold)
+ {
+ 	int i;
+ 	
+@@ -877,7 +877,10 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
+ 		 * merge IO requests if the physical pages are ordered
+ 		 * properly.
+ 		 */
+-		list_add(&page->lru, list);
++		if (likely(cold == 0))
++			list_add(&page->lru, list);
++		else
++			list_add_tail(&page->lru, list);
+ 		set_page_private(page, migratetype);
+ 		list = &page->lru;
+ 	}
+@@ -1077,7 +1080,8 @@ again:
+ 		local_irq_save(flags);
+ 		if (!pcp->count) {
+ 			pcp->count = rmqueue_bulk(zone, 0,
+-					pcp->batch, &pcp->list, migratetype);
++					pcp->batch, &pcp->list,
++					migratetype, cold);
+ 			if (unlikely(!pcp->count))
+ 				goto failed;
+ 		}
+@@ -1096,7 +1100,8 @@ again:
+ 		/* Allocate more to the pcp list if necessary */
+ 		if (unlikely(&page->lru == &pcp->list)) {
+ 			pcp->count += rmqueue_bulk(zone, 0,
+-					pcp->batch, &pcp->list, migratetype);
++					pcp->batch, &pcp->list,
++					migratetype, cold);
+ 			page = list_entry(pcp->list.next, struct page, lru);
+ 		}
+ 
+diff --git a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c
+index 5f1d210..de56d39 100644
+--- a/net/ax25/ax25_in.c
++++ b/net/ax25/ax25_in.c
+@@ -437,8 +437,7 @@ free:
+ int ax25_kiss_rcv(struct sk_buff *skb, struct net_device *dev,
+ 		  struct packet_type *ptype, struct net_device *orig_dev)
+ {
+-	skb->sk = NULL;		/* Initially we don't know who it's for */
+-	skb->destructor = NULL;	/* Who initializes this, dammit?! */
++	skb_orphan(skb);
+ 
+ 	if (!net_eq(dev_net(dev), &init_net)) {
+ 		kfree_skb(skb);
+diff --git a/net/core/dev.c b/net/core/dev.c
+index e2e9e4a..e545067 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -2284,8 +2284,6 @@ ncls:
+ 	if (!skb)
+ 		goto out;
+ 
+-	skb_orphan(skb);
+-
+ 	type = skb->protocol;
+ 	list_for_each_entry_rcu(ptype,
+ 			&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {
+@@ -2788,9 +2786,11 @@ static void net_rx_action(struct softirq_action *h)
+ 		 * move the instance around on the list at-will.
+ 		 */
+ 		if (unlikely(work == weight)) {
+-			if (unlikely(napi_disable_pending(n)))
+-				__napi_complete(n);
+-			else
++			if (unlikely(napi_disable_pending(n))) {
++				local_irq_enable();
++				napi_complete(n);
++				local_irq_disable();
++			} else
+ 				list_move_tail(&n->poll_list, list);
+ 		}
+ 
+diff --git a/net/core/sock.c b/net/core/sock.c
+index 7dbf3ff..3f5e77e 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -915,13 +915,19 @@ static inline void sock_lock_init(struct sock *sk)
+ 			af_family_keys + sk->sk_family);
+ }
+ 
++/*
++ * Copy all fields from osk to nsk but nsk->sk_refcnt must not change yet,
++ * even temporarly, because of RCU lookups. sk_node should also be left as is.
++ */
+ static void sock_copy(struct sock *nsk, const struct sock *osk)
+ {
+ #ifdef CONFIG_SECURITY_NETWORK
+ 	void *sptr = nsk->sk_security;
+ #endif
+-
+-	memcpy(nsk, osk, osk->sk_prot->obj_size);
++	BUILD_BUG_ON(offsetof(struct sock, sk_copy_start) !=
++		     sizeof(osk->sk_node) + sizeof(osk->sk_refcnt));
++	memcpy(&nsk->sk_copy_start, &osk->sk_copy_start,
++	       osk->sk_prot->obj_size - offsetof(struct sock, sk_copy_start));
+ #ifdef CONFIG_SECURITY_NETWORK
+ 	nsk->sk_security = sptr;
+ 	security_sk_clone(osk, nsk);
+@@ -935,8 +941,23 @@ static struct sock *sk_prot_alloc(struct proto *prot, gfp_t priority,
+ 	struct kmem_cache *slab;
+ 
+ 	slab = prot->slab;
+-	if (slab != NULL)
+-		sk = kmem_cache_alloc(slab, priority);
++	if (slab != NULL) {
++		sk = kmem_cache_alloc(slab, priority & ~__GFP_ZERO);
++		if (!sk)
++			return sk;
++		if (priority & __GFP_ZERO) {
++			/*
++			 * caches using SLAB_DESTROY_BY_RCU should let
++			 * sk_node.next un-modified. Special care is taken
++			 * when initializing object to zero.
++			 */
++			if (offsetof(struct sock, sk_node.next) != 0)
++				memset(sk, 0, offsetof(struct sock, sk_node.next));
++			memset(&sk->sk_node.pprev, 0,
++			       prot->obj_size - offsetof(struct sock,
++							 sk_node.pprev));
++		}
++	}
+ 	else
+ 		sk = kmalloc(prot->obj_size, priority);
+ 
+@@ -1103,6 +1124,11 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
+ 
+ 		newsk->sk_err	   = 0;
+ 		newsk->sk_priority = 0;
++		/*
++		 * Before updating sk_refcnt, we must commit prior changes to memory
++		 * (Documentation/RCU/rculist_nulls.txt for details)
++		 */
++		smp_wmb();
+ 		atomic_set(&newsk->sk_refcnt, 2);
+ 
+ 		/*
+@@ -1794,6 +1820,11 @@ void sock_init_data(struct socket *sock, struct sock *sk)
+ 
+ 	sk->sk_stamp = ktime_set(-1L, 0);
+ 
++	/*
++	 * Before updating sk_refcnt, we must commit prior changes to memory
++	 * (Documentation/RCU/rculist_nulls.txt for details)
++	 */
++	smp_wmb();
+ 	atomic_set(&sk->sk_refcnt, 1);
+ 	atomic_set(&sk->sk_drops, 0);
+ }
+diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c
+index 1a58a6f..0bc7bf5 100644
+--- a/net/ipv4/ip_input.c
++++ b/net/ipv4/ip_input.c
+@@ -437,6 +437,9 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
+ 	/* Remove any debris in the socket control block */
+ 	memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
+ 
++	/* Must drop socket now because of tproxy. */
++	skb_orphan(skb);
++
+ 	return NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, dev, NULL,
+ 		       ip_rcv_finish);
+ 
+diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
+index 8f04bd9..c0cd26a 100644
+--- a/net/ipv6/ip6_input.c
++++ b/net/ipv6/ip6_input.c
+@@ -139,6 +139,9 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt
+ 
+ 	rcu_read_unlock();
+ 
++	/* Must drop socket now because of tproxy. */
++	skb_orphan(skb);
++
+ 	return NF_HOOK(PF_INET6, NF_INET_PRE_ROUTING, skb, dev, NULL,
+ 		       ip6_rcv_finish);
+ err:
+diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
+index 3eb5bcc..e0fbcff 100644
+--- a/net/irda/af_irda.c
++++ b/net/irda/af_irda.c
+@@ -913,9 +913,6 @@ static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
+ 	/* Clean up the original one to keep it in listen state */
+ 	irttp_listen(self->tsap);
+ 
+-	/* Wow ! What is that ? Jean II */
+-	skb->sk = NULL;
+-	skb->destructor = NULL;
+ 	kfree_skb(skb);
+ 	sk->sk_ack_backlog--;
+ 
+diff --git a/net/irda/ircomm/ircomm_lmp.c b/net/irda/ircomm/ircomm_lmp.c
+index 67c99d2..7ba9661 100644
+--- a/net/irda/ircomm/ircomm_lmp.c
++++ b/net/irda/ircomm/ircomm_lmp.c
+@@ -196,6 +196,7 @@ static int ircomm_lmp_data_request(struct ircomm_cb *self,
+ 	/* Don't forget to refcount it - see ircomm_tty_do_softint() */
+ 	skb_get(skb);
+ 
++	skb_orphan(skb);
+ 	skb->destructor = ircomm_lmp_flow_control;
+ 
+ 	if ((self->pkt_count++ > 7) && (self->flow_status == FLOW_START)) {
+diff --git a/net/socket.c b/net/socket.c
+index 791d71a..6d47165 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -736,7 +736,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
+ 	if (more)
+ 		flags |= MSG_MORE;
+ 
+-	return sock->ops->sendpage(sock, page, offset, size, flags);
++	return kernel_sendpage(sock, page, offset, size, flags);
+ }
+ 
+ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
+diff --git a/net/wireless/scan.c b/net/wireless/scan.c
+index bc7f788..f5be6a8 100644
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -118,7 +118,7 @@ static int cmp_ies(u8 num, u8 *ies1, size_t len1, u8 *ies2, size_t len2)
+ 
+ 	if (!ie1 && !ie2)
+ 		return 0;
+-	if (!ie1)
++	if (!ie1 || !ie2)
+ 		return -1;
+ 
+ 	r = memcmp(ie1 + 2, ie2 + 2, min(ie1[1], ie2[1]));
+@@ -171,6 +171,8 @@ static bool is_mesh(struct cfg80211_bss *a,
+ 	ie = find_ie(WLAN_EID_MESH_CONFIG,
+ 		     a->information_elements,
+ 		     a->len_information_elements);
++	if (!ie)
++		return false;
+ 	if (ie[1] != IEEE80211_MESH_CONFIG_LEN)
+ 		return false;
+ 
+diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c
+index 96036cf..79d78f4 100644
+--- a/net/xfrm/xfrm_algo.c
++++ b/net/xfrm/xfrm_algo.c
+@@ -292,8 +292,8 @@ static struct xfrm_algo_desc ealg_list[] = {
+ 	}
+ },
+ {
+-	.name = "cbc(cast128)",
+-	.compat = "cast128",
++	.name = "cbc(cast5)",
++	.compat = "cast5",
+ 
+ 	.uinfo = {
+ 		.encr = {
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 18e8dad..1df7692 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -13150,6 +13150,8 @@ static int patch_alc269(struct hda_codec *codec)
+ 		set_capture_mixer(spec);
+ 	set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
+ 
++	spec->vmaster_nid = 0x02;
++
+ 	codec->patch_ops = alc_patch_ops;
+ 	if (board_config == ALC269_AUTO)
+ 		spec->init_hook = alc269_auto_init;

Deleted: genpatches-2.6/trunk/2.6.30/1500_Make-sock-sendpage-use-kernel-sendpage.patch
===================================================================
--- genpatches-2.6/trunk/2.6.30/1500_Make-sock-sendpage-use-kernel-sendpage.patch	2009-08-14 11:27:21 UTC (rev 1596)
+++ genpatches-2.6/trunk/2.6.30/1500_Make-sock-sendpage-use-kernel-sendpage.patch	2009-08-17 00:54:12 UTC (rev 1597)
@@ -1,11 +0,0 @@
---- a/net/socket.c	2009-08-13 19:13:00.000000000 -0400
-+++ b/net/socket.c	2009-08-13 19:14:38.000000000 -0400
-@@ -736,7 +736,7 @@ static ssize_t sock_sendpage(struct file
- 	if (more)
- 		flags |= MSG_MORE;
- 
--	return sock->ops->sendpage(sock, page, offset, size, flags);
-+	return kernel_sendpage(sock, page, offset, size, flags);
- }
- 
- static ssize_t sock_splice_read(struct file *file, loff_t *ppos,

Deleted: genpatches-2.6/trunk/2.6.30/2700_init-fence-regs-to-zero-on-GEM-load.patch
===================================================================
--- genpatches-2.6/trunk/2.6.30/2700_init-fence-regs-to-zero-on-GEM-load.patch	2009-08-14 11:27:21 UTC (rev 1596)
+++ genpatches-2.6/trunk/2.6.30/2700_init-fence-regs-to-zero-on-GEM-load.patch	2009-08-17 00:54:12 UTC (rev 1597)
@@ -1,50 +0,0 @@
-From: Grégoire Henry <Gregoire.Henry@pps.jussieu.fr>
-Date: Tue, 23 Jun 2009 13:41:02 +0000 (+0200)
-Subject: drm/i915: initialize fence registers to zero when loading GEM
-X-Git-Tag: v2.6.31-rc2~85^2~1^2
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=b5aa8a0fc132dd512c33e7c2621d075e3b77a65e
-
-drm/i915: initialize fence registers to zero when loading GEM
-
-Unitialized fence register could leads to corrupted display. Problem
-encountered on MacBooks (revision 1 and 2), directly booting from EFI
-or through BIOS emulation.
-
-(bug #21710 at freedestop.org)
-
-Signed-off-by: Grégoire Henry <henry@pps.jussieu.fr>
-Signed-off-by: Eric Anholt <eric@anholt.net>
----
-
-diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
-index 8660b21..876b65c 100644
---- a/drivers/gpu/drm/i915/i915_gem.c
-+++ b/drivers/gpu/drm/i915/i915_gem.c
-@@ -4227,6 +4227,7 @@ i915_gem_lastclose(struct drm_device *dev)
- void
- i915_gem_load(struct drm_device *dev)
- {
-+	int i;
- 	drm_i915_private_t *dev_priv = dev->dev_private;
- 
- 	spin_lock_init(&dev_priv->mm.active_list_lock);
-@@ -4246,6 +4247,18 @@ i915_gem_load(struct drm_device *dev)
- 	else
- 		dev_priv->num_fence_regs = 8;
- 
-+	/* Initialize fence registers to zero */
-+	if (IS_I965G(dev)) {
-+		for (i = 0; i < 16; i++)
-+			I915_WRITE64(FENCE_REG_965_0 + (i * 8), 0);
-+	} else {
-+		for (i = 0; i < 8; i++)
-+			I915_WRITE(FENCE_REG_830_0 + (i * 4), 0);
-+		if (IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
-+			for (i = 0; i < 8; i++)
-+				I915_WRITE(FENCE_REG_945_8 + (i * 4), 0);
-+	}
-+
- 	i915_gem_detect_bit_6_swizzle(dev);
- }
- 
-




                 reply	other threads:[~2009-08-17  0:54 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1McqUH-0003fM-0X@stork.gentoo.org \
    --to=mpagano@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox