diff options
Diffstat (limited to '3.2.20/1019_linux-3.2.20.patch')
-rw-r--r-- | 3.2.20/1019_linux-3.2.20.patch | 2829 |
1 files changed, 0 insertions, 2829 deletions
diff --git a/3.2.20/1019_linux-3.2.20.patch b/3.2.20/1019_linux-3.2.20.patch deleted file mode 100644 index 5350ff6..0000000 --- a/3.2.20/1019_linux-3.2.20.patch +++ /dev/null @@ -1,2829 +0,0 @@ -diff --git a/Makefile b/Makefile -index c291184..c7e9cc4 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 3 - PATCHLEVEL = 2 --SUBLEVEL = 19 -+SUBLEVEL = 20 - EXTRAVERSION = - NAME = Saber-toothed Squirrel - -diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig -index ef642a0..987c72d 100644 ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -520,7 +520,7 @@ config ARCH_IXP4XX - depends on MMU - select CLKSRC_MMIO - select CPU_XSCALE -- select GENERIC_GPIO -+ select ARCH_REQUIRE_GPIOLIB - select GENERIC_CLOCKEVENTS - select HAVE_SCHED_CLOCK - select MIGHT_HAVE_PCI -diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c -index b86a005..caf28fc 100644 ---- a/arch/arm/mach-ixp4xx/common.c -+++ b/arch/arm/mach-ixp4xx/common.c -@@ -29,6 +29,7 @@ - #include <linux/clockchips.h> - #include <linux/io.h> - #include <linux/export.h> -+#include <linux/gpio.h> - - #include <mach/udc.h> - #include <mach/hardware.h> -@@ -106,7 +107,7 @@ static signed char irq2gpio[32] = { - 7, 8, 9, 10, 11, 12, -1, -1, - }; - --int gpio_to_irq(int gpio) -+static int ixp4xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) - { - int irq; - -@@ -116,7 +117,6 @@ int gpio_to_irq(int gpio) - } - return -EINVAL; - } --EXPORT_SYMBOL(gpio_to_irq); - - int irq_to_gpio(unsigned int irq) - { -@@ -376,12 +376,56 @@ static struct platform_device *ixp46x_devices[] __initdata = { - unsigned long ixp4xx_exp_bus_size; - EXPORT_SYMBOL(ixp4xx_exp_bus_size); - -+static int ixp4xx_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) -+{ -+ gpio_line_config(gpio, IXP4XX_GPIO_IN); -+ -+ return 0; -+} -+ -+static int ixp4xx_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, -+ int level) -+{ -+ gpio_line_set(gpio, level); -+ gpio_line_config(gpio, IXP4XX_GPIO_OUT); -+ -+ return 0; -+} -+ -+static int ixp4xx_gpio_get_value(struct gpio_chip *chip, unsigned gpio) -+{ -+ int value; -+ -+ gpio_line_get(gpio, &value); -+ -+ return value; -+} -+ -+static void ixp4xx_gpio_set_value(struct gpio_chip *chip, unsigned gpio, -+ int value) -+{ -+ gpio_line_set(gpio, value); -+} -+ -+static struct gpio_chip ixp4xx_gpio_chip = { -+ .label = "IXP4XX_GPIO_CHIP", -+ .direction_input = ixp4xx_gpio_direction_input, -+ .direction_output = ixp4xx_gpio_direction_output, -+ .get = ixp4xx_gpio_get_value, -+ .set = ixp4xx_gpio_set_value, -+ .to_irq = ixp4xx_gpio_to_irq, -+ .base = 0, -+ .ngpio = 16, -+}; -+ - void __init ixp4xx_sys_init(void) - { - ixp4xx_exp_bus_size = SZ_16M; - - platform_add_devices(ixp4xx_devices, ARRAY_SIZE(ixp4xx_devices)); - -+ gpiochip_add(&ixp4xx_gpio_chip); -+ - if (cpu_is_ixp46x()) { - int region; - -diff --git a/arch/arm/mach-ixp4xx/include/mach/gpio.h b/arch/arm/mach-ixp4xx/include/mach/gpio.h -index 83d6b4e..ef37f26 100644 ---- a/arch/arm/mach-ixp4xx/include/mach/gpio.h -+++ b/arch/arm/mach-ixp4xx/include/mach/gpio.h -@@ -1,79 +1,2 @@ --/* -- * arch/arm/mach-ixp4xx/include/mach/gpio.h -- * -- * IXP4XX GPIO wrappers for arch-neutral GPIO calls -- * -- * Written by Milan Svoboda <msvoboda@ra.rockwell.com> -- * Based on PXA implementation by Philipp Zabel <philipp.zabel@gmail.com> -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License as published by -- * the Free Software Foundation; either version 2 of the License, or -- * (at your option) any later version. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- * -- * You should have received a copy of the GNU General Public License -- * along with this program; if not, write to the Free Software -- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- * -- */ -- --#ifndef __ASM_ARCH_IXP4XX_GPIO_H --#define __ASM_ARCH_IXP4XX_GPIO_H -- --#include <linux/kernel.h> --#include <mach/hardware.h> -- --#define __ARM_GPIOLIB_COMPLEX -- --static inline int gpio_request(unsigned gpio, const char *label) --{ -- return 0; --} -- --static inline void gpio_free(unsigned gpio) --{ -- might_sleep(); -- -- return; --} -- --static inline int gpio_direction_input(unsigned gpio) --{ -- gpio_line_config(gpio, IXP4XX_GPIO_IN); -- return 0; --} -- --static inline int gpio_direction_output(unsigned gpio, int level) --{ -- gpio_line_set(gpio, level); -- gpio_line_config(gpio, IXP4XX_GPIO_OUT); -- return 0; --} -- --static inline int gpio_get_value(unsigned gpio) --{ -- int value; -- -- gpio_line_get(gpio, &value); -- -- return value; --} -- --static inline void gpio_set_value(unsigned gpio, int value) --{ -- gpio_line_set(gpio, value); --} -- --#include <asm-generic/gpio.h> /* cansleep wrappers */ -- --extern int gpio_to_irq(int gpio); --#define gpio_to_irq gpio_to_irq --extern int irq_to_gpio(unsigned int irq); -- --#endif -+/* empty */ - -diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig -index e446bab..a93ed04 100644 ---- a/arch/microblaze/Kconfig -+++ b/arch/microblaze/Kconfig -@@ -46,7 +46,7 @@ config GENERIC_CLOCKEVENTS - def_bool y - - config GENERIC_GPIO -- def_bool y -+ bool - - config GENERIC_CSUM - def_bool y -diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h -index 3999ec0..67d1ce0 100644 ---- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h -+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h -@@ -2,6 +2,7 @@ - #define BCM63XX_GPIO_H - - #include <linux/init.h> -+#include <bcm63xx_cpu.h> - - int __init bcm63xx_gpio_init(void); - -diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S -index 5350342..07ef351 100644 ---- a/arch/parisc/kernel/entry.S -+++ b/arch/parisc/kernel/entry.S -@@ -552,7 +552,7 @@ - * entry (identifying the physical page) and %r23 up with - * the from tlb entry (or nothing if only a to entry---for - * clear_user_page_asm) */ -- .macro do_alias spc,tmp,tmp1,va,pte,prot,fault -+ .macro do_alias spc,tmp,tmp1,va,pte,prot,fault,patype - cmpib,COND(<>),n 0,\spc,\fault - ldil L%(TMPALIAS_MAP_START),\tmp - #if defined(CONFIG_64BIT) && (TMPALIAS_MAP_START >= 0x80000000) -@@ -581,11 +581,15 @@ - */ - cmpiclr,= 0x01,\tmp,%r0 - ldi (_PAGE_DIRTY|_PAGE_READ|_PAGE_WRITE),\prot --#ifdef CONFIG_64BIT -+.ifc \patype,20 - depd,z \prot,8,7,\prot --#else -+.else -+.ifc \patype,11 - depw,z \prot,8,7,\prot --#endif -+.else -+ .error "undefined PA type to do_alias" -+.endif -+.endif - /* - * OK, it is in the temp alias region, check whether "from" or "to". - * Check "subtle" note in pacache.S re: r23/r26. -@@ -1189,7 +1193,7 @@ dtlb_miss_20w: - nop - - dtlb_check_alias_20w: -- do_alias spc,t0,t1,va,pte,prot,dtlb_fault -+ do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20 - - idtlbt pte,prot - -@@ -1213,7 +1217,7 @@ nadtlb_miss_20w: - nop - - nadtlb_check_alias_20w: -- do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate -+ do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20 - - idtlbt pte,prot - -@@ -1245,7 +1249,7 @@ dtlb_miss_11: - nop - - dtlb_check_alias_11: -- do_alias spc,t0,t1,va,pte,prot,dtlb_fault -+ do_alias spc,t0,t1,va,pte,prot,dtlb_fault,11 - - idtlba pte,(va) - idtlbp prot,(va) -@@ -1277,7 +1281,7 @@ nadtlb_miss_11: - nop - - nadtlb_check_alias_11: -- do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate -+ do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,11 - - idtlba pte,(va) - idtlbp prot,(va) -@@ -1304,7 +1308,7 @@ dtlb_miss_20: - nop - - dtlb_check_alias_20: -- do_alias spc,t0,t1,va,pte,prot,dtlb_fault -+ do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20 - - idtlbt pte,prot - -@@ -1330,7 +1334,7 @@ nadtlb_miss_20: - nop - - nadtlb_check_alias_20: -- do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate -+ do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20 - - idtlbt pte,prot - -@@ -1457,7 +1461,7 @@ naitlb_miss_20w: - nop - - naitlb_check_alias_20w: -- do_alias spc,t0,t1,va,pte,prot,naitlb_fault -+ do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20 - - iitlbt pte,prot - -@@ -1511,7 +1515,7 @@ naitlb_miss_11: - nop - - naitlb_check_alias_11: -- do_alias spc,t0,t1,va,pte,prot,itlb_fault -+ do_alias spc,t0,t1,va,pte,prot,itlb_fault,11 - - iitlba pte,(%sr0, va) - iitlbp prot,(%sr0, va) -@@ -1557,7 +1561,7 @@ naitlb_miss_20: - nop - - naitlb_check_alias_20: -- do_alias spc,t0,t1,va,pte,prot,naitlb_fault -+ do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20 - - iitlbt pte,prot - -diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S -index fa6f2b8..64a9998 100644 ---- a/arch/parisc/kernel/vmlinux.lds.S -+++ b/arch/parisc/kernel/vmlinux.lds.S -@@ -50,8 +50,10 @@ SECTIONS - . = KERNEL_BINARY_TEXT_START; - - _text = .; /* Text and read-only data */ -- .text ALIGN(16) : { -+ .head ALIGN(16) : { - HEAD_TEXT -+ } = 0 -+ .text ALIGN(16) : { - TEXT_TEXT - SCHED_TEXT - LOCK_TEXT -@@ -65,7 +67,7 @@ SECTIONS - *(.fixup) - *(.lock.text) /* out-of-line lock text */ - *(.gnu.warning) -- } = 0 -+ } - /* End of text section */ - _etext = .; - -diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c -index e7c920b..cca659e 100644 ---- a/arch/x86/xen/enlighten.c -+++ b/arch/x86/xen/enlighten.c -@@ -982,7 +982,10 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = { - .wbinvd = native_wbinvd, - - .read_msr = native_read_msr_safe, -+ .rdmsr_regs = native_rdmsr_safe_regs, - .write_msr = xen_write_msr_safe, -+ .wrmsr_regs = native_wrmsr_safe_regs, -+ - .read_tsc = native_read_tsc, - .read_pmc = native_read_pmc, - -diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c -index 7711d94..5535477 100644 ---- a/drivers/acpi/battery.c -+++ b/drivers/acpi/battery.c -@@ -643,11 +643,19 @@ static int acpi_battery_update(struct acpi_battery *battery) - - static void acpi_battery_refresh(struct acpi_battery *battery) - { -+ int power_unit; -+ - if (!battery->bat.dev) - return; - -+ power_unit = battery->power_unit; -+ - acpi_battery_get_info(battery); -- /* The battery may have changed its reporting units. */ -+ -+ if (power_unit == battery->power_unit) -+ return; -+ -+ /* The battery has changed its reporting units. */ - sysfs_remove_battery(battery); - sysfs_add_battery(battery); - } -diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c -index 5d1d076..d452592 100644 ---- a/drivers/atm/solos-pci.c -+++ b/drivers/atm/solos-pci.c -@@ -984,6 +984,7 @@ static uint32_t fpga_tx(struct solos_card *card) - } else if (skb && card->using_dma) { - SKB_CB(skb)->dma_addr = pci_map_single(card->dev, skb->data, - skb->len, PCI_DMA_TODEVICE); -+ card->tx_skb[port] = skb; - iowrite32(SKB_CB(skb)->dma_addr, - card->config_regs + TX_DMA_ADDR(port)); - } -@@ -1152,7 +1153,8 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id) - db_fpga_upgrade = db_firmware_upgrade = 0; - } - -- if (card->fpga_version >= DMA_SUPPORTED){ -+ if (card->fpga_version >= DMA_SUPPORTED) { -+ pci_set_master(dev); - card->using_dma = 1; - } else { - card->using_dma = 0; -diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c -index 99fefbd..f1bd44f 100644 ---- a/drivers/bluetooth/ath3k.c -+++ b/drivers/bluetooth/ath3k.c -@@ -74,10 +74,15 @@ static struct usb_device_id ath3k_table[] = { - { USB_DEVICE(0x0CF3, 0x311D) }, - { USB_DEVICE(0x13d3, 0x3375) }, - { USB_DEVICE(0x04CA, 0x3005) }, -+ { USB_DEVICE(0x13d3, 0x3362) }, -+ { USB_DEVICE(0x0CF3, 0xE004) }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE02C) }, - -+ /* Atheros AR5BBU22 with sflash firmware */ -+ { USB_DEVICE(0x0489, 0xE03C) }, -+ - { } /* Terminating entry */ - }; - -@@ -93,6 +98,11 @@ static struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 }, -+ -+ /* Atheros AR5BBU22 with sflash firmware */ -+ { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, - - { } /* Terminating entry */ - }; -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index e56da6a..fc4bcd6 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -61,7 +61,7 @@ static struct usb_device_id btusb_table[] = { - { USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, - - /* Broadcom SoftSailing reporting vendor specific */ -- { USB_DEVICE(0x05ac, 0x21e1) }, -+ { USB_DEVICE(0x0a5c, 0x21e1) }, - - /* Apple MacBookPro 7,1 */ - { USB_DEVICE(0x05ac, 0x8213) }, -@@ -101,9 +101,16 @@ static struct usb_device_id btusb_table[] = { - { USB_DEVICE(0x0c10, 0x0000) }, - - /* Broadcom BCM20702A0 */ -+ { USB_DEVICE(0x0489, 0xe042) }, - { USB_DEVICE(0x0a5c, 0x21e3) }, -+ { USB_DEVICE(0x0a5c, 0x21e6) }, -+ { USB_DEVICE(0x0a5c, 0x21e8) }, -+ { USB_DEVICE(0x0a5c, 0x21f3) }, - { USB_DEVICE(0x413c, 0x8197) }, - -+ /* Foxconn - Hon Hai */ -+ { USB_DEVICE(0x0489, 0xe033) }, -+ - { } /* Terminating entry */ - }; - -@@ -130,10 +137,15 @@ static struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, - -+ /* Atheros AR5BBU12 with sflash firmware */ -+ { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 }, -+ - /* Broadcom BCM2035 */ - { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, - { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU }, -diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h -index a1d53b6..06ec1e5 100644 ---- a/drivers/gpu/drm/i915/i915_reg.h -+++ b/drivers/gpu/drm/i915/i915_reg.h -@@ -3533,7 +3533,11 @@ - #define GEN6_CAGF_MASK (0x7f << GEN6_CAGF_SHIFT) - #define GEN6_RP_CONTROL 0xA024 - #define GEN6_RP_MEDIA_TURBO (1<<11) --#define GEN6_RP_USE_NORMAL_FREQ (1<<9) -+#define GEN6_RP_MEDIA_MODE_MASK (3<<9) -+#define GEN6_RP_MEDIA_HW_TURBO_MODE (3<<9) -+#define GEN6_RP_MEDIA_HW_NORMAL_MODE (2<<9) -+#define GEN6_RP_MEDIA_HW_MODE (1<<9) -+#define GEN6_RP_MEDIA_SW_MODE (0<<9) - #define GEN6_RP_MEDIA_IS_GFX (1<<8) - #define GEN6_RP_ENABLE (1<<7) - #define GEN6_RP_UP_IDLE_MIN (0x1<<3) -diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 3ff980d..4720397 100644 ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -1864,7 +1864,7 @@ static void intel_update_fbc(struct drm_device *dev) - if (enable_fbc < 0) { - DRM_DEBUG_KMS("fbc set to per-chip default\n"); - enable_fbc = 1; -- if (INTEL_INFO(dev)->gen <= 5) -+ if (INTEL_INFO(dev)->gen <= 6) - enable_fbc = 0; - } - if (!enable_fbc) { -@@ -8005,7 +8005,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) - I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); - I915_WRITE(GEN6_RP_CONTROL, - GEN6_RP_MEDIA_TURBO | -- GEN6_RP_USE_NORMAL_FREQ | -+ GEN6_RP_MEDIA_HW_NORMAL_MODE | - GEN6_RP_MEDIA_IS_GFX | - GEN6_RP_ENABLE | - GEN6_RP_UP_BUSY_AVG | -diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c -index 12eb789..d4c4937 100644 ---- a/drivers/gpu/drm/i915/intel_dp.c -+++ b/drivers/gpu/drm/i915/intel_dp.c -@@ -1149,10 +1149,10 @@ static void ironlake_edp_panel_off(struct intel_dp *intel_dp) - - DRM_DEBUG_KMS("Turn eDP power off\n"); - -- WARN(intel_dp->want_panel_vdd, "Cannot turn power off while VDD is on\n"); -+ WARN(!intel_dp->want_panel_vdd, "Need VDD to turn off panel\n"); - - pp = ironlake_get_pp_control(dev_priv); -- pp &= ~(POWER_TARGET_ON | EDP_FORCE_VDD | PANEL_POWER_RESET | EDP_BLC_ENABLE); -+ pp &= ~(POWER_TARGET_ON | PANEL_POWER_RESET | EDP_BLC_ENABLE); - I915_WRITE(PCH_PP_CONTROL, pp); - POSTING_READ(PCH_PP_CONTROL); - -@@ -1260,18 +1260,16 @@ static void intel_dp_prepare(struct drm_encoder *encoder) - { - struct intel_dp *intel_dp = enc_to_intel_dp(encoder); - -+ -+ /* Make sure the panel is off before trying to change the mode. But also -+ * ensure that we have vdd while we switch off the panel. */ -+ ironlake_edp_panel_vdd_on(intel_dp); - ironlake_edp_backlight_off(intel_dp); - ironlake_edp_panel_off(intel_dp); - -- /* Wake up the sink first */ -- ironlake_edp_panel_vdd_on(intel_dp); - intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON); - intel_dp_link_down(intel_dp); - ironlake_edp_panel_vdd_off(intel_dp, false); -- -- /* Make sure the panel is off before trying to -- * change the mode -- */ - } - - static void intel_dp_commit(struct drm_encoder *encoder) -@@ -1303,10 +1301,11 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode) - uint32_t dp_reg = I915_READ(intel_dp->output_reg); - - if (mode != DRM_MODE_DPMS_ON) { -+ /* Switching the panel off requires vdd. */ -+ ironlake_edp_panel_vdd_on(intel_dp); - ironlake_edp_backlight_off(intel_dp); - ironlake_edp_panel_off(intel_dp); - -- ironlake_edp_panel_vdd_on(intel_dp); - intel_dp_sink_dpms(intel_dp, mode); - intel_dp_link_down(intel_dp); - ironlake_edp_panel_vdd_off(intel_dp, false); -diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c -index 583c2d0..ceec71b 100644 ---- a/drivers/gpu/drm/i915/intel_lvds.c -+++ b/drivers/gpu/drm/i915/intel_lvds.c -@@ -716,6 +716,14 @@ static const struct dmi_system_id intel_no_lvds[] = { - }, - }, - { -+ .callback = intel_no_lvds_dmi_callback, -+ .ident = "Clientron E830", -+ .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "Clientron"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "E830"), -+ }, -+ }, -+ { - .callback = intel_no_lvds_dmi_callback, - .ident = "Asus EeeBox PC EB1007", - .matches = { -@@ -733,6 +741,30 @@ static const struct dmi_system_id intel_no_lvds[] = { - }, - { - .callback = intel_no_lvds_dmi_callback, -+ .ident = "Hewlett-Packard HP t5740e Thin Client", -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), -+ }, -+ }, -+ { -+ .callback = intel_no_lvds_dmi_callback, -+ .ident = "Hewlett-Packard t5745", -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -+ DMI_MATCH(DMI_BOARD_NAME, "hp t5745"), -+ }, -+ }, -+ { -+ .callback = intel_no_lvds_dmi_callback, -+ .ident = "Hewlett-Packard st5747", -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -+ DMI_MATCH(DMI_BOARD_NAME, "hp st5747"), -+ }, -+ }, -+ { -+ .callback = intel_no_lvds_dmi_callback, - .ident = "MSI Wind Box DC500", - .matches = { - DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), -diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c -index 8eddcca..a8d8ee5 100644 ---- a/drivers/gpu/drm/i915/intel_sdvo.c -+++ b/drivers/gpu/drm/i915/intel_sdvo.c -@@ -769,10 +769,12 @@ static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd, - ((v_sync_len & 0x30) >> 4); - - dtd->part2.dtd_flags = 0x18; -+ if (mode->flags & DRM_MODE_FLAG_INTERLACE) -+ dtd->part2.dtd_flags |= DTD_FLAG_INTERLACE; - if (mode->flags & DRM_MODE_FLAG_PHSYNC) -- dtd->part2.dtd_flags |= 0x2; -+ dtd->part2.dtd_flags |= DTD_FLAG_HSYNC_POSITIVE; - if (mode->flags & DRM_MODE_FLAG_PVSYNC) -- dtd->part2.dtd_flags |= 0x4; -+ dtd->part2.dtd_flags |= DTD_FLAG_VSYNC_POSITIVE; - - dtd->part2.sdvo_flags = 0; - dtd->part2.v_sync_off_high = v_sync_offset & 0xc0; -@@ -806,9 +808,11 @@ static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode, - mode->clock = dtd->part1.clock * 10; - - mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); -- if (dtd->part2.dtd_flags & 0x2) -+ if (dtd->part2.dtd_flags & DTD_FLAG_INTERLACE) -+ mode->flags |= DRM_MODE_FLAG_INTERLACE; -+ if (dtd->part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE) - mode->flags |= DRM_MODE_FLAG_PHSYNC; -- if (dtd->part2.dtd_flags & 0x4) -+ if (dtd->part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE) - mode->flags |= DRM_MODE_FLAG_PVSYNC; - } - -diff --git a/drivers/gpu/drm/i915/intel_sdvo_regs.h b/drivers/gpu/drm/i915/intel_sdvo_regs.h -index 4aa6f34..372f33b 100644 ---- a/drivers/gpu/drm/i915/intel_sdvo_regs.h -+++ b/drivers/gpu/drm/i915/intel_sdvo_regs.h -@@ -61,6 +61,11 @@ struct intel_sdvo_caps { - u16 output_flags; - } __attribute__((packed)); - -+/* Note: SDVO detailed timing flags match EDID misc flags. */ -+#define DTD_FLAG_HSYNC_POSITIVE (1 << 1) -+#define DTD_FLAG_VSYNC_POSITIVE (1 << 2) -+#define DTD_FLAG_INTERLACE (1 << 7) -+ - /** This matches the EDID DTD structure, more or less */ - struct intel_sdvo_dtd { - struct { -diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c -index 2b1fcad..12041fa 100644 ---- a/drivers/gpu/drm/i915/intel_tv.c -+++ b/drivers/gpu/drm/i915/intel_tv.c -@@ -1307,6 +1307,11 @@ intel_tv_detect_type(struct intel_tv *intel_tv, - - I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN); - I915_WRITE(TV_CTL, save_tv_ctl); -+ POSTING_READ(TV_CTL); -+ -+ /* For unknown reasons the hw barfs if we don't do this vblank wait. */ -+ intel_wait_for_vblank(intel_tv->base.base.dev, -+ to_intel_crtc(intel_tv->base.base.crtc)->pipe); - - /* Restore interrupt config */ - if (connector->polled & DRM_CONNECTOR_POLL_HPD) { -diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c -index 92c9628..dac178b 100644 ---- a/drivers/gpu/drm/radeon/evergreen.c -+++ b/drivers/gpu/drm/radeon/evergreen.c -@@ -977,6 +977,11 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev) - WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); - WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); - WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); -+ if ((rdev->family == CHIP_JUNIPER) || -+ (rdev->family == CHIP_CYPRESS) || -+ (rdev->family == CHIP_HEMLOCK) || -+ (rdev->family == CHIP_BARTS)) -+ WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp); - } - WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); - WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); -@@ -2074,9 +2079,12 @@ static void evergreen_gpu_init(struct radeon_device *rdev) - /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ - if (rdev->flags & RADEON_IS_IGP) - rdev->config.evergreen.tile_config |= 1 << 4; -- else -- rdev->config.evergreen.tile_config |= -- ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; -+ else { -+ if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) -+ rdev->config.evergreen.tile_config |= 1 << 4; -+ else -+ rdev->config.evergreen.tile_config |= 0 << 4; -+ } - rdev->config.evergreen.tile_config |= - ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) << 8; - rdev->config.evergreen.tile_config |= -@@ -2108,9 +2116,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev) - WREG32(CC_SYS_RB_BACKEND_DISABLE, rb); - WREG32(GC_USER_RB_BACKEND_DISABLE, rb); - WREG32(CC_GC_SHADER_PIPE_CONFIG, sp); -- } -+ } - -- grbm_gfx_index |= SE_BROADCAST_WRITES; -+ grbm_gfx_index = INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES; - WREG32(GRBM_GFX_INDEX, grbm_gfx_index); - WREG32(RLC_GFX_INDEX, grbm_gfx_index); - -diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h -index e00039e..0128445 100644 ---- a/drivers/gpu/drm/radeon/evergreend.h -+++ b/drivers/gpu/drm/radeon/evergreend.h -@@ -230,6 +230,7 @@ - #define MC_VM_MD_L1_TLB0_CNTL 0x2654 - #define MC_VM_MD_L1_TLB1_CNTL 0x2658 - #define MC_VM_MD_L1_TLB2_CNTL 0x265C -+#define MC_VM_MD_L1_TLB3_CNTL 0x2698 - - #define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C - #define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660 -diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c -index 0e57998..9e50814 100644 ---- a/drivers/gpu/drm/radeon/ni.c -+++ b/drivers/gpu/drm/radeon/ni.c -@@ -804,8 +804,10 @@ static void cayman_gpu_init(struct radeon_device *rdev) - rdev->config.cayman.tile_config |= (3 << 0); - break; - } -- rdev->config.cayman.tile_config |= -- ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; -+ if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) -+ rdev->config.cayman.tile_config |= 1 << 4; -+ else -+ rdev->config.cayman.tile_config |= 0 << 4; - rdev->config.cayman.tile_config |= - ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; - rdev->config.cayman.tile_config |= -diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c -index 8e1532f..9d2c369 100644 ---- a/drivers/gpu/drm/radeon/radeon_atombios.c -+++ b/drivers/gpu/drm/radeon/radeon_atombios.c -@@ -438,7 +438,9 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, - */ - if ((dev->pdev->device == 0x9498) && - (dev->pdev->subsystem_vendor == 0x1682) && -- (dev->pdev->subsystem_device == 0x2452)) { -+ (dev->pdev->subsystem_device == 0x2452) && -+ (i2c_bus->valid == false) && -+ !(supported_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))) { - struct radeon_device *rdev = dev->dev_private; - *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93); - } -diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c -index 23ae1c6..e36ba7f 100644 ---- a/drivers/gpu/drm/radeon/rv770.c -+++ b/drivers/gpu/drm/radeon/rv770.c -@@ -151,6 +151,8 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev) - WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); - WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); - WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); -+ if (rdev->family == CHIP_RV740) -+ WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp); - WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); - WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); - WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); -@@ -689,8 +691,12 @@ static void rv770_gpu_init(struct radeon_device *rdev) - - if (rdev->family == CHIP_RV770) - gb_tiling_config |= BANK_TILING(1); -- else -- gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); -+ else { -+ if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) -+ gb_tiling_config |= BANK_TILING(1); -+ else -+ gb_tiling_config |= BANK_TILING(0); -+ } - rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3); - gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); - if ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) -diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h -index 79fa588..7538092 100644 ---- a/drivers/gpu/drm/radeon/rv770d.h -+++ b/drivers/gpu/drm/radeon/rv770d.h -@@ -174,6 +174,7 @@ - #define MC_VM_MD_L1_TLB0_CNTL 0x2654 - #define MC_VM_MD_L1_TLB1_CNTL 0x2658 - #define MC_VM_MD_L1_TLB2_CNTL 0x265C -+#define MC_VM_MD_L1_TLB3_CNTL 0x2698 - #define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C - #define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038 - #define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034 -diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c -index 0bb0f5f..0d27bff 100644 ---- a/drivers/gpu/drm/ttm/ttm_bo.c -+++ b/drivers/gpu/drm/ttm/ttm_bo.c -@@ -1816,6 +1816,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink) - spin_unlock(&glob->lru_lock); - (void) ttm_bo_cleanup_refs(bo, false, false, false); - kref_put(&bo->list_kref, ttm_bo_release_list); -+ spin_lock(&glob->lru_lock); - continue; - } - -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c -index f4e7763..c41226a 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c -@@ -66,7 +66,7 @@ static int vmw_gmr2_bind(struct vmw_private *dev_priv, - cmd += sizeof(remap_cmd) / sizeof(uint32); - - for (i = 0; i < num_pages; ++i) { -- if (VMW_PPN_SIZE > 4) -+ if (VMW_PPN_SIZE <= 4) - *cmd = page_to_pfn(*pages++); - else - *((uint64_t *)cmd) = page_to_pfn(*pages++); -diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c -index 966a6e7..f1d5408 100644 ---- a/drivers/iommu/amd_iommu.c -+++ b/drivers/iommu/amd_iommu.c -@@ -381,12 +381,27 @@ static void dump_command(unsigned long phys_addr) - - static void iommu_print_event(struct amd_iommu *iommu, void *__evt) - { -- u32 *event = __evt; -- int type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK; -- int devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK; -- int domid = (event[1] >> EVENT_DOMID_SHIFT) & EVENT_DOMID_MASK; -- int flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK; -- u64 address = (u64)(((u64)event[3]) << 32) | event[2]; -+ int type, devid, domid, flags; -+ volatile u32 *event = __evt; -+ int count = 0; -+ u64 address; -+ -+retry: -+ type = (event[1] >> EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK; -+ devid = (event[0] >> EVENT_DEVID_SHIFT) & EVENT_DEVID_MASK; -+ domid = (event[1] >> EVENT_DOMID_SHIFT) & EVENT_DOMID_MASK; -+ flags = (event[1] >> EVENT_FLAGS_SHIFT) & EVENT_FLAGS_MASK; -+ address = (u64)(((u64)event[3]) << 32) | event[2]; -+ -+ if (type == 0) { -+ /* Did we hit the erratum? */ -+ if (++count == LOOP_TIMEOUT) { -+ pr_err("AMD-Vi: No event written to event log\n"); -+ return; -+ } -+ udelay(1); -+ goto retry; -+ } - - printk(KERN_ERR "AMD-Vi: Event logged ["); - -@@ -439,6 +454,8 @@ static void iommu_print_event(struct amd_iommu *iommu, void *__evt) - default: - printk(KERN_ERR "UNKNOWN type=0x%02x]\n", type); - } -+ -+ memset(__evt, 0, 4 * sizeof(u32)); - } - - static void iommu_poll_events(struct amd_iommu *iommu) -diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c -index 20d5852..6269eb0 100644 ---- a/drivers/iommu/amd_iommu_init.c -+++ b/drivers/iommu/amd_iommu_init.c -@@ -943,6 +943,9 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h) - if (!iommu->dev) - return 1; - -+ iommu->root_pdev = pci_get_bus_and_slot(iommu->dev->bus->number, -+ PCI_DEVFN(0, 0)); -+ - iommu->cap_ptr = h->cap_ptr; - iommu->pci_seg = h->pci_seg; - iommu->mmio_phys = h->mmio_phys; -@@ -1225,20 +1228,16 @@ static void iommu_apply_resume_quirks(struct amd_iommu *iommu) - { - int i, j; - u32 ioc_feature_control; -- struct pci_dev *pdev = NULL; -+ struct pci_dev *pdev = iommu->root_pdev; - - /* RD890 BIOSes may not have completely reconfigured the iommu */ -- if (!is_rd890_iommu(iommu->dev)) -+ if (!is_rd890_iommu(iommu->dev) || !pdev) - return; - - /* - * First, we need to ensure that the iommu is enabled. This is - * controlled by a register in the northbridge - */ -- pdev = pci_get_bus_and_slot(iommu->dev->bus->number, PCI_DEVFN(0, 0)); -- -- if (!pdev) -- return; - - /* Select Northbridge indirect register 0x75 and enable writing */ - pci_write_config_dword(pdev, 0x60, 0x75 | (1 << 7)); -@@ -1248,8 +1247,6 @@ static void iommu_apply_resume_quirks(struct amd_iommu *iommu) - if (!(ioc_feature_control & 0x1)) - pci_write_config_dword(pdev, 0x64, ioc_feature_control | 1); - -- pci_dev_put(pdev); -- - /* Restore the iommu BAR */ - pci_write_config_dword(iommu->dev, iommu->cap_ptr + 4, - iommu->stored_addr_lo); -diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h -index 5b9c507..40ab83b 100644 ---- a/drivers/iommu/amd_iommu_types.h -+++ b/drivers/iommu/amd_iommu_types.h -@@ -385,6 +385,9 @@ struct amd_iommu { - /* Pointer to PCI device of this IOMMU */ - struct pci_dev *dev; - -+ /* Cache pdev to root device for resume quirks */ -+ struct pci_dev *root_pdev; -+ - /* physical address of MMIO space */ - u64 mmio_phys; - /* virtual address of MMIO space */ -diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig -index 318a869..4035b6d 100644 ---- a/drivers/mtd/Kconfig -+++ b/drivers/mtd/Kconfig -@@ -128,7 +128,7 @@ config MTD_AFS_PARTS - - config MTD_OF_PARTS - tristate "OpenFirmware partitioning information support" -- default Y -+ default y - depends on OF - help - This provides a partition parsing function which derives -diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c -index 69148ae..f024375 100644 ---- a/drivers/mtd/nand/nand_bbt.c -+++ b/drivers/mtd/nand/nand_bbt.c -@@ -324,6 +324,7 @@ static int scan_read_raw_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs, - - buf += mtd->oobsize + mtd->writesize; - len -= mtd->writesize; -+ offs += mtd->writesize; - } - return 0; - } -diff --git a/drivers/net/ethernet/freescale/fec_mpc52xx.c b/drivers/net/ethernet/freescale/fec_mpc52xx.c -index 30745b5..1e52736 100644 ---- a/drivers/net/ethernet/freescale/fec_mpc52xx.c -+++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c -@@ -437,7 +437,7 @@ static irqreturn_t mpc52xx_fec_rx_interrupt(int irq, void *dev_id) - length = status & BCOM_FEC_RX_BD_LEN_MASK; - skb_put(rskb, length - 4); /* length without CRC32 */ - rskb->protocol = eth_type_trans(rskb, dev); -- if (!skb_defer_rx_timestamp(skb)) -+ if (!skb_defer_rx_timestamp(rskb)) - netif_rx(rskb); - - spin_lock(&priv->lock); -diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c -index 697cae3..cc2565c 100644 ---- a/drivers/net/ethernet/realtek/r8169.c -+++ b/drivers/net/ethernet/realtek/r8169.c -@@ -62,8 +62,12 @@ - #define R8169_MSG_DEFAULT \ - (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN) - --#define TX_BUFFS_AVAIL(tp) \ -- (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1) -+#define TX_SLOTS_AVAIL(tp) \ -+ (tp->dirty_tx + NUM_TX_DESC - tp->cur_tx) -+ -+/* A skbuff with nr_frags needs nr_frags+1 entries in the tx queue */ -+#define TX_FRAGS_READY_FOR(tp,nr_frags) \ -+ (TX_SLOTS_AVAIL(tp) >= (nr_frags + 1)) - - /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). - The RTL chips use a 64 element hash table based on the Ethernet CRC. */ -@@ -5512,7 +5516,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, - u32 opts[2]; - int frags; - -- if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) { -+ if (unlikely(!TX_FRAGS_READY_FOR(tp, skb_shinfo(skb)->nr_frags))) { - netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n"); - goto err_stop_0; - } -@@ -5560,10 +5564,21 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, - - RTL_W8(TxPoll, NPQ); - -- if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) { -+ if (!TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) { -+ /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must -+ * not miss a ring update when it notices a stopped queue. -+ */ -+ smp_wmb(); - netif_stop_queue(dev); -- smp_rmb(); -- if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS) -+ /* Sync with rtl_tx: -+ * - publish queue status and cur_tx ring index (write barrier) -+ * - refresh dirty_tx ring index (read barrier). -+ * May the current thread have a pessimistic view of the ring -+ * status and forget to wake up queue, a racing rtl_tx thread -+ * can't. -+ */ -+ smp_mb(); -+ if (TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) - netif_wake_queue(dev); - } - -@@ -5663,9 +5678,16 @@ static void rtl8169_tx_interrupt(struct net_device *dev, - - if (tp->dirty_tx != dirty_tx) { - tp->dirty_tx = dirty_tx; -- smp_wmb(); -+ /* Sync with rtl8169_start_xmit: -+ * - publish dirty_tx ring index (write barrier) -+ * - refresh cur_tx ring index and queue status (read barrier) -+ * May the current thread miss the stopped queue condition, -+ * a racing xmit thread can only have a right view of the -+ * ring status. -+ */ -+ smp_mb(); - if (netif_queue_stopped(dev) && -- (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) { -+ TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) { - netif_wake_queue(dev); - } - /* -@@ -5674,7 +5696,6 @@ static void rtl8169_tx_interrupt(struct net_device *dev, - * of start_xmit activity is detected (if it is not detected, - * it is slow enough). -- FR - */ -- smp_rmb(); - if (tp->cur_tx != dirty_tx) - RTL_W8(TxPoll, NPQ); - } -diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c -index 959d448..97f342e 100644 ---- a/drivers/net/macvlan.c -+++ b/drivers/net/macvlan.c -@@ -258,7 +258,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) - - xmit_world: - skb->ip_summed = ip_summed; -- skb_set_dev(skb, vlan->lowerdev); -+ skb->dev = vlan->lowerdev; - return dev_queue_xmit(skb); - } - -diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c -index a9abee8..fc147a5 100644 ---- a/drivers/net/usb/asix.c -+++ b/drivers/net/usb/asix.c -@@ -35,6 +35,7 @@ - #include <linux/crc32.h> - #include <linux/usb/usbnet.h> - #include <linux/slab.h> -+#include <linux/if_vlan.h> - - #define DRIVER_VERSION "08-Nov-2011" - #define DRIVER_NAME "asix" -@@ -348,7 +349,7 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) - return 2; - } - -- if (size > dev->net->mtu + ETH_HLEN) { -+ if (size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) { - netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n", - size); - return 0; -diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c -index 03b0a65..76fd277 100644 ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -64,7 +64,8 @@ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, - static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, - struct ath_txq *txq, - struct ath_atx_tid *tid, -- struct sk_buff *skb); -+ struct sk_buff *skb, -+ bool dequeue); - - enum { - MCS_HT20, -@@ -761,7 +762,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, - fi = get_frame_info(skb); - bf = fi->bf; - if (!fi->bf) -- bf = ath_tx_setup_buffer(sc, txq, tid, skb); -+ bf = ath_tx_setup_buffer(sc, txq, tid, skb, true); - - if (!bf) - continue; -@@ -1669,7 +1670,7 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, - return; - } - -- bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); -+ bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false); - if (!bf) - return; - -@@ -1696,7 +1697,7 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq, - - bf = fi->bf; - if (!bf) -- bf = ath_tx_setup_buffer(sc, txq, tid, skb); -+ bf = ath_tx_setup_buffer(sc, txq, tid, skb, false); - - if (!bf) - return; -@@ -1761,7 +1762,8 @@ u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) - static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, - struct ath_txq *txq, - struct ath_atx_tid *tid, -- struct sk_buff *skb) -+ struct sk_buff *skb, -+ bool dequeue) - { - struct ath_common *common = ath9k_hw_common(sc->sc_ah); - struct ath_frame_info *fi = get_frame_info(skb); -@@ -1802,6 +1804,8 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, - return bf; - - error: -+ if (dequeue) -+ __skb_unlink(skb, &tid->buf_q); - dev_kfree_skb_any(skb); - return NULL; - } -@@ -1833,7 +1837,7 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb, - */ - ath_tx_send_ampdu(sc, tid, skb, txctl); - } else { -- bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); -+ bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false); - if (!bf) - goto out; - -diff --git a/drivers/net/wireless/iwlwifi/iwl-2000.c b/drivers/net/wireless/iwlwifi/iwl-2000.c -index 9823e41..a97a52a 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-2000.c -+++ b/drivers/net/wireless/iwlwifi/iwl-2000.c -@@ -211,7 +211,7 @@ static struct iwl_base_params iwl2000_base_params = { - .chain_noise_scale = 1000, - .wd_timeout = IWL_DEF_WD_TIMEOUT, - .max_event_log_size = 512, -- .shadow_reg_enable = true, -+ .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ - .hd_v2 = true, - }; - -@@ -230,7 +230,7 @@ static struct iwl_base_params iwl2030_base_params = { - .chain_noise_scale = 1000, - .wd_timeout = IWL_LONG_WD_TIMEOUT, - .max_event_log_size = 512, -- .shadow_reg_enable = true, -+ .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ - .hd_v2 = true, - }; - -diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c -index b4f809c..0b9f797 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-6000.c -+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c -@@ -308,7 +308,7 @@ static struct iwl_base_params iwl6000_base_params = { - .chain_noise_scale = 1000, - .wd_timeout = IWL_DEF_WD_TIMEOUT, - .max_event_log_size = 512, -- .shadow_reg_enable = true, -+ .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ - }; - - static struct iwl_base_params iwl6050_base_params = { -@@ -325,7 +325,7 @@ static struct iwl_base_params iwl6050_base_params = { - .chain_noise_scale = 1500, - .wd_timeout = IWL_DEF_WD_TIMEOUT, - .max_event_log_size = 1024, -- .shadow_reg_enable = true, -+ .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ - }; - static struct iwl_base_params iwl6000_g2_base_params = { - .eeprom_size = OTP_LOW_IMAGE_SIZE, -@@ -341,7 +341,7 @@ static struct iwl_base_params iwl6000_g2_base_params = { - .chain_noise_scale = 1000, - .wd_timeout = IWL_LONG_WD_TIMEOUT, - .max_event_log_size = 512, -- .shadow_reg_enable = true, -+ .shadow_reg_enable = false, /* TODO: fix bugs using this feature */ - }; - - static struct iwl_ht_params iwl6000_ht_params = { -diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c -index 66118ce..9ba2c1b 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c -+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c -@@ -886,6 +886,7 @@ static void rs_bt_update_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, - if ((priv->bt_traffic_load != priv->last_bt_traffic_load) || - (priv->bt_full_concurrent != full_concurrent)) { - priv->bt_full_concurrent = full_concurrent; -+ priv->last_bt_traffic_load = priv->bt_traffic_load; - - /* Update uCode's rate table. */ - tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); -diff --git a/drivers/net/wireless/wl1251/sdio.c b/drivers/net/wireless/wl1251/sdio.c -index 1b851f6..e2750a1 100644 ---- a/drivers/net/wireless/wl1251/sdio.c -+++ b/drivers/net/wireless/wl1251/sdio.c -@@ -260,6 +260,7 @@ static int wl1251_sdio_probe(struct sdio_func *func, - } - - if (wl->irq) { -+ irq_set_status_flags(wl->irq, IRQ_NOAUTOEN); - ret = request_irq(wl->irq, wl1251_line_irq, 0, "wl1251", wl); - if (ret < 0) { - wl1251_error("request_irq() failed: %d", ret); -@@ -267,7 +268,6 @@ static int wl1251_sdio_probe(struct sdio_func *func, - } - - irq_set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING); -- disable_irq(wl->irq); - - wl1251_sdio_ops.enable_irq = wl1251_enable_line_irq; - wl1251_sdio_ops.disable_irq = wl1251_disable_line_irq; -diff --git a/drivers/net/wireless/wl1251/spi.c b/drivers/net/wireless/wl1251/spi.c -index eaa5f95..134ae9c 100644 ---- a/drivers/net/wireless/wl1251/spi.c -+++ b/drivers/net/wireless/wl1251/spi.c -@@ -281,6 +281,7 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi) - - wl->use_eeprom = pdata->use_eeprom; - -+ irq_set_status_flags(wl->irq, IRQ_NOAUTOEN); - ret = request_irq(wl->irq, wl1251_irq, 0, DRIVER_NAME, wl); - if (ret < 0) { - wl1251_error("request_irq() failed: %d", ret); -@@ -289,8 +290,6 @@ static int __devinit wl1251_spi_probe(struct spi_device *spi) - - irq_set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING); - -- disable_irq(wl->irq); -- - ret = wl1251_init_ieee80211(wl); - if (ret) - goto out_irq; -diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c -index f85cfa6..f0ab58e 100644 ---- a/drivers/scsi/scsi_lib.c -+++ b/drivers/scsi/scsi_lib.c -@@ -1382,16 +1382,19 @@ static int scsi_lld_busy(struct request_queue *q) - { - struct scsi_device *sdev = q->queuedata; - struct Scsi_Host *shost; -- struct scsi_target *starget; - - if (!sdev) - return 0; - - shost = sdev->host; -- starget = scsi_target(sdev); - -- if (scsi_host_in_recovery(shost) || scsi_host_is_busy(shost) || -- scsi_target_is_busy(starget) || scsi_device_is_busy(sdev)) -+ /* -+ * Ignore host/starget busy state. -+ * Since block layer does not have a concept of fairness across -+ * multiple queues, congestion of host/starget needs to be handled -+ * in SCSI layer. -+ */ -+ if (scsi_host_in_recovery(shost) || scsi_device_is_busy(sdev)) - return 1; - - return 0; -diff --git a/drivers/scsi/scsi_wait_scan.c b/drivers/scsi/scsi_wait_scan.c -index 74708fc..ae78148 100644 ---- a/drivers/scsi/scsi_wait_scan.c -+++ b/drivers/scsi/scsi_wait_scan.c -@@ -12,7 +12,7 @@ - - #include <linux/module.h> - #include <linux/device.h> --#include <scsi/scsi_scan.h> -+#include "scsi_priv.h" - - static int __init wait_scan_init(void) - { -diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c -index cad8b92..455a251 100644 ---- a/drivers/target/target_core_file.c -+++ b/drivers/target/target_core_file.c -@@ -134,21 +134,11 @@ static struct se_device *fd_create_virtdevice( - ret = PTR_ERR(dev_p); - goto fail; - } --#if 0 -- if (di->no_create_file) -- flags = O_RDWR | O_LARGEFILE; -- else -- flags = O_RDWR | O_CREAT | O_LARGEFILE; --#else -- flags = O_RDWR | O_CREAT | O_LARGEFILE; --#endif --/* flags |= O_DIRECT; */ - /* -- * If fd_buffered_io=1 has not been set explicitly (the default), -- * use O_SYNC to force FILEIO writes to disk. -+ * Use O_DSYNC by default instead of O_SYNC to forgo syncing -+ * of pure timestamp updates. - */ -- if (!(fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO)) -- flags |= O_SYNC; -+ flags = O_RDWR | O_CREAT | O_LARGEFILE | O_DSYNC; - - file = filp_open(dev_p, flags, 0600); - if (IS_ERR(file)) { -@@ -400,26 +390,6 @@ static void fd_emulate_sync_cache(struct se_task *task) - transport_complete_sync_cache(cmd, ret == 0); - } - --/* -- * WRITE Force Unit Access (FUA) emulation on a per struct se_task -- * LBA range basis.. -- */ --static void fd_emulate_write_fua(struct se_cmd *cmd, struct se_task *task) --{ -- struct se_device *dev = cmd->se_dev; -- struct fd_dev *fd_dev = dev->dev_ptr; -- loff_t start = task->task_lba * dev->se_sub_dev->se_dev_attrib.block_size; -- loff_t end = start + task->task_size; -- int ret; -- -- pr_debug("FILEIO: FUA WRITE LBA: %llu, bytes: %u\n", -- task->task_lba, task->task_size); -- -- ret = vfs_fsync_range(fd_dev->fd_file, start, end, 1); -- if (ret != 0) -- pr_err("FILEIO: vfs_fsync_range() failed: %d\n", ret); --} -- - static int fd_do_task(struct se_task *task) - { - struct se_cmd *cmd = task->task_se_cmd; -@@ -434,19 +404,21 @@ static int fd_do_task(struct se_task *task) - ret = fd_do_readv(task); - } else { - ret = fd_do_writev(task); -- -+ /* -+ * Perform implict vfs_fsync_range() for fd_do_writev() ops -+ * for SCSI WRITEs with Forced Unit Access (FUA) set. -+ * Allow this to happen independent of WCE=0 setting. -+ */ - if (ret > 0 && -- dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0 && - dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0 && - (cmd->se_cmd_flags & SCF_FUA)) { -- /* -- * We might need to be a bit smarter here -- * and return some sense data to let the initiator -- * know the FUA WRITE cache sync failed..? -- */ -- fd_emulate_write_fua(cmd, task); -- } -+ struct fd_dev *fd_dev = dev->dev_ptr; -+ loff_t start = task->task_lba * -+ dev->se_sub_dev->se_dev_attrib.block_size; -+ loff_t end = start + task->task_size; - -+ vfs_fsync_range(fd_dev->fd_file, start, end, 1); -+ } - } - - if (ret < 0) { -@@ -478,7 +450,6 @@ enum { - static match_table_t tokens = { - {Opt_fd_dev_name, "fd_dev_name=%s"}, - {Opt_fd_dev_size, "fd_dev_size=%s"}, -- {Opt_fd_buffered_io, "fd_buffered_io=%d"}, - {Opt_err, NULL} - }; - -@@ -490,7 +461,7 @@ static ssize_t fd_set_configfs_dev_params( - struct fd_dev *fd_dev = se_dev->se_dev_su_ptr; - char *orig, *ptr, *arg_p, *opts; - substring_t args[MAX_OPT_ARGS]; -- int ret = 0, arg, token; -+ int ret = 0, token; - - opts = kstrdup(page, GFP_KERNEL); - if (!opts) -@@ -534,19 +505,6 @@ static ssize_t fd_set_configfs_dev_params( - " bytes\n", fd_dev->fd_dev_size); - fd_dev->fbd_flags |= FBDF_HAS_SIZE; - break; -- case Opt_fd_buffered_io: -- match_int(args, &arg); -- if (arg != 1) { -- pr_err("bogus fd_buffered_io=%d value\n", arg); -- ret = -EINVAL; -- goto out; -- } -- -- pr_debug("FILEIO: Using buffered I/O" -- " operations for struct fd_dev\n"); -- -- fd_dev->fbd_flags |= FDBD_USE_BUFFERED_IO; -- break; - default: - break; - } -@@ -578,10 +536,8 @@ static ssize_t fd_show_configfs_dev_params( - ssize_t bl = 0; - - bl = sprintf(b + bl, "TCM FILEIO ID: %u", fd_dev->fd_dev_id); -- bl += sprintf(b + bl, " File: %s Size: %llu Mode: %s\n", -- fd_dev->fd_dev_name, fd_dev->fd_dev_size, -- (fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO) ? -- "Buffered" : "Synchronous"); -+ bl += sprintf(b + bl, " File: %s Size: %llu Mode: O_DSYNC\n", -+ fd_dev->fd_dev_name, fd_dev->fd_dev_size); - return bl; - } - -diff --git a/drivers/target/target_core_file.h b/drivers/target/target_core_file.h -index 59e6e73..53ece69 100644 ---- a/drivers/target/target_core_file.h -+++ b/drivers/target/target_core_file.h -@@ -18,7 +18,6 @@ struct fd_request { - - #define FBDF_HAS_PATH 0x01 - #define FBDF_HAS_SIZE 0x02 --#define FDBD_USE_BUFFERED_IO 0x04 - - struct fd_dev { - u32 fbd_flags; -diff --git a/fs/attr.c b/fs/attr.c -index 7ee7ba4..b8f55c4 100644 ---- a/fs/attr.c -+++ b/fs/attr.c -@@ -176,6 +176,11 @@ int notify_change(struct dentry * dentry, struct iattr * attr) - return -EPERM; - } - -+ if ((ia_valid & ATTR_SIZE) && IS_I_VERSION(inode)) { -+ if (attr->ia_size != inode->i_size) -+ inode_inc_iversion(inode); -+ } -+ - if ((ia_valid & ATTR_MODE)) { - mode_t amode = attr->ia_mode; - /* Flag setting protected by i_mutex */ -diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h -index c467ac8..2f3ff59 100644 ---- a/fs/cifs/cifsglob.h -+++ b/fs/cifs/cifsglob.h -@@ -43,6 +43,7 @@ - - #define CIFS_MIN_RCV_POOL 4 - -+#define MAX_REOPEN_ATT 5 /* these many maximum attempts to reopen a file */ - /* - * default attribute cache timeout (jiffies) - */ -diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h -index 6f4e243..26917d3 100644 ---- a/fs/cifs/cifsproto.h -+++ b/fs/cifs/cifsproto.h -@@ -184,11 +184,13 @@ extern int CIFSTCon(unsigned int xid, struct cifs_ses *ses, - - extern int CIFSFindFirst(const int xid, struct cifs_tcon *tcon, - const char *searchName, const struct nls_table *nls_codepage, -- __u16 *searchHandle, struct cifs_search_info *psrch_inf, -+ __u16 *searchHandle, __u16 search_flags, -+ struct cifs_search_info *psrch_inf, - int map, const char dirsep); - - extern int CIFSFindNext(const int xid, struct cifs_tcon *tcon, -- __u16 searchHandle, struct cifs_search_info *psrch_inf); -+ __u16 searchHandle, __u16 search_flags, -+ struct cifs_search_info *psrch_inf); - - extern int CIFSFindClose(const int, struct cifs_tcon *tcon, - const __u16 search_handle); -diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c -index e89803b..6aa7457 100644 ---- a/fs/cifs/cifssmb.c -+++ b/fs/cifs/cifssmb.c -@@ -4327,7 +4327,7 @@ int - CIFSFindFirst(const int xid, struct cifs_tcon *tcon, - const char *searchName, - const struct nls_table *nls_codepage, -- __u16 *pnetfid, -+ __u16 *pnetfid, __u16 search_flags, - struct cifs_search_info *psrch_inf, int remap, const char dirsep) - { - /* level 257 SMB_ */ -@@ -4399,8 +4399,7 @@ findFirstRetry: - cpu_to_le16(ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM | - ATTR_DIRECTORY); - pSMB->SearchCount = cpu_to_le16(CIFSMaxBufSize/sizeof(FILE_UNIX_INFO)); -- pSMB->SearchFlags = cpu_to_le16(CIFS_SEARCH_CLOSE_AT_END | -- CIFS_SEARCH_RETURN_RESUME); -+ pSMB->SearchFlags = cpu_to_le16(search_flags); - pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); - - /* BB what should we set StorageType to? Does it matter? BB */ -@@ -4470,8 +4469,8 @@ findFirstRetry: - return rc; - } - --int CIFSFindNext(const int xid, struct cifs_tcon *tcon, -- __u16 searchHandle, struct cifs_search_info *psrch_inf) -+int CIFSFindNext(const int xid, struct cifs_tcon *tcon, __u16 searchHandle, -+ __u16 search_flags, struct cifs_search_info *psrch_inf) - { - TRANSACTION2_FNEXT_REQ *pSMB = NULL; - TRANSACTION2_FNEXT_RSP *pSMBr = NULL; -@@ -4514,8 +4513,7 @@ int CIFSFindNext(const int xid, struct cifs_tcon *tcon, - cpu_to_le16(CIFSMaxBufSize / sizeof(FILE_UNIX_INFO)); - pSMB->InformationLevel = cpu_to_le16(psrch_inf->info_level); - pSMB->ResumeKey = psrch_inf->resume_key; -- pSMB->SearchFlags = -- cpu_to_le16(CIFS_SEARCH_CLOSE_AT_END | CIFS_SEARCH_RETURN_RESUME); -+ pSMB->SearchFlags = cpu_to_le16(search_flags); - - name_len = psrch_inf->resume_name_len; - params += name_len; -diff --git a/fs/cifs/file.c b/fs/cifs/file.c -index 0f7dc22..0bb785f 100644 ---- a/fs/cifs/file.c -+++ b/fs/cifs/file.c -@@ -1534,10 +1534,11 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, - struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, - bool fsuid_only) - { -- struct cifsFileInfo *open_file; -+ struct cifsFileInfo *open_file, *inv_file = NULL; - struct cifs_sb_info *cifs_sb; - bool any_available = false; - int rc; -+ unsigned int refind = 0; - - /* Having a null inode here (because mapping->host was set to zero by - the VFS or MM) should not happen but we had reports of on oops (due to -@@ -1557,40 +1558,25 @@ struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, - - spin_lock(&cifs_file_list_lock); - refind_writable: -+ if (refind > MAX_REOPEN_ATT) { -+ spin_unlock(&cifs_file_list_lock); -+ return NULL; -+ } - list_for_each_entry(open_file, &cifs_inode->openFileList, flist) { - if (!any_available && open_file->pid != current->tgid) - continue; - if (fsuid_only && open_file->uid != current_fsuid()) - continue; - if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) { -- cifsFileInfo_get(open_file); -- - if (!open_file->invalidHandle) { - /* found a good writable file */ -+ cifsFileInfo_get(open_file); - spin_unlock(&cifs_file_list_lock); - return open_file; -+ } else { -+ if (!inv_file) -+ inv_file = open_file; - } -- -- spin_unlock(&cifs_file_list_lock); -- -- /* Had to unlock since following call can block */ -- rc = cifs_reopen_file(open_file, false); -- if (!rc) -- return open_file; -- -- /* if it fails, try another handle if possible */ -- cFYI(1, "wp failed on reopen file"); -- cifsFileInfo_put(open_file); -- -- spin_lock(&cifs_file_list_lock); -- -- /* else we simply continue to the next entry. Thus -- we do not loop on reopen errors. If we -- can not reopen the file, for example if we -- reconnected to a server with another client -- racing to delete or lock the file we would not -- make progress if we restarted before the beginning -- of the loop here. */ - } - } - /* couldn't find useable FH with same pid, try any available */ -@@ -1598,7 +1584,30 @@ refind_writable: - any_available = true; - goto refind_writable; - } -+ -+ if (inv_file) { -+ any_available = false; -+ cifsFileInfo_get(inv_file); -+ } -+ - spin_unlock(&cifs_file_list_lock); -+ -+ if (inv_file) { -+ rc = cifs_reopen_file(inv_file, false); -+ if (!rc) -+ return inv_file; -+ else { -+ spin_lock(&cifs_file_list_lock); -+ list_move_tail(&inv_file->flist, -+ &cifs_inode->openFileList); -+ spin_unlock(&cifs_file_list_lock); -+ cifsFileInfo_put(inv_file); -+ spin_lock(&cifs_file_list_lock); -+ ++refind; -+ goto refind_writable; -+ } -+ } -+ - return NULL; - } - -diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c -index a090bbe..db4a138 100644 ---- a/fs/cifs/readdir.c -+++ b/fs/cifs/readdir.c -@@ -219,6 +219,7 @@ int get_symlink_reparse_path(char *full_path, struct cifs_sb_info *cifs_sb, - - static int initiate_cifs_search(const int xid, struct file *file) - { -+ __u16 search_flags; - int rc = 0; - char *full_path = NULL; - struct cifsFileInfo *cifsFile; -@@ -270,8 +271,12 @@ ffirst_retry: - cifsFile->srch_inf.info_level = SMB_FIND_FILE_DIRECTORY_INFO; - } - -+ search_flags = CIFS_SEARCH_CLOSE_AT_END | CIFS_SEARCH_RETURN_RESUME; -+ if (backup_cred(cifs_sb)) -+ search_flags |= CIFS_SEARCH_BACKUP_SEARCH; -+ - rc = CIFSFindFirst(xid, pTcon, full_path, cifs_sb->local_nls, -- &cifsFile->netfid, &cifsFile->srch_inf, -+ &cifsFile->netfid, search_flags, &cifsFile->srch_inf, - cifs_sb->mnt_cifs_flags & - CIFS_MOUNT_MAP_SPECIAL_CHR, CIFS_DIR_SEP(cifs_sb)); - if (rc == 0) -@@ -502,11 +507,13 @@ static int cifs_save_resume_key(const char *current_entry, - static int find_cifs_entry(const int xid, struct cifs_tcon *pTcon, - struct file *file, char **ppCurrentEntry, int *num_to_ret) - { -+ __u16 search_flags; - int rc = 0; - int pos_in_buf = 0; - loff_t first_entry_in_buffer; - loff_t index_to_find = file->f_pos; - struct cifsFileInfo *cifsFile = file->private_data; -+ struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); - /* check if index in the buffer */ - - if ((cifsFile == NULL) || (ppCurrentEntry == NULL) || -@@ -560,10 +567,14 @@ static int find_cifs_entry(const int xid, struct cifs_tcon *pTcon, - cifsFile); - } - -+ search_flags = CIFS_SEARCH_CLOSE_AT_END | CIFS_SEARCH_RETURN_RESUME; -+ if (backup_cred(cifs_sb)) -+ search_flags |= CIFS_SEARCH_BACKUP_SEARCH; -+ - while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) && - (rc == 0) && !cifsFile->srch_inf.endOfSearch) { - cFYI(1, "calling findnext2"); -- rc = CIFSFindNext(xid, pTcon, cifsFile->netfid, -+ rc = CIFSFindNext(xid, pTcon, cifsFile->netfid, search_flags, - &cifsFile->srch_inf); - /* FindFirst/Next set last_entry to NULL on malformed reply */ - if (cifsFile->srch_inf.last_entry) -diff --git a/fs/exofs/super.c b/fs/exofs/super.c -index e6085ec..7ed5000 100644 ---- a/fs/exofs/super.c -+++ b/fs/exofs/super.c -@@ -745,7 +745,6 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) - sbi->one_comp.obj.partition = opts->pid; - sbi->one_comp.obj.id = 0; - exofs_make_credential(sbi->one_comp.cred, &sbi->one_comp.obj); -- sbi->oc.numdevs = 1; - sbi->oc.single_comp = EC_SINGLE_COMP; - sbi->oc.comps = &sbi->one_comp; - -@@ -803,6 +802,7 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) - goto free_sbi; - - ore_comp_set_dev(&sbi->oc, 0, od); -+ sbi->oc.numdevs = 1; - } - - __sbi_read_stats(sbi); -diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c -index 12ccacd..914bf9e 100644 ---- a/fs/ext4/balloc.c -+++ b/fs/ext4/balloc.c -@@ -88,8 +88,8 @@ unsigned ext4_num_overhead_clusters(struct super_block *sb, - * unusual file system layouts. - */ - if (ext4_block_in_group(sb, ext4_block_bitmap(sb, gdp), block_group)) { -- block_cluster = EXT4_B2C(sbi, (start - -- ext4_block_bitmap(sb, gdp))); -+ block_cluster = EXT4_B2C(sbi, -+ ext4_block_bitmap(sb, gdp) - start); - if (block_cluster < num_clusters) - block_cluster = -1; - else if (block_cluster == num_clusters) { -@@ -100,7 +100,7 @@ unsigned ext4_num_overhead_clusters(struct super_block *sb, - - if (ext4_block_in_group(sb, ext4_inode_bitmap(sb, gdp), block_group)) { - inode_cluster = EXT4_B2C(sbi, -- start - ext4_inode_bitmap(sb, gdp)); -+ ext4_inode_bitmap(sb, gdp) - start); - if (inode_cluster < num_clusters) - inode_cluster = -1; - else if (inode_cluster == num_clusters) { -@@ -112,7 +112,7 @@ unsigned ext4_num_overhead_clusters(struct super_block *sb, - itbl_blk = ext4_inode_table(sb, gdp); - for (i = 0; i < sbi->s_itb_per_group; i++) { - if (ext4_block_in_group(sb, itbl_blk + i, block_group)) { -- c = EXT4_B2C(sbi, start - itbl_blk + i); -+ c = EXT4_B2C(sbi, itbl_blk + i - start); - if ((c < num_clusters) || (c == inode_cluster) || - (c == block_cluster) || (c == itbl_cluster)) - continue; -diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c -index ab25f57..76a6e3b 100644 ---- a/fs/ext4/ioctl.c -+++ b/fs/ext4/ioctl.c -@@ -36,7 +36,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) - handle_t *handle = NULL; - int err, migrate = 0; - struct ext4_iloc iloc; -- unsigned int oldflags; -+ unsigned int oldflags, mask, i; - unsigned int jflag; - - if (!inode_owner_or_capable(inode)) -@@ -113,9 +113,14 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) - if (err) - goto flags_err; - -- flags = flags & EXT4_FL_USER_MODIFIABLE; -- flags |= oldflags & ~EXT4_FL_USER_MODIFIABLE; -- ei->i_flags = flags; -+ for (i = 0, mask = 1; i < 32; i++, mask <<= 1) { -+ if (!(mask & EXT4_FL_USER_MODIFIABLE)) -+ continue; -+ if (mask & flags) -+ ext4_set_inode_flag(inode, i); -+ else -+ ext4_clear_inode_flag(inode, i); -+ } - - ext4_set_inode_flags(inode); - inode->i_ctime = ext4_current_time(inode); -diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c -index e2d8be8..1d07c12 100644 ---- a/fs/ext4/mballoc.c -+++ b/fs/ext4/mballoc.c -@@ -2567,6 +2567,9 @@ int ext4_mb_release(struct super_block *sb) - struct ext4_sb_info *sbi = EXT4_SB(sb); - struct kmem_cache *cachep = get_groupinfo_cache(sb->s_blocksize_bits); - -+ if (sbi->s_proc) -+ remove_proc_entry("mb_groups", sbi->s_proc); -+ - if (sbi->s_group_info) { - for (i = 0; i < ngroups; i++) { - grinfo = ext4_get_group_info(sb, i); -@@ -2614,8 +2617,6 @@ int ext4_mb_release(struct super_block *sb) - } - - free_percpu(sbi->s_locality_groups); -- if (sbi->s_proc) -- remove_proc_entry("mb_groups", sbi->s_proc); - - return 0; - } -@@ -4693,6 +4694,7 @@ do_more: - */ - new_entry = kmem_cache_alloc(ext4_free_ext_cachep, GFP_NOFS); - if (!new_entry) { -+ ext4_mb_unload_buddy(&e4b); - err = -ENOMEM; - goto error_return; - } -diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c -index aa4c782..4dd0890 100644 ---- a/fs/ext4/namei.c -+++ b/fs/ext4/namei.c -@@ -1037,6 +1037,12 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru - EXT4_ERROR_INODE(dir, "bad inode number: %u", ino); - return ERR_PTR(-EIO); - } -+ if (unlikely(ino == dir->i_ino)) { -+ EXT4_ERROR_INODE(dir, "'%.*s' linked to parent dir", -+ dentry->d_name.len, -+ dentry->d_name.name); -+ return ERR_PTR(-EIO); -+ } - inode = ext4_iget(dir->i_sb, ino); - if (inode == ERR_PTR(-ESTALE)) { - EXT4_ERROR_INODE(dir, -diff --git a/fs/ext4/super.c b/fs/ext4/super.c -index 961059b..ab7aa3f 100644 ---- a/fs/ext4/super.c -+++ b/fs/ext4/super.c -@@ -480,6 +480,7 @@ void __ext4_error(struct super_block *sb, const char *function, - printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: comm %s: %pV\n", - sb->s_id, function, line, current->comm, &vaf); - va_end(args); -+ save_error_info(sb, function, line); - - ext4_handle_error(sb); - } -@@ -3727,7 +3728,8 @@ no_journal: - goto failed_mount4; - } - -- ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY); -+ if (ext4_setup_super(sb, es, sb->s_flags & MS_RDONLY)) -+ sb->s_flags |= MS_RDONLY; - - /* determine the minimum size of new large inodes, if present */ - if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) { -diff --git a/fs/namespace.c b/fs/namespace.c -index cfc6d44..ca4913a 100644 ---- a/fs/namespace.c -+++ b/fs/namespace.c -@@ -1244,8 +1244,9 @@ void umount_tree(struct vfsmount *mnt, int propagate, struct list_head *kill) - list_del_init(&p->mnt_expire); - list_del_init(&p->mnt_list); - __touch_mnt_namespace(p->mnt_ns); -+ if (p->mnt_ns) -+ __mnt_make_shortterm(p); - p->mnt_ns = NULL; -- __mnt_make_shortterm(p); - list_del_init(&p->mnt_child); - if (p->mnt_parent != p) { - p->mnt_parent->mnt_ghosts++; -diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c -index 03d9b90..a3cae5d 100644 ---- a/fs/nfs/nfs4proc.c -+++ b/fs/nfs/nfs4proc.c -@@ -96,6 +96,8 @@ static int nfs4_map_errors(int err) - case -NFS4ERR_BADOWNER: - case -NFS4ERR_BADNAME: - return -EINVAL; -+ case -NFS4ERR_SHARE_DENIED: -+ return -EACCES; - default: - dprintk("%s could not handle NFSv4 error %d\n", - __func__, -err); -diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h -index 14b6cd0..def807c 100644 ---- a/include/drm/drm_pciids.h -+++ b/include/drm/drm_pciids.h -@@ -181,6 +181,7 @@ - {0x1002, 0x6747, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6748, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ -+ {0x1002, 0x674A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6751, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6758, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \ -@@ -198,6 +199,7 @@ - {0x1002, 0x6767, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6768, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6770, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ -+ {0x1002, 0x6771, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6772, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6778, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ - {0x1002, 0x6779, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \ -@@ -493,6 +495,7 @@ - {0x1002, 0x9645, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ - {0x1002, 0x9647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ - {0x1002, 0x9648, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ -+ {0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\ - {0x1002, 0x964a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ - {0x1002, 0x964b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ - {0x1002, 0x964c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ -@@ -512,6 +515,7 @@ - {0x1002, 0x9807, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ - {0x1002, 0x9808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ - {0x1002, 0x9809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ -+ {0x1002, 0x980A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PALM|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ - {0, 0, 0} - - #define r128_PCI_IDS \ -diff --git a/include/linux/Kbuild b/include/linux/Kbuild -index 619b565..bd21ecd 100644 ---- a/include/linux/Kbuild -+++ b/include/linux/Kbuild -@@ -224,6 +224,7 @@ header-y += kd.h - header-y += kdev_t.h - header-y += kernel.h - header-y += kernelcapi.h -+header-y += kernel-page-flags.h - header-y += keyboard.h - header-y += keyctl.h - header-y += l2tp.h -diff --git a/include/linux/kernel-page-flags.h b/include/linux/kernel-page-flags.h -index bd92a89..096b05d 100644 ---- a/include/linux/kernel-page-flags.h -+++ b/include/linux/kernel-page-flags.h -@@ -31,6 +31,8 @@ - - #define KPF_KSM 21 - -+#ifdef __KERNEL__ -+ - /* kernel hacking assistances - * WARNING: subject to change, never rely on them! - */ -@@ -43,4 +45,6 @@ - #define KPF_ARCH 38 - #define KPF_UNCACHED 39 - -+#endif /* __KERNEL__ */ -+ - #endif /* LINUX_KERNEL_PAGE_FLAGS_H */ -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index cbeb586..cb52340 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -1420,15 +1420,6 @@ static inline bool netdev_uses_dsa_tags(struct net_device *dev) - return 0; - } - --#ifndef CONFIG_NET_NS --static inline void skb_set_dev(struct sk_buff *skb, struct net_device *dev) --{ -- skb->dev = dev; --} --#else /* CONFIG_NET_NS */ --void skb_set_dev(struct sk_buff *skb, struct net_device *dev); --#endif -- - static inline bool netdev_uses_trailer_tags(struct net_device *dev) - { - #ifdef CONFIG_NET_DSA_TAG_TRAILER -diff --git a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h -index 0ddd161..31d2844 100644 ---- a/include/linux/netfilter_bridge.h -+++ b/include/linux/netfilter_bridge.h -@@ -104,9 +104,18 @@ struct bridge_skb_cb { - } daddr; - }; - -+static inline void br_drop_fake_rtable(struct sk_buff *skb) -+{ -+ struct dst_entry *dst = skb_dst(skb); -+ -+ if (dst && (dst->flags & DST_FAKE_RTABLE)) -+ skb_dst_drop(skb); -+} -+ - #else - #define nf_bridge_maybe_copy_header(skb) (0) - #define nf_bridge_pad(skb) (0) -+#define br_drop_fake_rtable(skb) do { } while (0) - #endif /* CONFIG_BRIDGE_NETFILTER */ - - #endif /* __KERNEL__ */ -diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h -index e689b47..bdb4590 100644 ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -1866,8 +1866,6 @@ static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom, - { - int delta = 0; - -- if (headroom < NET_SKB_PAD) -- headroom = NET_SKB_PAD; - if (headroom > skb_headroom(skb)) - delta = headroom - skb_headroom(skb); - -diff --git a/include/net/dst.h b/include/net/dst.h -index 75766b4..16010d1 100644 ---- a/include/net/dst.h -+++ b/include/net/dst.h -@@ -54,6 +54,8 @@ struct dst_entry { - #define DST_NOCACHE 0x0010 - #define DST_NOCOUNT 0x0020 - #define DST_NOPEER 0x0040 -+#define DST_FAKE_RTABLE 0x0080 -+#define DST_XFRM_TUNNEL 0x0100 - - short error; - short obsolete; -diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h -index 6a72a58..ad03988 100644 ---- a/include/net/sctp/sctp.h -+++ b/include/net/sctp/sctp.h -@@ -703,4 +703,17 @@ static inline void sctp_v4_map_v6(union sctp_addr *addr) - addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff); - } - -+/* The cookie is always 0 since this is how it's used in the -+ * pmtu code. -+ */ -+static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) -+{ -+ if (t->dst && !dst_check(t->dst, 0)) { -+ dst_release(t->dst); -+ t->dst = NULL; -+ } -+ -+ return t->dst; -+} -+ - #endif /* __net_sctp_h__ */ -diff --git a/kernel/fork.c b/kernel/fork.c -index 26f1ab0..79ee71f 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -352,7 +352,8 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) - } - charge = 0; - if (mpnt->vm_flags & VM_ACCOUNT) { -- unsigned int len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; -+ unsigned long len; -+ len = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; - if (security_vm_enough_memory(len)) - goto fail_nomem; - charge = len; -diff --git a/lib/btree.c b/lib/btree.c -index 2a34392..297124d 100644 ---- a/lib/btree.c -+++ b/lib/btree.c -@@ -319,8 +319,8 @@ void *btree_get_prev(struct btree_head *head, struct btree_geo *geo, - - if (head->height == 0) - return NULL; --retry: - longcpy(key, __key, geo->keylen); -+retry: - dec_key(geo, key); - - node = head->node; -@@ -351,7 +351,7 @@ retry: - } - miss: - if (retry_key) { -- __key = retry_key; -+ longcpy(key, retry_key, geo->keylen); - retry_key = NULL; - goto retry; - } -diff --git a/mm/hugetlb.c b/mm/hugetlb.c -index 7120c2e..5f5c545 100644 ---- a/mm/hugetlb.c -+++ b/mm/hugetlb.c -@@ -2068,6 +2068,15 @@ static void hugetlb_vm_op_open(struct vm_area_struct *vma) - kref_get(&reservations->refs); - } - -+static void resv_map_put(struct vm_area_struct *vma) -+{ -+ struct resv_map *reservations = vma_resv_map(vma); -+ -+ if (!reservations) -+ return; -+ kref_put(&reservations->refs, resv_map_release); -+} -+ - static void hugetlb_vm_op_close(struct vm_area_struct *vma) - { - struct hstate *h = hstate_vma(vma); -@@ -2083,7 +2092,7 @@ static void hugetlb_vm_op_close(struct vm_area_struct *vma) - reserve = (end - start) - - region_count(&reservations->regions, start, end); - -- kref_put(&reservations->refs, resv_map_release); -+ resv_map_put(vma); - - if (reserve) { - hugetlb_acct_memory(h, -reserve); -@@ -2884,12 +2893,16 @@ int hugetlb_reserve_pages(struct inode *inode, - set_vma_resv_flags(vma, HPAGE_RESV_OWNER); - } - -- if (chg < 0) -- return chg; -+ if (chg < 0) { -+ ret = chg; -+ goto out_err; -+ } - - /* There must be enough filesystem quota for the mapping */ -- if (hugetlb_get_quota(inode->i_mapping, chg)) -- return -ENOSPC; -+ if (hugetlb_get_quota(inode->i_mapping, chg)) { -+ ret = -ENOSPC; -+ goto out_err; -+ } - - /* - * Check enough hugepages are available for the reservation. -@@ -2898,7 +2911,7 @@ int hugetlb_reserve_pages(struct inode *inode, - ret = hugetlb_acct_memory(h, chg); - if (ret < 0) { - hugetlb_put_quota(inode->i_mapping, chg); -- return ret; -+ goto out_err; - } - - /* -@@ -2915,6 +2928,10 @@ int hugetlb_reserve_pages(struct inode *inode, - if (!vma || vma->vm_flags & VM_MAYSHARE) - region_add(&inode->i_mapping->private_list, from, to); - return 0; -+out_err: -+ if (vma) -+ resv_map_put(vma); -+ return ret; - } - - void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) -diff --git a/mm/slub.c b/mm/slub.c -index a99c785..af47188 100644 ---- a/mm/slub.c -+++ b/mm/slub.c -@@ -1506,15 +1506,19 @@ static inline void *acquire_slab(struct kmem_cache *s, - freelist = page->freelist; - counters = page->counters; - new.counters = counters; -- if (mode) -+ if (mode) { - new.inuse = page->objects; -+ new.freelist = NULL; -+ } else { -+ new.freelist = freelist; -+ } - - VM_BUG_ON(new.frozen); - new.frozen = 1; - - } while (!__cmpxchg_double_slab(s, page, - freelist, counters, -- NULL, new.counters, -+ new.freelist, new.counters, - "lock and freeze")); - - remove_partial(n, page); -@@ -1556,7 +1560,6 @@ static void *get_partial_node(struct kmem_cache *s, - object = t; - available = page->objects - page->inuse; - } else { -- page->freelist = t; - available = put_cpu_partial(s, page, 0); - } - if (kmem_cache_debug(s) || available > s->cpu_partial / 2) -diff --git a/mm/vmalloc.c b/mm/vmalloc.c -index 27be2f0..eeba3bb 100644 ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -256,7 +256,7 @@ struct vmap_area { - struct rb_node rb_node; /* address sorted rbtree */ - struct list_head list; /* address sorted list */ - struct list_head purge_list; /* "lazy purge" list */ -- void *private; -+ struct vm_struct *vm; - struct rcu_head rcu_head; - }; - -@@ -1160,9 +1160,10 @@ void __init vmalloc_init(void) - /* Import existing vmlist entries. */ - for (tmp = vmlist; tmp; tmp = tmp->next) { - va = kzalloc(sizeof(struct vmap_area), GFP_NOWAIT); -- va->flags = tmp->flags | VM_VM_AREA; -+ va->flags = VM_VM_AREA; - va->va_start = (unsigned long)tmp->addr; - va->va_end = va->va_start + tmp->size; -+ va->vm = tmp; - __insert_vmap_area(va); - } - -@@ -1260,7 +1261,7 @@ static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, - vm->addr = (void *)va->va_start; - vm->size = va->va_end - va->va_start; - vm->caller = caller; -- va->private = vm; -+ va->vm = vm; - va->flags |= VM_VM_AREA; - } - -@@ -1383,7 +1384,7 @@ static struct vm_struct *find_vm_area(const void *addr) - - va = find_vmap_area((unsigned long)addr); - if (va && va->flags & VM_VM_AREA) -- return va->private; -+ return va->vm; - - return NULL; - } -@@ -1402,7 +1403,7 @@ struct vm_struct *remove_vm_area(const void *addr) - - va = find_vmap_area((unsigned long)addr); - if (va && va->flags & VM_VM_AREA) { -- struct vm_struct *vm = va->private; -+ struct vm_struct *vm = va->vm; - - if (!(vm->flags & VM_UNLIST)) { - struct vm_struct *tmp, **p; -diff --git a/mm/vmscan.c b/mm/vmscan.c -index cb33d9c..fbe2d2c 100644 ---- a/mm/vmscan.c -+++ b/mm/vmscan.c -@@ -697,7 +697,7 @@ static enum page_references page_check_references(struct page *page, - return PAGEREF_RECLAIM; - - if (referenced_ptes) { -- if (PageAnon(page)) -+ if (PageSwapBacked(page)) - return PAGEREF_ACTIVATE; - /* - * All mapped pages start out with page table -diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c -index bc25286..0cccca8 100644 ---- a/net/8021q/vlan_dev.c -+++ b/net/8021q/vlan_dev.c -@@ -156,7 +156,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb, - skb = __vlan_hwaccel_put_tag(skb, vlan_tci); - } - -- skb_set_dev(skb, vlan_dev_info(dev)->real_dev); -+ skb->dev = vlan_dev_info(dev)->real_dev; - len = skb->len; - ret = dev_queue_xmit(skb); - -diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c -index ee64287..e221f88 100644 ---- a/net/bridge/br_forward.c -+++ b/net/bridge/br_forward.c -@@ -47,6 +47,7 @@ int br_dev_queue_push_xmit(struct sk_buff *skb) - kfree_skb(skb); - } else { - skb_push(skb, ETH_HLEN); -+ br_drop_fake_rtable(skb); - dev_queue_xmit(skb); - } - -diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c -index fa8b8f7..577ea5d 100644 ---- a/net/bridge/br_netfilter.c -+++ b/net/bridge/br_netfilter.c -@@ -147,7 +147,7 @@ void br_netfilter_rtable_init(struct net_bridge *br) - rt->dst.dev = br->dev; - rt->dst.path = &rt->dst; - dst_init_metrics(&rt->dst, br_dst_default_metrics, true); -- rt->dst.flags = DST_NOXFRM | DST_NOPEER; -+ rt->dst.flags = DST_NOXFRM | DST_NOPEER | DST_FAKE_RTABLE; - rt->dst.ops = &fake_dst_ops; - } - -@@ -687,11 +687,7 @@ static unsigned int br_nf_local_in(unsigned int hook, struct sk_buff *skb, - const struct net_device *out, - int (*okfn)(struct sk_buff *)) - { -- struct rtable *rt = skb_rtable(skb); -- -- if (rt && rt == bridge_parent_rtable(in)) -- skb_dst_drop(skb); -- -+ br_drop_fake_rtable(skb); - return NF_ACCEPT; - } - -diff --git a/net/core/dev.c b/net/core/dev.c -index 61a7baa..1cbddc9 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -1607,10 +1607,14 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) - kfree_skb(skb); - return NET_RX_DROP; - } -- skb_set_dev(skb, dev); -+ skb->dev = dev; -+ skb_dst_drop(skb); - skb->tstamp.tv64 = 0; - skb->pkt_type = PACKET_HOST; - skb->protocol = eth_type_trans(skb, dev); -+ skb->mark = 0; -+ secpath_reset(skb); -+ nf_reset(skb); - return netif_rx(skb); - } - EXPORT_SYMBOL_GPL(dev_forward_skb); -@@ -1865,36 +1869,6 @@ void netif_device_attach(struct net_device *dev) - } - EXPORT_SYMBOL(netif_device_attach); - --/** -- * skb_dev_set -- assign a new device to a buffer -- * @skb: buffer for the new device -- * @dev: network device -- * -- * If an skb is owned by a device already, we have to reset -- * all data private to the namespace a device belongs to -- * before assigning it a new device. -- */ --#ifdef CONFIG_NET_NS --void skb_set_dev(struct sk_buff *skb, struct net_device *dev) --{ -- skb_dst_drop(skb); -- if (skb->dev && !net_eq(dev_net(skb->dev), dev_net(dev))) { -- secpath_reset(skb); -- nf_reset(skb); -- skb_init_secmark(skb); -- skb->mark = 0; -- skb->priority = 0; -- skb->nf_trace = 0; -- skb->ipvs_property = 0; --#ifdef CONFIG_NET_SCHED -- skb->tc_index = 0; --#endif -- } -- skb->dev = dev; --} --EXPORT_SYMBOL(skb_set_dev); --#endif /* CONFIG_NET_NS */ -- - /* - * Invalidate hardware checksum when packet is to be mangled, and - * complete checksum manually on outgoing path. -diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c -index a5b4134..530787b 100644 ---- a/net/ipv4/esp4.c -+++ b/net/ipv4/esp4.c -@@ -457,28 +457,22 @@ static u32 esp4_get_mtu(struct xfrm_state *x, int mtu) - struct esp_data *esp = x->data; - u32 blksize = ALIGN(crypto_aead_blocksize(esp->aead), 4); - u32 align = max_t(u32, blksize, esp->padlen); -- u32 rem; -- -- mtu -= x->props.header_len + crypto_aead_authsize(esp->aead); -- rem = mtu & (align - 1); -- mtu &= ~(align - 1); -+ unsigned int net_adj; - - switch (x->props.mode) { -- case XFRM_MODE_TUNNEL: -- break; -- default: - case XFRM_MODE_TRANSPORT: -- /* The worst case */ -- mtu -= blksize - 4; -- mtu += min_t(u32, blksize - 4, rem); -- break; - case XFRM_MODE_BEET: -- /* The worst case. */ -- mtu += min_t(u32, IPV4_BEET_PHMAXLEN, rem); -+ net_adj = sizeof(struct iphdr); - break; -+ case XFRM_MODE_TUNNEL: -+ net_adj = 0; -+ break; -+ default: -+ BUG(); - } - -- return mtu - 2; -+ return ((mtu - x->props.header_len - crypto_aead_authsize(esp->aead) - -+ net_adj) & ~(align - 1)) + (net_adj - 2); - } - - static void esp4_err(struct sk_buff *skb, u32 info) -diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c -index 80106d8..d01f9c6 100644 ---- a/net/ipv4/fib_semantics.c -+++ b/net/ipv4/fib_semantics.c -@@ -146,6 +146,12 @@ static void free_fib_info_rcu(struct rcu_head *head) - { - struct fib_info *fi = container_of(head, struct fib_info, rcu); - -+ change_nexthops(fi) { -+ if (nexthop_nh->nh_dev) -+ dev_put(nexthop_nh->nh_dev); -+ } endfor_nexthops(fi); -+ -+ release_net(fi->fib_net); - if (fi->fib_metrics != (u32 *) dst_default_metrics) - kfree(fi->fib_metrics); - kfree(fi); -@@ -157,13 +163,7 @@ void free_fib_info(struct fib_info *fi) - pr_warning("Freeing alive fib_info %p\n", fi); - return; - } -- change_nexthops(fi) { -- if (nexthop_nh->nh_dev) -- dev_put(nexthop_nh->nh_dev); -- nexthop_nh->nh_dev = NULL; -- } endfor_nexthops(fi); - fib_info_cnt--; -- release_net(fi->fib_net); - call_rcu(&fi->rcu, free_fib_info_rcu); - } - -diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c -index 3ce23f9..cd2d639 100644 ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -1372,6 +1372,8 @@ static int check_leaf(struct fib_table *tb, struct trie *t, struct leaf *l, - - if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos) - continue; -+ if (fi->fib_dead) -+ continue; - if (fa->fa_info->fib_scope < flp->flowi4_scope) - continue; - fib_alias_accessed(fa); -diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c -index 1ac7938..65dd543 100644 ---- a/net/ipv6/esp6.c -+++ b/net/ipv6/esp6.c -@@ -411,19 +411,15 @@ static u32 esp6_get_mtu(struct xfrm_state *x, int mtu) - struct esp_data *esp = x->data; - u32 blksize = ALIGN(crypto_aead_blocksize(esp->aead), 4); - u32 align = max_t(u32, blksize, esp->padlen); -- u32 rem; -+ unsigned int net_adj; - -- mtu -= x->props.header_len + crypto_aead_authsize(esp->aead); -- rem = mtu & (align - 1); -- mtu &= ~(align - 1); -- -- if (x->props.mode != XFRM_MODE_TUNNEL) { -- u32 padsize = ((blksize - 1) & 7) + 1; -- mtu -= blksize - padsize; -- mtu += min_t(u32, blksize - padsize, rem); -- } -+ if (x->props.mode != XFRM_MODE_TUNNEL) -+ net_adj = sizeof(struct ipv6hdr); -+ else -+ net_adj = 0; - -- return mtu - 2; -+ return ((mtu - x->props.header_len - crypto_aead_authsize(esp->aead) - -+ net_adj) & ~(align - 1)) + (net_adj - 2); - } - - static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, -diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c -index f7f07e2..ae98e09 100644 ---- a/net/ipv6/ip6_output.c -+++ b/net/ipv6/ip6_output.c -@@ -1178,6 +1178,29 @@ static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src, - return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL; - } - -+static void ip6_append_data_mtu(int *mtu, -+ int *maxfraglen, -+ unsigned int fragheaderlen, -+ struct sk_buff *skb, -+ struct rt6_info *rt) -+{ -+ if (!(rt->dst.flags & DST_XFRM_TUNNEL)) { -+ if (skb == NULL) { -+ /* first fragment, reserve header_len */ -+ *mtu = *mtu - rt->dst.header_len; -+ -+ } else { -+ /* -+ * this fragment is not first, the headers -+ * space is regarded as data space. -+ */ -+ *mtu = dst_mtu(rt->dst.path); -+ } -+ *maxfraglen = ((*mtu - fragheaderlen) & ~7) -+ + fragheaderlen - sizeof(struct frag_hdr); -+ } -+} -+ - int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, - int offset, int len, int odd, struct sk_buff *skb), - void *from, int length, int transhdrlen, -@@ -1187,7 +1210,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, - struct inet_sock *inet = inet_sk(sk); - struct ipv6_pinfo *np = inet6_sk(sk); - struct inet_cork *cork; -- struct sk_buff *skb; -+ struct sk_buff *skb, *skb_prev = NULL; - unsigned int maxfraglen, fragheaderlen; - int exthdrlen; - int dst_exthdrlen; -@@ -1245,8 +1268,12 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, - inet->cork.fl.u.ip6 = *fl6; - np->cork.hop_limit = hlimit; - np->cork.tclass = tclass; -- mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ? -- rt->dst.dev->mtu : dst_mtu(&rt->dst); -+ if (rt->dst.flags & DST_XFRM_TUNNEL) -+ mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ? -+ rt->dst.dev->mtu : dst_mtu(&rt->dst); -+ else -+ mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ? -+ rt->dst.dev->mtu : dst_mtu(rt->dst.path); - if (np->frag_size < mtu) { - if (np->frag_size) - mtu = np->frag_size; -@@ -1342,25 +1369,27 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, - unsigned int fraglen; - unsigned int fraggap; - unsigned int alloclen; -- struct sk_buff *skb_prev; - alloc_new_skb: -- skb_prev = skb; -- - /* There's no room in the current skb */ -- if (skb_prev) -- fraggap = skb_prev->len - maxfraglen; -+ if (skb) -+ fraggap = skb->len - maxfraglen; - else - fraggap = 0; -+ /* update mtu and maxfraglen if necessary */ -+ if (skb == NULL || skb_prev == NULL) -+ ip6_append_data_mtu(&mtu, &maxfraglen, -+ fragheaderlen, skb, rt); -+ -+ skb_prev = skb; - - /* - * If remaining data exceeds the mtu, - * we know we need more fragment(s). - */ - datalen = length + fraggap; -- if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen) -- datalen = maxfraglen - fragheaderlen; - -- fraglen = datalen + fragheaderlen; -+ if (datalen > (cork->length <= mtu && !(cork->flags & IPCORK_ALLFRAG) ? mtu : maxfraglen) - fragheaderlen) -+ datalen = maxfraglen - fragheaderlen - rt->dst.trailer_len; - if ((flags & MSG_MORE) && - !(rt->dst.dev->features&NETIF_F_SG)) - alloclen = mtu; -@@ -1369,13 +1398,16 @@ alloc_new_skb: - - alloclen += dst_exthdrlen; - -- /* -- * The last fragment gets additional space at tail. -- * Note: we overallocate on fragments with MSG_MODE -- * because we have no idea if we're the last one. -- */ -- if (datalen == length + fraggap) -- alloclen += rt->dst.trailer_len; -+ if (datalen != length + fraggap) { -+ /* -+ * this is not the last fragment, the trailer -+ * space is regarded as data space. -+ */ -+ datalen += rt->dst.trailer_len; -+ } -+ -+ alloclen += rt->dst.trailer_len; -+ fraglen = datalen + fragheaderlen; - - /* - * We just reserve space for fragment header. -diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c -index 2a2a3e7..2fbbe1f 100644 ---- a/net/l2tp/l2tp_ip.c -+++ b/net/l2tp/l2tp_ip.c -@@ -251,9 +251,16 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) - { - struct inet_sock *inet = inet_sk(sk); - struct sockaddr_l2tpip *addr = (struct sockaddr_l2tpip *) uaddr; -- int ret = -EINVAL; -+ int ret; - int chk_addr_ret; - -+ if (!sock_flag(sk, SOCK_ZAPPED)) -+ return -EINVAL; -+ if (addr_len < sizeof(struct sockaddr_l2tpip)) -+ return -EINVAL; -+ if (addr->l2tp_family != AF_INET) -+ return -EINVAL; -+ - ret = -EADDRINUSE; - read_lock_bh(&l2tp_ip_lock); - if (__l2tp_ip_bind_lookup(&init_net, addr->l2tp_addr.s_addr, sk->sk_bound_dev_if, addr->l2tp_conn_id)) -@@ -283,6 +290,8 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) - sk_del_node_init(sk); - write_unlock_bh(&l2tp_ip_lock); - ret = 0; -+ sock_reset_flag(sk, SOCK_ZAPPED); -+ - out: - release_sock(sk); - -@@ -303,13 +312,14 @@ static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len - __be32 saddr; - int oif, rc; - -- rc = -EINVAL; -+ if (sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */ -+ return -EINVAL; -+ - if (addr_len < sizeof(*lsa)) -- goto out; -+ return -EINVAL; - -- rc = -EAFNOSUPPORT; - if (lsa->l2tp_family != AF_INET) -- goto out; -+ return -EAFNOSUPPORT; - - lock_sock(sk); - -@@ -363,6 +373,14 @@ out: - return rc; - } - -+static int l2tp_ip_disconnect(struct sock *sk, int flags) -+{ -+ if (sock_flag(sk, SOCK_ZAPPED)) -+ return 0; -+ -+ return udp_disconnect(sk, flags); -+} -+ - static int l2tp_ip_getname(struct socket *sock, struct sockaddr *uaddr, - int *uaddr_len, int peer) - { -@@ -598,7 +616,7 @@ static struct proto l2tp_ip_prot = { - .close = l2tp_ip_close, - .bind = l2tp_ip_bind, - .connect = l2tp_ip_connect, -- .disconnect = udp_disconnect, -+ .disconnect = l2tp_ip_disconnect, - .ioctl = udp_ioctl, - .destroy = l2tp_ip_destroy_sock, - .setsockopt = ip_setsockopt, -diff --git a/net/mac80211/util.c b/net/mac80211/util.c -index d5230ec..7095ae5 100644 ---- a/net/mac80211/util.c -+++ b/net/mac80211/util.c -@@ -1111,6 +1111,12 @@ int ieee80211_reconfig(struct ieee80211_local *local) - } - } - -+ /* add back keys */ -+ list_for_each_entry(sdata, &local->interfaces, list) -+ if (ieee80211_sdata_running(sdata)) -+ ieee80211_enable_keys(sdata); -+ -+ wake_up: - /* - * Clear the WLAN_STA_BLOCK_BA flag so new aggregation - * sessions can be established after a resume. -@@ -1132,12 +1138,6 @@ int ieee80211_reconfig(struct ieee80211_local *local) - mutex_unlock(&local->sta_mtx); - } - -- /* add back keys */ -- list_for_each_entry(sdata, &local->interfaces, list) -- if (ieee80211_sdata_running(sdata)) -- ieee80211_enable_keys(sdata); -- -- wake_up: - ieee80211_wake_queues_by_reason(hw, - IEEE80211_QUEUE_STOP_REASON_SUSPEND); - -diff --git a/net/sctp/output.c b/net/sctp/output.c -index 817174e..8fc4dcd 100644 ---- a/net/sctp/output.c -+++ b/net/sctp/output.c -@@ -377,9 +377,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) - */ - skb_set_owner_w(nskb, sk); - -- /* The 'obsolete' field of dst is set to 2 when a dst is freed. */ -- if (!dst || (dst->obsolete > 1)) { -- dst_release(dst); -+ if (!sctp_transport_dst_check(tp)) { - sctp_transport_route(tp, NULL, sctp_sk(sk)); - if (asoc && (asoc->param_flags & SPP_PMTUD_ENABLE)) { - sctp_assoc_sync_pmtu(asoc); -diff --git a/net/sctp/transport.c b/net/sctp/transport.c -index 394c57c..8da4481 100644 ---- a/net/sctp/transport.c -+++ b/net/sctp/transport.c -@@ -226,23 +226,6 @@ void sctp_transport_pmtu(struct sctp_transport *transport, struct sock *sk) - transport->pathmtu = SCTP_DEFAULT_MAXSEGMENT; - } - --/* this is a complete rip-off from __sk_dst_check -- * the cookie is always 0 since this is how it's used in the -- * pmtu code -- */ --static struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t) --{ -- struct dst_entry *dst = t->dst; -- -- if (dst && dst->obsolete && dst->ops->check(dst, 0) == NULL) { -- dst_release(t->dst); -- t->dst = NULL; -- return NULL; -- } -- -- return dst; --} -- - void sctp_transport_update_pmtu(struct sctp_transport *t, u32 pmtu) - { - struct dst_entry *dst; -diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c -index f0268ea..b2250da 100644 ---- a/net/sunrpc/clnt.c -+++ b/net/sunrpc/clnt.c -@@ -959,6 +959,8 @@ call_reserveresult(struct rpc_task *task) - } - - switch (status) { -+ case -ENOMEM: -+ rpc_delay(task, HZ >> 2); - case -EAGAIN: /* woken up; retry */ - task->tk_action = call_reserve; - return; -diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c -index c64c0ef..3ac9789 100644 ---- a/net/sunrpc/xprt.c -+++ b/net/sunrpc/xprt.c -@@ -977,15 +977,16 @@ static void xprt_alloc_slot(struct rpc_task *task) - goto out_init_req; - switch (PTR_ERR(req)) { - case -ENOMEM: -- rpc_delay(task, HZ >> 2); - dprintk("RPC: dynamic allocation of request slot " - "failed! Retrying\n"); -+ task->tk_status = -ENOMEM; - break; - case -EAGAIN: - rpc_sleep_on(&xprt->backlog, task, NULL); - dprintk("RPC: waiting for request slot\n"); -+ default: -+ task->tk_status = -EAGAIN; - } -- task->tk_status = -EAGAIN; - return; - out_init_req: - task->tk_status = 0; -diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c -index 9049a5c..0174034 100644 ---- a/net/xfrm/xfrm_policy.c -+++ b/net/xfrm/xfrm_policy.c -@@ -1919,6 +1919,9 @@ no_transform: - } - ok: - xfrm_pols_put(pols, drop_pols); -+ if (dst && dst->xfrm && -+ dst->xfrm->props.mode == XFRM_MODE_TUNNEL) -+ dst->flags |= DST_XFRM_TUNNEL; - return dst; - - nopol: -diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c -index 0220b0f..839165f 100644 ---- a/sound/usb/pcm.c -+++ b/sound/usb/pcm.c -@@ -698,6 +698,9 @@ static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime, - int count = 0, needs_knot = 0; - int err; - -+ kfree(subs->rate_list.list); -+ subs->rate_list.list = NULL; -+ - list_for_each_entry(fp, &subs->fmt_list, list) { - if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS) - return 0; |