commit:     b6cdb44c09d28dc9845d5502832c6eb6dca6b803
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Apr 21 11:15:07 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Apr 21 11:15:07 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=b6cdb44c

Linux patch 4.19.117

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

 0000_README               |    4 +
 1116_linux-4.19.117.patch | 1368 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1372 insertions(+)

diff --git a/0000_README b/0000_README
index d15813b..8db7823 100644
--- a/0000_README
+++ b/0000_README
@@ -503,6 +503,10 @@ Patch:  1115_linux-4.19.116.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.19.116
 
+Patch:  1116_linux-4.19.117.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.19.117
+
 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/1116_linux-4.19.117.patch b/1116_linux-4.19.117.patch
new file mode 100644
index 0000000..c3a7077
--- /dev/null
+++ b/1116_linux-4.19.117.patch
@@ -0,0 +1,1368 @@
+diff --git a/Makefile b/Makefile
+index d85ff698f5b9..555dbaab7bad 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 19
+-SUBLEVEL = 116
++SUBLEVEL = 117
+ EXTRAVERSION =
+ NAME = "People's Front"
+ 
+diff --git a/arch/x86/include/asm/microcode_amd.h 
b/arch/x86/include/asm/microcode_amd.h
+index 209492849566..5c524d4f71cd 100644
+--- a/arch/x86/include/asm/microcode_amd.h
++++ b/arch/x86/include/asm/microcode_amd.h
+@@ -41,7 +41,7 @@ struct microcode_amd {
+       unsigned int                    mpb[0];
+ };
+ 
+-#define PATCH_MAX_SIZE PAGE_SIZE
++#define PATCH_MAX_SIZE (3 * PAGE_SIZE)
+ 
+ #ifdef CONFIG_MICROCODE_AMD
+ extern void __init load_ucode_amd_bsp(unsigned int family);
+diff --git a/arch/x86/kernel/cpu/intel_rdt.c b/arch/x86/kernel/cpu/intel_rdt.c
+index 1c92cd08c3b4..b32fa6bcf811 100644
+--- a/arch/x86/kernel/cpu/intel_rdt.c
++++ b/arch/x86/kernel/cpu/intel_rdt.c
+@@ -555,6 +555,8 @@ static void domain_add_cpu(int cpu, struct rdt_resource *r)
+       d->id = id;
+       cpumask_set_cpu(cpu, &d->cpu_mask);
+ 
++      rdt_domain_reconfigure_cdp(r);
++
+       if (r->alloc_capable && domain_setup_ctrlval(r, d)) {
+               kfree(d);
+               return;
+diff --git a/arch/x86/kernel/cpu/intel_rdt.h b/arch/x86/kernel/cpu/intel_rdt.h
+index 3736f6dc9545..2b483b739cf1 100644
+--- a/arch/x86/kernel/cpu/intel_rdt.h
++++ b/arch/x86/kernel/cpu/intel_rdt.h
+@@ -567,5 +567,6 @@ void cqm_setup_limbo_handler(struct rdt_domain *dom, 
unsigned long delay_ms);
+ void cqm_handle_limbo(struct work_struct *work);
+ bool has_busy_rmid(struct rdt_resource *r, struct rdt_domain *d);
+ void __check_limbo(struct rdt_domain *d, bool force_free);
++void rdt_domain_reconfigure_cdp(struct rdt_resource *r);
+ 
+ #endif /* _ASM_X86_INTEL_RDT_H */
+diff --git a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c 
b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+index 11c5accfa4db..cea7e01a346d 100644
+--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
++++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+@@ -1777,6 +1777,19 @@ static int set_cache_qos_cfg(int level, bool enable)
+       return 0;
+ }
+ 
++/* Restore the qos cfg state when a domain comes online */
++void rdt_domain_reconfigure_cdp(struct rdt_resource *r)
++{
++      if (!r->alloc_capable)
++              return;
++
++      if (r == &rdt_resources_all[RDT_RESOURCE_L2DATA])
++              l2_qos_cfg_update(&r->alloc_enabled);
++
++      if (r == &rdt_resources_all[RDT_RESOURCE_L3DATA])
++              l3_qos_cfg_update(&r->alloc_enabled);
++}
++
+ /*
+  * Enable or disable the MBA software controller
+  * which helps user specify bandwidth in MBps.
+@@ -2910,7 +2923,8 @@ static int rdtgroup_rmdir(struct kernfs_node *kn)
+        * If the rdtgroup is a mon group and parent directory
+        * is a valid "mon_groups" directory, remove the mon group.
+        */
+-      if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn) {
++      if (rdtgrp->type == RDTCTRL_GROUP && parent_kn == rdtgroup_default.kn &&
++          rdtgrp != &rdtgroup_default) {
+               if (rdtgrp->mode == RDT_MODE_PSEUDO_LOCKSETUP ||
+                   rdtgrp->mode == RDT_MODE_PSEUDO_LOCKED) {
+                       ret = rdtgroup_ctrl_remove(kn, rdtgrp);
+diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
+index 48c24d0e9e75..1fe9ccabc082 100644
+--- a/arch/x86/kvm/cpuid.c
++++ b/arch/x86/kvm/cpuid.c
+@@ -509,7 +509,8 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 
*entry, u32 function,
+                               entry->edx |= F(SPEC_CTRL);
+                       if (boot_cpu_has(X86_FEATURE_STIBP))
+                               entry->edx |= F(INTEL_STIBP);
+-                      if (boot_cpu_has(X86_FEATURE_SSBD))
++                      if (boot_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) ||
++                          boot_cpu_has(X86_FEATURE_AMD_SSBD))
+                               entry->edx |= F(SPEC_CTRL_SSBD);
+                       /*
+                        * We emulate ARCH_CAPABILITIES in software even
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+index 6bf032e81e39..219440bebd05 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+@@ -3788,9 +3788,12 @@ static int smu7_trim_single_dpm_states(struct pp_hwmgr 
*hwmgr,
+ {
+       uint32_t i;
+ 
++      /* force the trim if mclk_switching is disabled to prevent flicker */
++      bool force_trim = (low_limit == high_limit);
+       for (i = 0; i < dpm_table->count; i++) {
+       /*skip the trim if od is enabled*/
+-              if (!hwmgr->od_enabled && (dpm_table->dpm_levels[i].value < 
low_limit
++              if ((!hwmgr->od_enabled || force_trim)
++                      && (dpm_table->dpm_levels[i].value < low_limit
+                       || dpm_table->dpm_levels[i].value > high_limit))
+                       dpm_table->dpm_levels[i].enabled = false;
+               else
+diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
+index 8aa3b0af9fc2..05982e9fb6bb 100644
+--- a/drivers/net/dsa/mt7530.c
++++ b/drivers/net/dsa/mt7530.c
+@@ -824,8 +824,9 @@ mt7530_port_set_vlan_unaware(struct dsa_switch *ds, int 
port)
+        */
+       mt7530_rmw(priv, MT7530_PCR_P(port), PCR_PORT_VLAN_MASK,
+                  MT7530_PORT_MATRIX_MODE);
+-      mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK,
+-                 VLAN_ATTR(MT7530_VLAN_TRANSPARENT));
++      mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK,
++                 VLAN_ATTR(MT7530_VLAN_TRANSPARENT) |
++                 PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
+ 
+       priv->ports[port].vlan_filtering = false;
+ 
+@@ -843,8 +844,8 @@ mt7530_port_set_vlan_unaware(struct dsa_switch *ds, int 
port)
+       if (all_user_ports_removed) {
+               mt7530_write(priv, MT7530_PCR_P(MT7530_CPU_PORT),
+                            PCR_MATRIX(dsa_user_ports(priv->ds)));
+-              mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT),
+-                           PORT_SPEC_TAG);
++              mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), PORT_SPEC_TAG
++                           | PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
+       }
+ }
+ 
+@@ -870,8 +871,9 @@ mt7530_port_set_vlan_aware(struct dsa_switch *ds, int port)
+       /* Set the port as a user port which is to be able to recognize VID
+        * from incoming packets before fetching entry within the VLAN table.
+        */
+-      mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK,
+-                 VLAN_ATTR(MT7530_VLAN_USER));
++      mt7530_rmw(priv, MT7530_PVC_P(port), VLAN_ATTR_MASK | PVC_EG_TAG_MASK,
++                 VLAN_ATTR(MT7530_VLAN_USER) |
++                 PVC_EG_TAG(MT7530_VLAN_EG_DISABLED));
+ }
+ 
+ static void
+@@ -1297,6 +1299,10 @@ mt7530_setup(struct dsa_switch *ds)
+                       mt7530_cpu_port_enable(priv, i);
+               else
+                       mt7530_port_disable(ds, i, NULL);
++
++              /* Enable consistent egress tag */
++              mt7530_rmw(priv, MT7530_PVC_P(i), PVC_EG_TAG_MASK,
++                         PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT));
+       }
+ 
+       /* Flush the FDB table */
+diff --git a/drivers/net/dsa/mt7530.h b/drivers/net/dsa/mt7530.h
+index d9b407a22a58..ea30f10397aa 100644
+--- a/drivers/net/dsa/mt7530.h
++++ b/drivers/net/dsa/mt7530.h
+@@ -167,9 +167,16 @@ enum mt7530_port_mode {
+ /* Register for port vlan control */
+ #define MT7530_PVC_P(x)                       (0x2010 + ((x) * 0x100))
+ #define  PORT_SPEC_TAG                        BIT(5)
++#define  PVC_EG_TAG(x)                        (((x) & 0x7) << 8)
++#define  PVC_EG_TAG_MASK              PVC_EG_TAG(7)
+ #define  VLAN_ATTR(x)                 (((x) & 0x3) << 6)
+ #define  VLAN_ATTR_MASK                       VLAN_ATTR(3)
+ 
++enum mt7530_vlan_port_eg_tag {
++      MT7530_VLAN_EG_DISABLED = 0,
++      MT7530_VLAN_EG_CONSISTENT = 1,
++};
++
+ enum mt7530_vlan_port_attr {
+       MT7530_VLAN_USER = 0,
+       MT7530_VLAN_TRANSPARENT = 3,
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c 
b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+index d96a84a62d78..5519eff58441 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+@@ -515,7 +515,7 @@ static void xgbe_isr_task(unsigned long data)
+                               xgbe_disable_rx_tx_ints(pdata);
+ 
+                               /* Turn on polling */
+-                              __napi_schedule_irqoff(&pdata->napi);
++                              __napi_schedule(&pdata->napi);
+                       }
+               } else {
+                       /* Don't clear Rx/Tx status if doing per channel DMA
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c 
b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+index fc1fa0f9f338..57694eada995 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+@@ -155,6 +155,8 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
+       plat_dat->init = sun7i_gmac_init;
+       plat_dat->exit = sun7i_gmac_exit;
+       plat_dat->fix_mac_speed = sun7i_fix_speed;
++      plat_dat->tx_fifo_size = 4096;
++      plat_dat->rx_fifo_size = 16384;
+ 
+       ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv);
+       if (ret)
+diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c 
b/drivers/net/wireless/ath/wil6210/debugfs.c
+index 44296c015925..55a809cb3105 100644
+--- a/drivers/net/wireless/ath/wil6210/debugfs.c
++++ b/drivers/net/wireless/ath/wil6210/debugfs.c
+@@ -730,32 +730,6 @@ struct dentry *wil_debugfs_create_ioblob(const char *name,
+       return debugfs_create_file(name, mode, parent, wil_blob, &fops_ioblob);
+ }
+ 
+-/*---reset---*/
+-static ssize_t wil_write_file_reset(struct file *file, const char __user *buf,
+-                                  size_t len, loff_t *ppos)
+-{
+-      struct wil6210_priv *wil = file->private_data;
+-      struct net_device *ndev = wil->main_ndev;
+-
+-      /**
+-       * BUG:
+-       * this code does NOT sync device state with the rest of system
+-       * use with care, debug only!!!
+-       */
+-      rtnl_lock();
+-      dev_close(ndev);
+-      ndev->flags &= ~IFF_UP;
+-      rtnl_unlock();
+-      wil_reset(wil, true);
+-
+-      return len;
+-}
+-
+-static const struct file_operations fops_reset = {
+-      .write = wil_write_file_reset,
+-      .open  = simple_open,
+-};
+-
+ /*---write channel 1..4 to rxon for it, 0 to rxoff---*/
+ static ssize_t wil_write_file_rxon(struct file *file, const char __user *buf,
+                                  size_t len, loff_t *ppos)
+@@ -991,6 +965,8 @@ static ssize_t wil_write_file_txmgmt(struct file *file, 
const char __user *buf,
+       int rc;
+       void *frame;
+ 
++      memset(&params, 0, sizeof(params));
++
+       if (!len)
+               return -EINVAL;
+ 
+@@ -2459,7 +2435,6 @@ static const struct {
+       {"desc",        0444,           &fops_txdesc},
+       {"bf",          0444,           &fops_bf},
+       {"mem_val",     0644,           &fops_memread},
+-      {"reset",       0244,           &fops_reset},
+       {"rxon",        0244,           &fops_rxon},
+       {"tx_mgmt",     0244,           &fops_txmgmt},
+       {"wmi_send", 0244,              &fops_wmi},
+diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c 
b/drivers/net/wireless/ath/wil6210/interrupt.c
+index 0655cd884514..d161dc930313 100644
+--- a/drivers/net/wireless/ath/wil6210/interrupt.c
++++ b/drivers/net/wireless/ath/wil6210/interrupt.c
+@@ -1,6 +1,6 @@
+ /*
+  * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
+- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
++ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+  *
+  * Permission to use, copy, modify, and/or distribute this software for any
+  * purpose with or without fee is hereby granted, provided that the above
+@@ -590,10 +590,14 @@ static irqreturn_t wil6210_irq_misc(int irq, void 
*cookie)
+       }
+ 
+       if (isr & BIT_DMA_EP_MISC_ICR_HALP) {
+-              wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n");
+-              wil6210_mask_halp(wil);
+               isr &= ~BIT_DMA_EP_MISC_ICR_HALP;
+-              complete(&wil->halp.comp);
++              if (wil->halp.handle_icr) {
++                      /* no need to handle HALP ICRs until next vote */
++                      wil->halp.handle_icr = false;
++                      wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n");
++                      wil6210_mask_halp(wil);
++                      complete(&wil->halp.comp);
++              }
+       }
+ 
+       wil->isr_misc = isr;
+diff --git a/drivers/net/wireless/ath/wil6210/main.c 
b/drivers/net/wireless/ath/wil6210/main.c
+index 10673fa9388e..fe91db3478dc 100644
+--- a/drivers/net/wireless/ath/wil6210/main.c
++++ b/drivers/net/wireless/ath/wil6210/main.c
+@@ -1687,7 +1687,7 @@ int __wil_up(struct wil6210_priv *wil)
+               return rc;
+ 
+       /* Rx RING. After MAC and beacon */
+-      rc = wil->txrx_ops.rx_init(wil, 1 << rx_ring_order);
++      rc = wil->txrx_ops.rx_init(wil, rx_ring_order);
+       if (rc)
+               return rc;
+ 
+@@ -1814,11 +1814,14 @@ void wil_halp_vote(struct wil6210_priv *wil)
+ 
+       if (++wil->halp.ref_cnt == 1) {
+               reinit_completion(&wil->halp.comp);
++              /* mark to IRQ context to handle HALP ICR */
++              wil->halp.handle_icr = true;
+               wil6210_set_halp(wil);
+               rc = wait_for_completion_timeout(&wil->halp.comp, to_jiffies);
+               if (!rc) {
+                       wil_err(wil, "HALP vote timed out\n");
+                       /* Mask HALP as done in case the interrupt is raised */
++                      wil->halp.handle_icr = false;
+                       wil6210_mask_halp(wil);
+               } else {
+                       wil_dbg_irq(wil,
+diff --git a/drivers/net/wireless/ath/wil6210/txrx.c 
b/drivers/net/wireless/ath/wil6210/txrx.c
+index 73cdf54521f9..236dcb6f5e84 100644
+--- a/drivers/net/wireless/ath/wil6210/txrx.c
++++ b/drivers/net/wireless/ath/wil6210/txrx.c
+@@ -881,7 +881,7 @@ static void wil_rx_buf_len_init(struct wil6210_priv *wil)
+       }
+ }
+ 
+-static int wil_rx_init(struct wil6210_priv *wil, u16 size)
++static int wil_rx_init(struct wil6210_priv *wil, uint order)
+ {
+       struct wil_ring *vring = &wil->ring_rx;
+       int rc;
+@@ -895,7 +895,7 @@ static int wil_rx_init(struct wil6210_priv *wil, u16 size)
+ 
+       wil_rx_buf_len_init(wil);
+ 
+-      vring->size = size;
++      vring->size = 1 << order;
+       vring->is_rx = true;
+       rc = wil_vring_alloc(wil, vring);
+       if (rc)
+diff --git a/drivers/net/wireless/ath/wil6210/txrx_edma.c 
b/drivers/net/wireless/ath/wil6210/txrx_edma.c
+index 5fa8d6ad6648..fe666a3583c1 100644
+--- a/drivers/net/wireless/ath/wil6210/txrx_edma.c
++++ b/drivers/net/wireless/ath/wil6210/txrx_edma.c
+@@ -268,6 +268,9 @@ static void wil_move_all_rx_buff_to_free_list(struct 
wil6210_priv *wil,
+       struct list_head *active = &wil->rx_buff_mgmt.active;
+       dma_addr_t pa;
+ 
++      if (!wil->rx_buff_mgmt.buff_arr)
++              return;
++
+       while (!list_empty(active)) {
+               struct wil_rx_buff *rx_buff =
+                       list_first_entry(active, struct wil_rx_buff, list);
+@@ -590,9 +593,9 @@ static void wil_rx_buf_len_init_edma(struct wil6210_priv 
*wil)
+               WIL_MAX_ETH_MTU : WIL_EDMA_RX_BUF_LEN_DEFAULT;
+ }
+ 
+-static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size)
++static int wil_rx_init_edma(struct wil6210_priv *wil, uint desc_ring_order)
+ {
+-      u16 status_ring_size;
++      u16 status_ring_size, desc_ring_size = 1 << desc_ring_order;
+       struct wil_ring *ring = &wil->ring_rx;
+       int rc;
+       size_t elem_size = wil->use_compressed_rx_status ?
+@@ -607,7 +610,12 @@ static int wil_rx_init_edma(struct wil6210_priv *wil, u16 
desc_ring_size)
+                       "compressed RX status cannot be used with SW 
reorder\n");
+               return -EINVAL;
+       }
+-
++      if (wil->rx_status_ring_order <= desc_ring_order)
++              /* make sure sring is larger than desc ring */
++              wil->rx_status_ring_order = desc_ring_order + 1;
++      if (wil->rx_buff_id_count <= desc_ring_size)
++              /* make sure we will not run out of buff_ids */
++              wil->rx_buff_id_count = desc_ring_size + 512;
+       if (wil->rx_status_ring_order < WIL_SRING_SIZE_ORDER_MIN ||
+           wil->rx_status_ring_order > WIL_SRING_SIZE_ORDER_MAX)
+               wil->rx_status_ring_order = WIL_RX_SRING_SIZE_ORDER_DEFAULT;
+diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h 
b/drivers/net/wireless/ath/wil6210/wil6210.h
+index 75fe1a3b7046..bc89044d0b66 100644
+--- a/drivers/net/wireless/ath/wil6210/wil6210.h
++++ b/drivers/net/wireless/ath/wil6210/wil6210.h
+@@ -602,7 +602,7 @@ struct wil_txrx_ops {
+                          struct wil_ring *ring, struct sk_buff *skb);
+       irqreturn_t (*irq_tx)(int irq, void *cookie);
+       /* RX ops */
+-      int (*rx_init)(struct wil6210_priv *wil, u16 ring_size);
++      int (*rx_init)(struct wil6210_priv *wil, uint ring_order);
+       void (*rx_fini)(struct wil6210_priv *wil);
+       int (*wmi_addba_rx_resp)(struct wil6210_priv *wil, u8 mid, u8 cid,
+                                u8 tid, u8 token, u16 status, bool amsdu,
+@@ -778,6 +778,7 @@ struct wil_halp {
+       struct mutex            lock; /* protect halp ref_cnt */
+       unsigned int            ref_cnt;
+       struct completion       comp;
++      u8                      handle_icr;
+ };
+ 
+ struct wil_blob_wrapper {
+diff --git a/drivers/net/wireless/ath/wil6210/wmi.c 
b/drivers/net/wireless/ath/wil6210/wmi.c
+index 8a603432f531..3928b13ae026 100644
+--- a/drivers/net/wireless/ath/wil6210/wmi.c
++++ b/drivers/net/wireless/ath/wil6210/wmi.c
+@@ -2802,7 +2802,7 @@ static void wmi_event_handle(struct wil6210_priv *wil,
+ 
+               if (mid == MID_BROADCAST)
+                       mid = 0;
+-              if (mid >= wil->max_vifs) {
++              if (mid >= ARRAY_SIZE(wil->vifs) || mid >= wil->max_vifs) {
+                       wil_dbg_wmi(wil, "invalid mid %d, event skipped\n",
+                                   mid);
+                       return;
+diff --git a/drivers/net/wireless/mac80211_hwsim.c 
b/drivers/net/wireless/mac80211_hwsim.c
+index ce2dd06af62e..3564f5869b44 100644
+--- a/drivers/net/wireless/mac80211_hwsim.c
++++ b/drivers/net/wireless/mac80211_hwsim.c
+@@ -3327,9 +3327,9 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, 
struct genl_info *info)
+               param.no_vif = true;
+ 
+       if (info->attrs[HWSIM_ATTR_RADIO_NAME]) {
+-              hwname = kasprintf(GFP_KERNEL, "%.*s",
+-                                 nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
+-                                 (char 
*)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]));
++              hwname = kstrndup((char 
*)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]),
++                                nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
++                                GFP_KERNEL);
+               if (!hwname)
+                       return -ENOMEM;
+               param.hwname = hwname;
+@@ -3385,9 +3385,9 @@ static int hwsim_del_radio_nl(struct sk_buff *msg, 
struct genl_info *info)
+       if (info->attrs[HWSIM_ATTR_RADIO_ID]) {
+               idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]);
+       } else if (info->attrs[HWSIM_ATTR_RADIO_NAME]) {
+-              hwname = kasprintf(GFP_KERNEL, "%.*s",
+-                                 nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
+-                                 (char 
*)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]));
++              hwname = kstrndup((char 
*)nla_data(info->attrs[HWSIM_ATTR_RADIO_NAME]),
++                                nla_len(info->attrs[HWSIM_ATTR_RADIO_NAME]),
++                                GFP_KERNEL);
+               if (!hwname)
+                       return -ENOMEM;
+       } else
+diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c
+index e1e5dfcb16f3..259fd58812ae 100644
+--- a/drivers/pwm/pwm-pca9685.c
++++ b/drivers/pwm/pwm-pca9685.c
+@@ -31,6 +31,7 @@
+ #include <linux/slab.h>
+ #include <linux/delay.h>
+ #include <linux/pm_runtime.h>
++#include <linux/bitmap.h>
+ 
+ /*
+  * Because the PCA9685 has only one prescaler per chip, changing the period of
+@@ -85,6 +86,7 @@ struct pca9685 {
+ #if IS_ENABLED(CONFIG_GPIOLIB)
+       struct mutex lock;
+       struct gpio_chip gpio;
++      DECLARE_BITMAP(pwms_inuse, PCA9685_MAXCHAN + 1);
+ #endif
+ };
+ 
+@@ -94,51 +96,51 @@ static inline struct pca9685 *to_pca(struct pwm_chip *chip)
+ }
+ 
+ #if IS_ENABLED(CONFIG_GPIOLIB)
+-static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int 
offset)
++static bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca, int pwm_idx)
+ {
+-      struct pca9685 *pca = gpiochip_get_data(gpio);
+-      struct pwm_device *pwm;
++      bool is_inuse;
+ 
+       mutex_lock(&pca->lock);
+-
+-      pwm = &pca->chip.pwms[offset];
+-
+-      if (pwm->flags & (PWMF_REQUESTED | PWMF_EXPORTED)) {
+-              mutex_unlock(&pca->lock);
+-              return -EBUSY;
++      if (pwm_idx >= PCA9685_MAXCHAN) {
++              /*
++               * "all LEDs" channel:
++               * pretend already in use if any of the PWMs are requested
++               */
++              if (!bitmap_empty(pca->pwms_inuse, PCA9685_MAXCHAN)) {
++                      is_inuse = true;
++                      goto out;
++              }
++      } else {
++              /*
++               * regular channel:
++               * pretend already in use if the "all LEDs" channel is requested
++               */
++              if (test_bit(PCA9685_MAXCHAN, pca->pwms_inuse)) {
++                      is_inuse = true;
++                      goto out;
++              }
+       }
+-
+-      pwm_set_chip_data(pwm, (void *)1);
+-
++      is_inuse = test_and_set_bit(pwm_idx, pca->pwms_inuse);
++out:
+       mutex_unlock(&pca->lock);
+-      pm_runtime_get_sync(pca->chip.dev);
+-      return 0;
++      return is_inuse;
+ }
+ 
+-static bool pca9685_pwm_is_gpio(struct pca9685 *pca, struct pwm_device *pwm)
++static void pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx)
+ {
+-      bool is_gpio = false;
+-
+       mutex_lock(&pca->lock);
++      clear_bit(pwm_idx, pca->pwms_inuse);
++      mutex_unlock(&pca->lock);
++}
+ 
+-      if (pwm->hwpwm >= PCA9685_MAXCHAN) {
+-              unsigned int i;
+-
+-              /*
+-               * Check if any of the GPIOs are requested and in that case
+-               * prevent using the "all LEDs" channel.
+-               */
+-              for (i = 0; i < pca->gpio.ngpio; i++)
+-                      if (gpiochip_is_requested(&pca->gpio, i)) {
+-                              is_gpio = true;
+-                              break;
+-                      }
+-      } else if (pwm_get_chip_data(pwm)) {
+-              is_gpio = true;
+-      }
++static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int 
offset)
++{
++      struct pca9685 *pca = gpiochip_get_data(gpio);
+ 
+-      mutex_unlock(&pca->lock);
+-      return is_gpio;
++      if (pca9685_pwm_test_and_set_inuse(pca, offset))
++              return -EBUSY;
++      pm_runtime_get_sync(pca->chip.dev);
++      return 0;
+ }
+ 
+ static int pca9685_pwm_gpio_get(struct gpio_chip *gpio, unsigned int offset)
+@@ -173,6 +175,7 @@ static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, 
unsigned int offset)
+ 
+       pca9685_pwm_gpio_set(gpio, offset, 0);
+       pm_runtime_put(pca->chip.dev);
++      pca9685_pwm_clear_inuse(pca, offset);
+ }
+ 
+ static int pca9685_pwm_gpio_get_direction(struct gpio_chip *chip,
+@@ -224,12 +227,17 @@ static int pca9685_pwm_gpio_probe(struct pca9685 *pca)
+       return devm_gpiochip_add_data(dev, &pca->gpio, pca);
+ }
+ #else
+-static inline bool pca9685_pwm_is_gpio(struct pca9685 *pca,
+-                                     struct pwm_device *pwm)
++static inline bool pca9685_pwm_test_and_set_inuse(struct pca9685 *pca,
++                                                int pwm_idx)
+ {
+       return false;
+ }
+ 
++static inline void
++pca9685_pwm_clear_inuse(struct pca9685 *pca, int pwm_idx)
++{
++}
++
+ static inline int pca9685_pwm_gpio_probe(struct pca9685 *pca)
+ {
+       return 0;
+@@ -413,7 +421,7 @@ static int pca9685_pwm_request(struct pwm_chip *chip, 
struct pwm_device *pwm)
+ {
+       struct pca9685 *pca = to_pca(chip);
+ 
+-      if (pca9685_pwm_is_gpio(pca, pwm))
++      if (pca9685_pwm_test_and_set_inuse(pca, pwm->hwpwm))
+               return -EBUSY;
+       pm_runtime_get_sync(chip->dev);
+ 
+@@ -422,8 +430,11 @@ static int pca9685_pwm_request(struct pwm_chip *chip, 
struct pwm_device *pwm)
+ 
+ static void pca9685_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
+ {
++      struct pca9685 *pca = to_pca(chip);
++
+       pca9685_pwm_disable(chip, pwm);
+       pm_runtime_put(chip->dev);
++      pca9685_pwm_clear_inuse(pca, pwm->hwpwm);
+ }
+ 
+ static const struct pwm_ops pca9685_pwm_ops = {
+diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
+index b3dee24917a8..d91209ba18c8 100644
+--- a/drivers/scsi/ufs/ufshcd.c
++++ b/drivers/scsi/ufs/ufshcd.c
+@@ -1563,6 +1563,11 @@ start:
+                */
+               if (ufshcd_can_hibern8_during_gating(hba) &&
+                   ufshcd_is_link_hibern8(hba)) {
++                      if (async) {
++                              rc = -EAGAIN;
++                              hba->clk_gating.active_reqs--;
++                              break;
++                      }
+                       spin_unlock_irqrestore(hba->host->host_lock, flags);
+                       flush_work(&hba->clk_gating.ungate_work);
+                       spin_lock_irqsave(hba->host->host_lock, flags);
+diff --git a/drivers/target/iscsi/iscsi_target.c 
b/drivers/target/iscsi/iscsi_target.c
+index 03e9cb156df9..1633e2666268 100644
+--- a/drivers/target/iscsi/iscsi_target.c
++++ b/drivers/target/iscsi/iscsi_target.c
+@@ -4275,30 +4275,37 @@ int iscsit_close_connection(
+       if (!atomic_read(&sess->session_reinstatement) &&
+            atomic_read(&sess->session_fall_back_to_erl0)) {
+               spin_unlock_bh(&sess->conn_lock);
++              complete_all(&sess->session_wait_comp);
+               iscsit_close_session(sess);
+ 
+               return 0;
+       } else if (atomic_read(&sess->session_logout)) {
+               pr_debug("Moving to TARG_SESS_STATE_FREE.\n");
+               sess->session_state = TARG_SESS_STATE_FREE;
+-              spin_unlock_bh(&sess->conn_lock);
+ 
+-              if (atomic_read(&sess->sleep_on_sess_wait_comp))
+-                      complete(&sess->session_wait_comp);
++              if (atomic_read(&sess->session_close)) {
++                      spin_unlock_bh(&sess->conn_lock);
++                      complete_all(&sess->session_wait_comp);
++                      iscsit_close_session(sess);
++              } else {
++                      spin_unlock_bh(&sess->conn_lock);
++              }
+ 
+               return 0;
+       } else {
+               pr_debug("Moving to TARG_SESS_STATE_FAILED.\n");
+               sess->session_state = TARG_SESS_STATE_FAILED;
+ 
+-              if (!atomic_read(&sess->session_continuation)) {
+-                      spin_unlock_bh(&sess->conn_lock);
++              if (!atomic_read(&sess->session_continuation))
+                       iscsit_start_time2retain_handler(sess);
+-              } else
+-                      spin_unlock_bh(&sess->conn_lock);
+ 
+-              if (atomic_read(&sess->sleep_on_sess_wait_comp))
+-                      complete(&sess->session_wait_comp);
++              if (atomic_read(&sess->session_close)) {
++                      spin_unlock_bh(&sess->conn_lock);
++                      complete_all(&sess->session_wait_comp);
++                      iscsit_close_session(sess);
++              } else {
++                      spin_unlock_bh(&sess->conn_lock);
++              }
+ 
+               return 0;
+       }
+@@ -4404,9 +4411,9 @@ static void iscsit_logout_post_handler_closesession(
+       complete(&conn->conn_logout_comp);
+ 
+       iscsit_dec_conn_usage_count(conn);
++      atomic_set(&sess->session_close, 1);
+       iscsit_stop_session(sess, sleep, sleep);
+       iscsit_dec_session_usage_count(sess);
+-      iscsit_close_session(sess);
+ }
+ 
+ static void iscsit_logout_post_handler_samecid(
+@@ -4541,49 +4548,6 @@ void iscsit_fail_session(struct iscsi_session *sess)
+       sess->session_state = TARG_SESS_STATE_FAILED;
+ }
+ 
+-int iscsit_free_session(struct iscsi_session *sess)
+-{
+-      u16 conn_count = atomic_read(&sess->nconn);
+-      struct iscsi_conn *conn, *conn_tmp = NULL;
+-      int is_last;
+-
+-      spin_lock_bh(&sess->conn_lock);
+-      atomic_set(&sess->sleep_on_sess_wait_comp, 1);
+-
+-      list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list,
+-                      conn_list) {
+-              if (conn_count == 0)
+-                      break;
+-
+-              if (list_is_last(&conn->conn_list, &sess->sess_conn_list)) {
+-                      is_last = 1;
+-              } else {
+-                      iscsit_inc_conn_usage_count(conn_tmp);
+-                      is_last = 0;
+-              }
+-              iscsit_inc_conn_usage_count(conn);
+-
+-              spin_unlock_bh(&sess->conn_lock);
+-              iscsit_cause_connection_reinstatement(conn, 1);
+-              spin_lock_bh(&sess->conn_lock);
+-
+-              iscsit_dec_conn_usage_count(conn);
+-              if (is_last == 0)
+-                      iscsit_dec_conn_usage_count(conn_tmp);
+-
+-              conn_count--;
+-      }
+-
+-      if (atomic_read(&sess->nconn)) {
+-              spin_unlock_bh(&sess->conn_lock);
+-              wait_for_completion(&sess->session_wait_comp);
+-      } else
+-              spin_unlock_bh(&sess->conn_lock);
+-
+-      iscsit_close_session(sess);
+-      return 0;
+-}
+-
+ void iscsit_stop_session(
+       struct iscsi_session *sess,
+       int session_sleep,
+@@ -4594,8 +4558,6 @@ void iscsit_stop_session(
+       int is_last;
+ 
+       spin_lock_bh(&sess->conn_lock);
+-      if (session_sleep)
+-              atomic_set(&sess->sleep_on_sess_wait_comp, 1);
+ 
+       if (connection_sleep) {
+               list_for_each_entry_safe(conn, conn_tmp, &sess->sess_conn_list,
+@@ -4653,12 +4615,15 @@ int iscsit_release_sessions_for_tpg(struct 
iscsi_portal_group *tpg, int force)
+               spin_lock(&sess->conn_lock);
+               if (atomic_read(&sess->session_fall_back_to_erl0) ||
+                   atomic_read(&sess->session_logout) ||
++                  atomic_read(&sess->session_close) ||
+                   (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
+                       spin_unlock(&sess->conn_lock);
+                       continue;
+               }
++              iscsit_inc_session_usage_count(sess);
+               atomic_set(&sess->session_reinstatement, 1);
+               atomic_set(&sess->session_fall_back_to_erl0, 1);
++              atomic_set(&sess->session_close, 1);
+               spin_unlock(&sess->conn_lock);
+ 
+               list_move_tail(&se_sess->sess_list, &free_list);
+@@ -4668,7 +4633,9 @@ int iscsit_release_sessions_for_tpg(struct 
iscsi_portal_group *tpg, int force)
+       list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) {
+               sess = (struct iscsi_session *)se_sess->fabric_sess_ptr;
+ 
+-              iscsit_free_session(sess);
++              list_del_init(&se_sess->sess_list);
++              iscsit_stop_session(sess, 1, 1);
++              iscsit_dec_session_usage_count(sess);
+               session_count++;
+       }
+ 
+diff --git a/drivers/target/iscsi/iscsi_target.h 
b/drivers/target/iscsi/iscsi_target.h
+index 48bac0acf8c7..11a481cf6ead 100644
+--- a/drivers/target/iscsi/iscsi_target.h
++++ b/drivers/target/iscsi/iscsi_target.h
+@@ -43,7 +43,6 @@ extern int iscsi_target_rx_thread(void *);
+ extern int iscsit_close_connection(struct iscsi_conn *);
+ extern int iscsit_close_session(struct iscsi_session *);
+ extern void iscsit_fail_session(struct iscsi_session *);
+-extern int iscsit_free_session(struct iscsi_session *);
+ extern void iscsit_stop_session(struct iscsi_session *, int, int);
+ extern int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *, int);
+ 
+diff --git a/drivers/target/iscsi/iscsi_target_configfs.c 
b/drivers/target/iscsi/iscsi_target_configfs.c
+index 95d0a22b2ad6..d25cadc4f4f1 100644
+--- a/drivers/target/iscsi/iscsi_target_configfs.c
++++ b/drivers/target/iscsi/iscsi_target_configfs.c
+@@ -1501,20 +1501,23 @@ static void lio_tpg_close_session(struct se_session 
*se_sess)
+       spin_lock(&sess->conn_lock);
+       if (atomic_read(&sess->session_fall_back_to_erl0) ||
+           atomic_read(&sess->session_logout) ||
++          atomic_read(&sess->session_close) ||
+           (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
+               spin_unlock(&sess->conn_lock);
+               spin_unlock_bh(&se_tpg->session_lock);
+               return;
+       }
++      iscsit_inc_session_usage_count(sess);
+       atomic_set(&sess->session_reinstatement, 1);
+       atomic_set(&sess->session_fall_back_to_erl0, 1);
++      atomic_set(&sess->session_close, 1);
+       spin_unlock(&sess->conn_lock);
+ 
+       iscsit_stop_time2retain_timer(sess);
+       spin_unlock_bh(&se_tpg->session_lock);
+ 
+       iscsit_stop_session(sess, 1, 1);
+-      iscsit_close_session(sess);
++      iscsit_dec_session_usage_count(sess);
+ }
+ 
+ static u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg)
+diff --git a/drivers/target/iscsi/iscsi_target_login.c 
b/drivers/target/iscsi/iscsi_target_login.c
+index bb90c80ff388..f25049ba4a85 100644
+--- a/drivers/target/iscsi/iscsi_target_login.c
++++ b/drivers/target/iscsi/iscsi_target_login.c
+@@ -164,6 +164,7 @@ int iscsi_check_for_session_reinstatement(struct 
iscsi_conn *conn)
+               spin_lock(&sess_p->conn_lock);
+               if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
+                   atomic_read(&sess_p->session_logout) ||
++                  atomic_read(&sess_p->session_close) ||
+                   (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED)) {
+                       spin_unlock(&sess_p->conn_lock);
+                       continue;
+@@ -174,6 +175,7 @@ int iscsi_check_for_session_reinstatement(struct 
iscsi_conn *conn)
+                  (sess_p->sess_ops->SessionType == sessiontype))) {
+                       atomic_set(&sess_p->session_reinstatement, 1);
+                       atomic_set(&sess_p->session_fall_back_to_erl0, 1);
++                      atomic_set(&sess_p->session_close, 1);
+                       spin_unlock(&sess_p->conn_lock);
+                       iscsit_inc_session_usage_count(sess_p);
+                       iscsit_stop_time2retain_timer(sess_p);
+@@ -198,7 +200,6 @@ int iscsi_check_for_session_reinstatement(struct 
iscsi_conn *conn)
+       if (sess->session_state == TARG_SESS_STATE_FAILED) {
+               spin_unlock_bh(&sess->conn_lock);
+               iscsit_dec_session_usage_count(sess);
+-              iscsit_close_session(sess);
+               return 0;
+       }
+       spin_unlock_bh(&sess->conn_lock);
+@@ -206,7 +207,6 @@ int iscsi_check_for_session_reinstatement(struct 
iscsi_conn *conn)
+       iscsit_stop_session(sess, 1, 1);
+       iscsit_dec_session_usage_count(sess);
+ 
+-      iscsit_close_session(sess);
+       return 0;
+ }
+ 
+@@ -494,6 +494,7 @@ static int iscsi_login_non_zero_tsih_s2(
+               sess_p = (struct iscsi_session *)se_sess->fabric_sess_ptr;
+               if (atomic_read(&sess_p->session_fall_back_to_erl0) ||
+                   atomic_read(&sess_p->session_logout) ||
++                  atomic_read(&sess_p->session_close) ||
+                  (sess_p->time2retain_timer_flags & ISCSI_TF_EXPIRED))
+                       continue;
+               if (!memcmp(sess_p->isid, pdu->isid, 6) &&
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index 7b8b463676ad..8a4455d0af8b 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -688,12 +688,13 @@ out:
+       return 0;
+ }
+ 
+-static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force);
++static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
++              bool interrupt);
+ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
+ {
+       struct dwc3_request             *req;
+ 
+-      dwc3_stop_active_transfer(dep, true);
++      dwc3_stop_active_transfer(dep, true, false);
+ 
+       /* - giveback all requests to gadget driver */
+       while (!list_empty(&dep->started_list)) {
+@@ -1416,7 +1417,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
+               }
+               if (r == req) {
+                       /* wait until it is processed */
+-                      dwc3_stop_active_transfer(dep, true);
++                      dwc3_stop_active_transfer(dep, true, true);
+ 
+                       if (!r->trb)
+                               goto out0;
+@@ -2365,10 +2366,8 @@ static void 
dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
+ 
+       dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
+ 
+-      if (stop) {
+-              dwc3_stop_active_transfer(dep, true);
+-              dep->flags = DWC3_EP_ENABLED;
+-      }
++      if (stop)
++              dwc3_stop_active_transfer(dep, true, true);
+ 
+       /*
+        * WORKAROUND: This is the 2nd half of U1/U2 -> U0 workaround.
+@@ -2488,7 +2487,8 @@ static void dwc3_reset_gadget(struct dwc3 *dwc)
+       }
+ }
+ 
+-static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
++static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
++      bool interrupt)
+ {
+       struct dwc3 *dwc = dep->dwc;
+       struct dwc3_gadget_ep_cmd_params params;
+@@ -2532,7 +2532,7 @@ static void dwc3_stop_active_transfer(struct dwc3_ep 
*dep, bool force)
+ 
+       cmd = DWC3_DEPCMD_ENDTRANSFER;
+       cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
+-      cmd |= DWC3_DEPCMD_CMDIOC;
++      cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0;
+       cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
+       memset(&params, 0, sizeof(params));
+       ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
+diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
+index d1c5cd90b182..eedcb7bf50e9 100644
+--- a/fs/btrfs/relocation.c
++++ b/fs/btrfs/relocation.c
+@@ -525,8 +525,8 @@ static int should_ignore_root(struct btrfs_root *root)
+       if (!reloc_root)
+               return 0;
+ 
+-      if (btrfs_root_last_snapshot(&reloc_root->root_item) ==
+-          root->fs_info->running_transaction->transid - 1)
++      if (btrfs_header_generation(reloc_root->commit_root) ==
++          root->fs_info->running_transaction->transid)
+               return 0;
+       /*
+        * if there is reloc tree and it was created in previous
+diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
+index f81eb1785af2..a289f4bcee45 100644
+--- a/fs/ext4/extents.c
++++ b/fs/ext4/extents.c
+@@ -3438,8 +3438,8 @@ static int ext4_ext_convert_to_initialized(handle_t 
*handle,
+               (unsigned long long)map->m_lblk, map_len);
+ 
+       sbi = EXT4_SB(inode->i_sb);
+-      eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
+-              inode->i_sb->s_blocksize_bits;
++      eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1)
++                      >> inode->i_sb->s_blocksize_bits;
+       if (eof_block < map->m_lblk + map_len)
+               eof_block = map->m_lblk + map_len;
+ 
+@@ -3694,8 +3694,8 @@ static int ext4_split_convert_extents(handle_t *handle,
+                 __func__, inode->i_ino,
+                 (unsigned long long)map->m_lblk, map->m_len);
+ 
+-      eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
+-              inode->i_sb->s_blocksize_bits;
++      eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1)
++                      >> inode->i_sb->s_blocksize_bits;
+       if (eof_block < map->m_lblk + map->m_len)
+               eof_block = map->m_lblk + map->m_len;
+       /*
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index d44fc3f579e1..c76962eba5dd 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -4031,7 +4031,7 @@ static int ext4_fill_super(struct super_block *sb, void 
*data, int silent)
+       if (sbi->s_inodes_per_group < sbi->s_inodes_per_block ||
+           sbi->s_inodes_per_group > blocksize * 8) {
+               ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n",
+-                       sbi->s_blocks_per_group);
++                       sbi->s_inodes_per_group);
+               goto failed_mount;
+       }
+       sbi->s_itb_per_group = sbi->s_inodes_per_group /
+@@ -4162,9 +4162,9 @@ static int ext4_fill_super(struct super_block *sb, void 
*data, int silent)
+                       EXT4_BLOCKS_PER_GROUP(sb) - 1);
+       do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb));
+       if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
+-              ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
++              ext4_msg(sb, KERN_WARNING, "groups count too large: %llu "
+                      "(block count %llu, first data block %u, "
+-                     "blocks per group %lu)", sbi->s_groups_count,
++                     "blocks per group %lu)", blocks_count,
+                      ext4_blocks_count(es),
+                      le32_to_cpu(es->s_first_data_block),
+                      EXT4_BLOCKS_PER_GROUP(sb));
+diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
+index 4200a6fe9599..97760cb9bcd7 100644
+--- a/fs/jbd2/commit.c
++++ b/fs/jbd2/commit.c
+@@ -992,9 +992,10 @@ restart_loop:
+                        * journalled data) we need to unmap buffer and clear
+                        * more bits. We also need to be careful about the check
+                        * because the data page mapping can get cleared under
+-                       * out hands, which alse need not to clear more bits
+-                       * because the page and buffers will be freed and can
+-                       * never be reused once we are done with them.
++                       * our hands. Note that if mapping == NULL, we don't
++                       * need to make buffer unmapped because the page is
++                       * already detached from the mapping and buffers cannot
++                       * get reused.
+                        */
+                       mapping = READ_ONCE(bh->b_page->mapping);
+                       if (mapping && !sb_is_blkdev_sb(mapping->host->i_sb)) {
+diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
+index a138bb3bc2a5..8b3c284ce92e 100644
+--- a/fs/overlayfs/inode.c
++++ b/fs/overlayfs/inode.c
+@@ -884,7 +884,7 @@ struct inode *ovl_get_inode(struct super_block *sb,
+       struct dentry *lowerdentry = lowerpath ? lowerpath->dentry : NULL;
+       bool bylower = ovl_hash_bylower(sb, upperdentry, lowerdentry,
+                                       oip->index);
+-      int fsid = bylower ? oip->lowerpath->layer->fsid : 0;
++      int fsid = bylower ? lowerpath->layer->fsid : 0;
+       bool is_dir, metacopy = false;
+       unsigned long ino = 0;
+       int err = oip->newinode ? -EEXIST : -ENOMEM;
+@@ -934,6 +934,8 @@ struct inode *ovl_get_inode(struct super_block *sb,
+                       err = -ENOMEM;
+                       goto out_err;
+               }
++              ino = realinode->i_ino;
++              fsid = lowerpath->layer->fsid;
+       }
+       ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev, ino, fsid);
+       ovl_inode_init(inode, upperdentry, lowerdentry, oip->lowerdata);
+diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
+index 7b9c82de11cc..5e26d61867b2 100644
+--- a/include/net/ip6_route.h
++++ b/include/net/ip6_route.h
+@@ -234,6 +234,7 @@ static inline bool ipv6_anycast_destination(const struct 
dst_entry *dst,
+ 
+       return rt->rt6i_flags & RTF_ANYCAST ||
+               (rt->rt6i_dst.plen < 127 &&
++               !(rt->rt6i_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) &&
+                ipv6_addr_equal(&rt->rt6i_dst.addr, daddr));
+ }
+ 
+diff --git a/include/target/iscsi/iscsi_target_core.h 
b/include/target/iscsi/iscsi_target_core.h
+index f2e6abea8490..70d18444d18d 100644
+--- a/include/target/iscsi/iscsi_target_core.h
++++ b/include/target/iscsi/iscsi_target_core.h
+@@ -674,7 +674,7 @@ struct iscsi_session {
+       atomic_t                session_logout;
+       atomic_t                session_reinstatement;
+       atomic_t                session_stop_active;
+-      atomic_t                sleep_on_sess_wait_comp;
++      atomic_t                session_close;
+       /* connection list */
+       struct list_head        sess_conn_list;
+       struct list_head        cr_active_list;
+diff --git a/kernel/trace/trace_events_trigger.c 
b/kernel/trace/trace_events_trigger.c
+index 9300e8bbf08a..38a2a558e546 100644
+--- a/kernel/trace/trace_events_trigger.c
++++ b/kernel/trace/trace_events_trigger.c
+@@ -1081,14 +1081,10 @@ register_snapshot_trigger(char *glob, struct 
event_trigger_ops *ops,
+                         struct event_trigger_data *data,
+                         struct trace_event_file *file)
+ {
+-      int ret = register_trigger(glob, ops, data, file);
+-
+-      if (ret > 0 && tracing_alloc_snapshot_instance(file->tr) != 0) {
+-              unregister_trigger(glob, ops, data, file);
+-              ret = 0;
+-      }
++      if (tracing_alloc_snapshot_instance(file->tr) != 0)
++              return 0;
+ 
+-      return ret;
++      return register_trigger(glob, ops, data, file);
+ }
+ 
+ static int
+diff --git a/mm/vmalloc.c b/mm/vmalloc.c
+index 958d6ba9ee2d..be65161f9753 100644
+--- a/mm/vmalloc.c
++++ b/mm/vmalloc.c
+@@ -1668,7 +1668,6 @@ static void *__vmalloc_area_node(struct vm_struct *area, 
gfp_t gfp_mask,
+       nr_pages = get_vm_area_size(area) >> PAGE_SHIFT;
+       array_size = (nr_pages * sizeof(struct page *));
+ 
+-      area->nr_pages = nr_pages;
+       /* Please note that the recursion is strictly bounded. */
+       if (array_size > PAGE_SIZE) {
+               pages = __vmalloc_node(array_size, 1, nested_gfp|highmem_mask,
+@@ -1676,13 +1675,16 @@ static void *__vmalloc_area_node(struct vm_struct 
*area, gfp_t gfp_mask,
+       } else {
+               pages = kmalloc_node(array_size, nested_gfp, node);
+       }
+-      area->pages = pages;
+-      if (!area->pages) {
++
++      if (!pages) {
+               remove_vm_area(area->addr);
+               kfree(area);
+               return NULL;
+       }
+ 
++      area->pages = pages;
++      area->nr_pages = nr_pages;
++
+       for (i = 0; i < area->nr_pages; i++) {
+               struct page *page;
+ 
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 2f4d35101f4d..426635e188fc 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -3934,7 +3934,8 @@ EXPORT_SYMBOL(netdev_max_backlog);
+ 
+ int netdev_tstamp_prequeue __read_mostly = 1;
+ int netdev_budget __read_mostly = 300;
+-unsigned int __read_mostly netdev_budget_usecs = 2000;
++/* Must be at least 2 jiffes to guarantee 1 jiffy timeout */
++unsigned int __read_mostly netdev_budget_usecs = 2 * USEC_PER_SEC / HZ;
+ int weight_p __read_mostly = 64;           /* old backlog weight */
+ int dev_weight_rx_bias __read_mostly = 1;  /* bias for backlog weight */
+ int dev_weight_tx_bias __read_mostly = 1;  /* bias for output_queue quota */
+diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c
+index 37708dabebd1..606bc7fe5cc7 100644
+--- a/net/hsr/hsr_netlink.c
++++ b/net/hsr/hsr_netlink.c
+@@ -64,10 +64,16 @@ static int hsr_newlink(struct net *src_net, struct 
net_device *dev,
+       else
+               multicast_spec = nla_get_u8(data[IFLA_HSR_MULTICAST_SPEC]);
+ 
+-      if (!data[IFLA_HSR_VERSION])
++      if (!data[IFLA_HSR_VERSION]) {
+               hsr_version = 0;
+-      else
++      } else {
+               hsr_version = nla_get_u8(data[IFLA_HSR_VERSION]);
++              if (hsr_version > 1) {
++                      NL_SET_ERR_MSG_MOD(extack,
++                                         "Only versions 0..1 are supported");
++                      return -EINVAL;
++              }
++      }
+ 
+       return hsr_dev_finalize(dev, link, multicast_spec, hsr_version);
+ }
+diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
+index fabece4b8997..a08d682ba676 100644
+--- a/net/ipv4/devinet.c
++++ b/net/ipv4/devinet.c
+@@ -587,12 +587,15 @@ struct in_ifaddr *inet_ifa_byprefix(struct in_device 
*in_dev, __be32 prefix,
+       return NULL;
+ }
+ 
+-static int ip_mc_config(struct sock *sk, bool join, const struct in_ifaddr 
*ifa)
++static int ip_mc_autojoin_config(struct net *net, bool join,
++                               const struct in_ifaddr *ifa)
+ {
++#if defined(CONFIG_IP_MULTICAST)
+       struct ip_mreqn mreq = {
+               .imr_multiaddr.s_addr = ifa->ifa_address,
+               .imr_ifindex = ifa->ifa_dev->dev->ifindex,
+       };
++      struct sock *sk = net->ipv4.mc_autojoin_sk;
+       int ret;
+ 
+       ASSERT_RTNL();
+@@ -605,6 +608,9 @@ static int ip_mc_config(struct sock *sk, bool join, const 
struct in_ifaddr *ifa)
+       release_sock(sk);
+ 
+       return ret;
++#else
++      return -EOPNOTSUPP;
++#endif
+ }
+ 
+ static int inet_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
+@@ -646,7 +652,7 @@ static int inet_rtm_deladdr(struct sk_buff *skb, struct 
nlmsghdr *nlh,
+                       continue;
+ 
+               if (ipv4_is_multicast(ifa->ifa_address))
+-                      ip_mc_config(net->ipv4.mc_autojoin_sk, false, ifa);
++                      ip_mc_autojoin_config(net, false, ifa);
+               __inet_del_ifa(in_dev, ifap, 1, nlh, NETLINK_CB(skb).portid);
+               return 0;
+       }
+@@ -907,8 +913,7 @@ static int inet_rtm_newaddr(struct sk_buff *skb, struct 
nlmsghdr *nlh,
+                */
+               set_ifa_lifetime(ifa, valid_lft, prefered_lft);
+               if (ifa->ifa_flags & IFA_F_MCAUTOJOIN) {
+-                      int ret = ip_mc_config(net->ipv4.mc_autojoin_sk,
+-                                             true, ifa);
++                      int ret = ip_mc_autojoin_config(net, true, ifa);
+ 
+                       if (ret < 0) {
+                               inet_free_ifa(ifa);
+diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
+index 82d38f93c81a..518327dccb3c 100644
+--- a/net/qrtr/qrtr.c
++++ b/net/qrtr/qrtr.c
+@@ -769,20 +769,21 @@ static int qrtr_sendmsg(struct socket *sock, struct 
msghdr *msg, size_t len)
+ 
+       node = NULL;
+       if (addr->sq_node == QRTR_NODE_BCAST) {
+-              enqueue_fn = qrtr_bcast_enqueue;
+-              if (addr->sq_port != QRTR_PORT_CTRL) {
++              if (addr->sq_port != QRTR_PORT_CTRL &&
++                  qrtr_local_nid != QRTR_NODE_BCAST) {
+                       release_sock(sk);
+                       return -ENOTCONN;
+               }
++              enqueue_fn = qrtr_bcast_enqueue;
+       } else if (addr->sq_node == ipc->us.sq_node) {
+               enqueue_fn = qrtr_local_enqueue;
+       } else {
+-              enqueue_fn = qrtr_node_enqueue;
+               node = qrtr_node_lookup(addr->sq_node);
+               if (!node) {
+                       release_sock(sk);
+                       return -ECONNRESET;
+               }
++              enqueue_fn = qrtr_node_enqueue;
+       }
+ 
+       plen = (len + 3) & ~3;
+diff --git a/security/keys/proc.c b/security/keys/proc.c
+index d38be9db2cc0..7ec2779cb089 100644
+--- a/security/keys/proc.c
++++ b/security/keys/proc.c
+@@ -144,6 +144,8 @@ static void *proc_keys_next(struct seq_file *p, void *v, 
loff_t *_pos)
+       n = key_serial_next(p, v);
+       if (n)
+               *_pos = key_node_serial(n);
++      else
++              (*_pos)++;
+       return n;
+ }
+ 
+diff --git a/sound/soc/intel/atom/sst-atom-controls.c 
b/sound/soc/intel/atom/sst-atom-controls.c
+index 3672d36b4b66..737f5d553313 100644
+--- a/sound/soc/intel/atom/sst-atom-controls.c
++++ b/sound/soc/intel/atom/sst-atom-controls.c
+@@ -1341,7 +1341,7 @@ int sst_send_pipe_gains(struct snd_soc_dai *dai, int 
stream, int mute)
+                               dai->capture_widget->name);
+               w = dai->capture_widget;
+               snd_soc_dapm_widget_for_each_source_path(w, p) {
+-                      if (p->connected && !p->connected(w, p->sink))
++                      if (p->connected && !p->connected(w, p->source))
+                               continue;
+ 
+                       if (p->connect &&  p->source->power &&
+diff --git a/sound/soc/intel/atom/sst/sst_pci.c 
b/sound/soc/intel/atom/sst/sst_pci.c
+index 6906ee624cf6..438c7bcd8c4c 100644
+--- a/sound/soc/intel/atom/sst/sst_pci.c
++++ b/sound/soc/intel/atom/sst/sst_pci.c
+@@ -107,7 +107,7 @@ static int sst_platform_get_resources(struct intel_sst_drv 
*ctx)
+       dev_dbg(ctx->dev, "DRAM Ptr %p\n", ctx->dram);
+ do_release_regions:
+       pci_release_regions(pci);
+-      return 0;
++      return ret;
+ }
+ 
+ /*
+diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
+index f2e173b9691d..257da95a4ea6 100644
+--- a/sound/usb/mixer.c
++++ b/sound/usb/mixer.c
+@@ -1461,7 +1461,7 @@ error:
+               usb_audio_err(chip,
+                       "cannot get connectors status: req = %#x, wValue = %#x, 
wIndex = %#x, type = %d\n",
+                       UAC_GET_CUR, validx, idx, cval->val_type);
+-              return ret;
++              return filter_error(cval, ret);
+       }
+ 
+       ucontrol->value.integer.value[0] = val;
+@@ -1765,11 +1765,15 @@ static void get_connector_control_name(struct 
usb_mixer_interface *mixer,
+ 
+ /* Build a mixer control for a UAC connector control (jack-detect) */
+ static void build_connector_control(struct usb_mixer_interface *mixer,
++                                  const struct usbmix_name_map *imap,
+                                   struct usb_audio_term *term, bool is_input)
+ {
+       struct snd_kcontrol *kctl;
+       struct usb_mixer_elem_info *cval;
+ 
++      if (check_ignored_ctl(find_map(imap, term->id, 0)))
++              return;
++
+       cval = kzalloc(sizeof(*cval), GFP_KERNEL);
+       if (!cval)
+               return;
+@@ -2107,8 +2111,9 @@ static int parse_audio_input_terminal(struct mixer_build 
*state, int unitid,
+       check_input_term(state, term_id, &iterm);
+ 
+       /* Check for jack detection. */
+-      if (uac_v2v3_control_is_readable(bmctls, control))
+-              build_connector_control(state->mixer, &iterm, true);
++      if ((iterm.type & 0xff00) != 0x0100 &&
++          uac_v2v3_control_is_readable(bmctls, control))
++              build_connector_control(state->mixer, state->map, &iterm, true);
+ 
+       return 0;
+ }
+@@ -3069,13 +3074,13 @@ static int snd_usb_mixer_controls_badd(struct 
usb_mixer_interface *mixer,
+               memset(&iterm, 0, sizeof(iterm));
+               iterm.id = UAC3_BADD_IT_ID4;
+               iterm.type = UAC_BIDIR_TERMINAL_HEADSET;
+-              build_connector_control(mixer, &iterm, true);
++              build_connector_control(mixer, map->map, &iterm, true);
+ 
+               /* Output Term - Insertion control */
+               memset(&oterm, 0, sizeof(oterm));
+               oterm.id = UAC3_BADD_OT_ID3;
+               oterm.type = UAC_BIDIR_TERMINAL_HEADSET;
+-              build_connector_control(mixer, &oterm, false);
++              build_connector_control(mixer, map->map, &oterm, false);
+       }
+ 
+       return 0;
+@@ -3104,7 +3109,7 @@ static int snd_usb_mixer_controls(struct 
usb_mixer_interface *mixer)
+               if (map->id == state.chip->usb_id) {
+                       state.map = map->map;
+                       state.selector_map = map->selector_map;
+-                      mixer->ignore_ctl_error = map->ignore_ctl_error;
++                      mixer->ignore_ctl_error |= map->ignore_ctl_error;
+                       break;
+               }
+       }
+@@ -3147,10 +3152,11 @@ static int snd_usb_mixer_controls(struct 
usb_mixer_interface *mixer)
+                       if (err < 0 && err != -EINVAL)
+                               return err;
+ 
+-                      if 
(uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls),
++                      if ((state.oterm.type & 0xff00) != 0x0100 &&
++                          
uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls),
+                                                        UAC2_TE_CONNECTOR)) {
+-                              build_connector_control(state.mixer, 
&state.oterm,
+-                                                      false);
++                              build_connector_control(state.mixer, state.map,
++                                                      &state.oterm, false);
+                       }
+               } else {  /* UAC_VERSION_3 */
+                       struct uac3_output_terminal_descriptor *desc = p;
+@@ -3172,10 +3178,11 @@ static int snd_usb_mixer_controls(struct 
usb_mixer_interface *mixer)
+                       if (err < 0 && err != -EINVAL)
+                               return err;
+ 
+-                      if 
(uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls),
++                      if ((state.oterm.type & 0xff00) != 0x0100 &&
++                          
uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls),
+                                                        UAC3_TE_INSERTION)) {
+-                              build_connector_control(state.mixer, 
&state.oterm,
+-                                                      false);
++                              build_connector_control(state.mixer, state.map,
++                                                      &state.oterm, false);
+                       }
+               }
+       }
+diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
+index f6e2cc66153a..bf000e54461b 100644
+--- a/sound/usb/mixer_maps.c
++++ b/sound/usb/mixer_maps.c
+@@ -364,9 +364,11 @@ static const struct usbmix_name_map dell_alc4020_map[] = {
+ };
+ 
+ /* Some mobos shipped with a dummy HD-audio show the invalid GET_MIN/GET_MAX
+- * response for Input Gain Pad (id=19, control=12).  Skip it.
++ * response for Input Gain Pad (id=19, control=12) and the connector status
++ * for SPDIF terminal (id=18).  Skip them.
+  */
+ static const struct usbmix_name_map asus_rog_map[] = {
++      { 18, NULL }, /* OT, connector control */
+       { 19, NULL, 12 }, /* FU, Input Gain Pad */
+       {}
+ };

Reply via email to