commit:     baad0da04bee1fda784022d9905bbc36e7fbde46
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Mar 30 14:13:21 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Mar 30 14:13:21 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=baad0da0

Linux patch 4.4.264

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README              |   4 +
 1263_linux-4.4.264.patch | 912 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 916 insertions(+)

diff --git a/0000_README b/0000_README
index 01ee91c..5125e01 100644
--- a/0000_README
+++ b/0000_README
@@ -1095,6 +1095,10 @@ Patch:  1262_linux-4.4.263.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.4.263
 
+Patch:  1263_linux-4.4.264.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.4.264
+
 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/1263_linux-4.4.264.patch b/1263_linux-4.4.264.patch
new file mode 100644
index 0000000..ddb1ac0
--- /dev/null
+++ b/1263_linux-4.4.264.patch
@@ -0,0 +1,912 @@
+diff --git a/Makefile b/Makefile
+index 3f578adbe7fe6..54115c5ca4e29 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 4
+-SUBLEVEL = 263
++SUBLEVEL = 264
+ EXTRAVERSION =
+ NAME = Blurry Fish Butt
+ 
+diff --git a/arch/ia64/include/asm/syscall.h b/arch/ia64/include/asm/syscall.h
+index 1d0b875fec44f..ec909eec0b4c6 100644
+--- a/arch/ia64/include/asm/syscall.h
++++ b/arch/ia64/include/asm/syscall.h
+@@ -35,7 +35,7 @@ static inline void syscall_rollback(struct task_struct *task,
+ static inline long syscall_get_error(struct task_struct *task,
+                                    struct pt_regs *regs)
+ {
+-      return regs->r10 == -1 ? regs->r8:0;
++      return regs->r10 == -1 ? -regs->r8:0;
+ }
+ 
+ static inline long syscall_get_return_value(struct task_struct *task,
+diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c
+index 6f54d511cc509..a757b123ebafc 100644
+--- a/arch/ia64/kernel/ptrace.c
++++ b/arch/ia64/kernel/ptrace.c
+@@ -2140,27 +2140,39 @@ static void syscall_get_set_args_cb(struct 
unw_frame_info *info, void *data)
+ {
+       struct syscall_get_set_args *args = data;
+       struct pt_regs *pt = args->regs;
+-      unsigned long *krbs, cfm, ndirty;
++      unsigned long *krbs, cfm, ndirty, nlocals, nouts;
+       int i, count;
+ 
+       if (unw_unwind_to_user(info) < 0)
+               return;
+ 
++      /*
++       * We get here via a few paths:
++       * - break instruction: cfm is shared with caller.
++       *   syscall args are in out= regs, locals are non-empty.
++       * - epsinstruction: cfm is set by br.call
++       *   locals don't exist.
++       *
++       * For both cases argguments are reachable in cfm.sof - cfm.sol.
++       * CFM: [ ... | sor: 17..14 | sol : 13..7 | sof : 6..0 ]
++       */
+       cfm = pt->cr_ifs;
++      nlocals = (cfm >> 7) & 0x7f; /* aka sol */
++      nouts = (cfm & 0x7f) - nlocals; /* aka sof - sol */
+       krbs = (unsigned long *)info->task + IA64_RBS_OFFSET/8;
+       ndirty = ia64_rse_num_regs(krbs, krbs + (pt->loadrs >> 19));
+ 
+       count = 0;
+       if (in_syscall(pt))
+-              count = min_t(int, args->n, cfm & 0x7f);
++              count = min_t(int, args->n, nouts);
+ 
++      /* Iterate over outs. */
+       for (i = 0; i < count; i++) {
++              int j = ndirty + nlocals + i + args->i;
+               if (args->rw)
+-                      *ia64_rse_skip_regs(krbs, ndirty + i + args->i) =
+-                              args->args[i];
++                      *ia64_rse_skip_regs(krbs, j) = args->args[i];
+               else
+-                      args->args[i] = *ia64_rse_skip_regs(krbs,
+-                              ndirty + i + args->i);
++                      args->args[i] = *ia64_rse_skip_regs(krbs, j);
+       }
+ 
+       if (!args->rw) {
+diff --git a/arch/powerpc/include/asm/dcr-native.h 
b/arch/powerpc/include/asm/dcr-native.h
+index 4efc11dacb980..4494d5e1932f4 100644
+--- a/arch/powerpc/include/asm/dcr-native.h
++++ b/arch/powerpc/include/asm/dcr-native.h
+@@ -64,8 +64,8 @@ static inline void mtdcrx(unsigned int reg, unsigned int val)
+ #define mfdcr(rn)                                             \
+       ({unsigned int rval;                                    \
+       if (__builtin_constant_p(rn) && rn < 1024)              \
+-              asm volatile("mfdcr %0," __stringify(rn)        \
+-                            : "=r" (rval));                   \
++              asm volatile("mfdcr %0, %1" : "=r" (rval)       \
++                            : "n" (rn));                      \
+       else if (likely(cpu_has_feature(CPU_FTR_INDEXED_DCR)))  \
+               rval = mfdcrx(rn);                              \
+       else                                                    \
+@@ -75,8 +75,8 @@ static inline void mtdcrx(unsigned int reg, unsigned int val)
+ #define mtdcr(rn, v)                                          \
+ do {                                                          \
+       if (__builtin_constant_p(rn) && rn < 1024)              \
+-              asm volatile("mtdcr " __stringify(rn) ",%0"     \
+-                            : : "r" (v));                     \
++              asm volatile("mtdcr %0, %1"                     \
++                            : : "n" (rn), "r" (v));           \
+       else if (likely(cpu_has_feature(CPU_FTR_INDEXED_DCR)))  \
+               mtdcrx(rn, v);                                  \
+       else                                                    \
+diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
+index 8dab88b85785a..33a594f728de5 100644
+--- a/arch/x86/include/asm/tlbflush.h
++++ b/arch/x86/include/asm/tlbflush.h
+@@ -245,12 +245,15 @@ static inline void __native_flush_tlb_single(unsigned 
long addr)
+        * ASID.  But, userspace flushes are probably much more
+        * important performance-wise.
+        *
+-       * Make sure to do only a single invpcid when KAISER is
+-       * disabled and we have only a single ASID.
++       * In the KAISER disabled case, do an INVLPG to make sure
++       * the mapping is flushed in case it is a global one.
+        */
+-      if (kaiser_enabled)
++      if (kaiser_enabled) {
+               invpcid_flush_one(X86_CR3_PCID_ASID_USER, addr);
+-      invpcid_flush_one(X86_CR3_PCID_ASID_KERN, addr);
++              invpcid_flush_one(X86_CR3_PCID_ASID_KERN, addr);
++      } else {
++              asm volatile("invlpg (%0)" ::"r" (addr) : "memory");
++      }
+ }
+ 
+ static inline void __flush_tlb_all(void)
+diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c
+index 340a1ee79d280..3d5ad2bc809b6 100644
+--- a/drivers/atm/eni.c
++++ b/drivers/atm/eni.c
+@@ -2278,7 +2278,8 @@ out:
+       return rc;
+ 
+ err_eni_release:
+-      eni_do_release(dev);
++      dev->phy = NULL;
++      iounmap(ENI_DEV(dev)->ioaddr);
+ err_unregister:
+       atm_dev_deregister(dev);
+ err_free_consistent:
+diff --git a/drivers/atm/idt77105.c b/drivers/atm/idt77105.c
+index feb023d7eebd6..40644670cff26 100644
+--- a/drivers/atm/idt77105.c
++++ b/drivers/atm/idt77105.c
+@@ -261,7 +261,7 @@ static int idt77105_start(struct atm_dev *dev)
+ {
+       unsigned long flags;
+ 
+-      if (!(dev->dev_data = kmalloc(sizeof(struct idt77105_priv),GFP_KERNEL)))
++      if (!(dev->phy_data = kmalloc(sizeof(struct idt77105_priv),GFP_KERNEL)))
+               return -ENOMEM;
+       PRIV(dev)->dev = dev;
+       spin_lock_irqsave(&idt77105_priv_lock, flags);
+@@ -338,7 +338,7 @@ static int idt77105_stop(struct atm_dev *dev)
+                 else
+                     idt77105_all = walk->next;
+               dev->phy = NULL;
+-                dev->dev_data = NULL;
++                dev->phy_data = NULL;
+                 kfree(walk);
+                 break;
+             }
+diff --git a/drivers/atm/lanai.c b/drivers/atm/lanai.c
+index ce43ae3e87b35..3002b1177005c 100644
+--- a/drivers/atm/lanai.c
++++ b/drivers/atm/lanai.c
+@@ -2239,6 +2239,7 @@ static int lanai_dev_open(struct atm_dev *atmdev)
+       conf1_write(lanai);
+ #endif
+       iounmap(lanai->base);
++      lanai->base = NULL;
+     error_pci:
+       pci_disable_device(lanai->pci);
+     error:
+@@ -2251,6 +2252,8 @@ static int lanai_dev_open(struct atm_dev *atmdev)
+ static void lanai_dev_close(struct atm_dev *atmdev)
+ {
+       struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
++      if (lanai->base==NULL)
++              return;
+       printk(KERN_INFO DEV_LABEL "(itf %d): shutting down interface\n",
+           lanai->number);
+       lanai_timed_poll_stop(lanai);
+@@ -2560,7 +2563,7 @@ static int lanai_init_one(struct pci_dev *pci,
+       struct atm_dev *atmdev;
+       int result;
+ 
+-      lanai = kmalloc(sizeof(*lanai), GFP_KERNEL);
++      lanai = kzalloc(sizeof(*lanai), GFP_KERNEL);
+       if (lanai == NULL) {
+               printk(KERN_ERR DEV_LABEL
+                      ": couldn't allocate dev_data structure!\n");
+diff --git a/drivers/atm/uPD98402.c b/drivers/atm/uPD98402.c
+index 5120a96b3a894..b2f4e8df15911 100644
+--- a/drivers/atm/uPD98402.c
++++ b/drivers/atm/uPD98402.c
+@@ -210,7 +210,7 @@ static void uPD98402_int(struct atm_dev *dev)
+ static int uPD98402_start(struct atm_dev *dev)
+ {
+       DPRINTK("phy_start\n");
+-      if (!(dev->dev_data = kmalloc(sizeof(struct uPD98402_priv),GFP_KERNEL)))
++      if (!(dev->phy_data = kmalloc(sizeof(struct uPD98402_priv),GFP_KERNEL)))
+               return -ENOMEM;
+       spin_lock_init(&PRIV(dev)->lock);
+       memset(&PRIV(dev)->sonet_stats,0,sizeof(struct k_sonet_stats));
+diff --git a/drivers/block/xen-blkback/blkback.c 
b/drivers/block/xen-blkback/blkback.c
+index f9dfcd8872af0..698a52a96d2df 100644
+--- a/drivers/block/xen-blkback/blkback.c
++++ b/drivers/block/xen-blkback/blkback.c
+@@ -919,7 +919,7 @@ next:
+ out:
+       for (i = last_map; i < num; i++) {
+               /* Don't zap current batch's valid persistent grants. */
+-              if(i >= last_map + segs_to_map)
++              if(i >= map_until)
+                       pages[i]->persistent_gnt = NULL;
+               pages[i]->handle = BLKBACK_INVALID_HANDLE;
+       }
+diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c
+index 5012e3ad12256..624f74d03a83a 100644
+--- a/drivers/bus/omap_l3_noc.c
++++ b/drivers/bus/omap_l3_noc.c
+@@ -285,7 +285,7 @@ static int omap_l3_probe(struct platform_device *pdev)
+        */
+       l3->debug_irq = platform_get_irq(pdev, 0);
+       ret = devm_request_irq(l3->dev, l3->debug_irq, l3_interrupt_handler,
+-                             0x0, "l3-dbg-irq", l3);
++                             IRQF_NO_THREAD, "l3-dbg-irq", l3);
+       if (ret) {
+               dev_err(l3->dev, "request_irq failed for %d\n",
+                       l3->debug_irq);
+@@ -294,7 +294,7 @@ static int omap_l3_probe(struct platform_device *pdev)
+ 
+       l3->app_irq = platform_get_irq(pdev, 1);
+       ret = devm_request_irq(l3->dev, l3->app_irq, l3_interrupt_handler,
+-                             0x0, "l3-app-irq", l3);
++                             IRQF_NO_THREAD, "l3-app-irq", l3);
+       if (ret)
+               dev_err(l3->dev, "request_irq failed for %d\n", l3->app_irq);
+ 
+diff --git a/drivers/infiniband/hw/cxgb4/cm.c 
b/drivers/infiniband/hw/cxgb4/cm.c
+index 54fd4d81a3f1f..8d75161854eec 100644
+--- a/drivers/infiniband/hw/cxgb4/cm.c
++++ b/drivers/infiniband/hw/cxgb4/cm.c
+@@ -3441,13 +3441,13 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id)
+           ep->com.local_addr.ss_family == AF_INET) {
+               err = cxgb4_remove_server_filter(
+                       ep->com.dev->rdev.lldi.ports[0], ep->stid,
+-                      ep->com.dev->rdev.lldi.rxq_ids[0], 0);
++                      ep->com.dev->rdev.lldi.rxq_ids[0], false);
+       } else {
+               struct sockaddr_in6 *sin6;
+               c4iw_init_wr_wait(&ep->com.wr_wait);
+               err = cxgb4_remove_server(
+                               ep->com.dev->rdev.lldi.ports[0], ep->stid,
+-                              ep->com.dev->rdev.lldi.rxq_ids[0], 0);
++                              ep->com.dev->rdev.lldi.rxq_ids[0], true);
+               if (err)
+                       goto done;
+               err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait,
+diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
+index 4ead5a18b7940..c41ab2cb272e7 100644
+--- a/drivers/net/can/c_can/c_can.c
++++ b/drivers/net/can/c_can/c_can.c
+@@ -212,18 +212,6 @@ static const struct can_bittiming_const 
c_can_bittiming_const = {
+       .brp_inc = 1,
+ };
+ 
+-static inline void c_can_pm_runtime_enable(const struct c_can_priv *priv)
+-{
+-      if (priv->device)
+-              pm_runtime_enable(priv->device);
+-}
+-
+-static inline void c_can_pm_runtime_disable(const struct c_can_priv *priv)
+-{
+-      if (priv->device)
+-              pm_runtime_disable(priv->device);
+-}
+-
+ static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv)
+ {
+       if (priv->device)
+@@ -1318,7 +1306,6 @@ static const struct net_device_ops c_can_netdev_ops = {
+ 
+ int register_c_can_dev(struct net_device *dev)
+ {
+-      struct c_can_priv *priv = netdev_priv(dev);
+       int err;
+ 
+       /* Deactivate pins to prevent DRA7 DCAN IP from being
+@@ -1328,28 +1315,19 @@ int register_c_can_dev(struct net_device *dev)
+        */
+       pinctrl_pm_select_sleep_state(dev->dev.parent);
+ 
+-      c_can_pm_runtime_enable(priv);
+-
+       dev->flags |= IFF_ECHO; /* we support local echo */
+       dev->netdev_ops = &c_can_netdev_ops;
+ 
+       err = register_candev(dev);
+-      if (err)
+-              c_can_pm_runtime_disable(priv);
+-      else
++      if (!err)
+               devm_can_led_init(dev);
+-
+       return err;
+ }
+ EXPORT_SYMBOL_GPL(register_c_can_dev);
+ 
+ void unregister_c_can_dev(struct net_device *dev)
+ {
+-      struct c_can_priv *priv = netdev_priv(dev);
+-
+       unregister_candev(dev);
+-
+-      c_can_pm_runtime_disable(priv);
+ }
+ EXPORT_SYMBOL_GPL(unregister_c_can_dev);
+ 
+diff --git a/drivers/net/can/c_can/c_can_pci.c 
b/drivers/net/can/c_can/c_can_pci.c
+index d065c0e2d18e6..f3e0b2124a376 100644
+--- a/drivers/net/can/c_can/c_can_pci.c
++++ b/drivers/net/can/c_can/c_can_pci.c
+@@ -239,12 +239,13 @@ static void c_can_pci_remove(struct pci_dev *pdev)
+ {
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct c_can_priv *priv = netdev_priv(dev);
++      void __iomem *addr = priv->base;
+ 
+       unregister_c_can_dev(dev);
+ 
+       free_c_can_dev(dev);
+ 
+-      pci_iounmap(pdev, priv->base);
++      pci_iounmap(pdev, addr);
+       pci_disable_msi(pdev);
+       pci_clear_master(pdev);
+       pci_release_regions(pdev);
+diff --git a/drivers/net/can/c_can/c_can_platform.c 
b/drivers/net/can/c_can/c_can_platform.c
+index 717530eac70c7..c6a03f565e3fc 100644
+--- a/drivers/net/can/c_can/c_can_platform.c
++++ b/drivers/net/can/c_can/c_can_platform.c
+@@ -29,6 +29,7 @@
+ #include <linux/list.h>
+ #include <linux/io.h>
+ #include <linux/platform_device.h>
++#include <linux/pm_runtime.h>
+ #include <linux/clk.h>
+ #include <linux/of.h>
+ #include <linux/of_device.h>
+@@ -385,6 +386,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
+       platform_set_drvdata(pdev, dev);
+       SET_NETDEV_DEV(dev, &pdev->dev);
+ 
++      pm_runtime_enable(priv->device);
+       ret = register_c_can_dev(dev);
+       if (ret) {
+               dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
+@@ -397,6 +399,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
+       return 0;
+ 
+ exit_free_device:
++      pm_runtime_disable(priv->device);
+       free_c_can_dev(dev);
+ exit:
+       dev_err(&pdev->dev, "probe failed\n");
+@@ -407,9 +410,10 @@ exit:
+ static int c_can_plat_remove(struct platform_device *pdev)
+ {
+       struct net_device *dev = platform_get_drvdata(pdev);
++      struct c_can_priv *priv = netdev_priv(dev);
+ 
+       unregister_c_can_dev(dev);
+-
++      pm_runtime_disable(priv->device);
+       free_c_can_dev(dev);
+ 
+       return 0;
+diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
+index 1a79118b008b1..2835aeb11c9fc 100644
+--- a/drivers/net/can/dev.c
++++ b/drivers/net/can/dev.c
+@@ -1054,6 +1054,7 @@ static void can_dellink(struct net_device *dev, struct 
list_head *head)
+ 
+ static struct rtnl_link_ops can_link_ops __read_mostly = {
+       .kind           = "can",
++      .netns_refund   = true,
+       .maxtype        = IFLA_CAN_MAX,
+       .policy         = can_policy,
+       .setup          = can_setup,
+diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
+index 0bd7e71647964..197c27d8f584b 100644
+--- a/drivers/net/can/m_can/m_can.c
++++ b/drivers/net/can/m_can/m_can.c
+@@ -428,9 +428,6 @@ static int m_can_do_rx_poll(struct net_device *dev, int 
quota)
+       }
+ 
+       while ((rxfs & RXFS_FFL_MASK) && (quota > 0)) {
+-              if (rxfs & RXFS_RFL)
+-                      netdev_warn(dev, "Rx FIFO 0 Message Lost\n");
+-
+               m_can_read_fifo(dev, rxfs);
+ 
+               quota--;
+diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
+index 0864f05633a29..a56f4f3a5872c 100644
+--- a/drivers/net/dsa/bcm_sf2.c
++++ b/drivers/net/dsa/bcm_sf2.c
+@@ -1067,8 +1067,10 @@ static u32 bcm_sf2_sw_get_phy_flags(struct dsa_switch 
*ds, int port)
+        * in bits 15:8 and the patch level in bits 7:0 which is exactly what
+        * the REG_PHY_REVISION register layout is.
+        */
+-
+-      return priv->hw_params.gphy_rev;
++      if (priv->int_phy_mask & BIT(port))
++              return priv->hw_params.gphy_rev;
++      else
++              return 0;
+ }
+ 
+ static int bcm_sf2_sw_indir_rw(struct dsa_switch *ds, int op, int addr,
+diff --git a/drivers/net/ethernet/freescale/fec_ptp.c 
b/drivers/net/ethernet/freescale/fec_ptp.c
+index f9e74461bdc0b..1231816125955 100644
+--- a/drivers/net/ethernet/freescale/fec_ptp.c
++++ b/drivers/net/ethernet/freescale/fec_ptp.c
+@@ -396,9 +396,16 @@ static int fec_ptp_gettime(struct ptp_clock_info *ptp, 
struct timespec64 *ts)
+       u64 ns;
+       unsigned long flags;
+ 
++      mutex_lock(&adapter->ptp_clk_mutex);
++      /* Check the ptp clock */
++      if (!adapter->ptp_clk_on) {
++              mutex_unlock(&adapter->ptp_clk_mutex);
++              return -EINVAL;
++      }
+       spin_lock_irqsave(&adapter->tmreg_lock, flags);
+       ns = timecounter_read(&adapter->tc);
+       spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
++      mutex_unlock(&adapter->ptp_clk_mutex);
+ 
+       *ts = ns_to_timespec64(ns);
+ 
+diff --git a/drivers/net/ethernet/intel/e1000e/82571.c 
b/drivers/net/ethernet/intel/e1000e/82571.c
+index 5f7016442ec4f..e486f351a54a3 100644
+--- a/drivers/net/ethernet/intel/e1000e/82571.c
++++ b/drivers/net/ethernet/intel/e1000e/82571.c
+@@ -917,6 +917,8 @@ static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw 
*hw, bool active)
+       } else {
+               data &= ~IGP02E1000_PM_D0_LPLU;
+               ret_val = e1e_wphy(hw, IGP02E1000_PHY_POWER_MGMT, data);
++              if (ret_val)
++                      return ret_val;
+               /* LPLU and SmartSpeed are mutually exclusive.  LPLU is used
+                * during Dx states where the power conservation is most
+                * important.  During driver activity we should enable
+diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c 
b/drivers/net/ethernet/intel/e1000e/netdev.c
+index 3bd0bdbdfa0e1..a8ee20ecb3ad5 100644
+--- a/drivers/net/ethernet/intel/e1000e/netdev.c
++++ b/drivers/net/ethernet/intel/e1000e/netdev.c
+@@ -5875,15 +5875,19 @@ static void e1000_reset_task(struct work_struct *work)
+       struct e1000_adapter *adapter;
+       adapter = container_of(work, struct e1000_adapter, reset_task);
+ 
++      rtnl_lock();
+       /* don't run the task if already down */
+-      if (test_bit(__E1000_DOWN, &adapter->state))
++      if (test_bit(__E1000_DOWN, &adapter->state)) {
++              rtnl_unlock();
+               return;
++      }
+ 
+       if (!(adapter->flags & FLAG_RESTART_NOW)) {
+               e1000e_dump(adapter);
+               e_err("Reset adapter unexpectedly\n");
+       }
+       e1000e_reinit_locked(adapter);
++      rtnl_unlock();
+ }
+ 
+ /**
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
+index 5174e0bd75d1e..625336264a44b 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
+@@ -1426,6 +1426,7 @@ void qlcnic_83xx_get_minidump_template(struct 
qlcnic_adapter *adapter)
+ 
+       if (fw_dump->tmpl_hdr == NULL || current_version > prev_version) {
+               vfree(fw_dump->tmpl_hdr);
++              fw_dump->tmpl_hdr = NULL;
+ 
+               if (qlcnic_83xx_md_check_extended_dump_capability(adapter))
+                       extended = !qlcnic_83xx_extend_md_capab(adapter);
+@@ -1444,6 +1445,8 @@ void qlcnic_83xx_get_minidump_template(struct 
qlcnic_adapter *adapter)
+                       struct qlcnic_83xx_dump_template_hdr *hdr;
+ 
+                       hdr = fw_dump->tmpl_hdr;
++                      if (!hdr)
++                              return;
+                       hdr->drv_cap_mask = 0x1f;
+                       fw_dump->cap_mask = 0x1f;
+                       dev_info(&pdev->dev,
+diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
+index 85f3a2c0d4dde..cc3b025ab7a78 100644
+--- a/drivers/net/ethernet/sun/niu.c
++++ b/drivers/net/ethernet/sun/niu.c
+@@ -3948,8 +3948,6 @@ static void niu_xmac_interrupt(struct niu *np)
+               mp->rx_mcasts += RXMAC_MC_FRM_CNT_COUNT;
+       if (val & XRXMAC_STATUS_RXBCAST_CNT_EXP)
+               mp->rx_bcasts += RXMAC_BC_FRM_CNT_COUNT;
+-      if (val & XRXMAC_STATUS_RXBCAST_CNT_EXP)
+-              mp->rx_bcasts += RXMAC_BC_FRM_CNT_COUNT;
+       if (val & XRXMAC_STATUS_RXHIST1_CNT_EXP)
+               mp->rx_hist_cnt1 += RXMAC_HIST_CNT1_COUNT;
+       if (val & XRXMAC_STATUS_RXHIST2_CNT_EXP)
+diff --git a/drivers/net/ethernet/tehuti/tehuti.c 
b/drivers/net/ethernet/tehuti/tehuti.c
+index 14c9d1baa85ce..19c832aaecf06 100644
+--- a/drivers/net/ethernet/tehuti/tehuti.c
++++ b/drivers/net/ethernet/tehuti/tehuti.c
+@@ -2068,6 +2068,7 @@ bdx_probe(struct pci_dev *pdev, const struct 
pci_device_id *ent)
+               /*bdx_hw_reset(priv); */
+               if (bdx_read_mac(priv)) {
+                       pr_err("load MAC address failed\n");
++                      err = -EFAULT;
+                       goto err_out_iomap;
+               }
+               SET_NETDEV_DEV(ndev, &pdev->dev);
+diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c
+index ff2270ead2e68..84e0e7f780297 100644
+--- a/drivers/net/usb/cdc-phonet.c
++++ b/drivers/net/usb/cdc-phonet.c
+@@ -406,6 +406,8 @@ static int usbpn_probe(struct usb_interface *intf, const 
struct usb_device_id *i
+ 
+       err = register_netdev(dev);
+       if (err) {
++              /* Set disconnected flag so that disconnect() returns early. */
++              pnd->disconnected = 1;
+               usb_driver_release_interface(&usbpn_driver, data_intf);
+               goto out;
+       }
+diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig
+index c3428767332c2..55ebf9f4a824e 100644
+--- a/fs/nfs/Kconfig
++++ b/fs/nfs/Kconfig
+@@ -132,7 +132,7 @@ config PNFS_OBJLAYOUT
+ config PNFS_FLEXFILE_LAYOUT
+       tristate
+       depends on NFS_V4_1 && NFS_V3
+-      default m
++      default NFS_V4
+ 
+ config NFS_V4_1_IMPLEMENTATION_ID_DOMAIN
+       string "NFSv4.1 Implementation ID Domain"
+diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c
+index 267126d32ec0f..4a68837e92ea4 100644
+--- a/fs/nfs/nfs3xdr.c
++++ b/fs/nfs/nfs3xdr.c
+@@ -33,6 +33,7 @@
+  */
+ #define NFS3_fhandle_sz               (1+16)
+ #define NFS3_fh_sz            (NFS3_fhandle_sz)       /* shorthand */
++#define NFS3_post_op_fh_sz    (1+NFS3_fh_sz)
+ #define NFS3_sattr_sz         (15)
+ #define NFS3_filename_sz      (1+(NFS3_MAXNAMLEN>>2))
+ #define NFS3_path_sz          (1+(NFS3_MAXPATHLEN>>2))
+@@ -70,7 +71,7 @@
+ #define NFS3_readlinkres_sz   (1+NFS3_post_op_attr_sz+1)
+ #define NFS3_readres_sz               (1+NFS3_post_op_attr_sz+3)
+ #define NFS3_writeres_sz      (1+NFS3_wcc_data_sz+4)
+-#define NFS3_createres_sz     
(1+NFS3_fh_sz+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
++#define NFS3_createres_sz     
(1+NFS3_post_op_fh_sz+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
+ #define NFS3_renameres_sz     (1+(2 * NFS3_wcc_data_sz))
+ #define NFS3_linkres_sz               
(1+NFS3_post_op_attr_sz+NFS3_wcc_data_sz)
+ #define NFS3_readdirres_sz    (1+NFS3_post_op_attr_sz+2)
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 0c9386978d9d8..92ca753723b5e 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -4848,6 +4848,9 @@ static int __nfs4_proc_set_acl(struct inode *inode, 
const void *buf, size_t bufl
+       unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE);
+       int ret, i;
+ 
++      /* You can't remove system.nfs4_acl: */
++      if (buflen == 0)
++              return -EINVAL;
+       if (!nfs4_server_supports_acls(server))
+               return -EOPNOTSUPP;
+       if (npages > ARRAY_SIZE(pages))
+diff --git a/fs/squashfs/export.c b/fs/squashfs/export.c
+index d2a806416c3ab..1d406a2094a56 100644
+--- a/fs/squashfs/export.c
++++ b/fs/squashfs/export.c
+@@ -165,14 +165,18 @@ __le64 *squashfs_read_inode_lookup_table(struct 
super_block *sb,
+               start = le64_to_cpu(table[n]);
+               end = le64_to_cpu(table[n + 1]);
+ 
+-              if (start >= end || (end - start) > SQUASHFS_METADATA_SIZE) {
++              if (start >= end
++                  || (end - start) >
++                  (SQUASHFS_METADATA_SIZE + SQUASHFS_BLOCK_OFFSET)) {
+                       kfree(table);
+                       return ERR_PTR(-EINVAL);
+               }
+       }
+ 
+       start = le64_to_cpu(table[indexes - 1]);
+-      if (start >= lookup_table_start || (lookup_table_start - start) > 
SQUASHFS_METADATA_SIZE) {
++      if (start >= lookup_table_start ||
++          (lookup_table_start - start) >
++          (SQUASHFS_METADATA_SIZE + SQUASHFS_BLOCK_OFFSET)) {
+               kfree(table);
+               return ERR_PTR(-EINVAL);
+       }
+diff --git a/fs/squashfs/id.c b/fs/squashfs/id.c
+index 8ccc0e3f6ea5a..d2e15baab5378 100644
+--- a/fs/squashfs/id.c
++++ b/fs/squashfs/id.c
+@@ -110,14 +110,16 @@ __le64 *squashfs_read_id_index_table(struct super_block 
*sb,
+               start = le64_to_cpu(table[n]);
+               end = le64_to_cpu(table[n + 1]);
+ 
+-              if (start >= end || (end - start) > SQUASHFS_METADATA_SIZE) {
++              if (start >= end || (end - start) >
++                              (SQUASHFS_METADATA_SIZE + 
SQUASHFS_BLOCK_OFFSET)) {
+                       kfree(table);
+                       return ERR_PTR(-EINVAL);
+               }
+       }
+ 
+       start = le64_to_cpu(table[indexes - 1]);
+-      if (start >= id_table_start || (id_table_start - start) > 
SQUASHFS_METADATA_SIZE) {
++      if (start >= id_table_start || (id_table_start - start) >
++                              (SQUASHFS_METADATA_SIZE + 
SQUASHFS_BLOCK_OFFSET)) {
+               kfree(table);
+               return ERR_PTR(-EINVAL);
+       }
+diff --git a/fs/squashfs/squashfs_fs.h b/fs/squashfs/squashfs_fs.h
+index e66486366f025..2fd1262cc1bd4 100644
+--- a/fs/squashfs/squashfs_fs.h
++++ b/fs/squashfs/squashfs_fs.h
+@@ -30,6 +30,7 @@
+ 
+ /* size of metadata (inode and directory) blocks */
+ #define SQUASHFS_METADATA_SIZE                8192
++#define SQUASHFS_BLOCK_OFFSET         2
+ 
+ /* default size of block device I/O */
+ #ifdef CONFIG_SQUASHFS_4K_DEVBLK_SIZE
+diff --git a/fs/squashfs/xattr_id.c b/fs/squashfs/xattr_id.c
+index 3a655d879600c..7f718d2bf3579 100644
+--- a/fs/squashfs/xattr_id.c
++++ b/fs/squashfs/xattr_id.c
+@@ -122,14 +122,16 @@ __le64 *squashfs_read_xattr_id_table(struct super_block 
*sb, u64 table_start,
+               start = le64_to_cpu(table[n]);
+               end = le64_to_cpu(table[n + 1]);
+ 
+-              if (start >= end || (end - start) > SQUASHFS_METADATA_SIZE) {
++              if (start >= end || (end - start) >
++                              (SQUASHFS_METADATA_SIZE + 
SQUASHFS_BLOCK_OFFSET)) {
+                       kfree(table);
+                       return ERR_PTR(-EINVAL);
+               }
+       }
+ 
+       start = le64_to_cpu(table[indexes - 1]);
+-      if (start >= table_start || (table_start - start) > 
SQUASHFS_METADATA_SIZE) {
++      if (start >= table_start || (table_start - start) >
++                              (SQUASHFS_METADATA_SIZE + 
SQUASHFS_BLOCK_OFFSET)) {
+               kfree(table);
+               return ERR_PTR(-EINVAL);
+       }
+diff --git a/include/linux/if_macvlan.h b/include/linux/if_macvlan.h
+index a4ccc3122f938..cfcbc49f4ddfa 100644
+--- a/include/linux/if_macvlan.h
++++ b/include/linux/if_macvlan.h
+@@ -70,13 +70,14 @@ static inline void macvlan_count_rx(const struct 
macvlan_dev *vlan,
+       if (likely(success)) {
+               struct vlan_pcpu_stats *pcpu_stats;
+ 
+-              pcpu_stats = this_cpu_ptr(vlan->pcpu_stats);
++              pcpu_stats = get_cpu_ptr(vlan->pcpu_stats);
+               u64_stats_update_begin(&pcpu_stats->syncp);
+               pcpu_stats->rx_packets++;
+               pcpu_stats->rx_bytes += len;
+               if (multicast)
+                       pcpu_stats->rx_multicast++;
+               u64_stats_update_end(&pcpu_stats->syncp);
++              put_cpu_ptr(vlan->pcpu_stats);
+       } else {
+               this_cpu_inc(vlan->pcpu_stats->rx_errors);
+       }
+diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h
+index df89c9bcba7db..7b38288dc2390 100644
+--- a/include/linux/u64_stats_sync.h
++++ b/include/linux/u64_stats_sync.h
+@@ -68,12 +68,13 @@ struct u64_stats_sync {
+ };
+ 
+ 
++#if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
++#define u64_stats_init(syncp) seqcount_init(&(syncp)->seq)
++#else
+ static inline void u64_stats_init(struct u64_stats_sync *syncp)
+ {
+-#if BITS_PER_LONG == 32 && defined(CONFIG_SMP)
+-      seqcount_init(&syncp->seq);
+-#endif
+ }
++#endif
+ 
+ static inline void u64_stats_update_begin(struct u64_stats_sync *syncp)
+ {
+diff --git a/include/net/red.h b/include/net/red.h
+index 17821f66de111..b3ab5c6bfa83f 100644
+--- a/include/net/red.h
++++ b/include/net/red.h
+@@ -167,7 +167,8 @@ static inline void red_set_vars(struct red_vars *v)
+       v->qcount       = -1;
+ }
+ 
+-static inline bool red_check_params(u32 qth_min, u32 qth_max, u8 Wlog, u8 
Scell_log)
++static inline bool red_check_params(u32 qth_min, u32 qth_max, u8 Wlog,
++                                  u8 Scell_log, u8 *stab)
+ {
+       if (fls(qth_min) + Wlog > 32)
+               return false;
+@@ -177,6 +178,13 @@ static inline bool red_check_params(u32 qth_min, u32 
qth_max, u8 Wlog, u8 Scell_
+               return false;
+       if (qth_max < qth_min)
+               return false;
++      if (stab) {
++              int i;
++
++              for (i = 0; i < RED_STAB_SIZE; i++)
++                      if (stab[i] >= 32)
++                              return false;
++      }
+       return true;
+ }
+ 
+diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h
+index 2f87c1ba13de6..baa977247dc92 100644
+--- a/include/net/rtnetlink.h
++++ b/include/net/rtnetlink.h
+@@ -28,6 +28,7 @@ static inline int rtnl_msg_family(const struct nlmsghdr *nlh)
+  *
+  *    @list: Used internally
+  *    @kind: Identifier
++ *    @netns_refund: Physical device, move to init_net on netns exit
+  *    @maxtype: Highest device specific netlink attribute number
+  *    @policy: Netlink policy for device specific attribute validation
+  *    @validate: Optional validation function for netlink/changelink 
parameters
+@@ -81,6 +82,7 @@ struct rtnl_link_ops {
+       unsigned int            (*get_num_tx_queues)(void);
+       unsigned int            (*get_num_rx_queues)(void);
+ 
++      bool                    netns_refund;
+       int                     slave_maxtype;
+       const struct nla_policy *slave_policy;
+       int                     (*slave_validate)(struct nlattr *tb[],
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 59157e9686fb2..6fd356e722118 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -7773,7 +7773,7 @@ static void __net_exit default_device_exit(struct net 
*net)
+                       continue;
+ 
+               /* Leave virtual devices for the generic cleanup */
+-              if (dev->rtnl_link_ops)
++              if (dev->rtnl_link_ops && !dev->rtnl_link_ops->netns_refund)
+                       continue;
+ 
+               /* Push remaining network devices to init_net */
+diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
+index 8360fda24bca0..eac20f4ab9248 100644
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -2448,14 +2448,14 @@ static int ieee80211_set_bitrate_mask(struct wiphy 
*wiphy,
+                       continue;
+ 
+               for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
+-                      if (~sdata->rc_rateidx_mcs_mask[i][j]) {
++                      if (sdata->rc_rateidx_mcs_mask[i][j] != 0xff) {
+                               sdata->rc_has_mcs_mask[i] = true;
+                               break;
+                       }
+               }
+ 
+               for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
+-                      if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) {
++                      if (sdata->rc_rateidx_vht_mcs_mask[i][j] != 0xffff) {
+                               sdata->rc_has_vht_mcs_mask[i] = true;
+                               break;
+                       }
+diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
+index f2af19673b26a..50fa92fe7d246 100644
+--- a/net/mac80211/ibss.c
++++ b/net/mac80211/ibss.c
+@@ -1860,6 +1860,8 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data 
*sdata)
+ 
+       /* remove beacon */
+       kfree(sdata->u.ibss.ie);
++      sdata->u.ibss.ie = NULL;
++      sdata->u.ibss.ie_len = 0;
+ 
+       /* on the next join, re-program HT parameters */
+       memset(&ifibss->ht_capa, 0, sizeof(ifibss->ht_capa));
+diff --git a/net/sched/sch_choke.c b/net/sched/sch_choke.c
+index fbdae062b2859..fee59e25929c1 100644
+--- a/net/sched/sch_choke.c
++++ b/net/sched/sch_choke.c
+@@ -423,6 +423,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr 
*opt)
+       struct sk_buff **old = NULL;
+       unsigned int mask;
+       u32 max_P;
++      u8 *stab;
+ 
+       if (opt == NULL)
+               return -EINVAL;
+@@ -438,8 +439,8 @@ static int choke_change(struct Qdisc *sch, struct nlattr 
*opt)
+       max_P = tb[TCA_CHOKE_MAX_P] ? nla_get_u32(tb[TCA_CHOKE_MAX_P]) : 0;
+ 
+       ctl = nla_data(tb[TCA_CHOKE_PARMS]);
+-
+-      if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, 
ctl->Scell_log))
++      stab = nla_data(tb[TCA_CHOKE_STAB]);
++      if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, 
ctl->Scell_log, stab))
+               return -EINVAL;
+ 
+       if (ctl->limit > CHOKE_MAX_QUEUE)
+@@ -492,7 +493,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr 
*opt)
+ 
+       red_set_parms(&q->parms, ctl->qth_min, ctl->qth_max, ctl->Wlog,
+                     ctl->Plog, ctl->Scell_log,
+-                    nla_data(tb[TCA_CHOKE_STAB]),
++                    stab,
+                     max_P);
+       red_set_vars(&q->vars);
+ 
+diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
+index 7af75caf0703d..2f73232031c63 100644
+--- a/net/sched/sch_gred.c
++++ b/net/sched/sch_gred.c
+@@ -389,7 +389,7 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp,
+       struct gred_sched *table = qdisc_priv(sch);
+       struct gred_sched_data *q = table->tab[dp];
+ 
+-      if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, 
ctl->Scell_log))
++      if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, 
ctl->Scell_log, stab))
+               return -EINVAL;
+ 
+       if (!q) {
+diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c
+index 842e0b103c3ed..ac85792038c41 100644
+--- a/net/sched/sch_red.c
++++ b/net/sched/sch_red.c
+@@ -188,6 +188,7 @@ static int red_change(struct Qdisc *sch, struct nlattr 
*opt)
+       struct Qdisc *child = NULL;
+       int err;
+       u32 max_P;
++      u8 *stab;
+ 
+       if (opt == NULL)
+               return -EINVAL;
+@@ -203,7 +204,9 @@ static int red_change(struct Qdisc *sch, struct nlattr 
*opt)
+       max_P = tb[TCA_RED_MAX_P] ? nla_get_u32(tb[TCA_RED_MAX_P]) : 0;
+ 
+       ctl = nla_data(tb[TCA_RED_PARMS]);
+-      if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog, 
ctl->Scell_log))
++      stab = nla_data(tb[TCA_RED_STAB]);
++      if (!red_check_params(ctl->qth_min, ctl->qth_max, ctl->Wlog,
++                            ctl->Scell_log, stab))
+               return -EINVAL;
+ 
+       if (ctl->limit > 0) {
+@@ -225,7 +228,7 @@ static int red_change(struct Qdisc *sch, struct nlattr 
*opt)
+       red_set_parms(&q->parms,
+                     ctl->qth_min, ctl->qth_max, ctl->Wlog,
+                     ctl->Plog, ctl->Scell_log,
+-                    nla_data(tb[TCA_RED_STAB]),
++                    stab,
+                     max_P);
+       red_set_vars(&q->vars);
+ 
+diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
+index 24cf18ebb8740..0b27487fd07d7 100644
+--- a/net/sched/sch_sfq.c
++++ b/net/sched/sch_sfq.c
+@@ -645,7 +645,7 @@ static int sfq_change(struct Qdisc *sch, struct nlattr 
*opt)
+       }
+ 
+       if (ctl_v1 && !red_check_params(ctl_v1->qth_min, ctl_v1->qth_max,
+-                                      ctl_v1->Wlog, ctl_v1->Scell_log))
++                                      ctl_v1->Wlog, ctl_v1->Scell_log, NULL))
+               return -EINVAL;
+       if (ctl_v1 && ctl_v1->qth_min) {
+               p = kmalloc(sizeof(*p), GFP_KERNEL);
+diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c
+index 4b898b15643de..80e461dd2db27 100644
+--- a/tools/perf/util/auxtrace.c
++++ b/tools/perf/util/auxtrace.c
+@@ -239,10 +239,6 @@ static int auxtrace_queues__add_buffer(struct 
auxtrace_queues *queues,
+               queue->set = true;
+               queue->tid = buffer->tid;
+               queue->cpu = buffer->cpu;
+-      } else if (buffer->cpu != queue->cpu || buffer->tid != queue->tid) {
+-              pr_err("auxtrace queue conflict: cpu %d, tid %d vs cpu %d, tid 
%d\n",
+-                     queue->cpu, queue->tid, buffer->cpu, buffer->tid);
+-              return -EINVAL;
+       }
+ 
+       buffer->buffer_nr = queues->next_buffer_nr++;

Reply via email to