commit:     36921383285e31038402e82e831105271a22a7ad
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Mar  9 12:18:35 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Tue Mar  9 12:18:35 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=36921383

Linux patch 5.10.22

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

 0000_README              |    4 +
 1021_linux-5.10.22.patch | 1550 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1554 insertions(+)

diff --git a/0000_README b/0000_README
index fd876b7..36a5539 100644
--- a/0000_README
+++ b/0000_README
@@ -127,6 +127,10 @@ Patch:  1020_linux-5.10.21.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.10.21
 
+Patch:  1021_linux-5.10.22.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.10.22
+
 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/1021_linux-5.10.22.patch b/1021_linux-5.10.22.patch
new file mode 100644
index 0000000..cb507f7
--- /dev/null
+++ b/1021_linux-5.10.22.patch
@@ -0,0 +1,1550 @@
+diff --git a/Makefile b/Makefile
+index 98ae9007e8a52..12a2a7271fcb0 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 10
+-SUBLEVEL = 21
++SUBLEVEL = 22
+ EXTRAVERSION =
+ NAME = Dare mighty things
+ 
+diff --git a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi 
b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
+index 724ee179b316e..fae48efae83e9 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-axg.dtsi
+@@ -227,8 +227,6 @@
+                                     "timing-adjustment";
+                       rx-fifo-depth = <4096>;
+                       tx-fifo-depth = <2048>;
+-                      resets = <&reset RESET_ETHERNET>;
+-                      reset-names = "stmmaceth";
+                       status = "disabled";
+               };
+ 
+diff --git a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi 
b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
+index a6127002573bd..959b299344e54 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi
+@@ -224,8 +224,6 @@
+                                     "timing-adjustment";
+                       rx-fifo-depth = <4096>;
+                       tx-fifo-depth = <2048>;
+-                      resets = <&reset RESET_ETHERNET>;
+-                      reset-names = "stmmaceth";
+                       status = "disabled";
+ 
+                       mdio0: mdio {
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi 
b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
+index 726b91d3a905a..0edd137151f89 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-gx.dtsi
+@@ -13,7 +13,6 @@
+ #include <dt-bindings/interrupt-controller/irq.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+ #include <dt-bindings/power/meson-gxbb-power.h>
+-#include <dt-bindings/reset/amlogic,meson-gxbb-reset.h>
+ #include <dt-bindings/thermal/thermal.h>
+ 
+ / {
+@@ -576,8 +575,6 @@
+                       interrupt-names = "macirq";
+                       rx-fifo-depth = <4096>;
+                       tx-fifo-depth = <2048>;
+-                      resets = <&reset RESET_ETHERNET>;
+-                      reset-names = "stmmaceth";
+                       power-domains = <&pwrc PWRC_GXBB_ETHERNET_MEM_ID>;
+                       status = "disabled";
+               };
+diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
+index 00576a960f11f..b913844ab7404 100644
+--- a/arch/arm64/mm/init.c
++++ b/arch/arm64/mm/init.c
+@@ -29,6 +29,7 @@
+ #include <linux/kexec.h>
+ #include <linux/crash_dump.h>
+ #include <linux/hugetlb.h>
++#include <linux/acpi_iort.h>
+ 
+ #include <asm/boot.h>
+ #include <asm/fixmap.h>
+@@ -42,8 +43,6 @@
+ #include <asm/tlb.h>
+ #include <asm/alternative.h>
+ 
+-#define ARM64_ZONE_DMA_BITS   30
+-
+ /*
+  * We need to be able to catch inadvertent references to memstart_addr
+  * that occur (potentially in generic code) before arm64_memblock_init()
+@@ -188,8 +187,14 @@ static phys_addr_t __init max_zone_phys(unsigned int 
zone_bits)
+ static void __init zone_sizes_init(unsigned long min, unsigned long max)
+ {
+       unsigned long max_zone_pfns[MAX_NR_ZONES]  = {0};
++      unsigned int __maybe_unused acpi_zone_dma_bits;
++      unsigned int __maybe_unused dt_zone_dma_bits;
+ 
+ #ifdef CONFIG_ZONE_DMA
++      acpi_zone_dma_bits = fls64(acpi_iort_dma_get_max_cpu_address());
++      dt_zone_dma_bits = fls64(of_dma_get_max_cpu_address(NULL));
++      zone_dma_bits = min3(32U, dt_zone_dma_bits, acpi_zone_dma_bits);
++      arm64_dma_phys_limit = max_zone_phys(zone_dma_bits);
+       max_zone_pfns[ZONE_DMA] = PFN_DOWN(arm64_dma_phys_limit);
+ #endif
+ #ifdef CONFIG_ZONE_DMA32
+@@ -376,18 +381,11 @@ void __init arm64_memblock_init(void)
+ 
+       early_init_fdt_scan_reserved_mem();
+ 
+-      if (IS_ENABLED(CONFIG_ZONE_DMA)) {
+-              zone_dma_bits = ARM64_ZONE_DMA_BITS;
+-              arm64_dma_phys_limit = max_zone_phys(ARM64_ZONE_DMA_BITS);
+-      }
+-
+       if (IS_ENABLED(CONFIG_ZONE_DMA32))
+               arm64_dma32_phys_limit = max_zone_phys(32);
+       else
+               arm64_dma32_phys_limit = PHYS_MASK + 1;
+ 
+-      reserve_crashkernel();
+-
+       reserve_elfcorehdr();
+ 
+       high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
+@@ -427,6 +425,12 @@ void __init bootmem_init(void)
+       sparse_init();
+       zone_sizes_init(min, max);
+ 
++      /*
++       * request_standard_resources() depends on crashkernel's memory being
++       * reserved, so do it here.
++       */
++      reserve_crashkernel();
++
+       memblock_dump_all();
+ }
+ 
+diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
+index 94f34109695c9..2494138a6905e 100644
+--- a/drivers/acpi/arm64/iort.c
++++ b/drivers/acpi/arm64/iort.c
+@@ -1730,3 +1730,58 @@ void __init acpi_iort_init(void)
+ 
+       iort_init_platform_devices();
+ }
++
++#ifdef CONFIG_ZONE_DMA
++/*
++ * Extract the highest CPU physical address accessible to all DMA masters in
++ * the system. PHYS_ADDR_MAX is returned when no constrained device is found.
++ */
++phys_addr_t __init acpi_iort_dma_get_max_cpu_address(void)
++{
++      phys_addr_t limit = PHYS_ADDR_MAX;
++      struct acpi_iort_node *node, *end;
++      struct acpi_table_iort *iort;
++      acpi_status status;
++      int i;
++
++      if (acpi_disabled)
++              return limit;
++
++      status = acpi_get_table(ACPI_SIG_IORT, 0,
++                              (struct acpi_table_header **)&iort);
++      if (ACPI_FAILURE(status))
++              return limit;
++
++      node = ACPI_ADD_PTR(struct acpi_iort_node, iort, iort->node_offset);
++      end = ACPI_ADD_PTR(struct acpi_iort_node, iort, iort->header.length);
++
++      for (i = 0; i < iort->node_count; i++) {
++              if (node >= end)
++                      break;
++
++              switch (node->type) {
++                      struct acpi_iort_named_component *ncomp;
++                      struct acpi_iort_root_complex *rc;
++                      phys_addr_t local_limit;
++
++              case ACPI_IORT_NODE_NAMED_COMPONENT:
++                      ncomp = (struct acpi_iort_named_component 
*)node->node_data;
++                      local_limit = DMA_BIT_MASK(ncomp->memory_address_limit);
++                      limit = min_not_zero(limit, local_limit);
++                      break;
++
++              case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
++                      if (node->revision < 1)
++                              break;
++
++                      rc = (struct acpi_iort_root_complex *)node->node_data;
++                      local_limit = DMA_BIT_MASK(rc->memory_address_limit);
++                      limit = min_not_zero(limit, local_limit);
++                      break;
++              }
++              node = ACPI_ADD_PTR(struct acpi_iort_node, node, node->length);
++      }
++      acpi_put_table(&iort->header);
++      return limit;
++}
++#endif
+diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
+index bfda153b1a41d..87682dcb64ec3 100644
+--- a/drivers/base/power/runtime.c
++++ b/drivers/base/power/runtime.c
+@@ -325,22 +325,22 @@ static void rpm_put_suppliers(struct device *dev)
+ static int __rpm_callback(int (*cb)(struct device *), struct device *dev)
+       __releases(&dev->power.lock) __acquires(&dev->power.lock)
+ {
+-      int retval, idx;
+       bool use_links = dev->power.links_count > 0;
++      bool get = false;
++      int retval, idx;
++      bool put;
+ 
+       if (dev->power.irq_safe) {
+               spin_unlock(&dev->power.lock);
++      } else if (!use_links) {
++              spin_unlock_irq(&dev->power.lock);
+       } else {
++              get = dev->power.runtime_status == RPM_RESUMING;
++
+               spin_unlock_irq(&dev->power.lock);
+ 
+-              /*
+-               * Resume suppliers if necessary.
+-               *
+-               * The device's runtime PM status cannot change until this
+-               * routine returns, so it is safe to read the status outside of
+-               * the lock.
+-               */
+-              if (use_links && dev->power.runtime_status == RPM_RESUMING) {
++              /* Resume suppliers if necessary. */
++              if (get) {
+                       idx = device_links_read_lock();
+ 
+                       retval = rpm_get_suppliers(dev);
+@@ -355,24 +355,36 @@ static int __rpm_callback(int (*cb)(struct device *), 
struct device *dev)
+ 
+       if (dev->power.irq_safe) {
+               spin_lock(&dev->power.lock);
+-      } else {
+-              /*
+-               * If the device is suspending and the callback has returned
+-               * success, drop the usage counters of the suppliers that have
+-               * been reference counted on its resume.
+-               *
+-               * Do that if resume fails too.
+-               */
+-              if (use_links
+-                  && ((dev->power.runtime_status == RPM_SUSPENDING && !retval)
+-                  || (dev->power.runtime_status == RPM_RESUMING && retval))) {
+-                      idx = device_links_read_lock();
++              return retval;
++      }
+ 
+- fail:
+-                      rpm_put_suppliers(dev);
++      spin_lock_irq(&dev->power.lock);
+ 
+-                      device_links_read_unlock(idx);
+-              }
++      if (!use_links)
++              return retval;
++
++      /*
++       * If the device is suspending and the callback has returned success,
++       * drop the usage counters of the suppliers that have been reference
++       * counted on its resume.
++       *
++       * Do that if the resume fails too.
++       */
++      put = dev->power.runtime_status == RPM_SUSPENDING && !retval;
++      if (put)
++              __update_runtime_status(dev, RPM_SUSPENDED);
++      else
++              put = get && retval;
++
++      if (put) {
++              spin_unlock_irq(&dev->power.lock);
++
++              idx = device_links_read_lock();
++
++fail:
++              rpm_put_suppliers(dev);
++
++              device_links_read_unlock(idx);
+ 
+               spin_lock_irq(&dev->power.lock);
+       }
+diff --git a/drivers/block/rsxx/core.c b/drivers/block/rsxx/core.c
+index 63f549889f875..5ac1881396afb 100644
+--- a/drivers/block/rsxx/core.c
++++ b/drivers/block/rsxx/core.c
+@@ -165,15 +165,17 @@ static ssize_t rsxx_cram_read(struct file *fp, char 
__user *ubuf,
+ {
+       struct rsxx_cardinfo *card = file_inode(fp)->i_private;
+       char *buf;
+-      ssize_t st;
++      int st;
+ 
+       buf = kzalloc(cnt, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+ 
+       st = rsxx_creg_read(card, CREG_ADD_CRAM + (u32)*ppos, cnt, buf, 1);
+-      if (!st)
+-              st = copy_to_user(ubuf, buf, cnt);
++      if (!st) {
++              if (copy_to_user(ubuf, buf, cnt))
++                      st = -EFAULT;
++      }
+       kfree(buf);
+       if (st)
+               return st;
+diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
+index 431919d5f48af..a2e0395cbe618 100644
+--- a/drivers/char/tpm/tpm_tis_core.c
++++ b/drivers/char/tpm/tpm_tis_core.c
+@@ -707,12 +707,22 @@ static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
+       const char *desc = "attempting to generate an interrupt";
+       u32 cap2;
+       cap_t cap;
++      int ret;
+ 
++      /* TPM 2.0 */
+       if (chip->flags & TPM_CHIP_FLAG_TPM2)
+               return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
+-      else
+-              return tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc,
+-                                0);
++
++      /* TPM 1.2 */
++      ret = request_locality(chip, 0);
++      if (ret < 0)
++              return ret;
++
++      ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
++
++      release_locality(chip, 0);
++
++      return ret;
+ }
+ 
+ /* Register the IRQ and issue a command that will cause an interrupt. If an
+@@ -1019,11 +1029,21 @@ int tpm_tis_core_init(struct device *dev, struct 
tpm_tis_data *priv, int irq,
+       init_waitqueue_head(&priv->read_queue);
+       init_waitqueue_head(&priv->int_queue);
+       if (irq != -1) {
+-              /* Before doing irq testing issue a command to the TPM in 
polling mode
++              /*
++               * Before doing irq testing issue a command to the TPM in 
polling mode
+                * to make sure it works. May as well use that command to set 
the
+                * proper timeouts for the driver.
+                */
+-              if (tpm_get_timeouts(chip)) {
++
++              rc = request_locality(chip, 0);
++              if (rc < 0)
++                      goto out_err;
++
++              rc = tpm_get_timeouts(chip);
++
++              release_locality(chip, 0);
++
++              if (rc) {
+                       dev_err(dev, "Could not get TPM timeouts and 
durations\n");
+                       rc = -ENODEV;
+                       goto out_err;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+index 2d125b8b15ee1..00a190929b55c 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+@@ -355,7 +355,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file 
*f, char __user *buf,
+       while (size) {
+               uint32_t value;
+ 
+-              value = RREG32_PCIE(*pos >> 2);
++              value = RREG32_PCIE(*pos);
+               r = put_user(value, (uint32_t *)buf);
+               if (r) {
+                       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
+@@ -422,7 +422,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file 
*f, const char __user
+                       return r;
+               }
+ 
+-              WREG32_PCIE(*pos >> 2, value);
++              WREG32_PCIE(*pos, value);
+ 
+               result += 4;
+               buf += 4;
+diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c
+index 8eeba8096493b..0af4774ddd613 100644
+--- a/drivers/gpu/drm/amd/amdgpu/nv.c
++++ b/drivers/gpu/drm/amd/amdgpu/nv.c
+@@ -459,7 +459,8 @@ static bool nv_is_headless_sku(struct pci_dev *pdev)
+ {
+       if ((pdev->device == 0x731E &&
+           (pdev->revision == 0xC6 || pdev->revision == 0xC7)) ||
+-          (pdev->device == 0x7340 && pdev->revision == 0xC9))
++          (pdev->device == 0x7340 && pdev->revision == 0xC9)  ||
++          (pdev->device == 0x7360 && pdev->revision == 0xC7))
+               return true;
+       return false;
+ }
+@@ -524,7 +525,8 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)
+               if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT &&
+                   !amdgpu_sriov_vf(adev))
+                       amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
+-              amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
++              if (!nv_is_headless_sku(adev->pdev))
++                      amdgpu_device_ip_block_add(adev, &vcn_v2_0_ip_block);
+               if (!amdgpu_sriov_vf(adev))
+                       amdgpu_device_ip_block_add(adev, &jpeg_v2_0_ip_block);
+               break;
+diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
+index 8e578f73a074c..bbba0cd42c89b 100644
+--- a/drivers/infiniband/core/cm.c
++++ b/drivers/infiniband/core/cm.c
+@@ -3650,6 +3650,7 @@ static int cm_send_sidr_rep_locked(struct cm_id_private 
*cm_id_priv,
+                                  struct ib_cm_sidr_rep_param *param)
+ {
+       struct ib_mad_send_buf *msg;
++      unsigned long flags;
+       int ret;
+ 
+       lockdep_assert_held(&cm_id_priv->lock);
+@@ -3675,12 +3676,12 @@ static int cm_send_sidr_rep_locked(struct 
cm_id_private *cm_id_priv,
+               return ret;
+       }
+       cm_id_priv->id.state = IB_CM_IDLE;
+-      spin_lock_irq(&cm.lock);
++      spin_lock_irqsave(&cm.lock, flags);
+       if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) {
+               rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
+               RB_CLEAR_NODE(&cm_id_priv->sidr_id_node);
+       }
+-      spin_unlock_irq(&cm.lock);
++      spin_unlock_irqrestore(&cm.lock, flags);
+       return 0;
+ }
+ 
+diff --git a/drivers/infiniband/hw/mlx5/devx.c 
b/drivers/infiniband/hw/mlx5/devx.c
+index 26564e7d34572..efb9ec99b68bd 100644
+--- a/drivers/infiniband/hw/mlx5/devx.c
++++ b/drivers/infiniband/hw/mlx5/devx.c
+@@ -1973,8 +1973,10 @@ static int 
UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_SUBSCRIBE_EVENT)(
+ 
+               num_alloc_xa_entries++;
+               event_sub = kzalloc(sizeof(*event_sub), GFP_KERNEL);
+-              if (!event_sub)
++              if (!event_sub) {
++                      err = -ENOMEM;
+                       goto err;
++              }
+ 
+               list_add_tail(&event_sub->event_list, &sub_list);
+               uverbs_uobject_get(&ev_file->uobj);
+diff --git a/drivers/infiniband/sw/rxe/Kconfig 
b/drivers/infiniband/sw/rxe/Kconfig
+index 4521490667925..06b8dc5093f77 100644
+--- a/drivers/infiniband/sw/rxe/Kconfig
++++ b/drivers/infiniband/sw/rxe/Kconfig
+@@ -4,6 +4,7 @@ config RDMA_RXE
+       depends on INET && PCI && INFINIBAND
+       depends on INFINIBAND_VIRT_DMA
+       select NET_UDP_TUNNEL
++      select CRYPTO
+       select CRYPTO_CRC32
+       help
+       This driver implements the InfiniBand RDMA transport over
+diff --git a/drivers/iommu/intel/pasid.h b/drivers/iommu/intel/pasid.h
+index 97dfcffbf495a..444c0bec221a4 100644
+--- a/drivers/iommu/intel/pasid.h
++++ b/drivers/iommu/intel/pasid.h
+@@ -30,8 +30,8 @@
+ #define VCMD_VRSP_IP                  0x1
+ #define VCMD_VRSP_SC(e)                       (((e) >> 1) & 0x3)
+ #define VCMD_VRSP_SC_SUCCESS          0
+-#define VCMD_VRSP_SC_NO_PASID_AVAIL   1
+-#define VCMD_VRSP_SC_INVALID_PASID    1
++#define VCMD_VRSP_SC_NO_PASID_AVAIL   2
++#define VCMD_VRSP_SC_INVALID_PASID    2
+ #define VCMD_VRSP_RESULT_PASID(e)     (((e) >> 8) & 0xfffff)
+ #define VCMD_CMD_OPERAND(e)           ((e) << 8)
+ /*
+diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
+index fce4cbf9529d6..50f3e673729c3 100644
+--- a/drivers/md/dm-bufio.c
++++ b/drivers/md/dm-bufio.c
+@@ -1526,6 +1526,10 @@ EXPORT_SYMBOL_GPL(dm_bufio_get_block_size);
+ sector_t dm_bufio_get_device_size(struct dm_bufio_client *c)
+ {
+       sector_t s = i_size_read(c->bdev->bd_inode) >> SECTOR_SHIFT;
++      if (s >= c->start)
++              s -= c->start;
++      else
++              s = 0;
+       if (likely(c->sectors_per_block_bits >= 0))
+               s >>= c->sectors_per_block_bits;
+       else
+diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
+index fb41b4f23c489..66f4c6398f670 100644
+--- a/drivers/md/dm-verity-fec.c
++++ b/drivers/md/dm-verity-fec.c
+@@ -61,19 +61,18 @@ static int fec_decode_rs8(struct dm_verity *v, struct 
dm_verity_fec_io *fio,
+ static u8 *fec_read_parity(struct dm_verity *v, u64 rsb, int index,
+                          unsigned *offset, struct dm_buffer **buf)
+ {
+-      u64 position, block;
++      u64 position, block, rem;
+       u8 *res;
+ 
+       position = (index + rsb) * v->fec->roots;
+-      block = position >> v->data_dev_block_bits;
+-      *offset = (unsigned)(position - (block << v->data_dev_block_bits));
++      block = div64_u64_rem(position, v->fec->roots << SECTOR_SHIFT, &rem);
++      *offset = (unsigned)rem;
+ 
+-      res = dm_bufio_read(v->fec->bufio, v->fec->start + block, buf);
++      res = dm_bufio_read(v->fec->bufio, block, buf);
+       if (IS_ERR(res)) {
+               DMERR("%s: FEC %llu: parity read failed (block %llu): %ld",
+                     v->data_dev->name, (unsigned long long)rsb,
+-                    (unsigned long long)(v->fec->start + block),
+-                    PTR_ERR(res));
++                    (unsigned long long)block, PTR_ERR(res));
+               *buf = NULL;
+       }
+ 
+@@ -155,7 +154,7 @@ static int fec_decode_bufs(struct dm_verity *v, struct 
dm_verity_fec_io *fio,
+ 
+               /* read the next block when we run out of parity bytes */
+               offset += v->fec->roots;
+-              if (offset >= 1 << v->data_dev_block_bits) {
++              if (offset >= v->fec->roots << SECTOR_SHIFT) {
+                       dm_bufio_release(buf);
+ 
+                       par = fec_read_parity(v, rsb, block_offset, &offset, 
&buf);
+@@ -674,7 +673,7 @@ int verity_fec_ctr(struct dm_verity *v)
+ {
+       struct dm_verity_fec *f = v->fec;
+       struct dm_target *ti = v->ti;
+-      u64 hash_blocks;
++      u64 hash_blocks, fec_blocks;
+       int ret;
+ 
+       if (!verity_fec_is_enabled(v)) {
+@@ -744,15 +743,17 @@ int verity_fec_ctr(struct dm_verity *v)
+       }
+ 
+       f->bufio = dm_bufio_client_create(f->dev->bdev,
+-                                        1 << v->data_dev_block_bits,
++                                        f->roots << SECTOR_SHIFT,
+                                         1, 0, NULL, NULL);
+       if (IS_ERR(f->bufio)) {
+               ti->error = "Cannot initialize FEC bufio client";
+               return PTR_ERR(f->bufio);
+       }
+ 
+-      if (dm_bufio_get_device_size(f->bufio) <
+-          ((f->start + f->rounds * f->roots) >> v->data_dev_block_bits)) {
++      dm_bufio_set_sector_offset(f->bufio, f->start << 
(v->data_dev_block_bits - SECTOR_SHIFT));
++
++      fec_blocks = div64_u64(f->rounds * f->roots, v->fec->roots << 
SECTOR_SHIFT);
++      if (dm_bufio_get_device_size(f->bufio) < fec_blocks) {
+               ti->error = "FEC device is too small";
+               return -E2BIG;
+       }
+diff --git a/drivers/net/ethernet/realtek/r8169_main.c 
b/drivers/net/ethernet/realtek/r8169_main.c
+index cfcc3ac613189..b7d5eaa70a67b 100644
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -2244,6 +2244,7 @@ static void rtl_pll_power_down(struct rtl8169_private 
*tp)
+ 
+       switch (tp->mac_version) {
+       case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
++      case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30:
+       case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33:
+       case RTL_GIGA_MAC_VER_37:
+       case RTL_GIGA_MAC_VER_39:
+@@ -2271,6 +2272,7 @@ static void rtl_pll_power_up(struct rtl8169_private *tp)
+ {
+       switch (tp->mac_version) {
+       case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
++      case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30:
+       case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_33:
+       case RTL_GIGA_MAC_VER_37:
+       case RTL_GIGA_MAC_VER_39:
+diff --git a/drivers/of/address.c b/drivers/of/address.c
+index 1c3257a2d4e37..73ddf2540f3fe 100644
+--- a/drivers/of/address.c
++++ b/drivers/of/address.c
+@@ -1024,6 +1024,48 @@ out:
+ }
+ #endif /* CONFIG_HAS_DMA */
+ 
++/**
++ * of_dma_get_max_cpu_address - Gets highest CPU address suitable for DMA
++ * @np: The node to start searching from or NULL to start from the root
++ *
++ * Gets the highest CPU physical address that is addressable by all DMA 
masters
++ * in the sub-tree pointed by np, or the whole tree if NULL is passed. If no
++ * DMA constrained device is found, it returns PHYS_ADDR_MAX.
++ */
++phys_addr_t __init of_dma_get_max_cpu_address(struct device_node *np)
++{
++      phys_addr_t max_cpu_addr = PHYS_ADDR_MAX;
++      struct of_range_parser parser;
++      phys_addr_t subtree_max_addr;
++      struct device_node *child;
++      struct of_range range;
++      const __be32 *ranges;
++      u64 cpu_end = 0;
++      int len;
++
++      if (!np)
++              np = of_root;
++
++      ranges = of_get_property(np, "dma-ranges", &len);
++      if (ranges && len) {
++              of_dma_range_parser_init(&parser, np);
++              for_each_of_range(&parser, &range)
++                      if (range.cpu_addr + range.size > cpu_end)
++                              cpu_end = range.cpu_addr + range.size - 1;
++
++              if (max_cpu_addr > cpu_end)
++                      max_cpu_addr = cpu_end;
++      }
++
++      for_each_available_child_of_node(np, child) {
++              subtree_max_addr = of_dma_get_max_cpu_address(child);
++              if (max_cpu_addr > subtree_max_addr)
++                      max_cpu_addr = subtree_max_addr;
++      }
++
++      return max_cpu_addr;
++}
++
+ /**
+  * of_dma_is_coherent - Check if device is coherent
+  * @np:       device node
+diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
+index 06cc988faf78b..eb51bc1474401 100644
+--- a/drivers/of/unittest.c
++++ b/drivers/of/unittest.c
+@@ -869,6 +869,26 @@ static void __init of_unittest_changeset(void)
+ #endif
+ }
+ 
++static void __init of_unittest_dma_get_max_cpu_address(void)
++{
++      struct device_node *np;
++      phys_addr_t cpu_addr;
++
++      if (!IS_ENABLED(CONFIG_OF_ADDRESS))
++              return;
++
++      np = of_find_node_by_path("/testcase-data/address-tests");
++      if (!np) {
++              pr_err("missing testcase data\n");
++              return;
++      }
++
++      cpu_addr = of_dma_get_max_cpu_address(np);
++      unittest(cpu_addr == 0x4fffffff,
++               "of_dma_get_max_cpu_address: wrong CPU addr %pad (expecting 
%x)\n",
++               &cpu_addr, 0x4fffffff);
++}
++
+ static void __init of_unittest_dma_ranges_one(const char *path,
+               u64 expect_dma_addr, u64 expect_paddr)
+ {
+@@ -3266,6 +3286,7 @@ static int __init of_unittest(void)
+       of_unittest_changeset();
+       of_unittest_parse_interrupts();
+       of_unittest_parse_interrupts_extended();
++      of_unittest_dma_get_max_cpu_address();
+       of_unittest_parse_dma_ranges();
+       of_unittest_pci_dma_ranges();
+       of_unittest_match_node();
+diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
+index 9a5d652c1672e..c99e293b50f54 100644
+--- a/fs/btrfs/block-group.c
++++ b/fs/btrfs/block-group.c
+@@ -1229,6 +1229,11 @@ static int inc_block_group_ro(struct btrfs_block_group 
*cache, int force)
+       spin_lock(&sinfo->lock);
+       spin_lock(&cache->lock);
+ 
++      if (cache->swap_extents) {
++              ret = -ETXTBSY;
++              goto out;
++      }
++
+       if (cache->ro) {
+               cache->ro++;
+               ret = 0;
+@@ -2274,7 +2279,7 @@ again:
+       }
+ 
+       ret = inc_block_group_ro(cache, 0);
+-      if (!do_chunk_alloc)
++      if (!do_chunk_alloc || ret == -ETXTBSY)
+               goto unlock_out;
+       if (!ret)
+               goto out;
+@@ -2283,6 +2288,8 @@ again:
+       if (ret < 0)
+               goto out;
+       ret = inc_block_group_ro(cache, 0);
++      if (ret == -ETXTBSY)
++              goto unlock_out;
+ out:
+       if (cache->flags & BTRFS_BLOCK_GROUP_SYSTEM) {
+               alloc_flags = btrfs_get_alloc_profile(fs_info, cache->flags);
+@@ -3363,6 +3370,7 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
+               ASSERT(list_empty(&block_group->io_list));
+               ASSERT(list_empty(&block_group->bg_list));
+               ASSERT(refcount_read(&block_group->refs) == 1);
++              ASSERT(block_group->swap_extents == 0);
+               btrfs_put_block_group(block_group);
+ 
+               spin_lock(&info->block_group_cache_lock);
+@@ -3429,3 +3437,26 @@ void btrfs_unfreeze_block_group(struct 
btrfs_block_group *block_group)
+               __btrfs_remove_free_space_cache(block_group->free_space_ctl);
+       }
+ }
++
++bool btrfs_inc_block_group_swap_extents(struct btrfs_block_group *bg)
++{
++      bool ret = true;
++
++      spin_lock(&bg->lock);
++      if (bg->ro)
++              ret = false;
++      else
++              bg->swap_extents++;
++      spin_unlock(&bg->lock);
++
++      return ret;
++}
++
++void btrfs_dec_block_group_swap_extents(struct btrfs_block_group *bg, int 
amount)
++{
++      spin_lock(&bg->lock);
++      ASSERT(!bg->ro);
++      ASSERT(bg->swap_extents >= amount);
++      bg->swap_extents -= amount;
++      spin_unlock(&bg->lock);
++}
+diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h
+index adfd7583a17b8..4c7614346f724 100644
+--- a/fs/btrfs/block-group.h
++++ b/fs/btrfs/block-group.h
+@@ -181,6 +181,12 @@ struct btrfs_block_group {
+        */
+       int needs_free_space;
+ 
++      /*
++       * Number of extents in this block group used for swap files.
++       * All accesses protected by the spinlock 'lock'.
++       */
++      int swap_extents;
++
+       /* Record locked full stripes for RAID5/6 block group */
+       struct btrfs_full_stripe_locks_tree full_stripe_locks_root;
+ };
+@@ -299,4 +305,7 @@ int btrfs_rmap_block(struct btrfs_fs_info *fs_info, u64 
chunk_start,
+                    u64 physical, u64 **logical, int *naddrs, int *stripe_len);
+ #endif
+ 
++bool btrfs_inc_block_group_swap_extents(struct btrfs_block_group *bg);
++void btrfs_dec_block_group_swap_extents(struct btrfs_block_group *bg, int 
amount);
++
+ #endif /* BTRFS_BLOCK_GROUP_H */
+diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
+index b6884eda9ff67..bcc6848bb6d6a 100644
+--- a/fs/btrfs/ctree.h
++++ b/fs/btrfs/ctree.h
+@@ -522,6 +522,11 @@ struct btrfs_swapfile_pin {
+        * points to a struct btrfs_device.
+        */
+       bool is_block_group;
++      /*
++       * Only used when 'is_block_group' is true and it is the number of
++       * extents used by a swapfile for this block group ('ptr' field).
++       */
++      int bg_extent_count;
+ };
+ 
+ bool btrfs_pinned_by_swapfile(struct btrfs_fs_info *fs_info, void *ptr);
+diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
+index 5aba81e161132..36e0de34ec68b 100644
+--- a/fs/btrfs/delayed-inode.c
++++ b/fs/btrfs/delayed-inode.c
+@@ -649,7 +649,7 @@ static int btrfs_delayed_inode_reserve_metadata(
+                                                     btrfs_ino(inode),
+                                                     num_bytes, 1);
+               } else {
+-                      btrfs_qgroup_free_meta_prealloc(root, 
fs_info->nodesize);
++                      btrfs_qgroup_free_meta_prealloc(root, num_bytes);
+               }
+               return ret;
+       }
+diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
+index 4373da7bcc0d5..c81a20cc10dc8 100644
+--- a/fs/btrfs/file.c
++++ b/fs/btrfs/file.c
+@@ -3236,8 +3236,11 @@ reserve_space:
+                       goto out;
+               ret = btrfs_qgroup_reserve_data(BTRFS_I(inode), &data_reserved,
+                                               alloc_start, bytes_to_reserve);
+-              if (ret)
++              if (ret) {
++                      unlock_extent_cached(&BTRFS_I(inode)->io_tree, 
lockstart,
++                                           lockend, &cached_state);
+                       goto out;
++              }
+               ret = btrfs_prealloc_file_range(inode, mode, alloc_start,
+                                               alloc_end - alloc_start,
+                                               i_blocksize(inode),
+diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
+index ae4059ce2f84c..ba280707d5ec2 100644
+--- a/fs/btrfs/free-space-cache.c
++++ b/fs/btrfs/free-space-cache.c
+@@ -2714,8 +2714,10 @@ static void __btrfs_return_cluster_to_free_space(
+       struct rb_node *node;
+ 
+       spin_lock(&cluster->lock);
+-      if (cluster->block_group != block_group)
+-              goto out;
++      if (cluster->block_group != block_group) {
++              spin_unlock(&cluster->lock);
++              return;
++      }
+ 
+       cluster->block_group = NULL;
+       cluster->window_start = 0;
+@@ -2753,8 +2755,6 @@ static void __btrfs_return_cluster_to_free_space(
+                                  entry->offset, &entry->offset_index, bitmap);
+       }
+       cluster->root = RB_ROOT;
+-
+-out:
+       spin_unlock(&cluster->lock);
+       btrfs_put_block_group(block_group);
+ }
+@@ -3034,8 +3034,6 @@ u64 btrfs_alloc_from_cluster(struct btrfs_block_group 
*block_group,
+                       entry->bytes -= bytes;
+               }
+ 
+-              if (entry->bytes == 0)
+-                      rb_erase(&entry->offset_index, &cluster->root);
+               break;
+       }
+ out:
+@@ -3052,7 +3050,10 @@ out:
+       ctl->free_space -= bytes;
+       if (!entry->bitmap && !btrfs_free_space_trimmed(entry))
+               ctl->discardable_bytes[BTRFS_STAT_CURR] -= bytes;
++
++      spin_lock(&cluster->lock);
+       if (entry->bytes == 0) {
++              rb_erase(&entry->offset_index, &cluster->root);
+               ctl->free_extents--;
+               if (entry->bitmap) {
+                       kmem_cache_free(btrfs_free_space_bitmap_cachep,
+@@ -3065,6 +3066,7 @@ out:
+               kmem_cache_free(btrfs_free_space_cachep, entry);
+       }
+ 
++      spin_unlock(&cluster->lock);
+       spin_unlock(&ctl->tree_lock);
+ 
+       return ret;
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index 4d85f3a6695d1..9b3df72ceffbb 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -9993,6 +9993,7 @@ static int btrfs_add_swapfile_pin(struct inode *inode, 
void *ptr,
+       sp->ptr = ptr;
+       sp->inode = inode;
+       sp->is_block_group = is_block_group;
++      sp->bg_extent_count = 1;
+ 
+       spin_lock(&fs_info->swapfile_pins_lock);
+       p = &fs_info->swapfile_pins.rb_node;
+@@ -10006,6 +10007,8 @@ static int btrfs_add_swapfile_pin(struct inode *inode, 
void *ptr,
+                          (sp->ptr == entry->ptr && sp->inode > entry->inode)) 
{
+                       p = &(*p)->rb_right;
+               } else {
++                      if (is_block_group)
++                              entry->bg_extent_count++;
+                       spin_unlock(&fs_info->swapfile_pins_lock);
+                       kfree(sp);
+                       return 1;
+@@ -10031,8 +10034,11 @@ static void btrfs_free_swapfile_pins(struct inode 
*inode)
+               sp = rb_entry(node, struct btrfs_swapfile_pin, node);
+               if (sp->inode == inode) {
+                       rb_erase(&sp->node, &fs_info->swapfile_pins);
+-                      if (sp->is_block_group)
++                      if (sp->is_block_group) {
++                              btrfs_dec_block_group_swap_extents(sp->ptr,
++                                                         sp->bg_extent_count);
+                               btrfs_put_block_group(sp->ptr);
++                      }
+                       kfree(sp);
+               }
+               node = next;
+@@ -10093,7 +10099,8 @@ static int btrfs_swap_activate(struct swap_info_struct 
*sis, struct file *file,
+                              sector_t *span)
+ {
+       struct inode *inode = file_inode(file);
+-      struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
++      struct btrfs_root *root = BTRFS_I(inode)->root;
++      struct btrfs_fs_info *fs_info = root->fs_info;
+       struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
+       struct extent_state *cached_state = NULL;
+       struct extent_map *em = NULL;
+@@ -10144,13 +10151,27 @@ static int btrfs_swap_activate(struct 
swap_info_struct *sis, struct file *file,
+          "cannot activate swapfile while exclusive operation is running");
+               return -EBUSY;
+       }
++
++      /*
++       * Prevent snapshot creation while we are activating the swap file.
++       * We do not want to race with snapshot creation. If snapshot creation
++       * already started before we bumped nr_swapfiles from 0 to 1 and
++       * completes before the first write into the swap file after it is
++       * activated, than that write would fallback to COW.
++       */
++      if (!btrfs_drew_try_write_lock(&root->snapshot_lock)) {
++              btrfs_exclop_finish(fs_info);
++              btrfs_warn(fs_info,
++         "cannot activate swapfile because snapshot creation is in progress");
++              return -EINVAL;
++      }
+       /*
+        * Snapshots can create extents which require COW even if NODATACOW is
+        * set. We use this counter to prevent snapshots. We must increment it
+        * before walking the extents because we don't want a concurrent
+        * snapshot to run after we've already checked the extents.
+        */
+-      atomic_inc(&BTRFS_I(inode)->root->nr_swapfiles);
++      atomic_inc(&root->nr_swapfiles);
+ 
+       isize = ALIGN_DOWN(inode->i_size, fs_info->sectorsize);
+ 
+@@ -10247,6 +10268,17 @@ static int btrfs_swap_activate(struct 
swap_info_struct *sis, struct file *file,
+                       goto out;
+               }
+ 
++              if (!btrfs_inc_block_group_swap_extents(bg)) {
++                      btrfs_warn(fs_info,
++                         "block group for swapfile at %llu is read-only%s",
++                         bg->start,
++                         atomic_read(&fs_info->scrubs_running) ?
++                                     " (scrub running)" : "");
++                      btrfs_put_block_group(bg);
++                      ret = -EINVAL;
++                      goto out;
++              }
++
+               ret = btrfs_add_swapfile_pin(inode, bg, true);
+               if (ret) {
+                       btrfs_put_block_group(bg);
+@@ -10285,6 +10317,8 @@ out:
+       if (ret)
+               btrfs_swap_deactivate(file);
+ 
++      btrfs_drew_write_unlock(&root->snapshot_lock);
++
+       btrfs_exclop_finish(fs_info);
+ 
+       if (ret)
+diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
+index bd46e107f955e..f5135314e4b39 100644
+--- a/fs/btrfs/ioctl.c
++++ b/fs/btrfs/ioctl.c
+@@ -1914,7 +1914,10 @@ static noinline int btrfs_ioctl_snap_create_v2(struct 
file *file,
+       if (vol_args->flags & BTRFS_SUBVOL_RDONLY)
+               readonly = true;
+       if (vol_args->flags & BTRFS_SUBVOL_QGROUP_INHERIT) {
+-              if (vol_args->size > PAGE_SIZE) {
++              u64 nums;
++
++              if (vol_args->size < sizeof(*inherit) ||
++                  vol_args->size > PAGE_SIZE) {
+                       ret = -EINVAL;
+                       goto free_args;
+               }
+@@ -1923,6 +1926,20 @@ static noinline int btrfs_ioctl_snap_create_v2(struct 
file *file,
+                       ret = PTR_ERR(inherit);
+                       goto free_args;
+               }
++
++              if (inherit->num_qgroups > PAGE_SIZE ||
++                  inherit->num_ref_copies > PAGE_SIZE ||
++                  inherit->num_excl_copies > PAGE_SIZE) {
++                      ret = -EINVAL;
++                      goto free_inherit;
++              }
++
++              nums = inherit->num_qgroups + 2 * inherit->num_ref_copies +
++                     2 * inherit->num_excl_copies;
++              if (vol_args->size != struct_size(inherit, qgroups, nums)) {
++                      ret = -EINVAL;
++                      goto free_inherit;
++              }
+       }
+ 
+       ret = __btrfs_ioctl_snap_create(file, vol_args->name, vol_args->fd,
+diff --git a/fs/btrfs/raid56.c b/fs/btrfs/raid56.c
+index 255490f42b5d5..9d33bf0154abf 100644
+--- a/fs/btrfs/raid56.c
++++ b/fs/btrfs/raid56.c
+@@ -2363,16 +2363,21 @@ static noinline void finish_parity_scrub(struct 
btrfs_raid_bio *rbio,
+       SetPageUptodate(p_page);
+ 
+       if (has_qstripe) {
++              /* RAID6, allocate and map temp space for the Q stripe */
+               q_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
+               if (!q_page) {
+                       __free_page(p_page);
+                       goto cleanup;
+               }
+               SetPageUptodate(q_page);
++              pointers[rbio->real_stripes - 1] = kmap(q_page);
+       }
+ 
+       atomic_set(&rbio->error, 0);
+ 
++      /* Map the parity stripe just once */
++      pointers[nr_data] = kmap(p_page);
++
+       for_each_set_bit(pagenr, rbio->dbitmap, rbio->stripe_npages) {
+               struct page *p;
+               void *parity;
+@@ -2382,16 +2387,8 @@ static noinline void finish_parity_scrub(struct 
btrfs_raid_bio *rbio,
+                       pointers[stripe] = kmap(p);
+               }
+ 
+-              /* then add the parity stripe */
+-              pointers[stripe++] = kmap(p_page);
+-
+               if (has_qstripe) {
+-                      /*
+-                       * raid6, add the qstripe and call the
+-                       * library function to fill in our p/q
+-                       */
+-                      pointers[stripe++] = kmap(q_page);
+-
++                      /* RAID6, call the library function to fill in our P/Q 
*/
+                       raid6_call.gen_syndrome(rbio->real_stripes, PAGE_SIZE,
+                                               pointers);
+               } else {
+@@ -2412,12 +2409,14 @@ static noinline void finish_parity_scrub(struct 
btrfs_raid_bio *rbio,
+ 
+               for (stripe = 0; stripe < nr_data; stripe++)
+                       kunmap(page_in_rbio(rbio, stripe, pagenr, 0));
+-              kunmap(p_page);
+       }
+ 
++      kunmap(p_page);
+       __free_page(p_page);
+-      if (q_page)
++      if (q_page) {
++              kunmap(q_page);
+               __free_page(q_page);
++      }
+ 
+ writeback:
+       /*
+diff --git a/fs/btrfs/reflink.c b/fs/btrfs/reflink.c
+index a646af95dd100..c4f87df532833 100644
+--- a/fs/btrfs/reflink.c
++++ b/fs/btrfs/reflink.c
+@@ -548,6 +548,24 @@ process_slot:
+               btrfs_release_path(path);
+               path->leave_spinning = 0;
+ 
++              /*
++               * When using NO_HOLES and we are cloning a range that covers
++               * only a hole (no extents) into a range beyond the current
++               * i_size, punching a hole in the target range will not create
++               * an extent map defining a hole, because the range starts at or
++               * beyond current i_size. If the file previously had an i_size
++               * greater than the new i_size set by this clone operation, we
++               * need to make sure the next fsync is a full fsync, so that it
++               * detects and logs a hole covering a range from the current
++               * i_size to the new i_size. If the clone range covers extents,
++               * besides a hole, then we know the full sync flag was already
++               * set by previous calls to btrfs_replace_file_extents() that
++               * replaced file extent items.
++               */
++              if (last_dest_end >= i_size_read(inode))
++                      set_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
++                              &BTRFS_I(inode)->runtime_flags);
++
+               ret = btrfs_replace_file_extents(inode, path, last_dest_end,
+                               destoff + len - 1, NULL, &trans);
+               if (ret)
+diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
+index e71e7586e9eb0..0392c556af601 100644
+--- a/fs/btrfs/scrub.c
++++ b/fs/btrfs/scrub.c
+@@ -3568,6 +3568,13 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
+                        * commit_transactions.
+                        */
+                       ro_set = 0;
++              } else if (ret == -ETXTBSY) {
++                      btrfs_warn(fs_info,
++                 "skipping scrub of block group %llu due to active swapfile",
++                                 cache->start);
++                      scrub_pause_off(fs_info);
++                      ret = 0;
++                      goto skip_unfreeze;
+               } else {
+                       btrfs_warn(fs_info,
+                                  "failed setting block group ro: %d", ret);
+@@ -3657,7 +3664,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
+               } else {
+                       spin_unlock(&cache->lock);
+               }
+-
++skip_unfreeze:
+               btrfs_unfreeze_block_group(cache);
+               btrfs_put_block_group(cache);
+               if (ret)
+diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
+index e51774201d53b..f1a60bcdb3db8 100644
+--- a/fs/btrfs/xattr.c
++++ b/fs/btrfs/xattr.c
+@@ -229,11 +229,33 @@ int btrfs_setxattr_trans(struct inode *inode, const char 
*name,
+ {
+       struct btrfs_root *root = BTRFS_I(inode)->root;
+       struct btrfs_trans_handle *trans;
++      const bool start_trans = (current->journal_info == NULL);
+       int ret;
+ 
+-      trans = btrfs_start_transaction(root, 2);
+-      if (IS_ERR(trans))
+-              return PTR_ERR(trans);
++      if (start_trans) {
++              /*
++               * 1 unit for inserting/updating/deleting the xattr
++               * 1 unit for the inode item update
++               */
++              trans = btrfs_start_transaction(root, 2);
++              if (IS_ERR(trans))
++                      return PTR_ERR(trans);
++      } else {
++              /*
++               * This can happen when smack is enabled and a directory is 
being
++               * created. It happens through d_instantiate_new(), which calls
++               * smack_d_instantiate(), which in turn calls __vfs_setxattr() 
to
++               * set the transmute xattr (XATTR_NAME_SMACKTRANSMUTE) on the
++               * inode. We have already reserved space for the xattr and inode
++               * update at btrfs_mkdir(), so just use the transaction handle.
++               * We don't join or start a transaction, as that will reset the
++               * block_rsv of the handle and trigger a warning for the start
++               * case.
++               */
++              ASSERT(strncmp(name, XATTR_SECURITY_PREFIX,
++                             XATTR_SECURITY_PREFIX_LEN) == 0);
++              trans = current->journal_info;
++      }
+ 
+       ret = btrfs_setxattr(trans, inode, name, value, size, flags);
+       if (ret)
+@@ -244,7 +266,8 @@ int btrfs_setxattr_trans(struct inode *inode, const char 
*name,
+       ret = btrfs_update_inode(trans, root, inode);
+       BUG_ON(ret);
+ out:
+-      btrfs_end_transaction(trans);
++      if (start_trans)
++              btrfs_end_transaction(trans);
+       return ret;
+ }
+ 
+diff --git a/fs/io_uring.c b/fs/io_uring.c
+index d0172cc4f6427..691c998691439 100644
+--- a/fs/io_uring.c
++++ b/fs/io_uring.c
+@@ -5083,6 +5083,9 @@ static void __io_queue_proc(struct io_poll_iocb *poll, 
struct io_poll_table *pt,
+                       pt->error = -EINVAL;
+                       return;
+               }
++              /* double add on the same waitqueue head, ignore */
++              if (poll->head == head)
++                      return;
+               poll = kmalloc(sizeof(*poll), GFP_ATOMIC);
+               if (!poll) {
+                       pt->error = -ENOMEM;
+diff --git a/include/crypto/hash.h b/include/crypto/hash.h
+index af2ff31ff619f..13f8a6a54ca87 100644
+--- a/include/crypto/hash.h
++++ b/include/crypto/hash.h
+@@ -149,7 +149,7 @@ struct ahash_alg {
+ 
+ struct shash_desc {
+       struct crypto_shash *tfm;
+-      void *__ctx[] CRYPTO_MINALIGN_ATTR;
++      void *__ctx[] __aligned(ARCH_SLAB_MINALIGN);
+ };
+ 
+ #define HASH_MAX_DIGESTSIZE    64
+@@ -162,9 +162,9 @@ struct shash_desc {
+ 
+ #define HASH_MAX_STATESIZE    512
+ 
+-#define SHASH_DESC_ON_STACK(shash, ctx)                                 \
+-      char __##shash##_desc[sizeof(struct shash_desc) +         \
+-              HASH_MAX_DESCSIZE] CRYPTO_MINALIGN_ATTR; \
++#define SHASH_DESC_ON_STACK(shash, ctx)                                       
     \
++      char __##shash##_desc[sizeof(struct shash_desc) + HASH_MAX_DESCSIZE] \
++              __aligned(__alignof__(struct shash_desc));                   \
+       struct shash_desc *shash = (struct shash_desc *)__##shash##_desc
+ 
+ /**
+diff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h
+index 20a32120bb880..1a12baa58e409 100644
+--- a/include/linux/acpi_iort.h
++++ b/include/linux/acpi_iort.h
+@@ -38,6 +38,7 @@ void iort_dma_setup(struct device *dev, u64 *dma_addr, u64 
*size);
+ const struct iommu_ops *iort_iommu_configure_id(struct device *dev,
+                                               const u32 *id_in);
+ int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head 
*head);
++phys_addr_t acpi_iort_dma_get_max_cpu_address(void);
+ #else
+ static inline void acpi_iort_init(void) { }
+ static inline u32 iort_msi_map_id(struct device *dev, u32 id)
+@@ -55,6 +56,9 @@ static inline const struct iommu_ops 
*iort_iommu_configure_id(
+ static inline
+ int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head 
*head)
+ { return 0; }
++
++static inline phys_addr_t acpi_iort_dma_get_max_cpu_address(void)
++{ return PHYS_ADDR_MAX; }
+ #endif
+ 
+ #endif /* __ACPI_IORT_H__ */
+diff --git a/include/linux/crypto.h b/include/linux/crypto.h
+index ef90e07c9635c..e3abd1f8646a1 100644
+--- a/include/linux/crypto.h
++++ b/include/linux/crypto.h
+@@ -151,9 +151,12 @@
+  * The macro CRYPTO_MINALIGN_ATTR (along with the void * type in the actual
+  * declaration) is used to ensure that the crypto_tfm context structure is
+  * aligned correctly for the given architecture so that there are no alignment
+- * faults for C data types.  In particular, this is required on platforms such
+- * as arm where pointers are 32-bit aligned but there are data types such as
+- * u64 which require 64-bit alignment.
++ * faults for C data types.  On architectures that support non-cache coherent
++ * DMA, such as ARM or arm64, it also takes into account the minimal alignment
++ * that is required to ensure that the context struct member does not share 
any
++ * cachelines with the rest of the struct. This is needed to ensure that cache
++ * maintenance for non-coherent DMA (cache invalidation in particular) does 
not
++ * affect data that may be accessed by the CPU concurrently.
+  */
+ #define CRYPTO_MINALIGN ARCH_KMALLOC_MINALIGN
+ 
+diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
+index fb3bf696c05e8..9d0c454d23cd6 100644
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -354,26 +354,6 @@ enum zone_type {
+        * DMA mask is assumed when ZONE_DMA32 is defined. Some 64-bit
+        * platforms may need both zones as they support peripherals with
+        * different DMA addressing limitations.
+-       *
+-       * Some examples:
+-       *
+-       *  - i386 and x86_64 have a fixed 16M ZONE_DMA and ZONE_DMA32 for the
+-       *    rest of the lower 4G.
+-       *
+-       *  - arm only uses ZONE_DMA, the size, up to 4G, may vary depending on
+-       *    the specific device.
+-       *
+-       *  - arm64 has a fixed 1G ZONE_DMA and ZONE_DMA32 for the rest of the
+-       *    lower 4G.
+-       *
+-       *  - powerpc only uses ZONE_DMA, the size, up to 2G, may vary
+-       *    depending on the specific device.
+-       *
+-       *  - s390 uses ZONE_DMA fixed to the lower 2G.
+-       *
+-       *  - ia64 and riscv only use ZONE_DMA32.
+-       *
+-       *  - parisc uses neither.
+        */
+ #ifdef CONFIG_ZONE_DMA
+       ZONE_DMA,
+diff --git a/include/linux/of.h b/include/linux/of.h
+index af655d264f10f..0f4e81e6fb232 100644
+--- a/include/linux/of.h
++++ b/include/linux/of.h
+@@ -558,6 +558,8 @@ int of_map_id(struct device_node *np, u32 id,
+              const char *map_name, const char *map_mask_name,
+              struct device_node **target, u32 *id_out);
+ 
++phys_addr_t of_dma_get_max_cpu_address(struct device_node *np);
++
+ #else /* CONFIG_OF */
+ 
+ static inline void of_core_init(void)
+@@ -995,6 +997,11 @@ static inline int of_map_id(struct device_node *np, u32 
id,
+       return -EINVAL;
+ }
+ 
++static inline phys_addr_t of_dma_get_max_cpu_address(struct device_node *np)
++{
++      return PHYS_ADDR_MAX;
++}
++
+ #define of_match_ptr(_ptr)    NULL
+ #define of_match_node(_matches, _node)        NULL
+ #endif /* CONFIG_OF */
+diff --git a/include/sound/intel-nhlt.h b/include/sound/intel-nhlt.h
+index 743c2f4422806..d0574805865f9 100644
+--- a/include/sound/intel-nhlt.h
++++ b/include/sound/intel-nhlt.h
+@@ -112,6 +112,11 @@ struct nhlt_vendor_dmic_array_config {
+       /* TODO add vendor mic config */
+ } __packed;
+ 
++enum {
++      NHLT_CONFIG_TYPE_GENERIC = 0,
++      NHLT_CONFIG_TYPE_MIC_ARRAY = 1
++};
++
+ enum {
+       NHLT_MIC_ARRAY_2CH_SMALL = 0xa,
+       NHLT_MIC_ARRAY_2CH_BIG = 0xb,
+diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
+index ddeb865706ba4..b12e5f4721ca7 100644
+--- a/kernel/trace/ring_buffer.c
++++ b/kernel/trace/ring_buffer.c
+@@ -2836,6 +2836,17 @@ rb_try_to_discard(struct ring_buffer_per_cpu 
*cpu_buffer,
+                                      write_stamp, write_stamp - delta))
+                       return 0;
+ 
++              /*
++               * It's possible that the event time delta is zero
++               * (has the same time stamp as the previous event)
++               * in which case write_stamp and before_stamp could
++               * be the same. In such a case, force before_stamp
++               * to be different than write_stamp. It doesn't
++               * matter what it is, as long as its different.
++               */
++              if (!delta)
++                      rb_time_set(&cpu_buffer->before_stamp, 0);
++
+               /*
+                * If an event were to come in now, it would see that the
+                * write_stamp and the before_stamp are different, and assume
+diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c
+index b9c2ee7ab43fa..cce12e1971d85 100644
+--- a/scripts/recordmcount.c
++++ b/scripts/recordmcount.c
+@@ -438,7 +438,7 @@ static int arm_is_fake_mcount(Elf32_Rel const *rp)
+ 
+ static int arm64_is_fake_mcount(Elf64_Rel const *rp)
+ {
+-      return ELF64_R_TYPE(w(rp->r_info)) != R_AARCH64_CALL26;
++      return ELF64_R_TYPE(w8(rp->r_info)) != R_AARCH64_CALL26;
+ }
+ 
+ /* 64-bit EM_MIPS has weird ELF64_Rela.r_info.
+diff --git a/security/tomoyo/network.c b/security/tomoyo/network.c
+index a89ed55d85d41..478f757ff8435 100644
+--- a/security/tomoyo/network.c
++++ b/security/tomoyo/network.c
+@@ -613,7 +613,7 @@ static int tomoyo_check_unix_address(struct sockaddr *addr,
+ static bool tomoyo_kernel_service(void)
+ {
+       /* Nothing to do if I am a kernel service. */
+-      return uaccess_kernel();
++      return (current->flags & (PF_KTHREAD | PF_IO_WORKER)) == PF_KTHREAD;
+ }
+ 
+ /**
+diff --git a/sound/hda/intel-nhlt.c b/sound/hda/intel-nhlt.c
+index 059aaf04f536a..d053beccfaec3 100644
+--- a/sound/hda/intel-nhlt.c
++++ b/sound/hda/intel-nhlt.c
+@@ -31,18 +31,44 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct 
nhlt_acpi_table *nhlt)
+       struct nhlt_endpoint *epnt;
+       struct nhlt_dmic_array_config *cfg;
+       struct nhlt_vendor_dmic_array_config *cfg_vendor;
++      struct nhlt_fmt *fmt_configs;
+       unsigned int dmic_geo = 0;
+-      u8 j;
++      u16 max_ch = 0;
++      u8 i, j;
+ 
+       if (!nhlt)
+               return 0;
+ 
+-      epnt = (struct nhlt_endpoint *)nhlt->desc;
++      for (j = 0, epnt = nhlt->desc; j < nhlt->endpoint_count; j++,
++           epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length)) {
+ 
+-      for (j = 0; j < nhlt->endpoint_count; j++) {
+-              if (epnt->linktype == NHLT_LINK_DMIC) {
+-                      cfg = (struct nhlt_dmic_array_config  *)
+-                                      (epnt->config.caps);
++              if (epnt->linktype != NHLT_LINK_DMIC)
++                      continue;
++
++              cfg = (struct nhlt_dmic_array_config  *)(epnt->config.caps);
++              fmt_configs = (struct nhlt_fmt *)(epnt->config.caps + 
epnt->config.size);
++
++              /* find max number of channels based on format_configuration */
++              if (fmt_configs->fmt_count) {
++                      dev_dbg(dev, "%s: found %d format definitions\n",
++                              __func__, fmt_configs->fmt_count);
++
++                      for (i = 0; i < fmt_configs->fmt_count; i++) {
++                              struct wav_fmt_ext *fmt_ext;
++
++                              fmt_ext = &fmt_configs->fmt_config[i].fmt_ext;
++
++                              if (fmt_ext->fmt.channels > max_ch)
++                                      max_ch = fmt_ext->fmt.channels;
++                      }
++                      dev_dbg(dev, "%s: max channels found %d\n", __func__, 
max_ch);
++              } else {
++                      dev_dbg(dev, "%s: No format information found\n", 
__func__);
++              }
++
++              if (cfg->device_config.config_type != 
NHLT_CONFIG_TYPE_MIC_ARRAY) {
++                      dmic_geo = max_ch;
++              } else {
+                       switch (cfg->array_type) {
+                       case NHLT_MIC_ARRAY_2CH_SMALL:
+                       case NHLT_MIC_ARRAY_2CH_BIG:
+@@ -59,13 +85,23 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct 
nhlt_acpi_table *nhlt)
+                               dmic_geo = cfg_vendor->nb_mics;
+                               break;
+                       default:
+-                              dev_warn(dev, "undefined DMIC array_type 
0x%0x\n",
+-                                       cfg->array_type);
++                              dev_warn(dev, "%s: undefined DMIC array_type 
0x%0x\n",
++                                       __func__, cfg->array_type);
++                      }
++
++                      if (dmic_geo > 0) {
++                              dev_dbg(dev, "%s: Array with %d dmics\n", 
__func__, dmic_geo);
++                      }
++                      if (max_ch > dmic_geo) {
++                              dev_dbg(dev, "%s: max channels %d exceed dmic 
number %d\n",
++                                      __func__, max_ch, dmic_geo);
+                       }
+               }
+-              epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
+       }
+ 
++      dev_dbg(dev, "%s: dmic number %d max_ch %d\n",
++              __func__, dmic_geo, max_ch);
++
+       return dmic_geo;
+ }
+ EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo);
+diff --git a/sound/pci/ctxfi/cthw20k2.c b/sound/pci/ctxfi/cthw20k2.c
+index fc1bc18caee98..85d1fc76f59e1 100644
+--- a/sound/pci/ctxfi/cthw20k2.c
++++ b/sound/pci/ctxfi/cthw20k2.c
+@@ -991,7 +991,7 @@ static int daio_mgr_dao_init(void *blk, unsigned int idx, 
unsigned int conf)
+ 
+       if (idx < 4) {
+               /* S/PDIF output */
+-              switch ((conf & 0x7)) {
++              switch ((conf & 0xf)) {
+               case 1:
+                       set_field(&ctl->txctl[idx], ATXCTL_NUC, 0);
+                       break;
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 5f4f8c2d760f0..b47504fa8dfd0 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -6408,6 +6408,7 @@ enum {
+       ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
+       ALC282_FIXUP_ACER_DISABLE_LINEOUT,
+       ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
++      ALC256_FIXUP_ACER_HEADSET_MIC,
+ };
+ 
+ static const struct hda_fixup alc269_fixups[] = {
+@@ -7864,6 +7865,16 @@ static const struct hda_fixup alc269_fixups[] = {
+               .chained = true,
+               .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
+       },
++      [ALC256_FIXUP_ACER_HEADSET_MIC] = {
++              .type = HDA_FIXUP_PINS,
++              .v.pins = (const struct hda_pintbl[]) {
++                      { 0x19, 0x02a1113c }, /* use as headset mic, without 
its own jack detect */
++                      { 0x1a, 0x90a1092f }, /* use as internal mic */
++                      { }
++              },
++              .chained = true,
++              .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
++      },
+ };
+ 
+ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+@@ -7890,9 +7901,11 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", 
ALC299_FIXUP_PREDATOR_SPK),
+       SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", 
ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
+       SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", 
ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
++      SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", 
ALC256_FIXUP_ACER_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", 
ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", 
ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", 
ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
++      SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", 
ALC256_FIXUP_ACER_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", 
ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", 
ALC233_FIXUP_ACER_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", 
ALC255_FIXUP_ACER_HEADSET_MIC),
+diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
+index 81e987eaf0637..375cfb9c9ab7e 100644
+--- a/sound/usb/mixer.c
++++ b/sound/usb/mixer.c
+@@ -1301,6 +1301,17 @@ no_res_check:
+                       /* totally crap, return an error */
+                       return -EINVAL;
+               }
++      } else {
++              /* if the max volume is too low, it's likely a bogus range;
++               * here we use -96dB as the threshold
++               */
++              if (cval->dBmax <= -9600) {
++                      usb_audio_info(cval->head.mixer->chip,
++                                     "%d:%d: bogus dB values (%d/%d), 
disabling dB reporting\n",
++                                     cval->head.id, 
mixer_ctrl_intf(cval->head.mixer),
++                                     cval->dBmin, cval->dBmax);
++                      cval->dBmin = cval->dBmax = 0;
++              }
+       }
+ 
+       return 0;
+diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
+index a7212f16660ec..646deb6244b15 100644
+--- a/sound/usb/mixer_maps.c
++++ b/sound/usb/mixer_maps.c
+@@ -536,6 +536,16 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
+               .id = USB_ID(0x05a7, 0x1020),
+               .map = bose_companion5_map,
+       },
++      {
++              /* Corsair Virtuoso SE (wired mode) */
++              .id = USB_ID(0x1b1c, 0x0a3d),
++              .map = corsair_virtuoso_map,
++      },
++      {
++              /* Corsair Virtuoso SE (wireless mode) */
++              .id = USB_ID(0x1b1c, 0x0a3e),
++              .map = corsair_virtuoso_map,
++      },
+       {
+               /* Corsair Virtuoso (wired mode) */
+               .id = USB_ID(0x1b1c, 0x0a41),

Reply via email to