summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '3.2.71/1036_linux-3.2.37.patch')
-rw-r--r--3.2.71/1036_linux-3.2.37.patch1689
1 files changed, 0 insertions, 1689 deletions
diff --git a/3.2.71/1036_linux-3.2.37.patch b/3.2.71/1036_linux-3.2.37.patch
deleted file mode 100644
index ad13251..0000000
--- a/3.2.71/1036_linux-3.2.37.patch
+++ /dev/null
@@ -1,1689 +0,0 @@
-diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
-index a4399f5..3b979c6 100644
---- a/Documentation/networking/ip-sysctl.txt
-+++ b/Documentation/networking/ip-sysctl.txt
-@@ -524,6 +524,11 @@ tcp_thin_dupack - BOOLEAN
- Documentation/networking/tcp-thin.txt
- Default: 0
-
-+tcp_challenge_ack_limit - INTEGER
-+ Limits number of Challenge ACK sent per second, as recommended
-+ in RFC 5961 (Improving TCP's Robustness to Blind In-Window Attacks)
-+ Default: 100
-+
- UDP variables:
-
- udp_mem - vector of 3 INTEGERs: min, pressure, max
-diff --git a/Makefile b/Makefile
-index 2052c29..21c77e2 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 3
- PATCHLEVEL = 2
--SUBLEVEL = 36
-+SUBLEVEL = 37
- EXTRAVERSION =
- NAME = Saber-toothed Squirrel
-
-diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
-index ec8affe..e74f86e 100644
---- a/arch/powerpc/kernel/time.c
-+++ b/arch/powerpc/kernel/time.c
-@@ -859,13 +859,8 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
-
- void update_vsyscall_tz(void)
- {
-- /* Make userspace gettimeofday spin until we're done. */
-- ++vdso_data->tb_update_count;
-- smp_mb();
- vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
- vdso_data->tz_dsttime = sys_tz.tz_dsttime;
-- smp_mb();
-- ++vdso_data->tb_update_count;
- }
-
- static void __init clocksource_init(void)
-diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c
-index e8dd5c5..d10c123 100644
---- a/arch/powerpc/platforms/40x/ppc40x_simple.c
-+++ b/arch/powerpc/platforms/40x/ppc40x_simple.c
-@@ -55,7 +55,8 @@ static const char *board[] __initdata = {
- "amcc,haleakala",
- "amcc,kilauea",
- "amcc,makalu",
-- "est,hotfoot"
-+ "est,hotfoot",
-+ NULL
- };
-
- static int __init ppc40x_probe(void)
-diff --git a/arch/sparc/include/asm/hugetlb.h b/arch/sparc/include/asm/hugetlb.h
-index 1770610..f368cef 100644
---- a/arch/sparc/include/asm/hugetlb.h
-+++ b/arch/sparc/include/asm/hugetlb.h
-@@ -58,14 +58,20 @@ static inline pte_t huge_pte_wrprotect(pte_t pte)
- static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
- unsigned long addr, pte_t *ptep)
- {
-- ptep_set_wrprotect(mm, addr, ptep);
-+ pte_t old_pte = *ptep;
-+ set_huge_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
- }
-
- static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
- unsigned long addr, pte_t *ptep,
- pte_t pte, int dirty)
- {
-- return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
-+ int changed = !pte_same(*ptep, pte);
-+ if (changed) {
-+ set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
-+ flush_tlb_page(vma, addr);
-+ }
-+ return changed;
- }
-
- static inline pte_t huge_ptep_get(pte_t *ptep)
-diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
-index 8ab80ba..792b66f 100644
---- a/drivers/acpi/scan.c
-+++ b/drivers/acpi/scan.c
-@@ -789,8 +789,8 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle,
- static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
- {
- struct acpi_device_id button_device_ids[] = {
-- {"PNP0C0D", 0},
- {"PNP0C0C", 0},
-+ {"PNP0C0D", 0},
- {"PNP0C0E", 0},
- {"", 0},
- };
-@@ -802,6 +802,11 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
- /* Power button, Lid switch always enable wakeup */
- if (!acpi_match_device_ids(device, button_device_ids)) {
- device->wakeup.flags.run_wake = 1;
-+ if (!acpi_match_device_ids(device, &button_device_ids[1])) {
-+ /* Do not use Lid/sleep button for S5 wakeup */
-+ if (device->wakeup.sleep_state == ACPI_STATE_S5)
-+ device->wakeup.sleep_state = ACPI_STATE_S4;
-+ }
- device_set_wakeup_capable(&device->dev, true);
- return;
- }
-@@ -1152,7 +1157,7 @@ static void acpi_device_set_id(struct acpi_device *device)
- acpi_add_id(device, ACPI_DOCK_HID);
- else if (!acpi_ibm_smbus_match(device))
- acpi_add_id(device, ACPI_SMBUS_IBM_HID);
-- else if (!acpi_device_hid(device) &&
-+ else if (list_empty(&device->pnp.ids) &&
- ACPI_IS_ROOT_DEVICE(device->parent)) {
- acpi_add_id(device, ACPI_BUS_HID); /* \_SB, LNXSYBUS */
- strcpy(device->pnp.device_name, ACPI_BUS_DEVICE_NAME);
-diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h
-index db195ab..e49ddd0 100644
---- a/drivers/block/aoe/aoe.h
-+++ b/drivers/block/aoe/aoe.h
-@@ -1,5 +1,5 @@
- /* Copyright (c) 2007 Coraid, Inc. See COPYING for GPL terms. */
--#define VERSION "47"
-+#define VERSION "47q"
- #define AOE_MAJOR 152
- #define DEVICE_NAME "aoe"
-
-diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c
-index 321de7b..7eca463 100644
---- a/drivers/block/aoe/aoeblk.c
-+++ b/drivers/block/aoe/aoeblk.c
-@@ -276,8 +276,6 @@ aoeblk_gdalloc(void *vp)
- goto err_mempool;
- blk_queue_make_request(d->blkq, aoeblk_make_request);
- d->blkq->backing_dev_info.name = "aoe";
-- if (bdi_init(&d->blkq->backing_dev_info))
-- goto err_blkq;
- spin_lock_irqsave(&d->lock, flags);
- gd->major = AOE_MAJOR;
- gd->first_minor = d->sysminor * AOE_PARTITIONS;
-@@ -298,9 +296,6 @@ aoeblk_gdalloc(void *vp)
- aoedisk_add_sysfs(d);
- return;
-
--err_blkq:
-- blk_cleanup_queue(d->blkq);
-- d->blkq = NULL;
- err_mempool:
- mempool_destroy(d->bufpool);
- err_disk:
-diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
-index 791df46..012a9d2 100644
---- a/drivers/gpu/drm/i915/i915_drv.h
-+++ b/drivers/gpu/drm/i915/i915_drv.h
-@@ -1305,6 +1305,7 @@ static inline void intel_unregister_dsm_handler(void) { return; }
- #endif /* CONFIG_ACPI */
-
- /* modesetting */
-+extern void i915_redisable_vga(struct drm_device *dev);
- extern void intel_modeset_init(struct drm_device *dev);
- extern void intel_modeset_gem_init(struct drm_device *dev);
- extern void intel_modeset_cleanup(struct drm_device *dev);
-diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index 54acad3..fa9639b 100644
---- a/drivers/gpu/drm/i915/intel_display.c
-+++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -8898,6 +8898,23 @@ static void i915_disable_vga(struct drm_device *dev)
- POSTING_READ(vga_reg);
- }
-
-+void i915_redisable_vga(struct drm_device *dev)
-+{
-+ struct drm_i915_private *dev_priv = dev->dev_private;
-+ u32 vga_reg;
-+
-+ if (HAS_PCH_SPLIT(dev))
-+ vga_reg = CPU_VGACNTRL;
-+ else
-+ vga_reg = VGACNTRL;
-+
-+ if (I915_READ(vga_reg) != VGA_DISP_DISABLE) {
-+ DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
-+ I915_WRITE(vga_reg, VGA_DISP_DISABLE);
-+ POSTING_READ(vga_reg);
-+ }
-+}
-+
- void intel_modeset_init(struct drm_device *dev)
- {
- struct drm_i915_private *dev_priv = dev->dev_private;
-diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
-index cf5ea3d..c6d0966 100644
---- a/drivers/gpu/drm/i915/intel_lvds.c
-+++ b/drivers/gpu/drm/i915/intel_lvds.c
-@@ -535,6 +535,7 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
-
- mutex_lock(&dev->mode_config.mutex);
- drm_helper_resume_force_mode(dev);
-+ i915_redisable_vga(dev);
- mutex_unlock(&dev->mode_config.mutex);
-
- return NOTIFY_OK;
-diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
-index d5af089..2bb29c9 100644
---- a/drivers/gpu/drm/nouveau/nouveau_bo.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
-@@ -940,7 +940,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
- if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) {
- mem->bus.offset = mem->start << PAGE_SHIFT;
- mem->bus.base = dev_priv->gart_info.aper_base;
-- mem->bus.is_iomem = true;
-+ mem->bus.is_iomem = !dev->agp->cant_use_aperture;
- }
- #endif
- break;
-diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
-index 81fc100..1b98338 100644
---- a/drivers/gpu/drm/radeon/radeon_combios.c
-+++ b/drivers/gpu/drm/radeon/radeon_combios.c
-@@ -1536,6 +1536,9 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
- of_machine_is_compatible("PowerBook6,7")) {
- /* ibook */
- rdev->mode_info.connector_table = CT_IBOOK;
-+ } else if (of_machine_is_compatible("PowerMac3,5")) {
-+ /* PowerMac G4 Silver radeon 7500 */
-+ rdev->mode_info.connector_table = CT_MAC_G4_SILVER;
- } else if (of_machine_is_compatible("PowerMac4,4")) {
- /* emac */
- rdev->mode_info.connector_table = CT_EMAC;
-@@ -1561,6 +1564,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
- (rdev->pdev->subsystem_device == 0x4150)) {
- /* Mac G5 tower 9600 */
- rdev->mode_info.connector_table = CT_MAC_G5_9600;
-+ } else if ((rdev->pdev->device == 0x4c66) &&
-+ (rdev->pdev->subsystem_vendor == 0x1002) &&
-+ (rdev->pdev->subsystem_device == 0x4c66)) {
-+ /* SAM440ep RV250 embedded board */
-+ rdev->mode_info.connector_table = CT_SAM440EP;
- } else
- #endif /* CONFIG_PPC_PMAC */
- #ifdef CONFIG_PPC64
-@@ -2134,6 +2142,115 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
- CONNECTOR_OBJECT_ID_SVIDEO,
- &hpd);
- break;
-+ case CT_SAM440EP:
-+ DRM_INFO("Connector Table: %d (SAM440ep embedded board)\n",
-+ rdev->mode_info.connector_table);
-+ /* LVDS */
-+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_NONE_DETECTED, 0, 0);
-+ hpd.hpd = RADEON_HPD_NONE;
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_LCD1_SUPPORT,
-+ 0),
-+ ATOM_DEVICE_LCD1_SUPPORT);
-+ radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_LCD1_SUPPORT,
-+ DRM_MODE_CONNECTOR_LVDS, &ddc_i2c,
-+ CONNECTOR_OBJECT_ID_LVDS,
-+ &hpd);
-+ /* DVI-I - secondary dac, int tmds */
-+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
-+ hpd.hpd = RADEON_HPD_1; /* ??? */
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_DFP1_SUPPORT,
-+ 0),
-+ ATOM_DEVICE_DFP1_SUPPORT);
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_CRT2_SUPPORT,
-+ 2),
-+ ATOM_DEVICE_CRT2_SUPPORT);
-+ radeon_add_legacy_connector(dev, 1,
-+ ATOM_DEVICE_DFP1_SUPPORT |
-+ ATOM_DEVICE_CRT2_SUPPORT,
-+ DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
-+ CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
-+ &hpd);
-+ /* VGA - primary dac */
-+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
-+ hpd.hpd = RADEON_HPD_NONE;
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_CRT1_SUPPORT,
-+ 1),
-+ ATOM_DEVICE_CRT1_SUPPORT);
-+ radeon_add_legacy_connector(dev, 2,
-+ ATOM_DEVICE_CRT1_SUPPORT,
-+ DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
-+ CONNECTOR_OBJECT_ID_VGA,
-+ &hpd);
-+ /* TV - TV DAC */
-+ ddc_i2c.valid = false;
-+ hpd.hpd = RADEON_HPD_NONE;
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_TV1_SUPPORT,
-+ 2),
-+ ATOM_DEVICE_TV1_SUPPORT);
-+ radeon_add_legacy_connector(dev, 3, ATOM_DEVICE_TV1_SUPPORT,
-+ DRM_MODE_CONNECTOR_SVIDEO,
-+ &ddc_i2c,
-+ CONNECTOR_OBJECT_ID_SVIDEO,
-+ &hpd);
-+ break;
-+ case CT_MAC_G4_SILVER:
-+ DRM_INFO("Connector Table: %d (mac g4 silver)\n",
-+ rdev->mode_info.connector_table);
-+ /* DVI-I - tv dac, int tmds */
-+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
-+ hpd.hpd = RADEON_HPD_1; /* ??? */
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_DFP1_SUPPORT,
-+ 0),
-+ ATOM_DEVICE_DFP1_SUPPORT);
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_CRT2_SUPPORT,
-+ 2),
-+ ATOM_DEVICE_CRT2_SUPPORT);
-+ radeon_add_legacy_connector(dev, 0,
-+ ATOM_DEVICE_DFP1_SUPPORT |
-+ ATOM_DEVICE_CRT2_SUPPORT,
-+ DRM_MODE_CONNECTOR_DVII, &ddc_i2c,
-+ CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,
-+ &hpd);
-+ /* VGA - primary dac */
-+ ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
-+ hpd.hpd = RADEON_HPD_NONE;
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_CRT1_SUPPORT,
-+ 1),
-+ ATOM_DEVICE_CRT1_SUPPORT);
-+ radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT1_SUPPORT,
-+ DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
-+ CONNECTOR_OBJECT_ID_VGA,
-+ &hpd);
-+ /* TV - TV DAC */
-+ ddc_i2c.valid = false;
-+ hpd.hpd = RADEON_HPD_NONE;
-+ radeon_add_legacy_encoder(dev,
-+ radeon_get_encoder_enum(dev,
-+ ATOM_DEVICE_TV1_SUPPORT,
-+ 2),
-+ ATOM_DEVICE_TV1_SUPPORT);
-+ radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT,
-+ DRM_MODE_CONNECTOR_SVIDEO,
-+ &ddc_i2c,
-+ CONNECTOR_OBJECT_ID_SVIDEO,
-+ &hpd);
-+ break;
- default:
- DRM_INFO("Connector table: %d (invalid)\n",
- rdev->mode_info.connector_table);
-diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
-index 87d494d..6fd53b6 100644
---- a/drivers/gpu/drm/radeon/radeon_connectors.c
-+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
-@@ -689,7 +689,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
- ret = connector_status_disconnected;
-
- if (radeon_connector->ddc_bus)
-- dret = radeon_ddc_probe(radeon_connector);
-+ dret = radeon_ddc_probe(radeon_connector, false);
- if (dret) {
- radeon_connector->detected_by_load = false;
- if (radeon_connector->edid) {
-@@ -871,7 +871,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
- bool dret = false;
-
- if (radeon_connector->ddc_bus)
-- dret = radeon_ddc_probe(radeon_connector);
-+ dret = radeon_ddc_probe(radeon_connector, false);
- if (dret) {
- radeon_connector->detected_by_load = false;
- if (radeon_connector->edid) {
-@@ -1299,7 +1299,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
- if (encoder) {
- /* setup ddc on the bridge */
- radeon_atom_ext_encoder_setup_ddc(encoder);
-- if (radeon_ddc_probe(radeon_connector)) /* try DDC */
-+ /* bridge chips are always aux */
-+ if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */
- ret = connector_status_connected;
- else if (radeon_connector->dac_load_detect) { /* try load detection */
- struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
-@@ -1317,7 +1318,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
- if (radeon_dp_getdpcd(radeon_connector))
- ret = connector_status_connected;
- } else {
-- if (radeon_ddc_probe(radeon_connector))
-+ /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */
-+ if (radeon_ddc_probe(radeon_connector, false))
- ret = connector_status_connected;
- }
- }
-diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
-index a22d6e6..aec8e0c 100644
---- a/drivers/gpu/drm/radeon/radeon_display.c
-+++ b/drivers/gpu/drm/radeon/radeon_display.c
-@@ -701,10 +701,15 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
- if (radeon_connector->router.ddc_valid)
- radeon_router_select_ddc_port(radeon_connector);
-
-- if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
-- (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) ||
-- (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) !=
-- ENCODER_OBJECT_ID_NONE)) {
-+ if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) !=
-+ ENCODER_OBJECT_ID_NONE) {
-+ struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
-+
-+ if (dig->dp_i2c_bus)
-+ radeon_connector->edid = drm_get_edid(&radeon_connector->base,
-+ &dig->dp_i2c_bus->adapter);
-+ } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
-+ (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
- struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
-
- if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
-diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c
-index 1441b00..cf20351 100644
---- a/drivers/gpu/drm/radeon/radeon_i2c.c
-+++ b/drivers/gpu/drm/radeon/radeon_i2c.c
-@@ -34,7 +34,7 @@
- * radeon_ddc_probe
- *
- */
--bool radeon_ddc_probe(struct radeon_connector *radeon_connector)
-+bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux)
- {
- u8 out = 0x0;
- u8 buf[8];
-@@ -58,7 +58,13 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector)
- if (radeon_connector->router.ddc_valid)
- radeon_router_select_ddc_port(radeon_connector);
-
-- ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2);
-+ if (use_aux) {
-+ struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;
-+ ret = i2c_transfer(&dig->dp_i2c_bus->adapter, msgs, 2);
-+ } else {
-+ ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2);
-+ }
-+
- if (ret != 2)
- /* Couldn't find an accessible DDC on this connector */
- return false;
-diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
-index 8254d5a..bb42df4 100644
---- a/drivers/gpu/drm/radeon/radeon_mode.h
-+++ b/drivers/gpu/drm/radeon/radeon_mode.h
-@@ -210,6 +210,8 @@ enum radeon_connector_table {
- CT_RN50_POWER,
- CT_MAC_X800,
- CT_MAC_G5_9600,
-+ CT_SAM440EP,
-+ CT_MAC_G4_SILVER
- };
-
- enum radeon_dvo_chip {
-@@ -521,7 +523,7 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c,
- u8 val);
- extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector);
- extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector);
--extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector);
-+extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux);
- extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector);
-
- extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector);
-diff --git a/drivers/hwmon/lm73.c b/drivers/hwmon/lm73.c
-index 9e64d96..376d9d9 100644
---- a/drivers/hwmon/lm73.c
-+++ b/drivers/hwmon/lm73.c
-@@ -49,6 +49,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
- struct i2c_client *client = to_i2c_client(dev);
- long temp;
- short value;
-+ s32 err;
-
- int status = strict_strtol(buf, 10, &temp);
- if (status < 0)
-@@ -57,8 +58,8 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
- /* Write value */
- value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4),
- (LM73_TEMP_MAX*4)) << 5;
-- i2c_smbus_write_word_swapped(client, attr->index, value);
-- return count;
-+ err = i2c_smbus_write_word_swapped(client, attr->index, value);
-+ return (err < 0) ? err : count;
- }
-
- static ssize_t show_temp(struct device *dev, struct device_attribute *da,
-@@ -66,11 +67,16 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da,
- {
- struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
- struct i2c_client *client = to_i2c_client(dev);
-+ int temp;
-+
-+ s32 err = i2c_smbus_read_word_swapped(client, attr->index);
-+ if (err < 0)
-+ return err;
-+
- /* use integer division instead of equivalent right shift to
- guarantee arithmetic shift and preserve the sign */
-- int temp = ((s16) (i2c_smbus_read_word_swapped(client,
-- attr->index))*250) / 32;
-- return sprintf(buf, "%d\n", temp);
-+ temp = (((s16) err) * 250) / 32;
-+ return scnprintf(buf, PAGE_SIZE, "%d\n", temp);
- }
-
-
-diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h
-index 568b4f1..3ade373 100644
---- a/drivers/infiniband/hw/nes/nes.h
-+++ b/drivers/infiniband/hw/nes/nes.h
-@@ -524,6 +524,7 @@ void nes_iwarp_ce_handler(struct nes_device *, struct nes_hw_cq *);
- int nes_destroy_cqp(struct nes_device *);
- int nes_nic_cm_xmit(struct sk_buff *, struct net_device *);
- void nes_recheck_link_status(struct work_struct *work);
-+void nes_terminate_timeout(unsigned long context);
-
- /* nes_nic.c */
- struct net_device *nes_netdev_init(struct nes_device *, void __iomem *);
-diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c
-index 7c0ff19..4cd1bf7 100644
---- a/drivers/infiniband/hw/nes/nes_hw.c
-+++ b/drivers/infiniband/hw/nes/nes_hw.c
-@@ -75,7 +75,6 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
- static void process_critical_error(struct nes_device *nesdev);
- static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number);
- static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode);
--static void nes_terminate_timeout(unsigned long context);
- static void nes_terminate_start_timer(struct nes_qp *nesqp);
-
- #ifdef CONFIG_INFINIBAND_NES_DEBUG
-@@ -3522,7 +3521,7 @@ static void nes_terminate_received(struct nes_device *nesdev,
- }
-
- /* Timeout routine in case terminate fails to complete */
--static void nes_terminate_timeout(unsigned long context)
-+void nes_terminate_timeout(unsigned long context)
- {
- struct nes_qp *nesqp = (struct nes_qp *)(unsigned long)context;
-
-@@ -3532,11 +3531,7 @@ static void nes_terminate_timeout(unsigned long context)
- /* Set a timer in case hw cannot complete the terminate sequence */
- static void nes_terminate_start_timer(struct nes_qp *nesqp)
- {
-- init_timer(&nesqp->terminate_timer);
-- nesqp->terminate_timer.function = nes_terminate_timeout;
-- nesqp->terminate_timer.expires = jiffies + HZ;
-- nesqp->terminate_timer.data = (unsigned long)nesqp;
-- add_timer(&nesqp->terminate_timer);
-+ mod_timer(&nesqp->terminate_timer, (jiffies + HZ));
- }
-
- /**
-diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
-index 5095bc4..b0471b4 100644
---- a/drivers/infiniband/hw/nes/nes_verbs.c
-+++ b/drivers/infiniband/hw/nes/nes_verbs.c
-@@ -1404,6 +1404,9 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
- }
-
- nesqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR);
-+ init_timer(&nesqp->terminate_timer);
-+ nesqp->terminate_timer.function = nes_terminate_timeout;
-+ nesqp->terminate_timer.data = (unsigned long)nesqp;
-
- /* update the QP table */
- nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp;
-@@ -1413,7 +1416,6 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
- return &nesqp->ibqp;
- }
-
--
- /**
- * nes_clean_cq
- */
-@@ -2559,6 +2561,11 @@ static struct ib_mr *nes_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
- return ibmr;
- case IWNES_MEMREG_TYPE_QP:
- case IWNES_MEMREG_TYPE_CQ:
-+ if (!region->length) {
-+ nes_debug(NES_DBG_MR, "Unable to register zero length region for CQ\n");
-+ ib_umem_release(region);
-+ return ERR_PTR(-EINVAL);
-+ }
- nespbl = kzalloc(sizeof(*nespbl), GFP_KERNEL);
- if (!nespbl) {
- nes_debug(NES_DBG_MR, "Unable to allocate PBL\n");
-diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
-index e9d73e7..979d225 100644
---- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
-@@ -701,8 +701,8 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
- 2);
- else if (AR_SREV_9485_11(ah))
- INIT_INI_ARRAY(&ah->iniModesRxGain,
-- ar9485Common_wo_xlna_rx_gain_1_1,
-- ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1),
-+ ar9485_common_rx_gain_1_1,
-+ ARRAY_SIZE(ar9485_common_rx_gain_1_1),
- 2);
- else if (AR_SREV_9580(ah))
- INIT_INI_ARRAY(&ah->iniModesRxGain,
-diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
-index 8a009bc..7ca84c3 100644
---- a/drivers/net/wireless/p54/p54usb.c
-+++ b/drivers/net/wireless/p54/p54usb.c
-@@ -47,6 +47,7 @@ static struct usb_device_id p54u_table[] = {
- {USB_DEVICE(0x0411, 0x0050)}, /* Buffalo WLI2-USB2-G54 */
- {USB_DEVICE(0x045e, 0x00c2)}, /* Microsoft MN-710 */
- {USB_DEVICE(0x0506, 0x0a11)}, /* 3COM 3CRWE254G72 */
-+ {USB_DEVICE(0x0675, 0x0530)}, /* DrayTek Vigor 530 */
- {USB_DEVICE(0x06b9, 0x0120)}, /* Thomson SpeedTouch 120g */
- {USB_DEVICE(0x0707, 0xee06)}, /* SMC 2862W-G */
- {USB_DEVICE(0x07aa, 0x001c)}, /* Corega CG-WLUSB2GT */
-@@ -82,6 +83,8 @@ static struct usb_device_id p54u_table[] = {
- {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */
- {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
- {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
-+ {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */
-+ {USB_DEVICE(0x083a, 0x4503)}, /* T-Com Sinus 154 data II */
- {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
- {USB_DEVICE(0x083a, 0xc501)}, /* Zoom Wireless-G 4410 */
- {USB_DEVICE(0x083a, 0xf503)}, /* Accton FD7050E ver 1010ec */
-@@ -101,6 +104,7 @@ static struct usb_device_id p54u_table[] = {
- {USB_DEVICE(0x13B1, 0x000C)}, /* Linksys WUSB54AG */
- {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */
- {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */
-+ /* {USB_DEVICE(0x15a9, 0x0002)}, * Also SparkLAN WL-682 with 3887 */
- {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */
- {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */
- {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */
-diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
-index fb19447..67cbe5a 100644
---- a/drivers/net/wireless/rt2x00/rt2800lib.c
-+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
-@@ -4208,7 +4208,8 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
- IEEE80211_HW_SIGNAL_DBM |
- IEEE80211_HW_SUPPORTS_PS |
- IEEE80211_HW_PS_NULLFUNC_STACK |
-- IEEE80211_HW_AMPDU_AGGREGATION;
-+ IEEE80211_HW_AMPDU_AGGREGATION |
-+ IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL;
- /*
- * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices
- * unless we are capable of sending the buffered frames out after the
-diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
-index 78fda9c..cab24f7 100644
---- a/drivers/pci/quirks.c
-+++ b/drivers/pci/quirks.c
-@@ -2747,7 +2747,7 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
- if (PCI_FUNC(dev->devfn))
- return;
- /*
-- * RICOH 0xe823 SD/MMC card reader fails to recognize
-+ * RICOH 0xe822 and 0xe823 SD/MMC card readers fail to recognize
- * certain types of SD/MMC cards. Lowering the SD base
- * clock frequency from 200Mhz to 50Mhz fixes this issue.
- *
-@@ -2758,7 +2758,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
- * 0xf9 - Key register for 0x150
- * 0xfc - key register for 0xe1
- */
-- if (dev->device == PCI_DEVICE_ID_RICOH_R5CE823) {
-+ if (dev->device == PCI_DEVICE_ID_RICOH_R5CE822 ||
-+ dev->device == PCI_DEVICE_ID_RICOH_R5CE823) {
- pci_write_config_byte(dev, 0xf9, 0xfc);
- pci_write_config_byte(dev, 0x150, 0x10);
- pci_write_config_byte(dev, 0xf9, 0x00);
-@@ -2785,6 +2786,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
- }
- DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
- DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
-+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832);
-+DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE822, ricoh_mmc_fixup_r5c832);
- DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
- DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
- #endif /*CONFIG_MMC_RICOH_MMC*/
-diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c
-index f93f412..f818dae 100644
---- a/drivers/rtc/rtc-vt8500.c
-+++ b/drivers/rtc/rtc-vt8500.c
-@@ -69,7 +69,7 @@
- | ALARM_SEC_BIT)
-
- #define VT8500_RTC_CR_ENABLE (1 << 0) /* Enable RTC */
--#define VT8500_RTC_CR_24H (1 << 1) /* 24h time format */
-+#define VT8500_RTC_CR_12H (1 << 1) /* 12h time format */
- #define VT8500_RTC_CR_SM_ENABLE (1 << 2) /* Enable periodic irqs */
- #define VT8500_RTC_CR_SM_SEC (1 << 3) /* 0: 1Hz/60, 1: 1Hz */
- #define VT8500_RTC_CR_CALIB (1 << 4) /* Enable calibration */
-@@ -118,7 +118,7 @@ static int vt8500_rtc_read_time(struct device *dev, struct rtc_time *tm)
- tm->tm_min = bcd2bin((time & TIME_MIN_MASK) >> TIME_MIN_S);
- tm->tm_hour = bcd2bin((time & TIME_HOUR_MASK) >> TIME_HOUR_S);
- tm->tm_mday = bcd2bin(date & DATE_DAY_MASK);
-- tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S);
-+ tm->tm_mon = bcd2bin((date & DATE_MONTH_MASK) >> DATE_MONTH_S) - 1;
- tm->tm_year = bcd2bin((date & DATE_YEAR_MASK) >> DATE_YEAR_S)
- + ((date >> DATE_CENTURY_S) & 1 ? 200 : 100);
- tm->tm_wday = (time & TIME_DOW_MASK) >> TIME_DOW_S;
-@@ -137,8 +137,9 @@ static int vt8500_rtc_set_time(struct device *dev, struct rtc_time *tm)
- }
-
- writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S)
-- | (bin2bcd(tm->tm_mon) << DATE_MONTH_S)
-- | (bin2bcd(tm->tm_mday)),
-+ | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S)
-+ | (bin2bcd(tm->tm_mday))
-+ | ((tm->tm_year >= 200) << DATE_CENTURY_S),
- vt8500_rtc->regbase + VT8500_RTC_DS);
- writel((bin2bcd(tm->tm_wday) << TIME_DOW_S)
- | (bin2bcd(tm->tm_hour) << TIME_HOUR_S)
-@@ -248,7 +249,7 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
- }
-
- /* Enable RTC and set it to 24-hour mode */
-- writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H,
-+ writel(VT8500_RTC_CR_ENABLE,
- vt8500_rtc->regbase + VT8500_RTC_CR);
-
- vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev,
-diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
-index a4884a5..c6ad694 100644
---- a/drivers/scsi/mvsas/mv_sas.c
-+++ b/drivers/scsi/mvsas/mv_sas.c
-@@ -1635,7 +1635,7 @@ int mvs_abort_task(struct sas_task *task)
- mv_dprintk("mvs_abort_task() mvi=%p task=%p "
- "slot=%p slot_idx=x%x\n",
- mvi, task, slot, slot_idx);
-- mvs_tmf_timedout((unsigned long)task);
-+ task->task_state_flags |= SAS_TASK_STATE_ABORTED;
- mvs_slot_task_free(mvi, task, slot, slot_idx);
- rc = TMF_RESP_FUNC_COMPLETE;
- goto out;
-diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c
-index d837d63..03cb95a 100644
---- a/drivers/video/mxsfb.c
-+++ b/drivers/video/mxsfb.c
-@@ -366,7 +366,8 @@ static void mxsfb_disable_controller(struct fb_info *fb_info)
- loop--;
- }
-
-- writel(VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4 + REG_CLR);
-+ reg = readl(host->base + LCDC_VDCTRL4);
-+ writel(reg & ~VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4);
-
- clk_disable(host->clk);
-
-diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
-index 99a27cf..4e5dfb7 100644
---- a/fs/cifs/transport.c
-+++ b/fs/cifs/transport.c
-@@ -485,6 +485,13 @@ send_nt_cancel(struct TCP_Server_Info *server, struct smb_hdr *in_buf,
- mutex_unlock(&server->srv_mutex);
- return rc;
- }
-+
-+ /*
-+ * The response to this call was already factored into the sequence
-+ * number when the call went out, so we must adjust it back downward
-+ * after signing here.
-+ */
-+ --server->sequence_number;
- rc = smb_send(server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
- mutex_unlock(&server->srv_mutex);
-
-diff --git a/fs/eventpoll.c b/fs/eventpoll.c
-index a6f3763..451b9b8 100644
---- a/fs/eventpoll.c
-+++ b/fs/eventpoll.c
-@@ -1197,10 +1197,30 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even
- * otherwise we might miss an event that happens between the
- * f_op->poll() call and the new event set registering.
- */
-- epi->event.events = event->events;
-+ epi->event.events = event->events; /* need barrier below */
- epi->event.data = event->data; /* protected by mtx */
-
- /*
-+ * The following barrier has two effects:
-+ *
-+ * 1) Flush epi changes above to other CPUs. This ensures
-+ * we do not miss events from ep_poll_callback if an
-+ * event occurs immediately after we call f_op->poll().
-+ * We need this because we did not take ep->lock while
-+ * changing epi above (but ep_poll_callback does take
-+ * ep->lock).
-+ *
-+ * 2) We also need to ensure we do not miss _past_ events
-+ * when calling f_op->poll(). This barrier also
-+ * pairs with the barrier in wq_has_sleeper (see
-+ * comments for wq_has_sleeper).
-+ *
-+ * This barrier will now guarantee ep_poll_callback or f_op->poll
-+ * (or both) will notice the readiness of an item.
-+ */
-+ smp_mb();
-+
-+ /*
- * Get current event bits. We can safely use the file* here because
- * its usage count has been increased by the caller of this function.
- */
-diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
-index 191580a..fbb92e6 100644
---- a/fs/ext4/extents.c
-+++ b/fs/ext4/extents.c
-@@ -2093,13 +2093,14 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
- * removes index from the index block.
- */
- static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode,
-- struct ext4_ext_path *path)
-+ struct ext4_ext_path *path, int depth)
- {
- int err;
- ext4_fsblk_t leaf;
-
- /* free index block */
-- path--;
-+ depth--;
-+ path = path + depth;
- leaf = ext4_idx_pblock(path->p_idx);
- if (unlikely(path->p_hdr->eh_entries == 0)) {
- EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0");
-@@ -2124,6 +2125,19 @@ static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode,
-
- ext4_free_blocks(handle, inode, NULL, leaf, 1,
- EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET);
-+
-+ while (--depth >= 0) {
-+ if (path->p_idx != EXT_FIRST_INDEX(path->p_hdr))
-+ break;
-+ path--;
-+ err = ext4_ext_get_access(handle, inode, path);
-+ if (err)
-+ break;
-+ path->p_idx->ei_block = (path+1)->p_idx->ei_block;
-+ err = ext4_ext_dirty(handle, inode, path);
-+ if (err)
-+ break;
-+ }
- return err;
- }
-
-@@ -2454,7 +2468,7 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
- /* if this leaf is free, then we should
- * remove it from index block above */
- if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL)
-- err = ext4_ext_rm_idx(handle, inode, path + depth);
-+ err = ext4_ext_rm_idx(handle, inode, path, depth);
-
- out:
- return err;
-@@ -2587,7 +2601,7 @@ again:
- /* index is empty, remove it;
- * handle must be already prepared by the
- * truncatei_leaf() */
-- err = ext4_ext_rm_idx(handle, inode, path + i);
-+ err = ext4_ext_rm_idx(handle, inode, path, i);
- }
- /* root level has p_bh == NULL, brelse() eats this */
- brelse(path[i].p_bh);
-diff --git a/fs/ext4/super.c b/fs/ext4/super.c
-index f8d5fce..24ac7a2 100644
---- a/fs/ext4/super.c
-+++ b/fs/ext4/super.c
-@@ -1942,6 +1942,16 @@ set_qf_format:
- }
- }
- #endif
-+ if (test_opt(sb, DIOREAD_NOLOCK)) {
-+ int blocksize =
-+ BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size);
-+
-+ if (blocksize < PAGE_CACHE_SIZE) {
-+ ext4_msg(sb, KERN_ERR, "can't mount with "
-+ "dioread_nolock if block size != PAGE_SIZE");
-+ return 0;
-+ }
-+ }
- return 1;
- }
-
-@@ -3367,15 +3377,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
- clear_opt(sb, DELALLOC);
- }
-
-- blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);
-- if (test_opt(sb, DIOREAD_NOLOCK)) {
-- if (blocksize < PAGE_SIZE) {
-- ext4_msg(sb, KERN_ERR, "can't mount with "
-- "dioread_nolock if block size != PAGE_SIZE");
-- goto failed_mount;
-- }
-- }
--
- sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
- (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0);
-
-@@ -3417,6 +3418,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
- if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY)))
- goto failed_mount;
-
-+ blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size);
- if (blocksize < EXT4_MIN_BLOCK_SIZE ||
- blocksize > EXT4_MAX_BLOCK_SIZE) {
- ext4_msg(sb, KERN_ERR,
-@@ -4652,7 +4654,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
- }
-
- ext4_setup_system_zone(sb);
-- if (sbi->s_journal == NULL)
-+ if (sbi->s_journal == NULL && !(old_sb_flags & MS_RDONLY))
- ext4_commit_super(sb, 1);
-
- #ifdef CONFIG_QUOTA
-diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
-index 8267de5..d7dd774 100644
---- a/fs/jbd2/transaction.c
-+++ b/fs/jbd2/transaction.c
-@@ -179,7 +179,8 @@ repeat:
- if (!new_transaction)
- goto alloc_transaction;
- write_lock(&journal->j_state_lock);
-- if (!journal->j_running_transaction) {
-+ if (!journal->j_running_transaction &&
-+ !journal->j_barrier_count) {
- jbd2_get_transaction(journal, new_transaction);
- new_transaction = NULL;
- }
-diff --git a/fs/nfs/super.c b/fs/nfs/super.c
-index 8150344..1943898 100644
---- a/fs/nfs/super.c
-+++ b/fs/nfs/super.c
-@@ -1057,7 +1057,7 @@ static int nfs_get_option_str(substring_t args[], char **option)
- {
- kfree(*option);
- *option = match_strdup(args);
-- return !option;
-+ return !*option;
- }
-
- static int nfs_get_option_ul(substring_t args[], unsigned long *option)
-diff --git a/fs/udf/inode.c b/fs/udf/inode.c
-index 15df1a4..af37ce3 100644
---- a/fs/udf/inode.c
-+++ b/fs/udf/inode.c
-@@ -581,6 +581,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block,
- struct udf_inode_info *iinfo = UDF_I(inode);
- int goal = 0, pgoal = iinfo->i_location.logicalBlockNum;
- int lastblock = 0;
-+ bool isBeyondEOF;
-
- prev_epos.offset = udf_file_entry_alloc_offset(inode);
- prev_epos.block = iinfo->i_location;
-@@ -659,7 +660,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block,
- /* Are we beyond EOF? */
- if (etype == -1) {
- int ret;
--
-+ isBeyondEOF = 1;
- if (count) {
- if (c)
- laarr[0] = laarr[1];
-@@ -702,6 +703,7 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block,
- endnum = c + 1;
- lastblock = 1;
- } else {
-+ isBeyondEOF = 0;
- endnum = startnum = ((count > 2) ? 2 : count);
-
- /* if the current extent is in position 0,
-@@ -749,7 +751,8 @@ static struct buffer_head *inode_getblk(struct inode *inode, sector_t block,
- *err = -ENOSPC;
- return NULL;
- }
-- iinfo->i_lenExtents += inode->i_sb->s_blocksize;
-+ if (isBeyondEOF)
-+ iinfo->i_lenExtents += inode->i_sb->s_blocksize;
- }
-
- /* if the extent the requsted block is located in contains multiple
-diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h
-index e58fa77..34e0274 100644
---- a/include/asm-generic/tlb.h
-+++ b/include/asm-generic/tlb.h
-@@ -78,6 +78,14 @@ struct mmu_gather_batch {
- #define MAX_GATHER_BATCH \
- ((PAGE_SIZE - sizeof(struct mmu_gather_batch)) / sizeof(void *))
-
-+/*
-+ * Limit the maximum number of mmu_gather batches to reduce a risk of soft
-+ * lockups for non-preemptible kernels on huge machines when a lot of memory
-+ * is zapped during unmapping.
-+ * 10K pages freed at once should be safe even without a preemption point.
-+ */
-+#define MAX_GATHER_BATCH_COUNT (10000UL/MAX_GATHER_BATCH)
-+
- /* struct mmu_gather is an opaque type used by the mm code for passing around
- * any data needed by arch specific code for tlb_remove_page.
- */
-@@ -94,6 +102,7 @@ struct mmu_gather {
- struct mmu_gather_batch *active;
- struct mmu_gather_batch local;
- struct page *__pages[MMU_GATHER_BUNDLE];
-+ unsigned int batch_count;
- };
-
- #define HAVE_GENERIC_MMU_GATHER
-diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
-index 59e4028..3fd17c2 100644
---- a/include/linux/compiler-gcc.h
-+++ b/include/linux/compiler-gcc.h
-@@ -50,6 +50,11 @@
- # define inline inline __attribute__((always_inline))
- # define __inline__ __inline__ __attribute__((always_inline))
- # define __inline __inline __attribute__((always_inline))
-+#else
-+/* A lot of inline functions can cause havoc with function tracing */
-+# define inline inline notrace
-+# define __inline__ __inline__ notrace
-+# define __inline __inline notrace
- #endif
-
- #define __deprecated __attribute__((deprecated))
-diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
-index e90a673..8d9b903 100644
---- a/include/linux/page-flags.h
-+++ b/include/linux/page-flags.h
-@@ -360,7 +360,7 @@ static inline void ClearPageCompound(struct page *page)
- * pages on the LRU and/or pagecache.
- */
- TESTPAGEFLAG(Compound, compound)
--__PAGEFLAG(Head, compound)
-+__SETPAGEFLAG(Head, compound) __CLEARPAGEFLAG(Head, compound)
-
- /*
- * PG_reclaim is used in combination with PG_compound to mark the
-@@ -372,8 +372,14 @@ __PAGEFLAG(Head, compound)
- * PG_compound & PG_reclaim => Tail page
- * PG_compound & ~PG_reclaim => Head page
- */
-+#define PG_head_mask ((1L << PG_compound))
- #define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))
-
-+static inline int PageHead(struct page *page)
-+{
-+ return ((page->flags & PG_head_tail_mask) == PG_head_mask);
-+}
-+
- static inline int PageTail(struct page *page)
- {
- return ((page->flags & PG_head_tail_mask) == PG_head_tail_mask);
-diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
-index 5776609..3db3da1 100644
---- a/include/linux/pci_ids.h
-+++ b/include/linux/pci_ids.h
-@@ -1543,6 +1543,7 @@
- #define PCI_DEVICE_ID_RICOH_RL5C476 0x0476
- #define PCI_DEVICE_ID_RICOH_RL5C478 0x0478
- #define PCI_DEVICE_ID_RICOH_R5C822 0x0822
-+#define PCI_DEVICE_ID_RICOH_R5CE822 0xe822
- #define PCI_DEVICE_ID_RICOH_R5CE823 0xe823
- #define PCI_DEVICE_ID_RICOH_R5C832 0x0832
- #define PCI_DEVICE_ID_RICOH_R5C843 0x0843
-diff --git a/include/linux/snmp.h b/include/linux/snmp.h
-index e16557a..64f5ca7 100644
---- a/include/linux/snmp.h
-+++ b/include/linux/snmp.h
-@@ -209,7 +209,6 @@ enum
- LINUX_MIB_TCPDSACKOFOSENT, /* TCPDSACKOfoSent */
- LINUX_MIB_TCPDSACKRECV, /* TCPDSACKRecv */
- LINUX_MIB_TCPDSACKOFORECV, /* TCPDSACKOfoRecv */
-- LINUX_MIB_TCPABORTONSYN, /* TCPAbortOnSyn */
- LINUX_MIB_TCPABORTONDATA, /* TCPAbortOnData */
- LINUX_MIB_TCPABORTONCLOSE, /* TCPAbortOnClose */
- LINUX_MIB_TCPABORTONMEMORY, /* TCPAbortOnMemory */
-@@ -233,6 +232,8 @@ enum
- LINUX_MIB_TCPTIMEWAITOVERFLOW, /* TCPTimeWaitOverflow */
- LINUX_MIB_TCPREQQFULLDOCOOKIES, /* TCPReqQFullDoCookies */
- LINUX_MIB_TCPREQQFULLDROP, /* TCPReqQFullDrop */
-+ LINUX_MIB_TCPCHALLENGEACK, /* TCPChallengeACK */
-+ LINUX_MIB_TCPSYNCHALLENGE, /* TCPSYNChallenge */
- __LINUX_MIB_MAX
- };
-
-diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h
-index e6db62e..ca2755f 100644
---- a/include/net/inet_connection_sock.h
-+++ b/include/net/inet_connection_sock.h
-@@ -317,6 +317,7 @@ extern void inet_csk_reqsk_queue_prune(struct sock *parent,
- const unsigned long max_rto);
-
- extern void inet_csk_destroy_sock(struct sock *sk);
-+extern void inet_csk_prepare_forced_close(struct sock *sk);
-
- /*
- * LISTEN is a special case for poll..
-diff --git a/include/net/mac80211.h b/include/net/mac80211.h
-index 72eddd1..1a6201a 100644
---- a/include/net/mac80211.h
-+++ b/include/net/mac80211.h
-@@ -1128,6 +1128,10 @@ enum sta_notify_cmd {
- * @IEEE80211_HW_TX_AMPDU_SETUP_IN_HW: The device handles TX A-MPDU session
- * setup strictly in HW. mac80211 should not attempt to do this in
- * software.
-+ *
-+ * @IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL: On this hardware TX BA session
-+ * should be tear down once BAR frame will not be acked.
-+ *
- */
- enum ieee80211_hw_flags {
- IEEE80211_HW_HAS_RATE_CONTROL = 1<<0,
-@@ -1154,6 +1158,7 @@ enum ieee80211_hw_flags {
- IEEE80211_HW_SUPPORTS_PER_STA_GTK = 1<<21,
- IEEE80211_HW_AP_LINK_PS = 1<<22,
- IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23,
-+ IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL = 1<<26,
- };
-
- /**
-diff --git a/include/net/tcp.h b/include/net/tcp.h
-index bb18c4d..0768715 100644
---- a/include/net/tcp.h
-+++ b/include/net/tcp.h
-@@ -251,6 +251,7 @@ extern int sysctl_tcp_max_ssthresh;
- extern int sysctl_tcp_cookie_size;
- extern int sysctl_tcp_thin_linear_timeouts;
- extern int sysctl_tcp_thin_dupack;
-+extern int sysctl_tcp_challenge_ack_limit;
-
- extern atomic_long_t tcp_memory_allocated;
- extern struct percpu_counter tcp_sockets_allocated;
-diff --git a/mm/memory.c b/mm/memory.c
-index 15e686a..4f2add1 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -205,10 +205,14 @@ static int tlb_next_batch(struct mmu_gather *tlb)
- return 1;
- }
-
-+ if (tlb->batch_count == MAX_GATHER_BATCH_COUNT)
-+ return 0;
-+
- batch = (void *)__get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0);
- if (!batch)
- return 0;
-
-+ tlb->batch_count++;
- batch->next = NULL;
- batch->nr = 0;
- batch->max = MAX_GATHER_BATCH;
-@@ -235,6 +239,7 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm)
- tlb->local.nr = 0;
- tlb->local.max = ARRAY_SIZE(tlb->__pages);
- tlb->active = &tlb->local;
-+ tlb->batch_count = 0;
-
- #ifdef CONFIG_HAVE_RCU_TABLE_FREE
- tlb->batch = NULL;
-diff --git a/mm/mempolicy.c b/mm/mempolicy.c
-index c59d44b..4d1e637 100644
---- a/mm/mempolicy.c
-+++ b/mm/mempolicy.c
-@@ -2334,8 +2334,7 @@ void numa_default_policy(void)
- */
-
- /*
-- * "local" is pseudo-policy: MPOL_PREFERRED with MPOL_F_LOCAL flag
-- * Used only for mpol_parse_str() and mpol_to_str()
-+ * "local" is implemented internally by MPOL_PREFERRED with MPOL_F_LOCAL flag.
- */
- #define MPOL_LOCAL MPOL_MAX
- static const char * const policy_modes[] =
-@@ -2350,28 +2349,21 @@ static const char * const policy_modes[] =
-
- #ifdef CONFIG_TMPFS
- /**
-- * mpol_parse_str - parse string to mempolicy
-+ * mpol_parse_str - parse string to mempolicy, for tmpfs mpol mount option.
- * @str: string containing mempolicy to parse
- * @mpol: pointer to struct mempolicy pointer, returned on success.
-- * @no_context: flag whether to "contextualize" the mempolicy
-+ * @unused: redundant argument, to be removed later.
- *
- * Format of input:
- * <mode>[=<flags>][:<nodelist>]
- *
-- * if @no_context is true, save the input nodemask in w.user_nodemask in
-- * the returned mempolicy. This will be used to "clone" the mempolicy in
-- * a specific context [cpuset] at a later time. Used to parse tmpfs mpol
-- * mount option. Note that if 'static' or 'relative' mode flags were
-- * specified, the input nodemask will already have been saved. Saving
-- * it again is redundant, but safe.
-- *
- * On success, returns 0, else 1
- */
--int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
-+int mpol_parse_str(char *str, struct mempolicy **mpol, int unused)
- {
- struct mempolicy *new = NULL;
- unsigned short mode;
-- unsigned short uninitialized_var(mode_flags);
-+ unsigned short mode_flags;
- nodemask_t nodes;
- char *nodelist = strchr(str, ':');
- char *flags = strchr(str, '=');
-@@ -2459,24 +2451,23 @@ int mpol_parse_str(char *str, struct mempolicy **mpol, int no_context)
- if (IS_ERR(new))
- goto out;
-
-- if (no_context) {
-- /* save for contextualization */
-- new->w.user_nodemask = nodes;
-- } else {
-- int ret;
-- NODEMASK_SCRATCH(scratch);
-- if (scratch) {
-- task_lock(current);
-- ret = mpol_set_nodemask(new, &nodes, scratch);
-- task_unlock(current);
-- } else
-- ret = -ENOMEM;
-- NODEMASK_SCRATCH_FREE(scratch);
-- if (ret) {
-- mpol_put(new);
-- goto out;
-- }
-- }
-+ /*
-+ * Save nodes for mpol_to_str() to show the tmpfs mount options
-+ * for /proc/mounts, /proc/pid/mounts and /proc/pid/mountinfo.
-+ */
-+ if (mode != MPOL_PREFERRED)
-+ new->v.nodes = nodes;
-+ else if (nodelist)
-+ new->v.preferred_node = first_node(nodes);
-+ else
-+ new->flags |= MPOL_F_LOCAL;
-+
-+ /*
-+ * Save nodes for contextualization: this will be used to "clone"
-+ * the mempolicy in a specific context [cpuset] at a later time.
-+ */
-+ new->w.user_nodemask = nodes;
-+
- err = 0;
-
- out:
-@@ -2496,13 +2487,13 @@ out:
- * @buffer: to contain formatted mempolicy string
- * @maxlen: length of @buffer
- * @pol: pointer to mempolicy to be formatted
-- * @no_context: "context free" mempolicy - use nodemask in w.user_nodemask
-+ * @unused: redundant argument, to be removed later.
- *
- * Convert a mempolicy into a string.
- * Returns the number of characters in buffer (if positive)
- * or an error (negative)
- */
--int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context)
-+int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int unused)
- {
- char *p = buffer;
- int l;
-@@ -2528,7 +2519,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context)
- case MPOL_PREFERRED:
- nodes_clear(nodes);
- if (flags & MPOL_F_LOCAL)
-- mode = MPOL_LOCAL; /* pseudo-policy */
-+ mode = MPOL_LOCAL;
- else
- node_set(pol->v.preferred_node, nodes);
- break;
-@@ -2536,10 +2527,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context)
- case MPOL_BIND:
- /* Fall through */
- case MPOL_INTERLEAVE:
-- if (no_context)
-- nodes = pol->w.user_nodemask;
-- else
-- nodes = pol->v.nodes;
-+ nodes = pol->v.nodes;
- break;
-
- default:
-diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
-index 3f4e541..72416c8 100644
---- a/net/dccp/ipv4.c
-+++ b/net/dccp/ipv4.c
-@@ -434,8 +434,8 @@ exit:
- NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
- return NULL;
- put_and_exit:
-- bh_unlock_sock(newsk);
-- sock_put(newsk);
-+ inet_csk_prepare_forced_close(newsk);
-+ dccp_done(newsk);
- goto exit;
- }
-
-diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
-index 17ee85c..592b78c 100644
---- a/net/dccp/ipv6.c
-+++ b/net/dccp/ipv6.c
-@@ -609,7 +609,8 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
- newinet->inet_rcv_saddr = LOOPBACK4_IPV6;
-
- if (__inet_inherit_port(sk, newsk) < 0) {
-- sock_put(newsk);
-+ inet_csk_prepare_forced_close(newsk);
-+ dccp_done(newsk);
- goto out;
- }
- __inet6_hash(newsk, NULL);
-diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
-index c14d88a..907ef2c 100644
---- a/net/ipv4/inet_connection_sock.c
-+++ b/net/ipv4/inet_connection_sock.c
-@@ -647,6 +647,22 @@ void inet_csk_destroy_sock(struct sock *sk)
- }
- EXPORT_SYMBOL(inet_csk_destroy_sock);
-
-+/* This function allows to force a closure of a socket after the call to
-+ * tcp/dccp_create_openreq_child().
-+ */
-+void inet_csk_prepare_forced_close(struct sock *sk)
-+{
-+ /* sk_clone_lock locked the socket and set refcnt to 2 */
-+ bh_unlock_sock(sk);
-+ sock_put(sk);
-+
-+ /* The below has to be done to allow calling inet_csk_destroy_sock */
-+ sock_set_flag(sk, SOCK_DEAD);
-+ percpu_counter_inc(sk->sk_prot->orphan_count);
-+ inet_sk(sk)->inet_num = 0;
-+}
-+EXPORT_SYMBOL(inet_csk_prepare_forced_close);
-+
- int inet_csk_listen_start(struct sock *sk, const int nr_table_entries)
- {
- struct inet_sock *inet = inet_sk(sk);
-diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c
-index 466ea8b..f7fdbe9 100644
---- a/net/ipv4/proc.c
-+++ b/net/ipv4/proc.c
-@@ -233,7 +233,6 @@ static const struct snmp_mib snmp4_net_list[] = {
- SNMP_MIB_ITEM("TCPDSACKOfoSent", LINUX_MIB_TCPDSACKOFOSENT),
- SNMP_MIB_ITEM("TCPDSACKRecv", LINUX_MIB_TCPDSACKRECV),
- SNMP_MIB_ITEM("TCPDSACKOfoRecv", LINUX_MIB_TCPDSACKOFORECV),
-- SNMP_MIB_ITEM("TCPAbortOnSyn", LINUX_MIB_TCPABORTONSYN),
- SNMP_MIB_ITEM("TCPAbortOnData", LINUX_MIB_TCPABORTONDATA),
- SNMP_MIB_ITEM("TCPAbortOnClose", LINUX_MIB_TCPABORTONCLOSE),
- SNMP_MIB_ITEM("TCPAbortOnMemory", LINUX_MIB_TCPABORTONMEMORY),
-@@ -257,6 +256,8 @@ static const struct snmp_mib snmp4_net_list[] = {
- SNMP_MIB_ITEM("TCPTimeWaitOverflow", LINUX_MIB_TCPTIMEWAITOVERFLOW),
- SNMP_MIB_ITEM("TCPReqQFullDoCookies", LINUX_MIB_TCPREQQFULLDOCOOKIES),
- SNMP_MIB_ITEM("TCPReqQFullDrop", LINUX_MIB_TCPREQQFULLDROP),
-+ SNMP_MIB_ITEM("TCPChallengeACK", LINUX_MIB_TCPCHALLENGEACK),
-+ SNMP_MIB_ITEM("TCPSYNChallenge", LINUX_MIB_TCPSYNCHALLENGE),
- SNMP_MIB_SENTINEL
- };
-
-diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
-index 69fd720..5485077 100644
---- a/net/ipv4/sysctl_net_ipv4.c
-+++ b/net/ipv4/sysctl_net_ipv4.c
-@@ -552,6 +552,13 @@ static struct ctl_table ipv4_table[] = {
- .mode = 0644,
- .proc_handler = proc_dointvec
- },
-+ {
-+ .procname = "tcp_challenge_ack_limit",
-+ .data = &sysctl_tcp_challenge_ack_limit,
-+ .maxlen = sizeof(int),
-+ .mode = 0644,
-+ .proc_handler = proc_dointvec
-+ },
- #ifdef CONFIG_NET_DMA
- {
- .procname = "tcp_dma_copybreak",
-diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
-index a08a621..aab8f08 100644
---- a/net/ipv4/tcp_input.c
-+++ b/net/ipv4/tcp_input.c
-@@ -86,6 +86,9 @@ int sysctl_tcp_app_win __read_mostly = 31;
- int sysctl_tcp_adv_win_scale __read_mostly = 1;
- EXPORT_SYMBOL(sysctl_tcp_adv_win_scale);
-
-+/* rfc5961 challenge ack rate limiting */
-+int sysctl_tcp_challenge_ack_limit = 100;
-+
- int sysctl_tcp_stdurg __read_mostly;
- int sysctl_tcp_rfc1337 __read_mostly;
- int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
-@@ -3700,6 +3703,24 @@ static int tcp_process_frto(struct sock *sk, int flag)
- return 0;
- }
-
-+/* RFC 5961 7 [ACK Throttling] */
-+static void tcp_send_challenge_ack(struct sock *sk)
-+{
-+ /* unprotected vars, we dont care of overwrites */
-+ static u32 challenge_timestamp;
-+ static unsigned int challenge_count;
-+ u32 now = jiffies / HZ;
-+
-+ if (now != challenge_timestamp) {
-+ challenge_timestamp = now;
-+ challenge_count = 0;
-+ }
-+ if (++challenge_count <= sysctl_tcp_challenge_ack_limit) {
-+ NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK);
-+ tcp_send_ack(sk);
-+ }
-+}
-+
- /* This routine deals with incoming acks, but not outgoing ones. */
- static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
- {
-@@ -3718,8 +3739,14 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
- /* If the ack is older than previous acks
- * then we can probably ignore it.
- */
-- if (before(ack, prior_snd_una))
-+ if (before(ack, prior_snd_una)) {
-+ /* RFC 5961 5.2 [Blind Data Injection Attack].[Mitigation] */
-+ if (before(ack, prior_snd_una - tp->max_window)) {
-+ tcp_send_challenge_ack(sk);
-+ return -1;
-+ }
- goto old_ack;
-+ }
-
- /* If the ack includes data we haven't sent yet, discard
- * this segment (RFC793 Section 3.9).
-@@ -5243,8 +5270,8 @@ out:
- /* Does PAWS and seqno based validation of an incoming segment, flags will
- * play significant role here.
- */
--static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
-- const struct tcphdr *th, int syn_inerr)
-+static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
-+ const struct tcphdr *th, int syn_inerr)
- {
- const u8 *hash_location;
- struct tcp_sock *tp = tcp_sk(sk);
-@@ -5269,38 +5296,48 @@ static int tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
- * an acknowledgment should be sent in reply (unless the RST
- * bit is set, if so drop the segment and return)".
- */
-- if (!th->rst)
-+ if (!th->rst) {
-+ if (th->syn)
-+ goto syn_challenge;
- tcp_send_dupack(sk, skb);
-+ }
- goto discard;
- }
-
- /* Step 2: check RST bit */
- if (th->rst) {
-- tcp_reset(sk);
-+ /* RFC 5961 3.2 :
-+ * If sequence number exactly matches RCV.NXT, then
-+ * RESET the connection
-+ * else
-+ * Send a challenge ACK
-+ */
-+ if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt)
-+ tcp_reset(sk);
-+ else
-+ tcp_send_challenge_ack(sk);
- goto discard;
- }
-
-- /* ts_recent update must be made after we are sure that the packet
-- * is in window.
-- */
-- tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
--
- /* step 3: check security and precedence [ignored] */
-
-- /* step 4: Check for a SYN in window. */
-- if (th->syn && !before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
-+ /* step 4: Check for a SYN
-+ * RFC 5691 4.2 : Send a challenge ack
-+ */
-+ if (th->syn) {
-+syn_challenge:
- if (syn_inerr)
- TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_INERRS);
-- NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPABORTONSYN);
-- tcp_reset(sk);
-- return -1;
-+ NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNCHALLENGE);
-+ tcp_send_challenge_ack(sk);
-+ goto discard;
- }
-
-- return 1;
-+ return true;
-
- discard:
- __kfree_skb(skb);
-- return 0;
-+ return false;
- }
-
- /*
-@@ -5330,7 +5367,6 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
- const struct tcphdr *th, unsigned int len)
- {
- struct tcp_sock *tp = tcp_sk(sk);
-- int res;
-
- /*
- * Header prediction.
-@@ -5510,14 +5546,18 @@ slow_path:
- * Standard slow path.
- */
-
-- res = tcp_validate_incoming(sk, skb, th, 1);
-- if (res <= 0)
-- return -res;
-+ if (!tcp_validate_incoming(sk, skb, th, 1))
-+ return 0;
-
- step5:
- if (th->ack && tcp_ack(sk, skb, FLAG_SLOWPATH) < 0)
- goto discard;
-
-+ /* ts_recent update must be made after we are sure that the packet
-+ * is in window.
-+ */
-+ tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
-+
- tcp_rcv_rtt_measure_ts(sk, skb);
-
- /* Process urgent data. */
-@@ -5822,7 +5862,6 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
- struct tcp_sock *tp = tcp_sk(sk);
- struct inet_connection_sock *icsk = inet_csk(sk);
- int queued = 0;
-- int res;
-
- tp->rx_opt.saw_tstamp = 0;
-
-@@ -5877,9 +5916,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
- return 0;
- }
-
-- res = tcp_validate_incoming(sk, skb, th, 0);
-- if (res <= 0)
-- return -res;
-+ if (!tcp_validate_incoming(sk, skb, th, 0))
-+ return 0;
-
- /* step 5: check the ACK field */
- if (th->ack) {
-@@ -5990,6 +6028,11 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
- } else
- goto discard;
-
-+ /* ts_recent update must be made after we are sure that the packet
-+ * is in window.
-+ */
-+ tcp_replace_ts_recent(tp, TCP_SKB_CB(skb)->seq);
-+
- /* step 6: check the URG bit */
- tcp_urg(sk, skb, th);
-
-diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
-index 58c09a0..a97c9ad 100644
---- a/net/ipv4/tcp_ipv4.c
-+++ b/net/ipv4/tcp_ipv4.c
-@@ -1520,9 +1520,8 @@ exit:
- NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
- return NULL;
- put_and_exit:
-- tcp_clear_xmit_timers(newsk);
-- bh_unlock_sock(newsk);
-- sock_put(newsk);
-+ inet_csk_prepare_forced_close(newsk);
-+ tcp_done(newsk);
- goto exit;
- }
- EXPORT_SYMBOL(tcp_v4_syn_recv_sock);
-diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
-index ccab3c8..db10805 100644
---- a/net/ipv6/tcp_ipv6.c
-+++ b/net/ipv6/tcp_ipv6.c
-@@ -1524,7 +1524,8 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
- #endif
-
- if (__inet_inherit_port(sk, newsk) < 0) {
-- sock_put(newsk);
-+ inet_csk_prepare_forced_close(newsk);
-+ tcp_done(newsk);
- goto out;
- }
- __inet6_hash(newsk, NULL);
-diff --git a/net/mac80211/status.c b/net/mac80211/status.c
-index 16518f3..67df50e 100644
---- a/net/mac80211/status.c
-+++ b/net/mac80211/status.c
-@@ -429,7 +429,11 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
- IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
- IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
-
-- ieee80211_set_bar_pending(sta, tid, ssn);
-+ if (local->hw.flags &
-+ IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL)
-+ ieee80211_stop_tx_ba_session(&sta->sta, tid);
-+ else
-+ ieee80211_set_bar_pending(sta, tid, ssn);
- }
- }
-
-diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
-index 29b942c..f08b9166 100644
---- a/net/sched/sch_htb.c
-+++ b/net/sched/sch_htb.c
-@@ -876,7 +876,7 @@ ok:
- q->now = psched_get_time();
- start_at = jiffies;
-
-- next_event = q->now + 5 * PSCHED_TICKS_PER_SEC;
-+ next_event = q->now + 5LLU * PSCHED_TICKS_PER_SEC;
-
- for (level = 0; level < TC_HTB_MAXDEPTH; level++) {
- /* common case optimization - skip event handler quickly */
-diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
-index c90b832..56c3f85 100644
---- a/net/sunrpc/sched.c
-+++ b/net/sunrpc/sched.c
-@@ -880,16 +880,35 @@ struct rpc_task *rpc_new_task(const struct rpc_task_setup *setup_data)
- return task;
- }
-
-+/*
-+ * rpc_free_task - release rpc task and perform cleanups
-+ *
-+ * Note that we free up the rpc_task _after_ rpc_release_calldata()
-+ * in order to work around a workqueue dependency issue.
-+ *
-+ * Tejun Heo states:
-+ * "Workqueue currently considers two work items to be the same if they're
-+ * on the same address and won't execute them concurrently - ie. it
-+ * makes a work item which is queued again while being executed wait
-+ * for the previous execution to complete.
-+ *
-+ * If a work function frees the work item, and then waits for an event
-+ * which should be performed by another work item and *that* work item
-+ * recycles the freed work item, it can create a false dependency loop.
-+ * There really is no reliable way to detect this short of verifying
-+ * every memory free."
-+ *
-+ */
- static void rpc_free_task(struct rpc_task *task)
- {
-- const struct rpc_call_ops *tk_ops = task->tk_ops;
-- void *calldata = task->tk_calldata;
-+ unsigned short tk_flags = task->tk_flags;
-+
-+ rpc_release_calldata(task->tk_ops, task->tk_calldata);
-
-- if (task->tk_flags & RPC_TASK_DYNAMIC) {
-+ if (tk_flags & RPC_TASK_DYNAMIC) {
- dprintk("RPC: %5u freeing task\n", task->tk_pid);
- mempool_free(task, rpc_task_mempool);
- }
-- rpc_release_calldata(tk_ops, calldata);
- }
-
- static void rpc_async_release(struct work_struct *work)