summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '3.2.20/1019_linux-3.2.20.patch')
-rw-r--r--3.2.20/1019_linux-3.2.20.patch2829
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;