commit:     c75c5fb8532cf27d9a1e6bcf2ed0711f340129ca
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Dec 16 20:12:56 2014 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Dec 16 20:12:56 2014 +0000
URL:        
http://sources.gentoo.org/gitweb/?p=proj/linux-patches.git;a=commit;h=c75c5fb8

Linux patch 3.17.7

---
 0000_README             |   4 +
 1006_linux-3.17.7.patch | 990 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 994 insertions(+)

diff --git a/0000_README b/0000_README
index afa626e..c62fecf 100644
--- a/0000_README
+++ b/0000_README
@@ -67,6 +67,10 @@ Patch:  1005_linux-3.17.6.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.17.6
 
+Patch:  1006_linux-3.17.7.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.17.7
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1006_linux-3.17.7.patch b/1006_linux-3.17.7.patch
new file mode 100644
index 0000000..a2df4f1
--- /dev/null
+++ b/1006_linux-3.17.7.patch
@@ -0,0 +1,990 @@
+diff --git a/Makefile b/Makefile
+index bb43e9e6a79c..267f8936ff69 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 17
+-SUBLEVEL = 6
++SUBLEVEL = 7
+ EXTRAVERSION =
+ NAME = Shuffling Zombie Juror
+ 
+diff --git a/arch/mips/net/bpf_jit.c b/arch/mips/net/bpf_jit.c
+index 9f7ecbda250c..1588716e32be 100644
+--- a/arch/mips/net/bpf_jit.c
++++ b/arch/mips/net/bpf_jit.c
+@@ -430,7 +430,7 @@ static inline void emit_mod(unsigned int dst, unsigned int 
src,
+               u32 *p = &ctx->target[ctx->idx];
+               uasm_i_divu(&p, dst, src);
+               p = &ctx->target[ctx->idx + 1];
+-              uasm_i_mflo(&p, dst);
++              uasm_i_mfhi(&p, dst);
+       }
+       ctx->idx += 2; /* 2 insts */
+ }
+@@ -1006,7 +1006,7 @@ load_ind:
+                       break;
+               case BPF_ALU | BPF_MOD | BPF_K:
+                       /* A %= k */
+-                      if (k == 1 || optimize_div(&k)) {
++                      if (k == 1) {
+                               ctx->flags |= SEEN_A;
+                               emit_jit_reg_move(r_A, r_zero, ctx);
+                       } else {
+diff --git a/arch/x86/boot/compressed/Makefile 
b/arch/x86/boot/compressed/Makefile
+index 14fe7cba21d1..b5bb49866bcc 100644
+--- a/arch/x86/boot/compressed/Makefile
++++ b/arch/x86/boot/compressed/Makefile
+@@ -75,7 +75,7 @@ suffix-$(CONFIG_KERNEL_XZ)   := xz
+ suffix-$(CONFIG_KERNEL_LZO)   := lzo
+ suffix-$(CONFIG_KERNEL_LZ4)   := lz4
+ 
+-RUN_SIZE = $(shell objdump -h vmlinux | \
++RUN_SIZE = $(shell $(OBJDUMP) -h vmlinux | \
+            perl $(srctree)/arch/x86/tools/calc_run_size.pl)
+ quiet_cmd_mkpiggy = MKPIGGY $@
+       cmd_mkpiggy = $(obj)/mkpiggy $< $(RUN_SIZE) > $@ || ( rm -f $@ ; false )
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index cf79c4cdf955..c874859b4565 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -299,11 +299,11 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec 
*ec,
+       /* following two actions should be kept atomic */
+       ec->curr = t;
+       start_transaction(ec);
+-      if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
+-              clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
+       spin_unlock_irqrestore(&ec->lock, tmp);
+       ret = ec_poll(ec);
+       spin_lock_irqsave(&ec->lock, tmp);
++      if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
++              clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
+       ec->curr = NULL;
+       spin_unlock_irqrestore(&ec->lock, tmp);
+       return ret;
+diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
+index 597b15e7f6e5..363a2576553a 100644
+--- a/drivers/ata/ahci.c
++++ b/drivers/ata/ahci.c
+@@ -321,6 +321,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
+       { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series RAID */
+       { PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
+       { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series RAID */
++      { PCI_VDEVICE(INTEL, 0x9d03), board_ahci }, /* Sunrise Point-LP AHCI */
++      { PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */
++      { PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */
+       { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H AHCI */
+       { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H RAID */
+       { PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
+@@ -492,6 +495,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
+        * enabled.  https://bugzilla.kernel.org/show_bug.cgi?id=60731
+        */
+       { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi },
++      { PCI_VDEVICE(SAMSUNG, 0xa800), board_ahci_nomsi },
+ 
+       /* Enmotus */
+       { PCI_DEVICE(0x1c44, 0x8000), board_ahci },
+diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
+index 07bc7e4dbd04..65071591b143 100644
+--- a/drivers/ata/sata_fsl.c
++++ b/drivers/ata/sata_fsl.c
+@@ -1488,7 +1488,7 @@ static int sata_fsl_probe(struct platform_device *ofdev)
+       host_priv->csr_base = csr_base;
+ 
+       irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
+-      if (irq < 0) {
++      if (!irq) {
+               dev_err(&ofdev->dev, "invalid irq from platform\n");
+               goto error_exit_with_cleanup;
+       }
+diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
+index 7bd17b3ee95c..8663c21093d1 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -4209,7 +4209,6 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
+               ironlake_fdi_disable(crtc);
+ 
+               ironlake_disable_pch_transcoder(dev_priv, pipe);
+-              intel_set_pch_fifo_underrun_reporting(dev, pipe, true);
+ 
+               if (HAS_PCH_CPT(dev)) {
+                       /* disable TRANS_DP_CTL */
+@@ -4274,7 +4273,6 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
+ 
+       if (intel_crtc->config.has_pch_encoder) {
+               lpt_disable_pch_transcoder(dev_priv);
+-              intel_set_pch_fifo_underrun_reporting(dev, TRANSCODER_A, true);
+               intel_ddi_fdi_disable(crtc);
+       }
+ 
+diff --git a/drivers/gpu/drm/i915/intel_lvds.c 
b/drivers/gpu/drm/i915/intel_lvds.c
+index fdf40267249c..4cc77e74e1f6 100644
+--- a/drivers/gpu/drm/i915/intel_lvds.c
++++ b/drivers/gpu/drm/i915/intel_lvds.c
+@@ -900,6 +900,17 @@ void intel_lvds_init(struct drm_device *dev)
+       int pipe;
+       u8 pin;
+ 
++      /*
++       * Unlock registers and just leave them unlocked. Do this before
++       * checking quirk lists to avoid bogus WARNINGs.
++       */
++      if (HAS_PCH_SPLIT(dev)) {
++              I915_WRITE(PCH_PP_CONTROL,
++                         I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
++      } else {
++              I915_WRITE(PP_CONTROL,
++                         I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
++      }
+       if (!intel_lvds_supported(dev))
+               return;
+ 
+@@ -1098,17 +1109,6 @@ out:
+       lvds_encoder->a3_power = I915_READ(lvds_encoder->reg) &
+                                LVDS_A3_POWER_MASK;
+ 
+-      /*
+-       * Unlock registers and just
+-       * leave them unlocked
+-       */
+-      if (HAS_PCH_SPLIT(dev)) {
+-              I915_WRITE(PCH_PP_CONTROL,
+-                         I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
+-      } else {
+-              I915_WRITE(PP_CONTROL,
+-                         I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
+-      }
+       lvds_connector->lid_notifier.notifier_call = intel_lid_notify;
+       if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) {
+               DRM_DEBUG_KMS("lid notifier registration failed\n");
+diff --git a/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c 
b/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c
+index da153a2cb6b5..f01d019edbfd 100644
+--- a/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c
++++ b/drivers/gpu/drm/nouveau/core/engine/device/nvc0.c
+@@ -212,7 +212,6 @@ nvc0_identify(struct nouveau_device *device)
+               device->oclass[NVDEV_ENGINE_BSP    ] = &nvc0_bsp_oclass;
+               device->oclass[NVDEV_ENGINE_PPP    ] = &nvc0_ppp_oclass;
+               device->oclass[NVDEV_ENGINE_COPY0  ] = &nvc0_copy0_oclass;
+-              device->oclass[NVDEV_ENGINE_COPY1  ] = &nvc0_copy1_oclass;
+               device->oclass[NVDEV_ENGINE_DISP   ] =  nva3_disp_oclass;
+               device->oclass[NVDEV_ENGINE_PERFMON] = &nvc0_perfmon_oclass;
+               break;
+diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c 
b/drivers/gpu/drm/nouveau/nouveau_drm.c
+index 3ed32dd90303..ace7524e631c 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
++++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
+@@ -626,7 +626,6 @@ int nouveau_pmops_suspend(struct device *dev)
+ 
+       pci_save_state(pdev);
+       pci_disable_device(pdev);
+-      pci_ignore_hotplug(pdev);
+       pci_set_power_state(pdev, PCI_D3hot);
+       return 0;
+ }
+@@ -930,6 +929,7 @@ static int nouveau_pmops_runtime_suspend(struct device 
*dev)
+       ret = nouveau_do_suspend(drm_dev, true);
+       pci_save_state(pdev);
+       pci_disable_device(pdev);
++      pci_ignore_hotplug(pdev);
+       pci_set_power_state(pdev, PCI_D3cold);
+       drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
+       return ret;
+diff --git a/drivers/gpu/drm/radeon/radeon_cs.c 
b/drivers/gpu/drm/radeon/radeon_cs.c
+index e244c2d72730..67f91571ae79 100644
+--- a/drivers/gpu/drm/radeon/radeon_cs.c
++++ b/drivers/gpu/drm/radeon/radeon_cs.c
+@@ -226,14 +226,11 @@ static int radeon_cs_get_ring(struct radeon_cs_parser 
*p, u32 ring, s32 priority
+ 
+ static void radeon_cs_sync_rings(struct radeon_cs_parser *p)
+ {
+-      int i;
+-
+-      for (i = 0; i < p->nrelocs; i++) {
+-              if (!p->relocs[i].robj)
+-                      continue;
++      struct radeon_cs_reloc *reloc;
+ 
++      list_for_each_entry(reloc, &p->validated, tv.head) {
+               radeon_semaphore_sync_to(p->ib.semaphore,
+-                                       p->relocs[i].robj->tbo.sync_obj);
++                                       reloc->robj->tbo.sync_obj);
+       }
+ }
+ 
+diff --git a/drivers/gpu/drm/radeon/radeon_kms.c 
b/drivers/gpu/drm/radeon/radeon_kms.c
+index eb7164d07985..82941bd8ca46 100644
+--- a/drivers/gpu/drm/radeon/radeon_kms.c
++++ b/drivers/gpu/drm/radeon/radeon_kms.c
+@@ -795,6 +795,8 @@ int radeon_get_vblank_timestamp_kms(struct drm_device 
*dev, int crtc,
+ 
+       /* Get associated drm_crtc: */
+       drmcrtc = &rdev->mode_info.crtcs[crtc]->base;
++      if (!drmcrtc)
++              return -EINVAL;
+ 
+       /* Helper routine in DRM core does all the work: */
+       return drm_calc_vbltimestamp_from_scanoutpos(dev, crtc, max_error,
+diff --git a/drivers/gpu/drm/radeon/radeon_object.c 
b/drivers/gpu/drm/radeon/radeon_object.c
+index 480c87d8edc5..835f402a9faf 100644
+--- a/drivers/gpu/drm/radeon/radeon_object.c
++++ b/drivers/gpu/drm/radeon/radeon_object.c
+@@ -187,6 +187,13 @@ int radeon_bo_create(struct radeon_device *rdev,
+       if (!(rdev->flags & RADEON_IS_PCIE))
+               bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC);
+ 
++#ifdef CONFIG_X86_32
++      /* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
++       * See https://bugs.freedesktop.org/show_bug.cgi?id=84627
++       */
++      bo->flags &= ~RADEON_GEM_GTT_WC;
++#endif
++
+       radeon_ttm_placement_from_domain(bo, domain);
+       /* Kernel allocation are uninterruptible */
+       down_read(&rdev->pm.mclk_lock);
+diff --git a/drivers/i2c/busses/i2c-cadence.c 
b/drivers/i2c/busses/i2c-cadence.c
+index 63f3f03ecc9b..c604f4c3ac0d 100644
+--- a/drivers/i2c/busses/i2c-cadence.c
++++ b/drivers/i2c/busses/i2c-cadence.c
+@@ -111,6 +111,8 @@
+ #define CDNS_I2C_DIVA_MAX     4
+ #define CDNS_I2C_DIVB_MAX     64
+ 
++#define CDNS_I2C_TIMEOUT_MAX  0xFF
++
+ #define cdns_i2c_readreg(offset)       readl_relaxed(id->membase + offset)
+ #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + 
offset)
+ 
+@@ -852,6 +854,15 @@ static int cdns_i2c_probe(struct platform_device *pdev)
+               goto err_clk_dis;
+       }
+ 
++      /*
++       * Cadence I2C controller has a bug wherein it generates
++       * invalid read transaction after HW timeout in master receiver mode.
++       * HW timeout is not used by this driver and the interrupt is disabled.
++       * But the feature itself cannot be disabled. Hence maximum value
++       * is written to this register to reduce the chances of error.
++       */
++      cdns_i2c_writereg(CDNS_I2C_TIMEOUT_MAX, CDNS_I2C_TIME_OUT_OFFSET);
++
+       dev_info(&pdev->dev, "%u kHz mmio %08lx irq %d\n",
+                id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq);
+ 
+diff --git a/drivers/i2c/busses/i2c-davinci.c 
b/drivers/i2c/busses/i2c-davinci.c
+index 4d9614719128..82be5e2da7cf 100644
+--- a/drivers/i2c/busses/i2c-davinci.c
++++ b/drivers/i2c/busses/i2c-davinci.c
+@@ -411,11 +411,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct 
i2c_msg *msg, int stop)
+       if (dev->cmd_err & DAVINCI_I2C_STR_NACK) {
+               if (msg->flags & I2C_M_IGNORE_NAK)
+                       return msg->len;
+-              if (stop) {
+-                      w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
+-                      w |= DAVINCI_I2C_MDR_STP;
+-                      davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
+-              }
++              w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
++              w |= DAVINCI_I2C_MDR_STP;
++              davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w);
+               return -EREMOTEIO;
+       }
+       return -EIO;
+diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
+index 0dffb0e62c3b..493574ee87f5 100644
+--- a/drivers/i2c/busses/i2c-omap.c
++++ b/drivers/i2c/busses/i2c-omap.c
+@@ -926,14 +926,12 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
+               if (stat & OMAP_I2C_STAT_NACK) {
+                       err |= OMAP_I2C_STAT_NACK;
+                       omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK);
+-                      break;
+               }
+ 
+               if (stat & OMAP_I2C_STAT_AL) {
+                       dev_err(dev->dev, "Arbitration lost\n");
+                       err |= OMAP_I2C_STAT_AL;
+                       omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL);
+-                      break;
+               }
+ 
+               /*
+@@ -958,11 +956,13 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
+                       if (dev->fifo_size)
+                               num_bytes = dev->buf_len;
+ 
+-                      omap_i2c_receive_data(dev, num_bytes, true);
+-
+-                      if (dev->errata & I2C_OMAP_ERRATA_I207)
++                      if (dev->errata & I2C_OMAP_ERRATA_I207) {
+                               i2c_omap_errata_i207(dev, stat);
++                              num_bytes = (omap_i2c_read_reg(dev,
++                                      OMAP_I2C_BUFSTAT_REG) >> 8) & 0x3F;
++                      }
+ 
++                      omap_i2c_receive_data(dev, num_bytes, true);
+                       omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR);
+                       continue;
+               }
+diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
+index de055451d1af..b535322a36db 100644
+--- a/drivers/input/evdev.c
++++ b/drivers/input/evdev.c
+@@ -421,7 +421,7 @@ static int evdev_open(struct inode *inode, struct file 
*file)
+ 
+  err_free_client:
+       evdev_detach_client(evdev, client);
+-      kfree(client);
++      kvfree(client);
+       return error;
+ }
+ 
+diff --git a/drivers/media/i2c/smiapp/smiapp-core.c 
b/drivers/media/i2c/smiapp/smiapp-core.c
+index 62acb10630f9..818b48d3ac28 100644
+--- a/drivers/media/i2c/smiapp/smiapp-core.c
++++ b/drivers/media/i2c/smiapp/smiapp-core.c
+@@ -2133,7 +2133,7 @@ static int smiapp_set_selection(struct v4l2_subdev 
*subdev,
+               ret = smiapp_set_compose(subdev, fh, sel);
+               break;
+       default:
+-              BUG();
++              ret = -EINVAL;
+       }
+ 
+       mutex_unlock(&sensor->mutex);
+diff --git a/drivers/media/rc/ir-rc6-decoder.c 
b/drivers/media/rc/ir-rc6-decoder.c
+index f1f098e22f7e..d16bc67af732 100644
+--- a/drivers/media/rc/ir-rc6-decoder.c
++++ b/drivers/media/rc/ir-rc6-decoder.c
+@@ -259,8 +259,8 @@ again:
+                       case 32:
+                               if ((scancode & RC6_6A_LCC_MASK) == 
RC6_6A_MCE_CC) {
+                                       protocol = RC_TYPE_RC6_MCE;
+-                                      scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
+                                       toggle = !!(scancode & 
RC6_6A_MCE_TOGGLE_MASK);
++                                      scancode &= ~RC6_6A_MCE_TOGGLE_MASK;
+                               } else {
+                                       protocol = RC_BIT_RC6_6A_32;
+                                       toggle = 0;
+diff --git a/drivers/media/usb/s2255/s2255drv.c 
b/drivers/media/usb/s2255/s2255drv.c
+index 2c901861034a..efcaa90529ba 100644
+--- a/drivers/media/usb/s2255/s2255drv.c
++++ b/drivers/media/usb/s2255/s2255drv.c
+@@ -632,7 +632,7 @@ static void s2255_fillbuff(struct s2255_vc *vc,
+                       break;
+               case V4L2_PIX_FMT_JPEG:
+               case V4L2_PIX_FMT_MJPEG:
+-                      buf->vb.v4l2_buf.length = jpgsize;
++                      vb2_set_plane_payload(&buf->vb, 0, jpgsize);
+                       memcpy(vbuf, tmpbuf, jpgsize);
+                       break;
+               case V4L2_PIX_FMT_YUV422P:
+diff --git a/drivers/net/bonding/bond_netlink.c 
b/drivers/net/bonding/bond_netlink.c
+index d163e112f04c..fc061c3a6485 100644
+--- a/drivers/net/bonding/bond_netlink.c
++++ b/drivers/net/bonding/bond_netlink.c
+@@ -194,7 +194,12 @@ static int bond_changelink(struct net_device *bond_dev,
+ 
+               bond_option_arp_ip_targets_clear(bond);
+               nla_for_each_nested(attr, data[IFLA_BOND_ARP_IP_TARGET], rem) {
+-                      __be32 target = nla_get_be32(attr);
++                      __be32 target;
++
++                      if (nla_len(attr) < sizeof(target))
++                              return -EINVAL;
++
++                      target = nla_get_be32(attr);
+ 
+                       bond_opt_initval(&newval, (__force u64)target);
+                       err = __bond_opt_set(bond, BOND_OPT_ARP_TARGETS,
+diff --git a/drivers/net/ethernet/broadcom/tg3.c 
b/drivers/net/ethernet/broadcom/tg3.c
+index ba499489969a..cbfa4ff9f3bd 100644
+--- a/drivers/net/ethernet/broadcom/tg3.c
++++ b/drivers/net/ethernet/broadcom/tg3.c
+@@ -8561,7 +8561,8 @@ static int tg3_init_rings(struct tg3 *tp)
+               if (tnapi->rx_rcb)
+                       memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
+ 
+-              if (tg3_rx_prodring_alloc(tp, &tnapi->prodring)) {
++              if (tnapi->prodring.rx_std &&
++                  tg3_rx_prodring_alloc(tp, &tnapi->prodring)) {
+                       tg3_free_rings(tp);
+                       return -ENOMEM;
+               }
+diff --git a/drivers/net/ethernet/marvell/mvneta.c 
b/drivers/net/ethernet/marvell/mvneta.c
+index ade067de1689..67a84cfaefa1 100644
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -216,7 +216,7 @@
+ /* Various constants */
+ 
+ /* Coalescing */
+-#define MVNETA_TXDONE_COAL_PKTS               16
++#define MVNETA_TXDONE_COAL_PKTS               1
+ #define MVNETA_RX_COAL_PKTS           32
+ #define MVNETA_RX_COAL_USEC           100
+ 
+@@ -1721,6 +1721,7 @@ static int mvneta_tx(struct sk_buff *skb, struct 
net_device *dev)
+       u16 txq_id = skb_get_queue_mapping(skb);
+       struct mvneta_tx_queue *txq = &pp->txqs[txq_id];
+       struct mvneta_tx_desc *tx_desc;
++      int len = skb->len;
+       int frags = 0;
+       u32 tx_cmd;
+ 
+@@ -1788,7 +1789,7 @@ out:
+ 
+               u64_stats_update_begin(&stats->syncp);
+               stats->tx_packets++;
+-              stats->tx_bytes  += skb->len;
++              stats->tx_bytes  += len;
+               u64_stats_update_end(&stats->syncp);
+       } else {
+               dev->stats.tx_dropped++;
+diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c 
b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+index 5d2498dcf536..cd5cf6d957c7 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
++++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+@@ -1546,7 +1546,7 @@ static int qp_alloc_res(struct mlx4_dev *dev, int slave, 
int op, int cmd,
+ 
+       switch (op) {
+       case RES_OP_RESERVE:
+-              count = get_param_l(&in_param);
++              count = get_param_l(&in_param) & 0xffffff;
+               align = get_param_h(&in_param);
+               err = mlx4_grant_resource(dev, slave, RES_QP, count, 0);
+               if (err)
+diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
+index 81a8a296a582..2aa3a8db5334 100644
+--- a/drivers/net/vxlan.c
++++ b/drivers/net/vxlan.c
+@@ -2050,9 +2050,8 @@ static int vxlan_init(struct net_device *dev)
+       spin_lock(&vn->sock_lock);
+       vs = vxlan_find_sock(vxlan->net, ipv6 ? AF_INET6 : AF_INET,
+                            vxlan->dst_port);
+-      if (vs) {
++      if (vs && atomic_add_unless(&vs->refcnt, 1, 0)) {
+               /* If we have a socket with same port already, reuse it */
+-              atomic_inc(&vs->refcnt);
+               vxlan_vs_add_dev(vs, vxlan);
+       } else {
+               /* otherwise make new socket outside of RTNL */
+@@ -2362,9 +2361,9 @@ static struct socket *vxlan_create_sock(struct net *net, 
bool ipv6,
+       if (ipv6) {
+               udp_conf.family = AF_INET6;
+               udp_conf.use_udp6_tx_checksums =
+-                  !!(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
++                  !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
+               udp_conf.use_udp6_rx_checksums =
+-                  !!(flags & VXLAN_F_UDP_ZERO_CSUM6_RX);
++                  !(flags & VXLAN_F_UDP_ZERO_CSUM6_RX);
+       } else {
+               udp_conf.family = AF_INET;
+               udp_conf.local_ip.s_addr = INADDR_ANY;
+@@ -2459,12 +2458,9 @@ struct vxlan_sock *vxlan_sock_add(struct net *net, 
__be16 port,
+ 
+       spin_lock(&vn->sock_lock);
+       vs = vxlan_find_sock(net, ipv6 ? AF_INET6 : AF_INET, port);
+-      if (vs) {
+-              if (vs->rcv == rcv)
+-                      atomic_inc(&vs->refcnt);
+-              else
++      if (vs && ((vs->rcv != rcv) ||
++                 !atomic_add_unless(&vs->refcnt, 1, 0)))
+                       vs = ERR_PTR(-EBUSY);
+-      }
+       spin_unlock(&vn->sock_lock);
+ 
+       if (!vs)
+diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
+index ca82f545ec2c..646e2dec699c 100644
+--- a/drivers/net/xen-netfront.c
++++ b/drivers/net/xen-netfront.c
+@@ -496,9 +496,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct 
netfront_queue *queue,
+               len = skb_frag_size(frag);
+               offset = frag->page_offset;
+ 
+-              /* Data must not cross a page boundary. */
+-              BUG_ON(len + offset > PAGE_SIZE<<compound_order(page));
+-
+               /* Skip unused frames from start of page */
+               page += offset >> PAGE_SHIFT;
+               offset &= ~PAGE_MASK;
+@@ -506,8 +503,6 @@ static void xennet_make_frags(struct sk_buff *skb, struct 
netfront_queue *queue,
+               while (len > 0) {
+                       unsigned long bytes;
+ 
+-                      BUG_ON(offset >= PAGE_SIZE);
+-
+                       bytes = PAGE_SIZE - offset;
+                       if (bytes > len)
+                               bytes = len;
+@@ -632,6 +627,9 @@ static int xennet_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
+                                   slots, skb->len);
+               if (skb_linearize(skb))
+                       goto drop;
++              data = skb->data;
++              offset = offset_in_page(data);
++              len = skb_headlen(skb);
+       }
+ 
+       spin_lock_irqsave(&queue->tx_lock, flags);
+diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
+index 30e97bcc4f88..d134710de96d 100644
+--- a/drivers/of/fdt.c
++++ b/drivers/of/fdt.c
+@@ -964,8 +964,6 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, 
u64 size)
+ int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
+                                       phys_addr_t size, bool nomap)
+ {
+-      if (memblock_is_region_reserved(base, size))
+-              return -EBUSY;
+       if (nomap)
+               return memblock_remove(base, size);
+       return memblock_reserve(base, size);
+diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
+index 6df8d3d885e5..b8b92c2f9683 100644
+--- a/fs/fat/namei_vfat.c
++++ b/fs/fat/namei_vfat.c
+@@ -736,7 +736,12 @@ static struct dentry *vfat_lookup(struct inode *dir, 
struct dentry *dentry,
+       }
+ 
+       alias = d_find_alias(inode);
+-      if (alias && !vfat_d_anon_disconn(alias)) {
++      /*
++       * Checking "alias->d_parent == dentry->d_parent" to make sure
++       * FS is not corrupted (especially double linked dir).
++       */
++      if (alias && alias->d_parent == dentry->d_parent &&
++          !vfat_d_anon_disconn(alias)) {
+               /*
+                * This inode has non anonymous-DCACHE_DISCONNECTED
+                * dentry. This means, the user did ->lookup() by an
+@@ -755,12 +760,9 @@ static struct dentry *vfat_lookup(struct inode *dir, 
struct dentry *dentry,
+ 
+ out:
+       mutex_unlock(&MSDOS_SB(sb)->s_lock);
+-      dentry->d_time = dentry->d_parent->d_inode->i_version;
+-      dentry = d_splice_alias(inode, dentry);
+-      if (dentry)
+-              dentry->d_time = dentry->d_parent->d_inode->i_version;
+-      return dentry;
+-
++      if (!inode)
++              dentry->d_time = dir->i_version;
++      return d_splice_alias(inode, dentry);
+ error:
+       mutex_unlock(&MSDOS_SB(sb)->s_lock);
+       return ERR_PTR(err);
+@@ -793,7 +795,6 @@ static int vfat_create(struct inode *dir, struct dentry 
*dentry, umode_t mode,
+       inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+       /* timestamp is already written, so mark_inode_dirty() is unneeded. */
+ 
+-      dentry->d_time = dentry->d_parent->d_inode->i_version;
+       d_instantiate(dentry, inode);
+ out:
+       mutex_unlock(&MSDOS_SB(sb)->s_lock);
+@@ -824,6 +825,7 @@ static int vfat_rmdir(struct inode *dir, struct dentry 
*dentry)
+       clear_nlink(inode);
+       inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
+       fat_detach(inode);
++      dentry->d_time = dir->i_version;
+ out:
+       mutex_unlock(&MSDOS_SB(sb)->s_lock);
+ 
+@@ -849,6 +851,7 @@ static int vfat_unlink(struct inode *dir, struct dentry 
*dentry)
+       clear_nlink(inode);
+       inode->i_mtime = inode->i_atime = CURRENT_TIME_SEC;
+       fat_detach(inode);
++      dentry->d_time = dir->i_version;
+ out:
+       mutex_unlock(&MSDOS_SB(sb)->s_lock);
+ 
+@@ -889,7 +892,6 @@ static int vfat_mkdir(struct inode *dir, struct dentry 
*dentry, umode_t mode)
+       inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+       /* timestamp is already written, so mark_inode_dirty() is unneeded. */
+ 
+-      dentry->d_time = dentry->d_parent->d_inode->i_version;
+       d_instantiate(dentry, inode);
+ 
+       mutex_unlock(&MSDOS_SB(sb)->s_lock);
+diff --git a/include/net/inet_common.h b/include/net/inet_common.h
+index fe7994c48b75..b2828a06a5a6 100644
+--- a/include/net/inet_common.h
++++ b/include/net/inet_common.h
+@@ -37,6 +37,8 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, 
unsigned long arg);
+ int inet_ctl_sock_create(struct sock **sk, unsigned short family,
+                        unsigned short type, unsigned char protocol,
+                        struct net *net);
++int inet_recv_error(struct sock *sk, struct msghdr *msg, int len,
++                  int *addr_len);
+ 
+ static inline void inet_ctl_sock_destroy(struct sock *sk)
+ {
+diff --git a/mm/frontswap.c b/mm/frontswap.c
+index c30eec536f03..f2a3571c6e22 100644
+--- a/mm/frontswap.c
++++ b/mm/frontswap.c
+@@ -244,8 +244,10 @@ int __frontswap_store(struct page *page)
+                 the (older) page from frontswap
+                */
+               inc_frontswap_failed_stores();
+-              if (dup)
++              if (dup) {
+                       __frontswap_clear(sis, offset);
++                      frontswap_ops->invalidate_page(type, offset);
++              }
+       }
+       if (frontswap_writethrough_enabled)
+               /* report failure so swap also writes to swap device */
+diff --git a/mm/memory.c b/mm/memory.c
+index 37b80fc3a9b6..e497defd663e 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -815,20 +815,20 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct 
*src_mm,
+               if (!pte_file(pte)) {
+                       swp_entry_t entry = pte_to_swp_entry(pte);
+ 
+-                      if (swap_duplicate(entry) < 0)
+-                              return entry.val;
+-
+-                      /* make sure dst_mm is on swapoff's mmlist. */
+-                      if (unlikely(list_empty(&dst_mm->mmlist))) {
+-                              spin_lock(&mmlist_lock);
+-                              if (list_empty(&dst_mm->mmlist))
+-                                      list_add(&dst_mm->mmlist,
+-                                               &src_mm->mmlist);
+-                              spin_unlock(&mmlist_lock);
+-                      }
+-                      if (likely(!non_swap_entry(entry)))
++                      if (likely(!non_swap_entry(entry))) {
++                              if (swap_duplicate(entry) < 0)
++                                      return entry.val;
++
++                              /* make sure dst_mm is on swapoff's mmlist. */
++                              if (unlikely(list_empty(&dst_mm->mmlist))) {
++                                      spin_lock(&mmlist_lock);
++                                      if (list_empty(&dst_mm->mmlist))
++                                              list_add(&dst_mm->mmlist,
++                                                       &src_mm->mmlist);
++                                      spin_unlock(&mmlist_lock);
++                              }
+                               rss[MM_SWAPENTS]++;
+-                      else if (is_migration_entry(entry)) {
++                      } else if (is_migration_entry(entry)) {
+                               page = migration_entry_to_page(entry);
+ 
+                               if (PageAnon(page))
+diff --git a/mm/mmap.c b/mm/mmap.c
+index ebc25fab1545..a226d31a2395 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -752,8 +752,11 @@ again:                    remove_next = 1 + (end > 
next->vm_end);
+                * shrinking vma had, to cover any anon pages imported.
+                */
+               if (exporter && exporter->anon_vma && !importer->anon_vma) {
+-                      if (anon_vma_clone(importer, exporter))
+-                              return -ENOMEM;
++                      int error;
++
++                      error = anon_vma_clone(importer, exporter);
++                      if (error)
++                              return error;
+                       importer->anon_vma = exporter->anon_vma;
+               }
+       }
+@@ -2453,7 +2456,8 @@ static int __split_vma(struct mm_struct * mm, struct 
vm_area_struct * vma,
+       if (err)
+               goto out_free_vma;
+ 
+-      if (anon_vma_clone(new, vma))
++      err = anon_vma_clone(new, vma);
++      if (err)
+               goto out_free_mpol;
+ 
+       if (new->vm_file)
+diff --git a/mm/rmap.c b/mm/rmap.c
+index e01318d4b07e..1807ca3f8731 100644
+--- a/mm/rmap.c
++++ b/mm/rmap.c
+@@ -274,6 +274,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct 
vm_area_struct *pvma)
+ {
+       struct anon_vma_chain *avc;
+       struct anon_vma *anon_vma;
++      int error;
+ 
+       /* Don't bother if the parent process has no anon_vma here. */
+       if (!pvma->anon_vma)
+@@ -283,8 +284,9 @@ int anon_vma_fork(struct vm_area_struct *vma, struct 
vm_area_struct *pvma)
+        * First, attach the new VMA to the parent VMA's anon_vmas,
+        * so rmap can find non-COWed pages in child processes.
+        */
+-      if (anon_vma_clone(vma, pvma))
+-              return -ENOMEM;
++      error = anon_vma_clone(vma, pvma);
++      if (error)
++              return error;
+ 
+       /* Then add our own anon_vma. */
+       anon_vma = anon_vma_alloc();
+diff --git a/mm/slab.c b/mm/slab.c
+index 7c52b3890d25..cc91c1ef4e8a 100644
+--- a/mm/slab.c
++++ b/mm/slab.c
+@@ -3108,7 +3108,7 @@ static void *____cache_alloc_node(struct kmem_cache 
*cachep, gfp_t flags,
+       void *obj;
+       int x;
+ 
+-      VM_BUG_ON(nodeid > num_online_nodes());
++      VM_BUG_ON(nodeid < 0 || nodeid >= MAX_NUMNODES);
+       n = get_node(cachep, nodeid);
+       BUG_ON(!n);
+ 
+diff --git a/mm/vmpressure.c b/mm/vmpressure.c
+index d4042e75f7c7..c5afd573d7da 100644
+--- a/mm/vmpressure.c
++++ b/mm/vmpressure.c
+@@ -165,6 +165,7 @@ static void vmpressure_work_fn(struct work_struct *work)
+       unsigned long scanned;
+       unsigned long reclaimed;
+ 
++      spin_lock(&vmpr->sr_lock);
+       /*
+        * Several contexts might be calling vmpressure(), so it is
+        * possible that the work was rescheduled again before the old
+@@ -173,11 +174,12 @@ static void vmpressure_work_fn(struct work_struct *work)
+        * here. No need for any locks here since we don't care if
+        * vmpr->reclaimed is in sync.
+        */
+-      if (!vmpr->scanned)
++      scanned = vmpr->scanned;
++      if (!scanned) {
++              spin_unlock(&vmpr->sr_lock);
+               return;
++      }
+ 
+-      spin_lock(&vmpr->sr_lock);
+-      scanned = vmpr->scanned;
+       reclaimed = vmpr->reclaimed;
+       vmpr->scanned = 0;
+       vmpr->reclaimed = 0;
+diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
+index f0493e3b7471..4921b6536ea5 100644
+--- a/net/core/rtnetlink.c
++++ b/net/core/rtnetlink.c
+@@ -1495,6 +1495,7 @@ static int do_setlink(const struct sk_buff *skb,
+                       goto errout;
+               }
+               if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) {
++                      put_net(net);
+                       err = -EPERM;
+                       goto errout;
+               }
+diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
+index d156b3c5f363..bf78bc365481 100644
+--- a/net/ipv4/af_inet.c
++++ b/net/ipv4/af_inet.c
+@@ -1421,6 +1421,17 @@ out:
+       return pp;
+ }
+ 
++int inet_recv_error(struct sock *sk, struct msghdr *msg, int len, int 
*addr_len)
++{
++      if (sk->sk_family == AF_INET)
++              return ip_recv_error(sk, msg, len, addr_len);
++#if IS_ENABLED(CONFIG_IPV6)
++      if (sk->sk_family == AF_INET6)
++              return pingv6_ops.ipv6_recv_error(sk, msg, len, addr_len);
++#endif
++      return -EINVAL;
++}
++
+ static int inet_gro_complete(struct sk_buff *skb, int nhoff)
+ {
+       __be16 newlen = htons(skb->len - nhoff);
+diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c
+index dd73bea2a65f..657d80c0931a 100644
+--- a/net/ipv4/gre_offload.c
++++ b/net/ipv4/gre_offload.c
+@@ -279,6 +279,9 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff)
+               err = ptype->callbacks.gro_complete(skb, nhoff + grehlen);
+ 
+       rcu_read_unlock();
++
++      skb_set_inner_mac_header(skb, nhoff + grehlen);
++
+       return err;
+ }
+ 
+diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c
+index e453cb724a95..607395236c95 100644
+--- a/net/ipv4/ip_vti.c
++++ b/net/ipv4/ip_vti.c
+@@ -528,6 +528,7 @@ static struct rtnl_link_ops vti_link_ops __read_mostly = {
+       .validate       = vti_tunnel_validate,
+       .newlink        = vti_newlink,
+       .changelink     = vti_changelink,
++      .dellink        = ip_tunnel_dellink,
+       .get_size       = vti_get_size,
+       .fill_info      = vti_fill_info,
+ };
+diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
+index 352476233608..b503a3021a71 100644
+--- a/net/ipv4/ping.c
++++ b/net/ipv4/ping.c
+@@ -855,16 +855,8 @@ int ping_recvmsg(struct kiocb *iocb, struct sock *sk, 
struct msghdr *msg,
+       if (flags & MSG_OOB)
+               goto out;
+ 
+-      if (flags & MSG_ERRQUEUE) {
+-              if (family == AF_INET) {
+-                      return ip_recv_error(sk, msg, len, addr_len);
+-#if IS_ENABLED(CONFIG_IPV6)
+-              } else if (family == AF_INET6) {
+-                      return pingv6_ops.ipv6_recv_error(sk, msg, len,
+-                                                        addr_len);
+-#endif
+-              }
+-      }
++      if (flags & MSG_ERRQUEUE)
++              return inet_recv_error(sk, msg, len, addr_len);
+ 
+       skb = skb_recv_datagram(sk, flags, noblock, &err);
+       if (!skb)
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index 6b0b38fdf4fc..9cbf8b1df165 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -1633,7 +1633,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, 
struct msghdr *msg,
+       u32 urg_hole = 0;
+ 
+       if (unlikely(flags & MSG_ERRQUEUE))
+-              return ip_recv_error(sk, msg, len, addr_len);
++              return inet_recv_error(sk, msg, len, addr_len);
+ 
+       if (sk_can_busy_loop(sk) && skb_queue_empty(&sk->sk_receive_queue) &&
+           (sk->sk_state == TCP_ESTABLISHED))
+diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c
+index cacb493a133d..33d08abe43db 100644
+--- a/net/ipv6/ip6_gre.c
++++ b/net/ipv6/ip6_gre.c
+@@ -502,11 +502,11 @@ static int ip6gre_rcv(struct sk_buff *skb)
+ 
+               skb->protocol = gre_proto;
+               /* WCCP version 1 and 2 protocol decoding.
+-               * - Change protocol to IP
++               * - Change protocol to IPv6
+                * - When dealing with WCCPv2, Skip extra 4 bytes in GRE header
+                */
+               if (flags == 0 && gre_proto == htons(ETH_P_WCCP)) {
+-                      skb->protocol = htons(ETH_P_IP);
++                      skb->protocol = htons(ETH_P_IPV6);
+                       if ((*(h + offset) & 0xF0) != 0x40)
+                               offset += 4;
+               }
+diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
+index 99c9487f236a..3abcd4afeaaf 100644
+--- a/net/ipv6/ip6_vti.c
++++ b/net/ipv6/ip6_vti.c
+@@ -905,6 +905,15 @@ static int vti6_newlink(struct net *src_net, struct 
net_device *dev,
+       return vti6_tnl_create2(dev);
+ }
+ 
++static void vti6_dellink(struct net_device *dev, struct list_head *head)
++{
++      struct net *net = dev_net(dev);
++      struct vti6_net *ip6n = net_generic(net, vti6_net_id);
++
++      if (dev != ip6n->fb_tnl_dev)
++              unregister_netdevice_queue(dev, head);
++}
++
+ static int vti6_changelink(struct net_device *dev, struct nlattr *tb[],
+                          struct nlattr *data[])
+ {
+@@ -980,6 +989,7 @@ static struct rtnl_link_ops vti6_link_ops __read_mostly = {
+       .setup          = vti6_dev_setup,
+       .validate       = vti6_validate,
+       .newlink        = vti6_newlink,
++      .dellink        = vti6_dellink,
+       .changelink     = vti6_changelink,
+       .get_size       = vti6_get_size,
+       .fill_info      = vti6_fill_info,
+@@ -1020,6 +1030,7 @@ static int __net_init vti6_init_net(struct net *net)
+       if (!ip6n->fb_tnl_dev)
+               goto err_alloc_dev;
+       dev_net_set(ip6n->fb_tnl_dev, net);
++      ip6n->fb_tnl_dev->rtnl_link_ops = &vti6_link_ops;
+ 
+       err = vti6_fb_tnl_dev_init(ip6n->fb_tnl_dev);
+       if (err < 0)
+diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
+index 0007b8180397..b6bf8e8caec7 100644
+--- a/net/netlink/af_netlink.c
++++ b/net/netlink/af_netlink.c
+@@ -3130,7 +3130,7 @@ static int __init netlink_proto_init(void)
+               .head_offset = offsetof(struct netlink_sock, node),
+               .key_offset = offsetof(struct netlink_sock, portid),
+               .key_len = sizeof(u32), /* portid */
+-              .hashfn = arch_fast_hash,
++              .hashfn = jhash,
+               .max_shift = 16, /* 64K */
+               .grow_decision = rht_grow_above_75,
+               .shrink_decision = rht_shrink_below_30,
+diff --git a/net/sctp/output.c b/net/sctp/output.c
+index 42dffd428389..fc5e45b8a832 100644
+--- a/net/sctp/output.c
++++ b/net/sctp/output.c
+@@ -401,12 +401,12 @@ int sctp_packet_transmit(struct sctp_packet *packet)
+       sk = chunk->skb->sk;
+ 
+       /* Allocate the new skb.  */
+-      nskb = alloc_skb(packet->size + LL_MAX_HEADER, GFP_ATOMIC);
++      nskb = alloc_skb(packet->size + MAX_HEADER, GFP_ATOMIC);
+       if (!nskb)
+               goto nomem;
+ 
+       /* Make sure the outbound skb has enough header room reserved. */
+-      skb_reserve(nskb, packet->overhead + LL_MAX_HEADER);
++      skb_reserve(nskb, packet->overhead + MAX_HEADER);
+ 
+       /* Set the owning socket so that we know where to get the
+        * destination IP address.
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
+index 06275f8807a8..4714ff92f15e 100644
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -332,6 +332,7 @@ static const struct hda_fixup ad1986a_fixups[] = {
+ 
+ static const struct snd_pci_quirk ad1986a_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x30af, "HP B2800", AD1986A_FIXUP_LAPTOP_IMIC),
++      SND_PCI_QUIRK(0x1043, 0x1443, "ASUS Z99He", AD1986A_FIXUP_EAPD),
+       SND_PCI_QUIRK(0x1043, 0x1447, "ASUS A8JN", AD1986A_FIXUP_EAPD),
+       SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8100, "ASUS P5", 
AD1986A_FIXUP_3STACK),
+       SND_PCI_QUIRK_MASK(0x1043, 0xff00, 0x8200, "ASUS M2", 
AD1986A_FIXUP_3STACK),
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 623a9d0c8d52..71a2350a974d 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -5087,6 +5087,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad", 
ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
+       SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", 
ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
+       SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", 
ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
++      SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
+       SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
+       SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", 
ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
+       SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
+diff --git a/sound/usb/midi.c b/sound/usb/midi.c
+index 7b166c2be0f7..3ee6f8815fc6 100644
+--- a/sound/usb/midi.c
++++ b/sound/usb/midi.c
+@@ -365,6 +365,8 @@ static void snd_usbmidi_error_timer(unsigned long data)
+               if (in && in->error_resubmit) {
+                       in->error_resubmit = 0;
+                       for (j = 0; j < INPUT_URBS; ++j) {
++                              if (atomic_read(&in->urbs[j]->use_count))
++                                      continue;
+                               in->urbs[j]->dev = umidi->dev;
+                               snd_usbmidi_submit_urb(in->urbs[j], GFP_ATOMIC);
+                       }

Reply via email to