commit:     2ec1effc95982d8c85e68fa645765c3bf04c893f
Author:     Arisu Tachibana <alicef <AT> gentoo <DOT> org>
AuthorDate: Thu Aug 21 05:19:04 2025 +0000
Commit:     Arisu Tachibana <alicef <AT> gentoo <DOT> org>
CommitDate: Thu Aug 21 05:19:04 2025 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=2ec1effc

Linux patch 5.4.281

Signed-off-by: Arisu Tachibana <alicef <AT> gentoo.org>

 0000_README              |    4 +
 1280_linux-5.4.281.patch | 1322 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1326 insertions(+)

diff --git a/0000_README b/0000_README
index 25446efb..c8560d5e 100644
--- a/0000_README
+++ b/0000_README
@@ -1163,6 +1163,10 @@ Patch:  1279_linux-5.4.280.patch
 From:   https://www.kernel.org
 Desc:   Linux 5.4.280
 
+Patch:  1280_linux-5.4.281.patch
+From:   https://www.kernel.org
+Desc:   Linux 5.4.281
+
 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/1280_linux-5.4.281.patch b/1280_linux-5.4.281.patch
new file mode 100644
index 00000000..efc08a06
--- /dev/null
+++ b/1280_linux-5.4.281.patch
@@ -0,0 +1,1322 @@
+diff --git a/Makefile b/Makefile
+index 1c30e93101283..ccb7ff1315901 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 280
++SUBLEVEL = 281
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
+index 98c6b91be4a8a..e198cbcb78901 100644
+--- a/arch/arm/include/asm/uaccess.h
++++ b/arch/arm/include/asm/uaccess.h
+@@ -143,16 +143,6 @@ extern int __get_user_64t_1(void *);
+ extern int __get_user_64t_2(void *);
+ extern int __get_user_64t_4(void *);
+ 
+-#define __GUP_CLOBBER_1       "lr", "cc"
+-#ifdef CONFIG_CPU_USE_DOMAINS
+-#define __GUP_CLOBBER_2       "ip", "lr", "cc"
+-#else
+-#define __GUP_CLOBBER_2 "lr", "cc"
+-#endif
+-#define __GUP_CLOBBER_4       "lr", "cc"
+-#define __GUP_CLOBBER_32t_8 "lr", "cc"
+-#define __GUP_CLOBBER_8       "lr", "cc"
+-
+ #define __get_user_x(__r2, __p, __e, __l, __s)                                
\
+          __asm__ __volatile__ (                                       \
+               __asmeq("%0", "r0") __asmeq("%1", "r2")                 \
+@@ -160,7 +150,7 @@ extern int __get_user_64t_4(void *);
+               "bl     __get_user_" #__s                               \
+               : "=&r" (__e), "=r" (__r2)                              \
+               : "0" (__p), "r" (__l)                                  \
+-              : __GUP_CLOBBER_##__s)
++              : "ip", "lr", "cc")
+ 
+ /* narrowing a double-word get into a single 32bit word register: */
+ #ifdef __ARMEB__
+@@ -182,7 +172,7 @@ extern int __get_user_64t_4(void *);
+               "bl     __get_user_64t_" #__s                           \
+               : "=&r" (__e), "=r" (__r2)                              \
+               : "0" (__p), "r" (__l)                                  \
+-              : __GUP_CLOBBER_##__s)
++              : "ip", "lr", "cc")
+ #else
+ #define __get_user_x_64t __get_user_x
+ #endif
+diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl 
b/arch/mips/kernel/syscalls/syscall_o32.tbl
+index 353539ea4140a..5f2c2636e7a4f 100644
+--- a/arch/mips/kernel/syscalls/syscall_o32.tbl
++++ b/arch/mips/kernel/syscalls/syscall_o32.tbl
+@@ -27,7 +27,7 @@
+ 17    o32     break                           sys_ni_syscall
+ # 18 was sys_stat
+ 18    o32     unused18                        sys_ni_syscall
+-19    o32     lseek                           sys_lseek
++19    o32     lseek                           sys_lseek                       
compat_sys_lseek
+ 20    o32     getpid                          sys_getpid
+ 21    o32     mount                           sys_mount                       
compat_sys_mount
+ 22    o32     umount                          sys_oldumount
+diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c
+index 177852e39a253..4b6b1846e4d23 100644
+--- a/arch/powerpc/kernel/eeh_pe.c
++++ b/arch/powerpc/kernel/eeh_pe.c
+@@ -922,6 +922,7 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
+ {
+       struct eeh_dev *edev;
+       struct pci_dev *pdev;
++      struct pci_bus *bus = NULL;
+ 
+       if (pe->type & EEH_PE_PHB)
+               return pe->phb->bus;
+@@ -932,9 +933,11 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
+ 
+       /* Retrieve the parent PCI bus of first (top) PCI device */
+       edev = list_first_entry_or_null(&pe->edevs, struct eeh_dev, entry);
++      pci_lock_rescan_remove();
+       pdev = eeh_dev_to_pci_dev(edev);
+       if (pdev)
+-              return pdev->bus;
++              bus = pdev->bus;
++      pci_unlock_rescan_remove();
+ 
+-      return NULL;
++      return bus;
+ }
+diff --git a/arch/powerpc/kvm/book3s_64_vio.c 
b/arch/powerpc/kvm/book3s_64_vio.c
+index 4518a0f2d6c69..ac80b49e4f011 100644
+--- a/arch/powerpc/kvm/book3s_64_vio.c
++++ b/arch/powerpc/kvm/book3s_64_vio.c
+@@ -118,14 +118,16 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm 
*kvm, int tablefd,
+       }
+       rcu_read_unlock();
+ 
+-      fdput(f);
+-
+-      if (!found)
++      if (!found) {
++              fdput(f);
+               return -EINVAL;
++      }
+ 
+       table_group = iommu_group_get_iommudata(grp);
+-      if (WARN_ON(!table_group))
++      if (WARN_ON(!table_group)) {
++              fdput(f);
+               return -EFAULT;
++      }
+ 
+       for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
+               struct iommu_table *tbltmp = table_group->tables[i];
+@@ -146,8 +148,10 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm 
*kvm, int tablefd,
+                       break;
+               }
+       }
+-      if (!tbl)
++      if (!tbl) {
++              fdput(f);
+               return -EINVAL;
++      }
+ 
+       rcu_read_lock();
+       list_for_each_entry_rcu(stit, &stt->iommu_tables, next) {
+@@ -158,6 +162,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm 
*kvm, int tablefd,
+                       /* stit is being destroyed */
+                       iommu_tce_table_put(tbl);
+                       rcu_read_unlock();
++                      fdput(f);
+                       return -ENOTTY;
+               }
+               /*
+@@ -165,6 +170,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm 
*kvm, int tablefd,
+                * its KVM reference counter and can return.
+                */
+               rcu_read_unlock();
++              fdput(f);
+               return 0;
+       }
+       rcu_read_unlock();
+@@ -172,6 +178,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm 
*kvm, int tablefd,
+       stit = kzalloc(sizeof(*stit), GFP_KERNEL);
+       if (!stit) {
+               iommu_tce_table_put(tbl);
++              fdput(f);
+               return -ENOMEM;
+       }
+ 
+@@ -180,6 +187,7 @@ extern long kvm_spapr_tce_attach_iommu_group(struct kvm 
*kvm, int tablefd,
+ 
+       list_add_rcu(&stit->next, &stt->iommu_tables);
+ 
++      fdput(f);
+       return 0;
+ }
+ 
+diff --git a/arch/powerpc/platforms/pseries/setup.c 
b/arch/powerpc/platforms/pseries/setup.c
+index d5abb25865e36..bc1a4e024529b 100644
+--- a/arch/powerpc/platforms/pseries/setup.c
++++ b/arch/powerpc/platforms/pseries/setup.c
+@@ -305,8 +305,8 @@ static int alloc_dispatch_log_kmem_cache(void)
+ {
+       void (*ctor)(void *) = get_dtl_cache_ctor();
+ 
+-      dtl_cache = kmem_cache_create("dtl", DISPATCH_LOG_BYTES,
+-                                              DISPATCH_LOG_BYTES, 0, ctor);
++      dtl_cache = kmem_cache_create_usercopy("dtl", DISPATCH_LOG_BYTES,
++                                              DISPATCH_LOG_BYTES, 0, 0, 
DISPATCH_LOG_BYTES, ctor);
+       if (!dtl_cache) {
+               pr_warn("Failed to create dispatch trace log buffer cache\n");
+               pr_warn("Stolen time statistics will be unreliable\n");
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index c7baccd47b89f..142578451e381 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -1310,10 +1310,13 @@ acpi_ec_space_handler(u32 function, 
acpi_physical_address address,
+       if (ec->busy_polling || bits > 8)
+               acpi_ec_burst_enable(ec);
+ 
+-      for (i = 0; i < bytes; ++i, ++address, ++value)
++      for (i = 0; i < bytes; ++i, ++address, ++value) {
+               result = (function == ACPI_READ) ?
+                       acpi_ec_read(ec, address, value) :
+                       acpi_ec_write(ec, address, *value);
++              if (result < 0)
++                      break;
++      }
+ 
+       if (ec->busy_polling || bits > 8)
+               acpi_ec_burst_disable(ec);
+@@ -1325,8 +1328,10 @@ acpi_ec_space_handler(u32 function, 
acpi_physical_address address,
+               return AE_NOT_FOUND;
+       case -ETIME:
+               return AE_TIME;
+-      default:
++      case 0:
+               return AE_OK;
++      default:
++              return AE_ERROR;
+       }
+ }
+ 
+diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
+index 0aca77cb8301c..92db8b0622b29 100644
+--- a/drivers/acpi/processor_idle.c
++++ b/drivers/acpi/processor_idle.c
+@@ -16,7 +16,6 @@
+ #include <linux/acpi.h>
+ #include <linux/dmi.h>
+ #include <linux/sched.h>       /* need_resched() */
+-#include <linux/sort.h>
+ #include <linux/tick.h>
+ #include <linux/cpuidle.h>
+ #include <linux/cpu.h>
+@@ -541,28 +540,24 @@ static void acpi_processor_power_verify_c3(struct 
acpi_processor *pr,
+       return;
+ }
+ 
+-static int acpi_cst_latency_cmp(const void *a, const void *b)
++static void acpi_cst_latency_sort(struct acpi_processor_cx *states, size_t 
length)
+ {
+-      const struct acpi_processor_cx *x = a, *y = b;
++      int i, j, k;
+ 
+-      if (!(x->valid && y->valid))
+-              return 0;
+-      if (x->latency > y->latency)
+-              return 1;
+-      if (x->latency < y->latency)
+-              return -1;
+-      return 0;
+-}
+-static void acpi_cst_latency_swap(void *a, void *b, int n)
+-{
+-      struct acpi_processor_cx *x = a, *y = b;
+-      u32 tmp;
++      for (i = 1; i < length; i++) {
++              if (!states[i].valid)
++                      continue;
+ 
+-      if (!(x->valid && y->valid))
+-              return;
+-      tmp = x->latency;
+-      x->latency = y->latency;
+-      y->latency = tmp;
++              for (j = i - 1, k = i; j >= 0; j--) {
++                      if (!states[j].valid)
++                              continue;
++
++                      if (states[j].latency > states[k].latency)
++                              swap(states[j].latency, states[k].latency);
++
++                      k = j;
++              }
++      }
+ }
+ 
+ static int acpi_processor_power_verify(struct acpi_processor *pr)
+@@ -607,10 +602,7 @@ static int acpi_processor_power_verify(struct 
acpi_processor *pr)
+ 
+       if (buggy_latency) {
+               pr_notice("FW issue: working around C-state latencies out of 
order\n");
+-              sort(&pr->power.states[1], max_cstate,
+-                   sizeof(struct acpi_processor_cx),
+-                   acpi_cst_latency_cmp,
+-                   acpi_cst_latency_swap);
++              acpi_cst_latency_sort(&pr->power.states[1], max_cstate);
+       }
+ 
+       lapic_timer_propagate_broadcast(pr);
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c 
b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+index 8bb54fc0d534b..161984bc24deb 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+@@ -2003,7 +2003,7 @@ static int sdma_v4_0_process_trap_irq(struct 
amdgpu_device *adev,
+                                     struct amdgpu_irq_src *source,
+                                     struct amdgpu_iv_entry *entry)
+ {
+-      uint32_t instance;
++      int instance;
+ 
+       DRM_DEBUG("IH: SDMA trap\n");
+       instance = sdma_v4_0_irq_id_to_seq(entry->client_id);
+diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
+index 9ff89bfda7a24..8e286e023916f 100644
+--- a/drivers/input/mouse/elantech.c
++++ b/drivers/input/mouse/elantech.c
+@@ -1476,16 +1476,47 @@ static void elantech_disconnect(struct psmouse 
*psmouse)
+       psmouse->private = NULL;
+ }
+ 
++/*
++ * Some hw_version 4 models fail to properly activate absolute mode on
++ * resume without going through disable/enable cycle.
++ */
++static const struct dmi_system_id elantech_needs_reenable[] = {
++#if defined(CONFIG_DMI) && defined(CONFIG_X86)
++      {
++              /* Lenovo N24 */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "81AF"),
++              },
++      },
++#endif
++      { }
++};
++
+ /*
+  * Put the touchpad back into absolute mode when reconnecting
+  */
+ static int elantech_reconnect(struct psmouse *psmouse)
+ {
++      int err;
++
+       psmouse_reset(psmouse);
+ 
+       if (elantech_detect(psmouse, 0))
+               return -1;
+ 
++      if (dmi_check_system(elantech_needs_reenable)) {
++              err = ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE);
++              if (err)
++                      psmouse_warn(psmouse, "failed to deactivate mouse on 
%s: %d\n",
++                                   psmouse->ps2dev.serio->phys, err);
++
++              err = ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE);
++              if (err)
++                      psmouse_warn(psmouse, "failed to reactivate mouse on 
%s: %d\n",
++                                   psmouse->ps2dev.serio->phys, err);
++      }
++
+       if (elantech_set_absolute_mode(psmouse)) {
+               psmouse_err(psmouse,
+                           "failed to put touchpad back into absolute 
mode.\n");
+diff --git a/drivers/input/touchscreen/silead.c 
b/drivers/input/touchscreen/silead.c
+index c8776146f1d1b..467feacdbd7a2 100644
+--- a/drivers/input/touchscreen/silead.c
++++ b/drivers/input/touchscreen/silead.c
+@@ -70,7 +70,6 @@ struct silead_ts_data {
+       struct regulator_bulk_data regulators[2];
+       char fw_name[64];
+       struct touchscreen_properties prop;
+-      u32 max_fingers;
+       u32 chip_id;
+       struct input_mt_pos pos[SILEAD_MAX_FINGERS];
+       int slots[SILEAD_MAX_FINGERS];
+@@ -98,7 +97,7 @@ static int silead_ts_request_input_dev(struct silead_ts_data 
*data)
+       input_set_abs_params(data->input, ABS_MT_POSITION_Y, 0, 4095, 0, 0);
+       touchscreen_parse_properties(data->input, true, &data->prop);
+ 
+-      input_mt_init_slots(data->input, data->max_fingers,
++      input_mt_init_slots(data->input, SILEAD_MAX_FINGERS,
+                           INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED |
+                           INPUT_MT_TRACK);
+ 
+@@ -145,10 +144,10 @@ static void silead_ts_read_data(struct i2c_client 
*client)
+               return;
+       }
+ 
+-      if (buf[0] > data->max_fingers) {
++      if (buf[0] > SILEAD_MAX_FINGERS) {
+               dev_warn(dev, "More touches reported then supported %d > %d\n",
+-                       buf[0], data->max_fingers);
+-              buf[0] = data->max_fingers;
++                       buf[0], SILEAD_MAX_FINGERS);
++              buf[0] = SILEAD_MAX_FINGERS;
+       }
+ 
+       touch_nr = 0;
+@@ -200,7 +199,6 @@ static void silead_ts_read_data(struct i2c_client *client)
+ 
+ static int silead_ts_init(struct i2c_client *client)
+ {
+-      struct silead_ts_data *data = i2c_get_clientdata(client);
+       int error;
+ 
+       error = i2c_smbus_write_byte_data(client, SILEAD_REG_RESET,
+@@ -210,7 +208,7 @@ static int silead_ts_init(struct i2c_client *client)
+       usleep_range(SILEAD_CMD_SLEEP_MIN, SILEAD_CMD_SLEEP_MAX);
+ 
+       error = i2c_smbus_write_byte_data(client, SILEAD_REG_TOUCH_NR,
+-                                      data->max_fingers);
++                                        SILEAD_MAX_FINGERS);
+       if (error)
+               goto i2c_write_err;
+       usleep_range(SILEAD_CMD_SLEEP_MIN, SILEAD_CMD_SLEEP_MAX);
+@@ -437,13 +435,6 @@ static void silead_ts_read_props(struct i2c_client 
*client)
+       const char *str;
+       int error;
+ 
+-      error = device_property_read_u32(dev, "silead,max-fingers",
+-                                       &data->max_fingers);
+-      if (error) {
+-              dev_dbg(dev, "Max fingers read error %d\n", error);
+-              data->max_fingers = 5; /* Most devices handle up-to 5 fingers */
+-      }
+-
+       error = device_property_read_string(dev, "firmware-name", &str);
+       if (!error)
+               snprintf(data->fw_name, sizeof(data->fw_name),
+diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
+index 7310b476323c2..5cd29deb79858 100644
+--- a/drivers/misc/mei/main.c
++++ b/drivers/misc/mei/main.c
+@@ -268,7 +268,7 @@ static ssize_t mei_write(struct file *file, const char 
__user *ubuf,
+       }
+ 
+       if (!mei_cl_is_connected(cl)) {
+-              cl_err(dev, cl, "is not connected");
++              cl_dbg(dev, cl, "is not connected");
+               rets = -ENODEV;
+               goto out;
+       }
+diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c 
b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
+index 411b3adb1d9ea..a96b223984070 100644
+--- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
++++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
+@@ -266,7 +266,7 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv 
*priv, void *cmd,
+       }
+       usb_free_urb(urb);
+ 
+-      return 0;
++      return err;
+ }
+ 
+ int kvaser_usb_can_rx_over_error(struct net_device *netdev)
+diff --git a/drivers/net/tap.c b/drivers/net/tap.c
+index c299faaf4b2d5..781cd2649bbbd 100644
+--- a/drivers/net/tap.c
++++ b/drivers/net/tap.c
+@@ -1153,6 +1153,11 @@ static int tap_get_user_xdp(struct tap_queue *q, struct 
xdp_buff *xdp)
+       struct sk_buff *skb;
+       int err, depth;
+ 
++      if (unlikely(xdp->data_end - xdp->data < ETH_HLEN)) {
++              err = -EINVAL;
++              goto err;
++      }
++
+       if (q->flags & IFF_VNET_HDR)
+               vnet_hdr_len = READ_ONCE(q->vnet_hdr_sz);
+ 
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index 3c52d0d24704f..0adce9bf7a1e5 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -2539,6 +2539,9 @@ static int tun_xdp_one(struct tun_struct *tun,
+       bool skb_xdp = false;
+       struct page *page;
+ 
++      if (unlikely(datasize < ETH_HLEN))
++              return -EINVAL;
++
+       xdp_prog = rcu_dereference(tun->xdp_prog);
+       if (xdp_prog) {
+               if (gso->gso_type) {
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 7cad9850e6f15..17aa52ed892b5 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1334,6 +1334,8 @@ static const struct usb_device_id products[] = {
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x1260, 2)}, /* Telit LE910Cx */
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x1261, 2)}, /* Telit LE910Cx */
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x1900, 1)}, /* Telit LN940 series */
++      {QMI_QUIRK_SET_DTR(0x1bc7, 0x3000, 0)}, /* Telit FN912 series */
++      {QMI_QUIRK_SET_DTR(0x1bc7, 0x3001, 0)}, /* Telit FN912 series */
+       {QMI_FIXED_INTF(0x1c9e, 0x9801, 3)},    /* Telewell TW-3G HSPA+ */
+       {QMI_FIXED_INTF(0x1c9e, 0x9803, 4)},    /* Telewell TW-3G HSPA+ */
+       {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)},    /* XS Stick W100-2 from 4G 
Systems */
+diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c
+index d2ab3f07c008c..8296e6bc229ee 100644
+--- a/drivers/s390/char/sclp.c
++++ b/drivers/s390/char/sclp.c
+@@ -1208,6 +1208,7 @@ sclp_init(void)
+ fail_unregister_reboot_notifier:
+       unregister_reboot_notifier(&sclp_reboot_notifier);
+ fail_init_state_uninitialized:
++      list_del(&sclp_state_change_event.list);
+       sclp_init_state = sclp_init_state_uninitialized;
+       free_page((unsigned long) sclp_read_sccb);
+       free_page((unsigned long) sclp_init_sccb);
+diff --git a/drivers/scsi/libsas/sas_internal.h 
b/drivers/scsi/libsas/sas_internal.h
+index 01f1738ce6dff..3fb8a64f571d5 100644
+--- a/drivers/scsi/libsas/sas_internal.h
++++ b/drivers/scsi/libsas/sas_internal.h
+@@ -111,6 +111,20 @@ static inline void sas_fail_probe(struct domain_device 
*dev, const char *func, i
+               func, dev->parent ? "exp-attached" :
+               "direct-attached",
+               SAS_ADDR(dev->sas_addr), err);
++
++      /*
++       * If the device probe failed, the expander phy attached address
++       * needs to be reset so that the phy will not be treated as flutter
++       * in the next revalidation
++       */
++      if (dev->parent && !dev_is_expander(dev->dev_type)) {
++              struct sas_phy *phy = dev->phy;
++              struct domain_device *parent = dev->parent;
++              struct ex_phy *ex_phy = &parent->ex_dev.ex_phy[phy->number];
++
++              memset(ex_phy->attached_sas_addr, 0, SAS_ADDR_SIZE);
++      }
++
+       sas_unregister_dev(dev->port, dev);
+ }
+ 
+diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c
+index 858058f228191..e0601b5520b78 100644
+--- a/drivers/scsi/qedf/qedf_main.c
++++ b/drivers/scsi/qedf/qedf_main.c
+@@ -3299,6 +3299,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode)
+       }
+ 
+       /* Start the Slowpath-process */
++      memset(&slowpath_params, 0, sizeof(struct qed_slowpath_params));
+       slowpath_params.int_mode = QED_INT_MODE_MSIX;
+       slowpath_params.drv_major = QEDF_DRIVER_MAJOR_VER;
+       slowpath_params.drv_minor = QEDF_DRIVER_MINOR_VER;
+diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
+index 67f31183c1180..8c9bafee58f9f 100644
+--- a/drivers/spi/spi-imx.c
++++ b/drivers/spi/spi-imx.c
+@@ -993,7 +993,7 @@ static struct spi_imx_devtype_data imx35_cspi_devtype_data 
= {
+       .rx_available = mx31_rx_available,
+       .reset = mx31_reset,
+       .fifo_size = 8,
+-      .has_dmamode = true,
++      .has_dmamode = false,
+       .dynamic_burst = false,
+       .has_slavemode = false,
+       .devtype = IMX35_CSPI,
+diff --git a/fs/dcache.c b/fs/dcache.c
+index c58b5e5cb045d..78081bdc49311 100644
+--- a/fs/dcache.c
++++ b/fs/dcache.c
+@@ -3073,28 +3073,25 @@ EXPORT_SYMBOL(d_splice_alias);
+   
+ bool is_subdir(struct dentry *new_dentry, struct dentry *old_dentry)
+ {
+-      bool result;
++      bool subdir;
+       unsigned seq;
+ 
+       if (new_dentry == old_dentry)
+               return true;
+ 
+-      do {
+-              /* for restarting inner loop in case of seq retry */
+-              seq = read_seqbegin(&rename_lock);
+-              /*
+-               * Need rcu_readlock to protect against the d_parent trashing
+-               * due to d_move
+-               */
+-              rcu_read_lock();
+-              if (d_ancestor(old_dentry, new_dentry))
+-                      result = true;
+-              else
+-                      result = false;
+-              rcu_read_unlock();
+-      } while (read_seqretry(&rename_lock, seq));
+-
+-      return result;
++      /* Access d_parent under rcu as d_move() may change it. */
++      rcu_read_lock();
++      seq = read_seqbegin(&rename_lock);
++      subdir = d_ancestor(old_dentry, new_dentry);
++       /* Try lockless once... */
++      if (read_seqretry(&rename_lock, seq)) {
++              /* ...else acquire lock for progress even on deep chains. */
++              read_seqlock_excl(&rename_lock);
++              subdir = d_ancestor(old_dentry, new_dentry);
++              read_sequnlock_excl(&rename_lock);
++      }
++      rcu_read_unlock();
++      return subdir;
+ }
+ EXPORT_SYMBOL(is_subdir);
+ 
+diff --git a/fs/file.c b/fs/file.c
+index e56059fa1b309..64892b7444191 100644
+--- a/fs/file.c
++++ b/fs/file.c
+@@ -462,12 +462,12 @@ struct files_struct init_files = {
+ 
+ static unsigned int find_next_fd(struct fdtable *fdt, unsigned int start)
+ {
+-      unsigned int maxfd = fdt->max_fds;
++      unsigned int maxfd = fdt->max_fds; /* always multiple of BITS_PER_LONG 
*/
+       unsigned int maxbit = maxfd / BITS_PER_LONG;
+       unsigned int bitbit = start / BITS_PER_LONG;
+ 
+       bitbit = find_next_zero_bit(fdt->full_fds_bits, maxbit, bitbit) * 
BITS_PER_LONG;
+-      if (bitbit > maxfd)
++      if (bitbit >= maxfd)
+               return maxfd;
+       if (bitbit > start)
+               start = bitbit;
+diff --git a/fs/hfsplus/xattr.c b/fs/hfsplus/xattr.c
+index bb0b27d88e502..d91f76ef18d9b 100644
+--- a/fs/hfsplus/xattr.c
++++ b/fs/hfsplus/xattr.c
+@@ -700,7 +700,7 @@ ssize_t hfsplus_listxattr(struct dentry *dentry, char 
*buffer, size_t size)
+               return err;
+       }
+ 
+-      strbuf = kmalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN +
++      strbuf = kzalloc(NLS_MAX_CHARSET_SIZE * HFSPLUS_ATTR_MAX_STRLEN +
+                       XATTR_MAC_OSX_PREFIX_LEN + 1, GFP_KERNEL);
+       if (!strbuf) {
+               res = -ENOMEM;
+diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c
+index 7ae54f78a5b0b..aea5531559c06 100644
+--- a/fs/jfs/xattr.c
++++ b/fs/jfs/xattr.c
+@@ -797,7 +797,7 @@ ssize_t __jfs_getxattr(struct inode *inode, const char 
*name, void *data,
+                      size_t buf_size)
+ {
+       struct jfs_ea_list *ealist;
+-      struct jfs_ea *ea;
++      struct jfs_ea *ea, *ealist_end;
+       struct ea_buffer ea_buf;
+       int xattr_size;
+       ssize_t size;
+@@ -817,9 +817,16 @@ ssize_t __jfs_getxattr(struct inode *inode, const char 
*name, void *data,
+               goto not_found;
+ 
+       ealist = (struct jfs_ea_list *) ea_buf.xattr;
++      ealist_end = END_EALIST(ealist);
+ 
+       /* Find the named attribute */
+-      for (ea = FIRST_EA(ealist); ea < END_EALIST(ealist); ea = NEXT_EA(ea))
++      for (ea = FIRST_EA(ealist); ea < ealist_end; ea = NEXT_EA(ea)) {
++              if (unlikely(ea + 1 > ealist_end) ||
++                  unlikely(NEXT_EA(ea) > ealist_end)) {
++                      size = -EUCLEAN;
++                      goto release;
++              }
++
+               if ((namelen == ea->namelen) &&
+                   memcmp(name, ea->name, namelen) == 0) {
+                       /* Found it */
+@@ -834,6 +841,7 @@ ssize_t __jfs_getxattr(struct inode *inode, const char 
*name, void *data,
+                       memcpy(data, value, size);
+                       goto release;
+               }
++      }
+       not_found:
+       size = -ENODATA;
+       release:
+@@ -861,7 +869,7 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, 
size_t buf_size)
+       ssize_t size = 0;
+       int xattr_size;
+       struct jfs_ea_list *ealist;
+-      struct jfs_ea *ea;
++      struct jfs_ea *ea, *ealist_end;
+       struct ea_buffer ea_buf;
+ 
+       down_read(&JFS_IP(inode)->xattr_sem);
+@@ -876,9 +884,16 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, 
size_t buf_size)
+               goto release;
+ 
+       ealist = (struct jfs_ea_list *) ea_buf.xattr;
++      ealist_end = END_EALIST(ealist);
+ 
+       /* compute required size of list */
+-      for (ea = FIRST_EA(ealist); ea < END_EALIST(ealist); ea = NEXT_EA(ea)) {
++      for (ea = FIRST_EA(ealist); ea < ealist_end; ea = NEXT_EA(ea)) {
++              if (unlikely(ea + 1 > ealist_end) ||
++                  unlikely(NEXT_EA(ea) > ealist_end)) {
++                      size = -EUCLEAN;
++                      goto release;
++              }
++
+               if (can_list(ea))
+                       size += name_size(ea) + 1;
+       }
+diff --git a/fs/locks.c b/fs/locks.c
+index bafe11deea56b..85c8af53d4eb1 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -2526,8 +2526,9 @@ int fcntl_setlk(unsigned int fd, struct file *filp, 
unsigned int cmd,
+       error = do_lock_file_wait(filp, cmd, file_lock);
+ 
+       /*
+-       * Attempt to detect a close/fcntl race and recover by releasing the
+-       * lock that was just acquired. There is no need to do that when we're
++       * Detect close/fcntl races and recover by zapping all POSIX locks
++       * associated with this file and our files_struct, just like on
++       * filp_flush(). There is no need to do that when we're
+        * unlocking though, or for OFD locks.
+        */
+       if (!error && file_lock->fl_type != F_UNLCK &&
+@@ -2541,9 +2542,7 @@ int fcntl_setlk(unsigned int fd, struct file *filp, 
unsigned int cmd,
+               f = fcheck(fd);
+               spin_unlock(&current->files->file_lock);
+               if (f != filp) {
+-                      file_lock->fl_type = F_UNLCK;
+-                      error = do_lock_file_wait(filp, cmd, file_lock);
+-                      WARN_ON_ONCE(error);
++                      locks_remove_posix(filp, &current->files);
+                       error = -EBADF;
+               }
+       }
+@@ -2657,8 +2656,9 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, 
unsigned int cmd,
+       error = do_lock_file_wait(filp, cmd, file_lock);
+ 
+       /*
+-       * Attempt to detect a close/fcntl race and recover by releasing the
+-       * lock that was just acquired. There is no need to do that when we're
++       * Detect close/fcntl races and recover by zapping all POSIX locks
++       * associated with this file and our files_struct, just like on
++       * filp_flush(). There is no need to do that when we're
+        * unlocking though, or for OFD locks.
+        */
+       if (!error && file_lock->fl_type != F_UNLCK &&
+@@ -2672,9 +2672,7 @@ int fcntl_setlk64(unsigned int fd, struct file *filp, 
unsigned int cmd,
+               f = fcheck(fd);
+               spin_unlock(&current->files->file_lock);
+               if (f != filp) {
+-                      file_lock->fl_type = F_UNLCK;
+-                      error = do_lock_file_wait(filp, cmd, file_lock);
+-                      WARN_ON_ONCE(error);
++                      locks_remove_posix(filp, &current->files);
+                       error = -EBADF;
+               }
+       }
+diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c
+index 49b9c61459c5d..74a3e63242e82 100644
+--- a/fs/ocfs2/dir.c
++++ b/fs/ocfs2/dir.c
+@@ -296,13 +296,16 @@ static void ocfs2_dx_dir_name_hash(struct inode *dir, 
const char *name, int len,
+  * bh passed here can be an inode block or a dir data block, depending
+  * on the inode inline data flag.
+  */
+-static int ocfs2_check_dir_entry(struct inode * dir,
+-                               struct ocfs2_dir_entry * de,
+-                               struct buffer_head * bh,
++static int ocfs2_check_dir_entry(struct inode *dir,
++                               struct ocfs2_dir_entry *de,
++                               struct buffer_head *bh,
++                               char *buf,
++                               unsigned int size,
+                                unsigned long offset)
+ {
+       const char *error_msg = NULL;
+       const int rlen = le16_to_cpu(de->rec_len);
++      const unsigned long next_offset = ((char *) de - buf) + rlen;
+ 
+       if (unlikely(rlen < OCFS2_DIR_REC_LEN(1)))
+               error_msg = "rec_len is smaller than minimal";
+@@ -310,9 +313,11 @@ static int ocfs2_check_dir_entry(struct inode * dir,
+               error_msg = "rec_len % 4 != 0";
+       else if (unlikely(rlen < OCFS2_DIR_REC_LEN(de->name_len)))
+               error_msg = "rec_len is too small for name_len";
+-      else if (unlikely(
+-               ((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize))
+-              error_msg = "directory entry across blocks";
++      else if (unlikely(next_offset > size))
++              error_msg = "directory entry overrun";
++      else if (unlikely(next_offset > size - OCFS2_DIR_REC_LEN(1)) &&
++               next_offset != size)
++              error_msg = "directory entry too close to end";
+ 
+       if (unlikely(error_msg != NULL))
+               mlog(ML_ERROR, "bad entry in directory #%llu: %s - "
+@@ -354,16 +359,17 @@ static inline int ocfs2_search_dirblock(struct 
buffer_head *bh,
+       de_buf = first_de;
+       dlimit = de_buf + bytes;
+ 
+-      while (de_buf < dlimit) {
++      while (de_buf < dlimit - OCFS2_DIR_MEMBER_LEN) {
+               /* this code is executed quadratically often */
+               /* do minimal checking `by hand' */
+ 
+               de = (struct ocfs2_dir_entry *) de_buf;
+ 
+-              if (de_buf + namelen <= dlimit &&
++              if (de->name + namelen <= dlimit &&
+                   ocfs2_match(namelen, name, de)) {
+                       /* found a match - just to be sure, do a full check */
+-                      if (!ocfs2_check_dir_entry(dir, de, bh, offset)) {
++                      if (!ocfs2_check_dir_entry(dir, de, bh, first_de,
++                                                 bytes, offset)) {
+                               ret = -1;
+                               goto bail;
+                       }
+@@ -1140,7 +1146,7 @@ static int __ocfs2_delete_entry(handle_t *handle, struct 
inode *dir,
+       pde = NULL;
+       de = (struct ocfs2_dir_entry *) first_de;
+       while (i < bytes) {
+-              if (!ocfs2_check_dir_entry(dir, de, bh, i)) {
++              if (!ocfs2_check_dir_entry(dir, de, bh, first_de, bytes, i)) {
+                       status = -EIO;
+                       mlog_errno(status);
+                       goto bail;
+@@ -1640,7 +1646,8 @@ int __ocfs2_add_entry(handle_t *handle,
+               /* These checks should've already been passed by the
+                * prepare function, but I guess we can leave them
+                * here anyway. */
+-              if (!ocfs2_check_dir_entry(dir, de, insert_bh, offset)) {
++              if (!ocfs2_check_dir_entry(dir, de, insert_bh, data_start,
++                                         size, offset)) {
+                       retval = -ENOENT;
+                       goto bail;
+               }
+@@ -1778,7 +1785,8 @@ static int ocfs2_dir_foreach_blk_id(struct inode *inode,
+               }
+ 
+               de = (struct ocfs2_dir_entry *) (data->id_data + ctx->pos);
+-              if (!ocfs2_check_dir_entry(inode, de, di_bh, ctx->pos)) {
++              if (!ocfs2_check_dir_entry(inode, de, di_bh, (char 
*)data->id_data,
++                                         i_size_read(inode), ctx->pos)) {
+                       /* On error, skip the f_pos to the end. */
+                       ctx->pos = i_size_read(inode);
+                       break;
+@@ -1871,7 +1879,8 @@ static int ocfs2_dir_foreach_blk_el(struct inode *inode,
+               while (ctx->pos < i_size_read(inode)
+                      && offset < sb->s_blocksize) {
+                       de = (struct ocfs2_dir_entry *) (bh->b_data + offset);
+-                      if (!ocfs2_check_dir_entry(inode, de, bh, offset)) {
++                      if (!ocfs2_check_dir_entry(inode, de, bh, bh->b_data,
++                                                 sb->s_blocksize, offset)) {
+                               /* On error, skip the f_pos to the
+                                  next block. */
+                               ctx->pos = (ctx->pos | (sb->s_blocksize - 1)) + 
1;
+@@ -3343,7 +3352,7 @@ static int ocfs2_find_dir_space_id(struct inode *dir, 
struct buffer_head *di_bh,
+       struct super_block *sb = dir->i_sb;
+       struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
+       struct ocfs2_dir_entry *de, *last_de = NULL;
+-      char *de_buf, *limit;
++      char *first_de, *de_buf, *limit;
+       unsigned long offset = 0;
+       unsigned int rec_len, new_rec_len, free_space = dir->i_sb->s_blocksize;
+ 
+@@ -3356,14 +3365,16 @@ static int ocfs2_find_dir_space_id(struct inode *dir, 
struct buffer_head *di_bh,
+       else
+               free_space = dir->i_sb->s_blocksize - i_size_read(dir);
+ 
+-      de_buf = di->id2.i_data.id_data;
++      first_de = di->id2.i_data.id_data;
++      de_buf = first_de;
+       limit = de_buf + i_size_read(dir);
+       rec_len = OCFS2_DIR_REC_LEN(namelen);
+ 
+       while (de_buf < limit) {
+               de = (struct ocfs2_dir_entry *)de_buf;
+ 
+-              if (!ocfs2_check_dir_entry(dir, de, di_bh, offset)) {
++              if (!ocfs2_check_dir_entry(dir, de, di_bh, first_de,
++                                         i_size_read(dir), offset)) {
+                       ret = -ENOENT;
+                       goto out;
+               }
+@@ -3445,7 +3456,8 @@ static int ocfs2_find_dir_space_el(struct inode *dir, 
const char *name,
+                       /* move to next block */
+                       de = (struct ocfs2_dir_entry *) bh->b_data;
+               }
+-              if (!ocfs2_check_dir_entry(dir, de, bh, offset)) {
++              if (!ocfs2_check_dir_entry(dir, de, bh, bh->b_data, blocksize,
++                                         offset)) {
+                       status = -ENOENT;
+                       goto bail;
+               }
+diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
+index c60204b639ab7..71a7e42097cc0 100644
+--- a/net/bluetooth/hci_core.c
++++ b/net/bluetooth/hci_core.c
+@@ -3412,7 +3412,11 @@ void hci_unregister_dev(struct hci_dev *hdev)
+       list_del(&hdev->list);
+       write_unlock(&hci_dev_list_lock);
+ 
++      cancel_work_sync(&hdev->rx_work);
++      cancel_work_sync(&hdev->cmd_work);
++      cancel_work_sync(&hdev->tx_work);
+       cancel_work_sync(&hdev->power_on);
++      cancel_work_sync(&hdev->error_reset);
+ 
+       hci_dev_do_close(hdev);
+ 
+diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
+index d0293d051637b..e0d0aae343ac8 100644
+--- a/net/ipv4/af_inet.c
++++ b/net/ipv4/af_inet.c
+@@ -749,7 +749,9 @@ int inet_accept(struct socket *sock, struct socket 
*newsock, int flags,
+       sock_rps_record_flow(sk2);
+       WARN_ON(!((1 << sk2->sk_state) &
+                 (TCPF_ESTABLISHED | TCPF_SYN_RECV |
+-                TCPF_CLOSE_WAIT | TCPF_CLOSE)));
++                 TCPF_FIN_WAIT1 | TCPF_FIN_WAIT2 |
++                 TCPF_CLOSING | TCPF_CLOSE_WAIT |
++                 TCPF_CLOSE)));
+ 
+       sock_graft(sk2, newsock);
+ 
+diff --git a/net/ipv6/ila/ila_lwt.c b/net/ipv6/ila/ila_lwt.c
+index 422dcc691f71c..6a6a30e82810d 100644
+--- a/net/ipv6/ila/ila_lwt.c
++++ b/net/ipv6/ila/ila_lwt.c
+@@ -58,7 +58,9 @@ static int ila_output(struct net *net, struct sock *sk, 
struct sk_buff *skb)
+               return orig_dst->lwtstate->orig_output(net, sk, skb);
+       }
+ 
++      local_bh_disable();
+       dst = dst_cache_get(&ilwt->dst_cache);
++      local_bh_enable();
+       if (unlikely(!dst)) {
+               struct ipv6hdr *ip6h = ipv6_hdr(skb);
+               struct flowi6 fl6;
+@@ -86,8 +88,11 @@ static int ila_output(struct net *net, struct sock *sk, 
struct sk_buff *skb)
+                       goto drop;
+               }
+ 
+-              if (ilwt->connected)
++              if (ilwt->connected) {
++                      local_bh_disable();
+                       dst_cache_set_ip6(&ilwt->dst_cache, dst, &fl6.saddr);
++                      local_bh_enable();
++              }
+       }
+ 
+       skb_dst_set(skb, dst);
+diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
+index 36978a0e50001..c2d1addaa7ccc 100644
+--- a/net/mac80211/mesh.c
++++ b/net/mac80211/mesh.c
+@@ -1525,6 +1525,7 @@ void ieee80211_mesh_init_sdata(struct 
ieee80211_sub_if_data *sdata)
+       ifmsh->last_preq = jiffies;
+       ifmsh->next_perr = jiffies;
+       ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
++      ifmsh->nonpeer_pm = NL80211_MESH_POWER_ACTIVE;
+       /* Allocate all mesh structures when creating the first mesh interface. 
*/
+       if (!mesh_allocated)
+               ieee80211s_init();
+diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
+index ee65f1f50a0ab..d53018610d8a5 100644
+--- a/net/mac80211/scan.c
++++ b/net/mac80211/scan.c
+@@ -701,15 +701,21 @@ static int __ieee80211_start_scan(struct 
ieee80211_sub_if_data *sdata,
+                       local->hw_scan_ies_bufsize *= n_bands;
+               }
+ 
+-              local->hw_scan_req = kmalloc(
+-                              sizeof(*local->hw_scan_req) +
+-                              req->n_channels * sizeof(req->channels[0]) +
+-                              local->hw_scan_ies_bufsize, GFP_KERNEL);
++              local->hw_scan_req = kmalloc(struct_size(local->hw_scan_req,
++                                                       req.channels,
++                                                       req->n_channels) +
++                                           local->hw_scan_ies_bufsize,
++                                           GFP_KERNEL);
+               if (!local->hw_scan_req)
+                       return -ENOMEM;
+ 
+               local->hw_scan_req->req.ssids = req->ssids;
+               local->hw_scan_req->req.n_ssids = req->n_ssids;
++              /* None of the channels are actually set
++               * up but let UBSAN know the boundaries.
++               */
++              local->hw_scan_req->req.n_channels = req->n_channels;
++
+               ies = (u8 *)local->hw_scan_req +
+                       sizeof(*local->hw_scan_req) +
+                       req->n_channels * sizeof(req->channels[0]);
+diff --git a/net/mac802154/tx.c b/net/mac802154/tx.c
+index c829e4a753256..7cea95d0b78f9 100644
+--- a/net/mac802154/tx.c
++++ b/net/mac802154/tx.c
+@@ -34,8 +34,8 @@ void ieee802154_xmit_worker(struct work_struct *work)
+       if (res)
+               goto err_tx;
+ 
+-      dev->stats.tx_packets++;
+-      dev->stats.tx_bytes += skb->len;
++      DEV_STATS_INC(dev, tx_packets);
++      DEV_STATS_ADD(dev, tx_bytes, skb->len);
+ 
+       ieee802154_xmit_complete(&local->hw, skb, false);
+ 
+@@ -86,8 +86,8 @@ ieee802154_tx(struct ieee802154_local *local, struct sk_buff 
*skb)
+                       goto err_tx;
+               }
+ 
+-              dev->stats.tx_packets++;
+-              dev->stats.tx_bytes += len;
++              DEV_STATS_INC(dev, tx_packets);
++              DEV_STATS_ADD(dev, tx_bytes, len);
+       } else {
+               local->tx_skb = skb;
+               queue_work(local->workqueue, &local->tx_work);
+diff --git a/net/wireless/scan.c b/net/wireless/scan.c
+index a1c53d4b6711b..c74882e3c3096 100644
+--- a/net/wireless/scan.c
++++ b/net/wireless/scan.c
+@@ -2212,10 +2212,14 @@ int cfg80211_wext_siwscan(struct net_device *dev,
+       wiphy = &rdev->wiphy;
+ 
+       /* Determine number of channels, needed to allocate creq */
+-      if (wreq && wreq->num_channels)
++      if (wreq && wreq->num_channels) {
++              /* Passed from userspace so should be checked */
++              if (unlikely(wreq->num_channels > IW_MAX_FREQUENCIES))
++                      return -EINVAL;
+               n_channels = wreq->num_channels;
+-      else
++      } else {
+               n_channels = ieee80211_get_num_supported_channels(wiphy);
++      }
+ 
+       creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
+                      n_channels * sizeof(void *),
+diff --git a/scripts/gcc-plugins/gcc-common.h 
b/scripts/gcc-plugins/gcc-common.h
+index 9ad76b7f3f10e..0907ab19202a1 100644
+--- a/scripts/gcc-plugins/gcc-common.h
++++ b/scripts/gcc-plugins/gcc-common.h
+@@ -977,4 +977,8 @@ static inline void debug_gimple_stmt(const_gimple s)
+ #define SET_DECL_MODE(decl, mode)     DECL_MODE(decl) = (mode)
+ #endif
+ 
++#if BUILDING_GCC_VERSION >= 14000
++#define last_stmt(x)                  last_nondebug_stmt(x)
++#endif
++
+ #endif
+diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
+index 9f1de58e9f0c9..9e409418534b8 100644
+--- a/scripts/kconfig/expr.c
++++ b/scripts/kconfig/expr.c
+@@ -397,35 +397,6 @@ static struct expr *expr_eliminate_yn(struct expr *e)
+       return e;
+ }
+ 
+-/*
+- * bool FOO!=n => FOO
+- */
+-struct expr *expr_trans_bool(struct expr *e)
+-{
+-      if (!e)
+-              return NULL;
+-      switch (e->type) {
+-      case E_AND:
+-      case E_OR:
+-      case E_NOT:
+-              e->left.expr = expr_trans_bool(e->left.expr);
+-              e->right.expr = expr_trans_bool(e->right.expr);
+-              break;
+-      case E_UNEQUAL:
+-              // FOO!=n -> FOO
+-              if (e->left.sym->type == S_TRISTATE) {
+-                      if (e->right.sym == &symbol_no) {
+-                              e->type = E_SYMBOL;
+-                              e->right.sym = NULL;
+-                      }
+-              }
+-              break;
+-      default:
+-              ;
+-      }
+-      return e;
+-}
+-
+ /*
+  * e1 || e2 -> ?
+  */
+diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
+index 017843c9a4f42..fbbd8ebe852a1 100644
+--- a/scripts/kconfig/expr.h
++++ b/scripts/kconfig/expr.h
+@@ -302,7 +302,6 @@ struct expr *expr_copy(const struct expr *org);
+ void expr_free(struct expr *e);
+ void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
+ tristate expr_calc_value(struct expr *e);
+-struct expr *expr_trans_bool(struct expr *e);
+ struct expr *expr_eliminate_dups(struct expr *e);
+ struct expr *expr_transform(struct expr *e);
+ int expr_contains_symbol(struct expr *dep, struct symbol *sym);
+diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
+index e36b342f1065b..9b10f1248da11 100644
+--- a/scripts/kconfig/gconf.c
++++ b/scripts/kconfig/gconf.c
+@@ -1483,7 +1483,6 @@ int main(int ac, char *av[])
+ 
+       conf_parse(name);
+       fixup_rootmenu(&rootmenu);
+-      conf_read(NULL);
+ 
+       /* Load the interface and connect signals */
+       init_main_window(glade_file);
+@@ -1491,6 +1490,8 @@ int main(int ac, char *av[])
+       init_left_tree();
+       init_right_tree();
+ 
++      conf_read(NULL);
++
+       switch (view_mode) {
+       case SINGLE_VIEW:
+               display_tree_part();
+diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
+index d9d16469859ab..2c95e8a7ef165 100644
+--- a/scripts/kconfig/menu.c
++++ b/scripts/kconfig/menu.c
+@@ -387,8 +387,6 @@ void menu_finalize(struct menu *parent)
+                               dep = expr_transform(dep);
+                               dep = expr_alloc_and(expr_copy(basedep), dep);
+                               dep = expr_eliminate_dups(dep);
+-                              if (menu->sym && menu->sym->type != S_TRISTATE)
+-                                      dep = expr_trans_bool(dep);
+                               prop->visible.expr = dep;
+ 
+                               /*
+diff --git a/sound/core/pcm_dmaengine.c b/sound/core/pcm_dmaengine.c
+index 5d9a24ca6f3ec..6c0d0a43baa11 100644
+--- a/sound/core/pcm_dmaengine.c
++++ b/sound/core/pcm_dmaengine.c
+@@ -345,6 +345,12 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);
+ int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
+ {
+       struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
++      struct dma_tx_state state;
++      enum dma_status status;
++
++      status = dmaengine_tx_status(prtd->dma_chan, prtd->cookie, &state);
++      if (status == DMA_PAUSED)
++              dmaengine_terminate_async(prtd->dma_chan);
+ 
+       dmaengine_synchronize(prtd->dma_chan);
+       kfree(prtd);
+@@ -362,6 +368,12 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close);
+ int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream)
+ {
+       struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
++      struct dma_tx_state state;
++      enum dma_status status;
++
++      status = dmaengine_tx_status(prtd->dma_chan, prtd->cookie, &state);
++      if (status == DMA_PAUSED)
++              dmaengine_terminate_async(prtd->dma_chan);
+ 
+       dmaengine_synchronize(prtd->dma_chan);
+       dma_release_channel(prtd->dma_chan);
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 8a411a6fe0b7c..77034c31fa120 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -520,10 +520,14 @@ static void alc_shutup_pins(struct hda_codec *codec)
+       switch (codec->core.vendor_id) {
+       case 0x10ec0236:
+       case 0x10ec0256:
++      case 0x10ec0257:
+       case 0x19e58326:
+       case 0x10ec0283:
++      case 0x10ec0285:
+       case 0x10ec0286:
++      case 0x10ec0287:
+       case 0x10ec0288:
++      case 0x10ec0295:
+       case 0x10ec0298:
+               alc_headset_mic_no_shutup(codec);
+               break;
+@@ -8331,6 +8335,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", 
ALC269_FIXUP_LIFEBOOK_EXTMIC),
+       SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", 
ALC700_FIXUP_INTEL_REFERENCE),
+       SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", 
ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
++      SND_PCI_QUIRK(0x10ec, 0x119e, "Positivo SU C1400", 
ALC269_FIXUP_ASPIRE_HEADSET_MIC),
+       SND_PCI_QUIRK(0x10ec, 0x11bc, "VAIO VJFE-IL", 
ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
+       SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", 
ALC295_FIXUP_CHROME_BOOK),
+       SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", 
ALC295_FIXUP_CHROME_BOOK),
+diff --git a/sound/soc/intel/boards/bytcr_rt5640.c 
b/sound/soc/intel/boards/bytcr_rt5640.c
+index c740dec00f83b..057ecfe2c8b5c 100644
+--- a/sound/soc/intel/boards/bytcr_rt5640.c
++++ b/sound/soc/intel/boards/bytcr_rt5640.c
+@@ -465,6 +465,17 @@ static const struct dmi_system_id 
byt_rt5640_quirk_table[] = {
+                                       BYT_RT5640_SSP0_AIF1 |
+                                       BYT_RT5640_MCLK_EN),
+       },
++      {
++              .matches = {
++                      DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ARCHOS"),
++                      DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ARCHOS 101 CESIUM"),
++              },
++              .driver_data = (void *)(BYTCR_INPUT_DEFAULTS |
++                                      BYT_RT5640_JD_NOT_INV |
++                                      BYT_RT5640_DIFF_MIC |
++                                      BYT_RT5640_SSP0_AIF1 |
++                                      BYT_RT5640_MCLK_EN),
++      },
+       {
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ARCHOS"),
+diff --git a/sound/soc/ti/davinci-mcasp.c b/sound/soc/ti/davinci-mcasp.c
+index dc40b5c5d501e..b7a0806772027 100644
+--- a/sound/soc/ti/davinci-mcasp.c
++++ b/sound/soc/ti/davinci-mcasp.c
+@@ -1422,10 +1422,11 @@ static int davinci_mcasp_hw_rule_min_periodsize(
+ {
+       struct snd_interval *period_size = hw_param_interval(params,
+                                               SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
++      u8 numevt = *((u8 *)rule->private);
+       struct snd_interval frames;
+ 
+       snd_interval_any(&frames);
+-      frames.min = 64;
++      frames.min = numevt;
+       frames.integer = 1;
+ 
+       return snd_interval_refine(period_size, &frames);
+@@ -1440,6 +1441,7 @@ static int davinci_mcasp_startup(struct 
snd_pcm_substream *substream,
+       u32 max_channels = 0;
+       int i, dir, ret;
+       int tdm_slots = mcasp->tdm_slots;
++      u8 *numevt;
+ 
+       /* Do not allow more then one stream per direction */
+       if (mcasp->substreams[substream->stream])
+@@ -1539,9 +1541,12 @@ static int davinci_mcasp_startup(struct 
snd_pcm_substream *substream,
+                       return ret;
+       }
+ 
++      numevt = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
++                       &mcasp->txnumevt :
++                       &mcasp->rxnumevt;
+       snd_pcm_hw_rule_add(substream->runtime, 0,
+                           SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
+-                          davinci_mcasp_hw_rule_min_periodsize, NULL,
++                          davinci_mcasp_hw_rule_min_periodsize, numevt,
+                           SNDRV_PCM_HW_PARAM_PERIOD_SIZE, -1);
+ 
+       return 0;
+diff --git a/sound/soc/ti/omap-hdmi.c b/sound/soc/ti/omap-hdmi.c
+index def2a0ce88863..e4f661c5349ef 100644
+--- a/sound/soc/ti/omap-hdmi.c
++++ b/sound/soc/ti/omap-hdmi.c
+@@ -353,11 +353,7 @@ static int omap_hdmi_audio_probe(struct platform_device 
*pdev)
+       if (!card)
+               return -ENOMEM;
+ 
+-      card->name = devm_kasprintf(dev, GFP_KERNEL,
+-                                  "HDMI %s", dev_name(ad->dssdev));
+-      if (!card->name)
+-              return -ENOMEM;
+-
++      card->name = "HDMI";
+       card->owner = THIS_MODULE;
+       card->dai_link =
+               devm_kzalloc(dev, sizeof(*(card->dai_link)), GFP_KERNEL);
+diff --git a/tools/testing/selftests/vDSO/parse_vdso.c 
b/tools/testing/selftests/vDSO/parse_vdso.c
+index 1dbb4b87268fa..9ef3ad3789c17 100644
+--- a/tools/testing/selftests/vDSO/parse_vdso.c
++++ b/tools/testing/selftests/vDSO/parse_vdso.c
+@@ -77,14 +77,20 @@ static struct vdso_info
+       ELF(Verdef) *verdef;
+ } vdso_info;
+ 
+-/* Straight from the ELF specification. */
+-static unsigned long elf_hash(const unsigned char *name)
++/*
++ * Straight from the ELF specification...and then tweaked slightly, in order 
to
++ * avoid a few clang warnings.
++ */
++static unsigned long elf_hash(const char *name)
+ {
+       unsigned long h = 0, g;
+-      while (*name)
++      const unsigned char *uch_name = (const unsigned char *)name;
++
++      while (*uch_name)
+       {
+-              h = (h << 4) + *name++;
+-              if (g = h & 0xf0000000)
++              h = (h << 4) + *uch_name++;
++              g = h & 0xf0000000;
++              if (g)
+                       h ^= g >> 24;
+               h &= ~g;
+       }
+diff --git a/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c 
b/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c
+index 5ac4b00acfbcd..64c369fa43893 100644
+--- a/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c
++++ b/tools/testing/selftests/vDSO/vdso_standalone_test_x86.c
+@@ -20,7 +20,7 @@ extern void *vdso_sym(const char *version, const char *name);
+ extern void vdso_init_from_sysinfo_ehdr(uintptr_t base);
+ extern void vdso_init_from_auxv(void *auxv);
+ 
+-/* We need a libc functions... */
++/* We need some libc functions... */
+ int strcmp(const char *a, const char *b)
+ {
+       /* This implementation is buggy: it never returns -1. */
+@@ -36,6 +36,20 @@ int strcmp(const char *a, const char *b)
+       return 0;
+ }
+ 
++/*
++ * The clang build needs this, although gcc does not.
++ * Stolen from lib/string.c.
++ */
++void *memcpy(void *dest, const void *src, size_t count)
++{
++      char *tmp = dest;
++      const char *s = src;
++
++      while (count--)
++              *tmp++ = *s++;
++      return dest;
++}
++
+ /* ...and two syscalls.  This is x86-specific. */
+ static inline long x86_syscall3(long nr, long a0, long a1, long a2)
+ {
+@@ -72,7 +86,7 @@ void to_base10(char *lastdig, time_t n)
+       }
+ }
+ 
+-__attribute__((externally_visible)) void c_main(void **stack)
++void c_main(void **stack)
+ {
+       /* Parse the stack */
+       long argc = (long)*stack;


Reply via email to