commit:     1a06f87bb5ffd5d240e4b6a0e74e4a57fab1bd2f
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 24 13:38:56 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Nov 24 13:38:56 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=1a06f87b

Linux patch 4.9.246

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

 0000_README              |    4 +
 1245_linux-4.9.246.patch | 1306 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1310 insertions(+)

diff --git a/0000_README b/0000_README
index 99cf3b9..e3bb8b3 100644
--- a/0000_README
+++ b/0000_README
@@ -1023,6 +1023,10 @@ Patch:  1244_linux-4.9.245.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.9.245
 
+Patch:  1245_linux-4.9.246.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.9.246
+
 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/1245_linux-4.9.246.patch b/1245_linux-4.9.246.patch
new file mode 100644
index 0000000..a0603af
--- /dev/null
+++ b/1245_linux-4.9.246.patch
@@ -0,0 +1,1306 @@
+diff --git a/Makefile b/Makefile
+index b72f286d3bcdd..b9e2a97da5da7 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 245
++SUBLEVEL = 246
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+ 
+diff --git a/arch/arm/boot/dts/imx50-evk.dts b/arch/arm/boot/dts/imx50-evk.dts
+index 27d763c7a307d..4dbd180e72ba6 100644
+--- a/arch/arm/boot/dts/imx50-evk.dts
++++ b/arch/arm/boot/dts/imx50-evk.dts
+@@ -66,7 +66,7 @@
+                               MX50_PAD_CSPI_MISO__CSPI_MISO           0x00
+                               MX50_PAD_CSPI_MOSI__CSPI_MOSI           0x00
+                               MX50_PAD_CSPI_SS0__GPIO4_11             0xc4
+-                              MX50_PAD_ECSPI1_MOSI__CSPI_SS1          0xf4
++                              MX50_PAD_ECSPI1_MOSI__GPIO4_13          0x84
+                       >;
+               };
+ 
+diff --git a/arch/arm/boot/dts/imx6qdl-udoo.dtsi 
b/arch/arm/boot/dts/imx6qdl-udoo.dtsi
+index c96c91d836785..fc4ae2e423bd7 100644
+--- a/arch/arm/boot/dts/imx6qdl-udoo.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-udoo.dtsi
+@@ -94,7 +94,7 @@
+ &fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+-      phy-mode = "rgmii";
++      phy-mode = "rgmii-id";
+       status = "okay";
+ };
+ 
+diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
+index e3713d6fb8e00..bf6142a80cf1a 100644
+--- a/arch/arm64/kernel/psci.c
++++ b/arch/arm64/kernel/psci.c
+@@ -68,7 +68,6 @@ static int cpu_psci_cpu_disable(unsigned int cpu)
+ 
+ static void cpu_psci_cpu_die(unsigned int cpu)
+ {
+-      int ret;
+       /*
+        * There are no known implementations of PSCI actually using the
+        * power state field, pass a sensible default for now.
+@@ -76,9 +75,7 @@ static void cpu_psci_cpu_die(unsigned int cpu)
+       u32 state = PSCI_POWER_STATE_TYPE_POWER_DOWN <<
+                   PSCI_0_2_POWER_STATE_TYPE_SHIFT;
+ 
+-      ret = psci_ops.cpu_off(state);
+-
+-      pr_crit("unable to power off CPU%u (%d)\n", cpu, ret);
++      psci_ops.cpu_off(state);
+ }
+ 
+ static int cpu_psci_cpu_kill(unsigned int cpu)
+diff --git a/arch/mips/alchemy/common/clock.c 
b/arch/mips/alchemy/common/clock.c
+index 7ba7ea0a22f80..e6d0044393b08 100644
+--- a/arch/mips/alchemy/common/clock.c
++++ b/arch/mips/alchemy/common/clock.c
+@@ -151,6 +151,7 @@ static struct clk __init *alchemy_clk_setup_cpu(const char 
*parent_name,
+ {
+       struct clk_init_data id;
+       struct clk_hw *h;
++      struct clk *clk;
+ 
+       h = kzalloc(sizeof(*h), GFP_KERNEL);
+       if (!h)
+@@ -163,7 +164,13 @@ static struct clk __init *alchemy_clk_setup_cpu(const 
char *parent_name,
+       id.ops = &alchemy_clkops_cpu;
+       h->init = &id;
+ 
+-      return clk_register(NULL, h);
++      clk = clk_register(NULL, h);
++      if (IS_ERR(clk)) {
++              pr_err("failed to register clock\n");
++              kfree(h);
++      }
++
++      return clk;
+ }
+ 
+ /* AUXPLLs ************************************************************/
+diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
+index 0596505770dba..11985399c4695 100644
+--- a/arch/mips/mm/tlb-r4k.c
++++ b/arch/mips/mm/tlb-r4k.c
+@@ -424,6 +424,7 @@ int has_transparent_hugepage(void)
+       }
+       return mask == PM_HUGE_MASK;
+ }
++EXPORT_SYMBOL(has_transparent_hugepage);
+ 
+ #endif /* CONFIG_TRANSPARENT_HUGEPAGE  */
+ 
+diff --git a/arch/powerpc/include/asm/book3s/64/kup-radix.h 
b/arch/powerpc/include/asm/book3s/64/kup-radix.h
+index aa54ac2e5659e..cce8e7497d72b 100644
+--- a/arch/powerpc/include/asm/book3s/64/kup-radix.h
++++ b/arch/powerpc/include/asm/book3s/64/kup-radix.h
+@@ -1,6 +1,7 @@
+ /* SPDX-License-Identifier: GPL-2.0 */
+ #ifndef _ASM_POWERPC_BOOK3S_64_KUP_RADIX_H
+ #define _ASM_POWERPC_BOOK3S_64_KUP_RADIX_H
++#include <linux/jump_label.h>
+ 
+ DECLARE_STATIC_KEY_FALSE(uaccess_flush_key);
+ 
+diff --git a/arch/s390/kernel/perf_cpum_sf.c b/arch/s390/kernel/perf_cpum_sf.c
+index c62eb09b2ba7b..427b70397fcd3 100644
+--- a/arch/s390/kernel/perf_cpum_sf.c
++++ b/arch/s390/kernel/perf_cpum_sf.c
+@@ -1663,4 +1663,4 @@ out:
+       return err;
+ }
+ arch_initcall(init_cpum_sampling_pmu);
+-core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0640);
++core_param(cpum_sfb_size, CPUM_SF_MAX_SDB, sfb_size, 0644);
+diff --git a/arch/x86/kernel/cpu/microcode/intel.c 
b/arch/x86/kernel/cpu/microcode/intel.c
+index 1308abfc47580..0939151a42a9d 100644
+--- a/arch/x86/kernel/cpu/microcode/intel.c
++++ b/arch/x86/kernel/cpu/microcode/intel.c
+@@ -147,51 +147,6 @@ load_microcode(struct mc_saved_data *mcs, unsigned long 
*mc_ptrs,
+       }
+ }
+ 
+-/*
+- * Given CPU signature and a microcode patch, this function finds if the
+- * microcode patch has matching family and model with the CPU.
+- */
+-static enum ucode_state
+-matching_model_microcode(struct microcode_header_intel *mc_header,
+-                      unsigned long sig)
+-{
+-      unsigned int fam, model;
+-      unsigned int fam_ucode, model_ucode;
+-      struct extended_sigtable *ext_header;
+-      unsigned long total_size = get_totalsize(mc_header);
+-      unsigned long data_size = get_datasize(mc_header);
+-      int ext_sigcount, i;
+-      struct extended_signature *ext_sig;
+-
+-      fam   = x86_family(sig);
+-      model = x86_model(sig);
+-
+-      fam_ucode   = x86_family(mc_header->sig);
+-      model_ucode = x86_model(mc_header->sig);
+-
+-      if (fam == fam_ucode && model == model_ucode)
+-              return UCODE_OK;
+-
+-      /* Look for ext. headers: */
+-      if (total_size <= data_size + MC_HEADER_SIZE)
+-              return UCODE_NFOUND;
+-
+-      ext_header   = (void *) mc_header + data_size + MC_HEADER_SIZE;
+-      ext_sig      = (void *)ext_header + EXT_HEADER_SIZE;
+-      ext_sigcount = ext_header->count;
+-
+-      for (i = 0; i < ext_sigcount; i++) {
+-              fam_ucode   = x86_family(ext_sig->sig);
+-              model_ucode = x86_model(ext_sig->sig);
+-
+-              if (fam == fam_ucode && model == model_ucode)
+-                      return UCODE_OK;
+-
+-              ext_sig++;
+-      }
+-      return UCODE_NFOUND;
+-}
+-
+ static int
+ save_microcode(struct mc_saved_data *mcs,
+              struct microcode_intel **mc_saved_src,
+@@ -332,7 +287,8 @@ get_matching_model_microcode(unsigned long start, void 
*data, size_t size,
+                * the platform, we need to find and save microcode patches
+                * with the same family and model as the BSP.
+                */
+-              if (matching_model_microcode(mc_header, uci->cpu_sig.sig) != 
UCODE_OK) {
++              if (!find_matching_signature(mc_header, uci->cpu_sig.sig,
++                                           uci->cpu_sig.pf)) {
+                       ucode_ptr += mc_size;
+                       continue;
+               }
+diff --git a/arch/xtensa/mm/cache.c b/arch/xtensa/mm/cache.c
+index 3c75c4e597da8..7aaedeebb35dd 100644
+--- a/arch/xtensa/mm/cache.c
++++ b/arch/xtensa/mm/cache.c
+@@ -74,8 +74,10 @@ static inline void kmap_invalidate_coherent(struct page 
*page,
+                       kvaddr = TLBTEMP_BASE_1 +
+                               (page_to_phys(page) & DCACHE_ALIAS_MASK);
+ 
++                      preempt_disable();
+                       __invalidate_dcache_page_alias(kvaddr,
+                                                      page_to_phys(page));
++                      preempt_enable();
+               }
+       }
+ }
+@@ -160,6 +162,7 @@ void flush_dcache_page(struct page *page)
+               if (!alias && !mapping)
+                       return;
+ 
++              preempt_disable();
+               virt = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
+               __flush_invalidate_dcache_page_alias(virt, phys);
+ 
+@@ -170,6 +173,7 @@ void flush_dcache_page(struct page *page)
+ 
+               if (mapping)
+                       __invalidate_icache_page_alias(virt, phys);
++              preempt_enable();
+       }
+ 
+       /* There shouldn't be an entry in the cache for this page anymore. */
+@@ -203,8 +207,10 @@ void local_flush_cache_page(struct vm_area_struct *vma, 
unsigned long address,
+       unsigned long phys = page_to_phys(pfn_to_page(pfn));
+       unsigned long virt = TLBTEMP_BASE_1 + (address & DCACHE_ALIAS_MASK);
+ 
++      preempt_disable();
+       __flush_invalidate_dcache_page_alias(virt, phys);
+       __invalidate_icache_page_alias(virt, phys);
++      preempt_enable();
+ }
+ EXPORT_SYMBOL(local_flush_cache_page);
+ 
+@@ -231,11 +237,13 @@ update_mmu_cache(struct vm_area_struct * vma, unsigned 
long addr, pte_t *ptep)
+               unsigned long phys = page_to_phys(page);
+               unsigned long tmp;
+ 
++              preempt_disable();
+               tmp = TLBTEMP_BASE_1 + (phys & DCACHE_ALIAS_MASK);
+               __flush_invalidate_dcache_page_alias(tmp, phys);
+               tmp = TLBTEMP_BASE_1 + (addr & DCACHE_ALIAS_MASK);
+               __flush_invalidate_dcache_page_alias(tmp, phys);
+               __invalidate_icache_page_alias(tmp, phys);
++              preempt_enable();
+ 
+               clear_bit(PG_arch_1, &page->flags);
+       }
+@@ -269,7 +277,9 @@ void copy_to_user_page(struct vm_area_struct *vma, struct 
page *page,
+ 
+       if (alias) {
+               unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
++              preempt_disable();
+               __flush_invalidate_dcache_page_alias(t, phys);
++              preempt_enable();
+       }
+ 
+       /* Copy data */
+@@ -284,9 +294,11 @@ void copy_to_user_page(struct vm_area_struct *vma, struct 
page *page,
+       if (alias) {
+               unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
+ 
++              preempt_disable();
+               __flush_invalidate_dcache_range((unsigned long) dst, len);
+               if ((vma->vm_flags & VM_EXEC) != 0)
+                       __invalidate_icache_page_alias(t, phys);
++              preempt_enable();
+ 
+       } else if ((vma->vm_flags & VM_EXEC) != 0) {
+               __flush_dcache_range((unsigned long)dst,len);
+@@ -308,7 +320,9 @@ extern void copy_from_user_page(struct vm_area_struct 
*vma, struct page *page,
+ 
+       if (alias) {
+               unsigned long t = TLBTEMP_BASE_1 + (vaddr & DCACHE_ALIAS_MASK);
++              preempt_disable();
+               __flush_invalidate_dcache_page_alias(t, phys);
++              preempt_enable();
+       }
+ 
+       memcpy(dst, src, len);
+diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
+index c7296b5837873..8bcd09fb0feb9 100644
+--- a/drivers/atm/nicstar.c
++++ b/drivers/atm/nicstar.c
+@@ -1707,6 +1707,8 @@ static int ns_send(struct atm_vcc *vcc, struct sk_buff 
*skb)
+ 
+       if (push_scqe(card, vc, scq, &scqe, skb) != 0) {
+               atomic_inc(&vcc->stats->tx_err);
++              dma_unmap_single(&card->pcidev->dev, NS_PRV_DMA(skb), skb->len,
++                               DMA_TO_DEVICE);
+               dev_kfree_skb_any(skb);
+               return -EIO;
+       }
+diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
+index 780f886ccbfe9..261fbdb88fe15 100644
+--- a/drivers/iio/accel/kxcjk-1013.c
++++ b/drivers/iio/accel/kxcjk-1013.c
+@@ -91,6 +91,11 @@ enum kx_chipset {
+       KX_MAX_CHIPS /* this must be last */
+ };
+ 
++enum kx_acpi_type {
++      ACPI_GENERIC,
++      ACPI_SMO8500,
++};
++
+ struct kxcjk1013_data {
+       struct i2c_client *client;
+       struct iio_trigger *dready_trig;
+@@ -107,7 +112,7 @@ struct kxcjk1013_data {
+       bool motion_trigger_on;
+       int64_t timestamp;
+       enum kx_chipset chipset;
+-      bool is_smo8500_device;
++      enum kx_acpi_type acpi_type;
+ };
+ 
+ enum kxcjk1013_axis {
+@@ -1144,7 +1149,7 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, 
void *private)
+ 
+ static const char *kxcjk1013_match_acpi_device(struct device *dev,
+                                              enum kx_chipset *chipset,
+-                                             bool *is_smo8500_device)
++                                             enum kx_acpi_type *acpi_type)
+ {
+       const struct acpi_device_id *id;
+ 
+@@ -1153,7 +1158,7 @@ static const char *kxcjk1013_match_acpi_device(struct 
device *dev,
+               return NULL;
+ 
+       if (strcmp(id->id, "SMO8500") == 0)
+-              *is_smo8500_device = true;
++              *acpi_type = ACPI_SMO8500;
+ 
+       *chipset = (enum kx_chipset)id->driver_data;
+ 
+@@ -1189,7 +1194,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
+       } else if (ACPI_HANDLE(&client->dev)) {
+               name = kxcjk1013_match_acpi_device(&client->dev,
+                                                  &data->chipset,
+-                                                 &data->is_smo8500_device);
++                                                 &data->acpi_type);
+       } else
+               return -ENODEV;
+ 
+@@ -1207,7 +1212,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
+       indio_dev->modes = INDIO_DIRECT_MODE;
+       indio_dev->info = &kxcjk1013_info;
+ 
+-      if (client->irq > 0 && !data->is_smo8500_device) {
++      if (client->irq > 0 && data->acpi_type != ACPI_SMO8500) {
+               ret = devm_request_threaded_irq(&client->dev, client->irq,
+                                               kxcjk1013_data_rdy_trig_poll,
+                                               kxcjk1013_event_handler,
+diff --git a/drivers/input/misc/adxl34x.c b/drivers/input/misc/adxl34x.c
+index 2b2d02f408bbb..2e189646d8fe2 100644
+--- a/drivers/input/misc/adxl34x.c
++++ b/drivers/input/misc/adxl34x.c
+@@ -696,7 +696,7 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
+       struct input_dev *input_dev;
+       const struct adxl34x_platform_data *pdata;
+       int err, range, i;
+-      unsigned char revid;
++      int revid;
+ 
+       if (!irq) {
+               dev_err(dev, "no IRQ?\n");
+diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
+index 617eb75c7c0ce..c7508d9a4c6fb 100644
+--- a/drivers/net/can/dev.c
++++ b/drivers/net/can/dev.c
+@@ -555,7 +555,7 @@ static void can_restart(struct net_device *dev)
+       }
+       cf->can_id |= CAN_ERR_RESTARTED;
+ 
+-      netif_rx(skb);
++      netif_rx_ni(skb);
+ 
+       stats->rx_packets++;
+       stats->rx_bytes += cf->can_dlc;
+diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
+index 195f15edb32e3..0bd7e71647964 100644
+--- a/drivers/net/can/m_can/m_can.c
++++ b/drivers/net/can/m_can/m_can.c
+@@ -572,7 +572,7 @@ static int m_can_handle_state_change(struct net_device 
*dev,
+       unsigned int ecr;
+ 
+       switch (new_state) {
+-      case CAN_STATE_ERROR_ACTIVE:
++      case CAN_STATE_ERROR_WARNING:
+               /* error warning state */
+               priv->can.can_stats.error_warning++;
+               priv->can.state = CAN_STATE_ERROR_WARNING;
+@@ -601,7 +601,7 @@ static int m_can_handle_state_change(struct net_device 
*dev,
+       __m_can_get_berr_counter(dev, &bec);
+ 
+       switch (new_state) {
+-      case CAN_STATE_ERROR_ACTIVE:
++      case CAN_STATE_ERROR_WARNING:
+               /* error warning state */
+               cf->can_id |= CAN_ERR_CRTL;
+               cf->data[1] = (bec.txerr > bec.rxerr) ?
+diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c 
b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
+index 74b37309efab7..2e316228aa1e8 100644
+--- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c
++++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
+@@ -178,7 +178,7 @@ void peak_usb_get_ts_tv(struct peak_time_ref *time_ref, 
u32 ts,
+               if (time_ref->ts_dev_1 < time_ref->ts_dev_2) {
+                       /* case when event time (tsw) wraps */
+                       if (ts < time_ref->ts_dev_1)
+-                              delta_ts = 1 << time_ref->adapter->ts_used_bits;
++                              delta_ts = 
BIT_ULL(time_ref->adapter->ts_used_bits);
+ 
+               /* Otherwise, sync time counter (ts_dev_2) has wrapped:
+                * handle case when event time (tsn) hasn't.
+@@ -190,7 +190,7 @@ void peak_usb_get_ts_tv(struct peak_time_ref *time_ref, 
u32 ts,
+                *              tsn            ts
+                */
+               } else if (time_ref->ts_dev_1 < ts) {
+-                      delta_ts = -(1 << time_ref->adapter->ts_used_bits);
++                      delta_ts = -BIT_ULL(time_ref->adapter->ts_used_bits);
+               }
+ 
+               /* add delay between last sync and event timestamps */
+diff --git a/drivers/net/ethernet/broadcom/b44.c 
b/drivers/net/ethernet/broadcom/b44.c
+index d95dec5957861..9a9f6c12f89ab 100644
+--- a/drivers/net/ethernet/broadcom/b44.c
++++ b/drivers/net/ethernet/broadcom/b44.c
+@@ -2390,7 +2390,8 @@ static int b44_init_one(struct ssb_device *sdev,
+               goto err_out_free_dev;
+       }
+ 
+-      if (dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30))) {
++      err = dma_set_mask_and_coherent(sdev->dma_dev, DMA_BIT_MASK(30));
++      if (err) {
+               dev_err(sdev->dev,
+                       "Required 30BIT DMA mask unsupported by the system\n");
+               goto err_out_powerdown;
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+index 8634337e1a99d..9e5251c427a36 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
+@@ -1862,7 +1862,7 @@ static int bnxt_get_module_eeprom(struct net_device *dev,
+       /* Read A2 portion of the EEPROM */
+       if (length) {
+               start -= ETH_MODULE_SFF_8436_LEN;
+-              rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 1,
++              rc = bnxt_read_sfp_module_eeprom_info(bp, I2C_DEV_ADDR_A2, 0,
+                                                     start, length, data);
+       }
+       return rc;
+diff --git a/drivers/net/ethernet/faraday/ftgmac100.c 
b/drivers/net/ethernet/faraday/ftgmac100.c
+index 0437149f59392..65859ecf5c328 100644
+--- a/drivers/net/ethernet/faraday/ftgmac100.c
++++ b/drivers/net/ethernet/faraday/ftgmac100.c
+@@ -1444,6 +1444,8 @@ static int ftgmac100_probe(struct platform_device *pdev)
+       return 0;
+ 
+ err_ncsi_dev:
++      if (priv->ndev)
++              ncsi_unregister_dev(priv->ndev);
+ err_register_netdev:
+       ftgmac100_destroy_mdio(netdev);
+ err_setup_mdio:
+@@ -1465,6 +1467,8 @@ static int __exit ftgmac100_remove(struct 
platform_device *pdev)
+       netdev = platform_get_drvdata(pdev);
+       priv = netdev_priv(netdev);
+ 
++      if (priv->ndev)
++              ncsi_unregister_dev(priv->ndev);
+       unregister_netdev(netdev);
+       ftgmac100_destroy_mdio(netdev);
+ 
+diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c 
b/drivers/net/ethernet/mellanox/mlx4/fw.c
+index fe9dc1b3078c5..7c3e505cf2557 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
++++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
+@@ -1843,14 +1843,14 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct 
mlx4_init_hca_param *param)
+ #define        INIT_HCA_LOG_RD_OFFSET          (INIT_HCA_QPC_OFFSET + 0x77)
+ #define INIT_HCA_MCAST_OFFSET          0x0c0
+ #define        INIT_HCA_MC_BASE_OFFSET         (INIT_HCA_MCAST_OFFSET + 0x00)
+-#define        INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x12)
+-#define        INIT_HCA_LOG_MC_HASH_SZ_OFFSET  (INIT_HCA_MCAST_OFFSET + 0x16)
++#define        INIT_HCA_LOG_MC_ENTRY_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x13)
++#define        INIT_HCA_LOG_MC_HASH_SZ_OFFSET  (INIT_HCA_MCAST_OFFSET + 0x17)
+ #define  INIT_HCA_UC_STEERING_OFFSET   (INIT_HCA_MCAST_OFFSET + 0x18)
+ #define        INIT_HCA_LOG_MC_TABLE_SZ_OFFSET (INIT_HCA_MCAST_OFFSET + 0x1b)
+ #define  INIT_HCA_DEVICE_MANAGED_FLOW_STEERING_EN     0x6
+ #define  INIT_HCA_FS_PARAM_OFFSET         0x1d0
+ #define  INIT_HCA_FS_BASE_OFFSET          (INIT_HCA_FS_PARAM_OFFSET + 0x00)
+-#define  INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET  (INIT_HCA_FS_PARAM_OFFSET + 0x12)
++#define  INIT_HCA_FS_LOG_ENTRY_SZ_OFFSET  (INIT_HCA_FS_PARAM_OFFSET + 0x13)
+ #define  INIT_HCA_FS_A0_OFFSET                  (INIT_HCA_FS_PARAM_OFFSET + 
0x18)
+ #define  INIT_HCA_FS_LOG_TABLE_SZ_OFFSET  (INIT_HCA_FS_PARAM_OFFSET + 0x1b)
+ #define  INIT_HCA_FS_ETH_BITS_OFFSET      (INIT_HCA_FS_PARAM_OFFSET + 0x21)
+diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.h 
b/drivers/net/ethernet/mellanox/mlx4/fw.h
+index 5343a0599253b..b30a5a9b9777b 100644
+--- a/drivers/net/ethernet/mellanox/mlx4/fw.h
++++ b/drivers/net/ethernet/mellanox/mlx4/fw.h
+@@ -184,8 +184,8 @@ struct mlx4_init_hca_param {
+       u64 cmpt_base;
+       u64 mtt_base;
+       u64 global_caps;
+-      u16 log_mc_entry_sz;
+-      u16 log_mc_hash_sz;
++      u8 log_mc_entry_sz;
++      u8 log_mc_hash_sz;
+       u16 hca_core_clock; /* Internal Clock Frequency (in MHz) */
+       u8  log_num_qps;
+       u8  log_num_srqs;
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c 
b/drivers/net/ethernet/mellanox/mlxsw/core.c
+index bdf29d0cf4d77..901835d70f734 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
+@@ -436,7 +436,7 @@ static void mlxsw_emad_trans_timeout_schedule(struct 
mlxsw_reg_trans *trans)
+ {
+       unsigned long timeout = msecs_to_jiffies(MLXSW_EMAD_TIMEOUT_MS);
+ 
+-      mlxsw_core_schedule_dw(&trans->timeout_dw, timeout);
++      mlxsw_core_schedule_dw(&trans->timeout_dw, timeout << trans->retries);
+ }
+ 
+ static int mlxsw_emad_transmit(struct mlxsw_core *mlxsw_core,
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+index cda5b0a9e9489..10286215092f6 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+@@ -2251,7 +2251,8 @@ static int qlcnic_83xx_restart_hw(struct qlcnic_adapter 
*adapter)
+ 
+       /* Boot either flash image or firmware image from host file system */
+       if (qlcnic_load_fw_file == 1) {
+-              if (qlcnic_83xx_load_fw_image_from_host(adapter))
++              err = qlcnic_83xx_load_fw_image_from_host(adapter);
++              if (err)
+                       return err;
+       } else {
+               QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 74c925cd19a93..a571024882d7c 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -705,7 +705,7 @@ static const struct usb_device_id products[] = {
+       {QMI_FIXED_INTF(0x05c6, 0x9011, 4)},
+       {QMI_FIXED_INTF(0x05c6, 0x9021, 1)},
+       {QMI_FIXED_INTF(0x05c6, 0x9022, 2)},
+-      {QMI_FIXED_INTF(0x05c6, 0x9025, 4)},    /* Alcatel-sbell ASB TL131 TDD 
LTE  (China Mobile) */
++      {QMI_QUIRK_SET_DTR(0x05c6, 0x9025, 4)}, /* Alcatel-sbell ASB TL131 TDD 
LTE (China Mobile) */
+       {QMI_FIXED_INTF(0x05c6, 0x9026, 3)},
+       {QMI_FIXED_INTF(0x05c6, 0x902e, 5)},
+       {QMI_FIXED_INTF(0x05c6, 0x9031, 5)},
+diff --git a/drivers/pinctrl/pinctrl-rockchip.c 
b/drivers/pinctrl/pinctrl-rockchip.c
+index 417cd3bd7e0c9..ee2dcea1e54b9 100644
+--- a/drivers/pinctrl/pinctrl-rockchip.c
++++ b/drivers/pinctrl/pinctrl-rockchip.c
+@@ -1815,7 +1815,9 @@ static int rockchip_gpio_to_irq(struct gpio_chip *gc, 
unsigned offset)
+       if (!bank->domain)
+               return -ENXIO;
+ 
++      clk_enable(bank->clk);
+       virq = irq_create_mapping(bank->domain, offset);
++      clk_disable(bank->clk);
+ 
+       return (virq) ? : -ENXIO;
+ }
+diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
+index 0caf751d85ded..0a0dd0aac047c 100644
+--- a/drivers/regulator/core.c
++++ b/drivers/regulator/core.c
+@@ -1025,7 +1025,6 @@ static int _regulator_do_enable(struct regulator_dev 
*rdev);
+ /**
+  * set_machine_constraints - sets regulator constraints
+  * @rdev: regulator source
+- * @constraints: constraints to apply
+  *
+  * Allows platform initialisation code to define and constrain
+  * regulator circuits e.g. valid voltage/current ranges, etc.  NOTE:
+@@ -1033,21 +1032,11 @@ static int _regulator_do_enable(struct regulator_dev 
*rdev);
+  * regulator operations to proceed i.e. set_voltage, set_current_limit,
+  * set_mode.
+  */
+-static int set_machine_constraints(struct regulator_dev *rdev,
+-      const struct regulation_constraints *constraints)
++static int set_machine_constraints(struct regulator_dev *rdev)
+ {
+       int ret = 0;
+       const struct regulator_ops *ops = rdev->desc->ops;
+ 
+-      if (constraints)
+-              rdev->constraints = kmemdup(constraints, sizeof(*constraints),
+-                                          GFP_KERNEL);
+-      else
+-              rdev->constraints = kzalloc(sizeof(*constraints),
+-                                          GFP_KERNEL);
+-      if (!rdev->constraints)
+-              return -ENOMEM;
+-
+       ret = machine_constraints_voltage(rdev, rdev->constraints);
+       if (ret != 0)
+               return ret;
+@@ -3924,7 +3913,6 @@ struct regulator_dev *
+ regulator_register(const struct regulator_desc *regulator_desc,
+                  const struct regulator_config *cfg)
+ {
+-      const struct regulation_constraints *constraints = NULL;
+       const struct regulator_init_data *init_data;
+       struct regulator_config *config = NULL;
+       static atomic_t regulator_no = ATOMIC_INIT(-1);
+@@ -4024,14 +4012,23 @@ regulator_register(const struct regulator_desc 
*regulator_desc,
+ 
+       /* set regulator constraints */
+       if (init_data)
+-              constraints = &init_data->constraints;
++              rdev->constraints = kmemdup(&init_data->constraints,
++                                          sizeof(*rdev->constraints),
++                                          GFP_KERNEL);
++      else
++              rdev->constraints = kzalloc(sizeof(*rdev->constraints),
++                                          GFP_KERNEL);
++      if (!rdev->constraints) {
++              ret = -ENOMEM;
++              goto wash;
++      }
+ 
+       if (init_data && init_data->supply_regulator)
+               rdev->supply_name = init_data->supply_regulator;
+       else if (regulator_desc->supply_name)
+               rdev->supply_name = regulator_desc->supply_name;
+ 
+-      ret = set_machine_constraints(rdev, constraints);
++      ret = set_machine_constraints(rdev);
+       if (ret == -EPROBE_DEFER) {
+               /* Regulator might be in bypass mode and so needs its supply
+                * to set the constraints */
+@@ -4040,7 +4037,7 @@ regulator_register(const struct regulator_desc 
*regulator_desc,
+                * that is just being created */
+               ret = regulator_resolve_supply(rdev);
+               if (!ret)
+-                      ret = set_machine_constraints(rdev, constraints);
++                      ret = set_machine_constraints(rdev);
+               else
+                       rdev_dbg(rdev, "unable to resolve supply early: %pe\n",
+                                ERR_PTR(ret));
+diff --git a/drivers/regulator/ti-abb-regulator.c 
b/drivers/regulator/ti-abb-regulator.c
+index 6d17357b3a248..5f5f63eb8c762 100644
+--- a/drivers/regulator/ti-abb-regulator.c
++++ b/drivers/regulator/ti-abb-regulator.c
+@@ -342,8 +342,17 @@ static int ti_abb_set_voltage_sel(struct regulator_dev 
*rdev, unsigned sel)
+               return ret;
+       }
+ 
+-      /* If data is exactly the same, then just update index, no change */
+       info = &abb->info[sel];
++      /*
++       * When Linux kernel is starting up, we are'nt sure of the
++       * Bias configuration that bootloader has configured.
++       * So, we get to know the actual setting the first time
++       * we are asked to transition.
++       */
++      if (abb->current_info_idx == -EINVAL)
++              goto just_set_abb;
++
++      /* If data is exactly the same, then just update index, no change */
+       oinfo = &abb->info[abb->current_info_idx];
+       if (!memcmp(info, oinfo, sizeof(*info))) {
+               dev_dbg(dev, "%s: Same data new idx=%d, old idx=%d\n", __func__,
+@@ -351,6 +360,7 @@ static int ti_abb_set_voltage_sel(struct regulator_dev 
*rdev, unsigned sel)
+               goto out;
+       }
+ 
++just_set_abb:
+       ret = ti_abb_set_opp(rdev, abb, info);
+ 
+ out:
+diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
+index 325c38c9b4516..a60376496b1a7 100644
+--- a/drivers/tty/serial/imx.c
++++ b/drivers/tty/serial/imx.c
+@@ -1787,16 +1787,6 @@ imx_console_write(struct console *co, const char *s, 
unsigned int count)
+       unsigned int ucr1;
+       unsigned long flags = 0;
+       int locked = 1;
+-      int retval;
+-
+-      retval = clk_enable(sport->clk_per);
+-      if (retval)
+-              return;
+-      retval = clk_enable(sport->clk_ipg);
+-      if (retval) {
+-              clk_disable(sport->clk_per);
+-              return;
+-      }
+ 
+       if (sport->port.sysrq)
+               locked = 0;
+@@ -1832,9 +1822,6 @@ imx_console_write(struct console *co, const char *s, 
unsigned int count)
+ 
+       if (locked)
+               spin_unlock_irqrestore(&sport->port.lock, flags);
+-
+-      clk_disable(sport->clk_ipg);
+-      clk_disable(sport->clk_per);
+ }
+ 
+ /*
+@@ -1935,15 +1922,14 @@ imx_console_setup(struct console *co, char *options)
+ 
+       retval = uart_set_options(&sport->port, co, baud, parity, bits, flow);
+ 
+-      clk_disable(sport->clk_ipg);
+       if (retval) {
+-              clk_unprepare(sport->clk_ipg);
++              clk_disable_unprepare(sport->clk_ipg);
+               goto error_console;
+       }
+ 
+-      retval = clk_prepare(sport->clk_per);
++      retval = clk_prepare_enable(sport->clk_per);
+       if (retval)
+-              clk_unprepare(sport->clk_ipg);
++              clk_disable_unprepare(sport->clk_ipg);
+ 
+ error_console:
+       return retval;
+diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
+index b1e6acec53041..bbf056191aaa4 100644
+--- a/fs/efivarfs/super.c
++++ b/fs/efivarfs/super.c
+@@ -23,6 +23,7 @@ LIST_HEAD(efivarfs_list);
+ static void efivarfs_evict_inode(struct inode *inode)
+ {
+       clear_inode(inode);
++      kfree(inode->i_private);
+ }
+ 
+ static const struct super_operations efivarfs_ops = {
+diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
+index 360954196e2f3..54a7f3b8b1bf3 100644
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -2395,7 +2395,8 @@ int ext4_insert_dentry(struct inode *dir,
+                      struct ext4_filename *fname);
+ static inline void ext4_update_dx_flag(struct inode *inode)
+ {
+-      if (!ext4_has_feature_dir_index(inode->i_sb)) {
++      if (!ext4_has_feature_dir_index(inode->i_sb) &&
++          ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) {
+               /* ext4_iget() should have caught this... */
+               WARN_ON_ONCE(ext4_has_feature_metadata_csum(inode->i_sb));
+               ext4_clear_inode_flag(inode, EXT4_INODE_INDEX);
+diff --git a/fs/libfs.c b/fs/libfs.c
+index 278457f221482..835d25e335095 100644
+--- a/fs/libfs.c
++++ b/fs/libfs.c
+@@ -865,7 +865,7 @@ ssize_t simple_attr_write(struct file *file, const char 
__user *buf,
+                         size_t len, loff_t *ppos)
+ {
+       struct simple_attr *attr;
+-      u64 val;
++      unsigned long long val;
+       size_t size;
+       ssize_t ret;
+ 
+@@ -883,7 +883,9 @@ ssize_t simple_attr_write(struct file *file, const char 
__user *buf,
+               goto out;
+ 
+       attr->set_buf[size] = '\0';
+-      val = simple_strtoll(attr->set_buf, NULL, 0);
++      ret = kstrtoull(attr->set_buf, 0, &val);
++      if (ret)
++              goto out;
+       ret = attr->set(attr->data, val);
+       if (ret == 0)
+               ret = len; /* on success, claim we got the whole input */
+diff --git a/fs/super.c b/fs/super.c
+index abe2541fb28c2..377c439477b74 100644
+--- a/fs/super.c
++++ b/fs/super.c
+@@ -1254,36 +1254,11 @@ EXPORT_SYMBOL(__sb_end_write);
+  */
+ int __sb_start_write(struct super_block *sb, int level, bool wait)
+ {
+-      bool force_trylock = false;
+-      int ret = 1;
++      if (!wait)
++              return percpu_down_read_trylock(sb->s_writers.rw_sem + level-1);
+ 
+-#ifdef CONFIG_LOCKDEP
+-      /*
+-       * We want lockdep to tell us about possible deadlocks with freezing
+-       * but it's it bit tricky to properly instrument it. Getting a freeze
+-       * protection works as getting a read lock but there are subtle
+-       * problems. XFS for example gets freeze protection on internal level
+-       * twice in some cases, which is OK only because we already hold a
+-       * freeze protection also on higher level. Due to these cases we have
+-       * to use wait == F (trylock mode) which must not fail.
+-       */
+-      if (wait) {
+-              int i;
+-
+-              for (i = 0; i < level - 1; i++)
+-                      if (percpu_rwsem_is_held(sb->s_writers.rw_sem + i)) {
+-                              force_trylock = true;
+-                              break;
+-                      }
+-      }
+-#endif
+-      if (wait && !force_trylock)
+-              percpu_down_read(sb->s_writers.rw_sem + level-1);
+-      else
+-              ret = percpu_down_read_trylock(sb->s_writers.rw_sem + level-1);
+-
+-      WARN_ON(force_trylock && !ret);
+-      return ret;
++      percpu_down_read(sb->s_writers.rw_sem + level-1);
++      return 1;
+ }
+ EXPORT_SYMBOL(__sb_start_write);
+ 
+diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c
+index c5a24b80c7f72..33a28efc3085b 100644
+--- a/fs/xfs/libxfs/xfs_rmap_btree.c
++++ b/fs/xfs/libxfs/xfs_rmap_btree.c
+@@ -262,8 +262,8 @@ xfs_rmapbt_key_diff(
+       else if (y > x)
+               return -1;
+ 
+-      x = be64_to_cpu(kp->rm_offset);
+-      y = xfs_rmap_irec_offset_pack(rec);
++      x = XFS_RMAP_OFF(be64_to_cpu(kp->rm_offset));
++      y = rec->rm_offset;
+       if (x > y)
+               return 1;
+       else if (y > x)
+@@ -294,8 +294,8 @@ xfs_rmapbt_diff_two_keys(
+       else if (y > x)
+               return -1;
+ 
+-      x = be64_to_cpu(kp1->rm_offset);
+-      y = be64_to_cpu(kp2->rm_offset);
++      x = XFS_RMAP_OFF(be64_to_cpu(kp1->rm_offset));
++      y = XFS_RMAP_OFF(be64_to_cpu(kp2->rm_offset));
+       if (x > y)
+               return 1;
+       else if (y > x)
+@@ -401,8 +401,8 @@ xfs_rmapbt_keys_inorder(
+               return 1;
+       else if (a > b)
+               return 0;
+-      a = be64_to_cpu(k1->rmap.rm_offset);
+-      b = be64_to_cpu(k2->rmap.rm_offset);
++      a = XFS_RMAP_OFF(be64_to_cpu(k1->rmap.rm_offset));
++      b = XFS_RMAP_OFF(be64_to_cpu(k2->rmap.rm_offset));
+       if (a <= b)
+               return 1;
+       return 0;
+@@ -431,8 +431,8 @@ xfs_rmapbt_recs_inorder(
+               return 1;
+       else if (a > b)
+               return 0;
+-      a = be64_to_cpu(r1->rmap.rm_offset);
+-      b = be64_to_cpu(r2->rmap.rm_offset);
++      a = XFS_RMAP_OFF(be64_to_cpu(r1->rmap.rm_offset));
++      b = XFS_RMAP_OFF(be64_to_cpu(r2->rmap.rm_offset));
+       if (a <= b)
+               return 1;
+       return 0;
+diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
+index 928bd5515f02f..495655bcee69e 100644
+--- a/net/bridge/br_device.c
++++ b/net/bridge/br_device.c
+@@ -177,6 +177,7 @@ static struct rtnl_link_stats64 *br_get_stats64(struct 
net_device *dev,
+               sum.rx_packets += tmp.rx_packets;
+       }
+ 
++      netdev_stats_to_stats64(stats, &dev->stats);
+       stats->tx_bytes   = sum.tx_bytes;
+       stats->tx_packets = sum.tx_packets;
+       stats->rx_bytes   = sum.rx_bytes;
+diff --git a/net/core/devlink.c b/net/core/devlink.c
+index 1b5063088f1a7..785fbaac047ff 100644
+--- a/net/core/devlink.c
++++ b/net/core/devlink.c
+@@ -986,7 +986,7 @@ static int devlink_nl_sb_port_pool_fill(struct sk_buff 
*msg,
+               err = ops->sb_occ_port_pool_get(devlink_port, devlink_sb->index,
+                                               pool_index, &cur, &max);
+               if (err && err != -EOPNOTSUPP)
+-                      return err;
++                      goto sb_occ_get_failure;
+               if (!err) {
+                       if (nla_put_u32(msg, DEVLINK_ATTR_SB_OCC_CUR, cur))
+                               goto nla_put_failure;
+@@ -999,8 +999,10 @@ static int devlink_nl_sb_port_pool_fill(struct sk_buff 
*msg,
+       return 0;
+ 
+ nla_put_failure:
++      err = -EMSGSIZE;
++sb_occ_get_failure:
+       genlmsg_cancel(msg, hdr);
+-      return -EMSGSIZE;
++      return err;
+ }
+ 
+ static int devlink_nl_cmd_sb_port_pool_get_doit(struct sk_buff *skb,
+diff --git a/net/core/netpoll.c b/net/core/netpoll.c
+index 9c1bad3909bd7..0fa6269c3f20d 100644
+--- a/net/core/netpoll.c
++++ b/net/core/netpoll.c
+@@ -28,6 +28,7 @@
+ #include <linux/slab.h>
+ #include <linux/export.h>
+ #include <linux/if_vlan.h>
++#include <net/dsa.h>
+ #include <net/tcp.h>
+ #include <net/udp.h>
+ #include <net/addrconf.h>
+@@ -661,15 +662,15 @@ EXPORT_SYMBOL_GPL(__netpoll_setup);
+ 
+ int netpoll_setup(struct netpoll *np)
+ {
+-      struct net_device *ndev = NULL;
++      struct net_device *ndev = NULL, *dev = NULL;
++      struct net *net = current->nsproxy->net_ns;
+       struct in_device *in_dev;
+       int err;
+ 
+       rtnl_lock();
+-      if (np->dev_name[0]) {
+-              struct net *net = current->nsproxy->net_ns;
++      if (np->dev_name[0])
+               ndev = __dev_get_by_name(net, np->dev_name);
+-      }
++
+       if (!ndev) {
+               np_err(np, "%s doesn't exist, aborting\n", np->dev_name);
+               err = -ENODEV;
+@@ -677,6 +678,19 @@ int netpoll_setup(struct netpoll *np)
+       }
+       dev_hold(ndev);
+ 
++      /* bring up DSA management network devices up first */
++      for_each_netdev(net, dev) {
++              if (!netdev_uses_dsa(dev))
++                      continue;
++
++              err = dev_change_flags(dev, dev->flags | IFF_UP);
++              if (err < 0) {
++                      np_err(np, "%s failed to open %s\n",
++                             np->dev_name, dev->name);
++                      goto put;
++              }
++      }
++
+       if (netdev_master_upper_dev_get(ndev)) {
+               np_err(np, "%s is a slave device, aborting\n", np->dev_name);
+               err = -EBUSY;
+diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
+index 4273576e14754..9b25809b2d457 100644
+--- a/net/ipv4/inet_diag.c
++++ b/net/ipv4/inet_diag.c
+@@ -355,8 +355,10 @@ static int inet_req_diag_fill(struct sock *sk, struct 
sk_buff *skb,
+       r->idiag_inode  = 0;
+ 
+       if (net_admin && nla_put_u32(skb, INET_DIAG_MARK,
+-                                   inet_rsk(reqsk)->ir_mark))
++                                   inet_rsk(reqsk)->ir_mark)) {
++              nlmsg_cancel(skb, nlh);
+               return -EMSGSIZE;
++      }
+ 
+       nlmsg_end(skb, nlh);
+       return 0;
+diff --git a/net/ipv4/tcp_bbr.c b/net/ipv4/tcp_bbr.c
+index 3bfab2d415749..c22da42376fe9 100644
+--- a/net/ipv4/tcp_bbr.c
++++ b/net/ipv4/tcp_bbr.c
+@@ -740,7 +740,7 @@ static void bbr_update_min_rtt(struct sock *sk, const 
struct rate_sample *rs)
+       filter_expired = after(tcp_time_stamp,
+                              bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);
+       if (rs->rtt_us >= 0 &&
+-          (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) {
++          (rs->rtt_us < bbr->min_rtt_us || filter_expired)) {
+               bbr->min_rtt_us = rs->rtt_us;
+               bbr->min_rtt_stamp = tcp_time_stamp;
+       }
+diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c
+index 0edc44cb254e0..519e0730d9f62 100644
+--- a/net/ipv6/ah6.c
++++ b/net/ipv6/ah6.c
+@@ -595,7 +595,8 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff 
*skb)
+       memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len);
+       memset(ah->auth_data, 0, ahp->icv_trunc_len);
+ 
+-      if (ipv6_clear_mutable_options(ip6h, hdr_len, XFRM_POLICY_IN))
++      err = ipv6_clear_mutable_options(ip6h, hdr_len, XFRM_POLICY_IN);
++      if (err)
+               goto out_free;
+ 
+       ip6h->priority    = 0;
+diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
+index 14c5ba3a1b1c6..e913869193991 100644
+--- a/net/mac80211/rc80211_minstrel.c
++++ b/net/mac80211/rc80211_minstrel.c
+@@ -274,7 +274,7 @@ minstrel_tx_status(void *priv, struct 
ieee80211_supported_band *sband,
+       success = !!(info->flags & IEEE80211_TX_STAT_ACK);
+ 
+       for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
+-              if (ar[i].idx < 0)
++              if (ar[i].idx < 0 || !ar[i].count)
+                       break;
+ 
+               ndx = rix_to_ndx(mi, ar[i].idx);
+@@ -287,12 +287,6 @@ minstrel_tx_status(void *priv, struct 
ieee80211_supported_band *sband,
+                       mi->r[ndx].stats.success += success;
+       }
+ 
+-      if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && (i >= 0))
+-              mi->sample_packets++;
+-
+-      if (mi->sample_deferred > 0)
+-              mi->sample_deferred--;
+-
+       if (time_after(jiffies, mi->last_stats_update +
+                               (mp->update_interval * HZ) / 1000))
+               minstrel_update_stats(mp, mi);
+@@ -366,7 +360,7 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
+ #endif
+ 
+       delta = (mi->total_packets * sampling_ratio / 100) -
+-                      (mi->sample_packets + mi->sample_deferred / 2);
++                      mi->sample_packets;
+ 
+       /* delta < 0: no sampling required */
+       prev_sample = mi->prev_sample;
+@@ -375,7 +369,6 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
+               return;
+ 
+       if (mi->total_packets >= 10000) {
+-              mi->sample_deferred = 0;
+               mi->sample_packets = 0;
+               mi->total_packets = 0;
+       } else if (delta > mi->n_rates * 2) {
+@@ -400,19 +393,8 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
+        * rate sampling method should be used.
+        * Respect such rates that are not sampled for 20 interations.
+        */
+-      if (mrr_capable &&
+-          msr->perfect_tx_time > mr->perfect_tx_time &&
+-          msr->stats.sample_skipped < 20) {
+-              /* Only use IEEE80211_TX_CTL_RATE_CTRL_PROBE to mark
+-               * packets that have the sampling rate deferred to the
+-               * second MRR stage. Increase the sample counter only
+-               * if the deferred sample rate was actually used.
+-               * Use the sample_deferred counter to make sure that
+-               * the sampling is not done in large bursts */
+-              info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
+-              rate++;
+-              mi->sample_deferred++;
+-      } else {
++      if (msr->perfect_tx_time < mr->perfect_tx_time ||
++          msr->stats.sample_skipped >= 20) {
+               if (!msr->sample_limit)
+                       return;
+ 
+@@ -432,6 +414,7 @@ minstrel_get_rate(void *priv, struct ieee80211_sta *sta,
+ 
+       rate->idx = mi->r[ndx].rix;
+       rate->count = minstrel_get_retry_count(&mi->r[ndx], info);
++      info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
+ }
+ 
+ 
+diff --git a/net/mac80211/rc80211_minstrel.h b/net/mac80211/rc80211_minstrel.h
+index c230bbe93262b..5a9e44f4fba49 100644
+--- a/net/mac80211/rc80211_minstrel.h
++++ b/net/mac80211/rc80211_minstrel.h
+@@ -105,7 +105,6 @@ struct minstrel_sta_info {
+       u8 max_prob_rate;
+       unsigned int total_packets;
+       unsigned int sample_packets;
+-      int sample_deferred;
+ 
+       unsigned int sample_row;
+       unsigned int sample_column;
+diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
+index 8a9bbcfefbca6..bdcc6cb60b1c8 100644
+--- a/net/mac80211/sta_info.c
++++ b/net/mac80211/sta_info.c
+@@ -601,7 +601,7 @@ static int sta_info_insert_finish(struct sta_info *sta) 
__acquires(RCU)
+  out_drop_sta:
+       local->num_sta--;
+       synchronize_net();
+-      __cleanup_single_sta(sta);
++      cleanup_single_sta(sta);
+  out_err:
+       mutex_unlock(&local->sta_mtx);
+       kfree(sinfo);
+@@ -620,19 +620,13 @@ int sta_info_insert_rcu(struct sta_info *sta) 
__acquires(RCU)
+ 
+       err = sta_info_insert_check(sta);
+       if (err) {
++              sta_info_free(local, sta);
+               mutex_unlock(&local->sta_mtx);
+               rcu_read_lock();
+-              goto out_free;
++              return err;
+       }
+ 
+-      err = sta_info_insert_finish(sta);
+-      if (err)
+-              goto out_free;
+-
+-      return 0;
+- out_free:
+-      sta_info_free(local, sta);
+-      return err;
++      return sta_info_insert_finish(sta);
+ }
+ 
+ int sta_info_insert(struct sta_info *sta)
+diff --git a/net/netlabel/netlabel_unlabeled.c 
b/net/netlabel/netlabel_unlabeled.c
+index 053ba86461559..467e0d19cdfea 100644
+--- a/net/netlabel/netlabel_unlabeled.c
++++ b/net/netlabel/netlabel_unlabeled.c
+@@ -1185,12 +1185,13 @@ static int netlbl_unlabel_staticlist(struct sk_buff 
*skb,
+       struct netlbl_unlhsh_walk_arg cb_arg;
+       u32 skip_bkt = cb->args[0];
+       u32 skip_chain = cb->args[1];
+-      u32 iter_bkt;
+-      u32 iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0;
++      u32 skip_addr4 = cb->args[2];
++      u32 iter_bkt, iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0;
+       struct netlbl_unlhsh_iface *iface;
+       struct list_head *iter_list;
+       struct netlbl_af4list *addr4;
+ #if IS_ENABLED(CONFIG_IPV6)
++      u32 skip_addr6 = cb->args[3];
+       struct netlbl_af6list *addr6;
+ #endif
+ 
+@@ -1201,7 +1202,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
+       rcu_read_lock();
+       for (iter_bkt = skip_bkt;
+            iter_bkt < rcu_dereference(netlbl_unlhsh)->size;
+-           iter_bkt++, iter_chain = 0, iter_addr4 = 0, iter_addr6 = 0) {
++           iter_bkt++) {
+               iter_list = &rcu_dereference(netlbl_unlhsh)->tbl[iter_bkt];
+               list_for_each_entry_rcu(iface, iter_list, list) {
+                       if (!iface->valid ||
+@@ -1209,7 +1210,7 @@ static int netlbl_unlabel_staticlist(struct sk_buff *skb,
+                               continue;
+                       netlbl_af4list_foreach_rcu(addr4,
+                                                  &iface->addr4_list) {
+-                              if (iter_addr4++ < cb->args[2])
++                              if (iter_addr4++ < skip_addr4)
+                                       continue;
+                               if (netlbl_unlabel_staticlist_gen(
+                                             NLBL_UNLABEL_C_STATICLIST,
+@@ -1222,10 +1223,12 @@ static int netlbl_unlabel_staticlist(struct sk_buff 
*skb,
+                                       goto unlabel_staticlist_return;
+                               }
+                       }
++                      iter_addr4 = 0;
++                      skip_addr4 = 0;
+ #if IS_ENABLED(CONFIG_IPV6)
+                       netlbl_af6list_foreach_rcu(addr6,
+                                                  &iface->addr6_list) {
+-                              if (iter_addr6++ < cb->args[3])
++                              if (iter_addr6++ < skip_addr6)
+                                       continue;
+                               if (netlbl_unlabel_staticlist_gen(
+                                             NLBL_UNLABEL_C_STATICLIST,
+@@ -1238,8 +1241,12 @@ static int netlbl_unlabel_staticlist(struct sk_buff 
*skb,
+                                       goto unlabel_staticlist_return;
+                               }
+                       }
++                      iter_addr6 = 0;
++                      skip_addr6 = 0;
+ #endif /* IPv6 */
+               }
++              iter_chain = 0;
++              skip_chain = 0;
+       }
+ 
+ unlabel_staticlist_return:
+diff --git a/net/sctp/input.c b/net/sctp/input.c
+index 969fb1623e4ef..12d821ea8a1f6 100644
+--- a/net/sctp/input.c
++++ b/net/sctp/input.c
+@@ -449,7 +449,7 @@ void sctp_icmp_proto_unreachable(struct sock *sk,
+               else {
+                       if (!mod_timer(&t->proto_unreach_timer,
+                                               jiffies + (HZ/20)))
+-                              sctp_association_hold(asoc);
++                              sctp_transport_hold(t);
+               }
+       } else {
+               struct net *net = sock_net(sk);
+@@ -458,7 +458,7 @@ void sctp_icmp_proto_unreachable(struct sock *sk,
+                        "encountered!\n", __func__);
+ 
+               if (del_timer(&t->proto_unreach_timer))
+-                      sctp_association_put(asoc);
++                      sctp_transport_put(t);
+ 
+               sctp_do_sm(net, SCTP_EVENT_T_OTHER,
+                          SCTP_ST_OTHER(SCTP_EVENT_ICMP_PROTO_UNREACH),
+diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
+index 1133fa0830f4e..26e2927e0c6e2 100644
+--- a/net/sctp/sm_sideeffect.c
++++ b/net/sctp/sm_sideeffect.c
+@@ -417,7 +417,7 @@ void sctp_generate_proto_unreach_event(unsigned long data)
+               /* Try again later.  */
+               if (!mod_timer(&transport->proto_unreach_timer,
+                               jiffies + (HZ/20)))
+-                      sctp_association_hold(asoc);
++                      sctp_transport_hold(transport);
+               goto out_unlock;
+       }
+ 
+@@ -433,7 +433,7 @@ void sctp_generate_proto_unreach_event(unsigned long data)
+ 
+ out_unlock:
+       bh_unlock_sock(sk);
+-      sctp_association_put(asoc);
++      sctp_transport_put(transport);
+ }
+ 
+ 
+diff --git a/net/sctp/transport.c b/net/sctp/transport.c
+index 5c78942550e97..bace37b086e98 100644
+--- a/net/sctp/transport.c
++++ b/net/sctp/transport.c
+@@ -146,7 +146,7 @@ void sctp_transport_free(struct sctp_transport *transport)
+ 
+       /* Delete the ICMP proto unreachable timer if it's active. */
+       if (del_timer(&transport->proto_unreach_timer))
+-              sctp_association_put(transport->asoc);
++              sctp_transport_put(transport);
+ 
+       sctp_transport_put(transport);
+ }
+diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
+index 3bec5c59169b5..7bee5ca336fac 100644
+--- a/net/x25/af_x25.c
++++ b/net/x25/af_x25.c
+@@ -1047,6 +1047,7 @@ int x25_rx_call_request(struct sk_buff *skb, struct 
x25_neigh *nb,
+       makex25->lci           = lci;
+       makex25->dest_addr     = dest_addr;
+       makex25->source_addr   = source_addr;
++      x25_neigh_hold(nb);
+       makex25->neighbour     = nb;
+       makex25->facilities    = facilities;
+       makex25->dte_facilities= dte_facilities;
+diff --git a/sound/core/control.c b/sound/core/control.c
+index 511368fe974ef..abda2c3fcd8ac 100644
+--- a/sound/core/control.c
++++ b/sound/core/control.c
+@@ -1381,7 +1381,7 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
+ 
+  unlock:
+       up_write(&card->controls_rwsem);
+-      return 0;
++      return err;
+ }
+ 
+ static int snd_ctl_elem_add_user(struct snd_ctl_file *file,
+diff --git a/sound/pci/mixart/mixart_core.c b/sound/pci/mixart/mixart_core.c
+index dccf3db48fe06..1381f4fa08565 100644
+--- a/sound/pci/mixart/mixart_core.c
++++ b/sound/pci/mixart/mixart_core.c
+@@ -83,7 +83,6 @@ static int get_msg(struct mixart_mgr *mgr, struct mixart_msg 
*resp,
+       unsigned int i;
+ #endif
+ 
+-      mutex_lock(&mgr->msg_lock);
+       err = 0;
+ 
+       /* copy message descriptor from miXart to driver */
+@@ -132,8 +131,6 @@ static int get_msg(struct mixart_mgr *mgr, struct 
mixart_msg *resp,
+       writel_be(headptr, MIXART_MEM(mgr, MSG_OUTBOUND_FREE_HEAD));
+ 
+  _clean_exit:
+-      mutex_unlock(&mgr->msg_lock);
+-
+       return err;
+ }
+ 
+@@ -271,7 +268,9 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct 
mixart_msg *request, int
+       resp.data = resp_data;
+       resp.size = max_resp_size;
+ 
++      mutex_lock(&mgr->msg_lock);
+       err = get_msg(mgr, &resp, msg_frame);
++      mutex_unlock(&mgr->msg_lock);
+ 
+       if( request->message_id != resp.message_id )
+               dev_err(&mgr->pci->dev, "RESPONSE ERROR!\n");
+diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c
+index ce3bfb48b26f0..956b0aa916cfe 100644
+--- a/tools/perf/builtin-lock.c
++++ b/tools/perf/builtin-lock.c
+@@ -616,7 +616,7 @@ static int report_lock_release_event(struct perf_evsel 
*evsel,
+       case SEQ_STATE_READ_ACQUIRED:
+               seq->read_count--;
+               BUG_ON(seq->read_count < 0);
+-              if (!seq->read_count) {
++              if (seq->read_count) {
+                       ls->nr_release++;
+                       goto end;
+               }

Reply via email to