commit:     af8bb58a584bb9c4e0fa3ea2027adb2f9f9a0244
Author:     Arisu Tachibana <alicef <AT> gentoo <DOT> org>
AuthorDate: Thu Sep  4 14:31:14 2025 +0000
Commit:     Arisu Tachibana <alicef <AT> gentoo <DOT> org>
CommitDate: Thu Sep  4 14:31:14 2025 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=af8bb58a

Linux patch 6.1.150

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

 0000_README              |    4 +
 1149_linux-6.1.150.patch | 2165 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2169 insertions(+)

diff --git a/0000_README b/0000_README
index fedc7000..87859a6b 100644
--- a/0000_README
+++ b/0000_README
@@ -639,6 +639,10 @@ Patch:  1148_linux-6.1.149.patch
 From:   https://www.kernel.org
 Desc:   Linux 6.1.149
 
+Patch:  1149_linux-6.1.150.patch
+From:   https://www.kernel.org
+Desc:   Linux 6.1.150
+
 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/1149_linux-6.1.150.patch b/1149_linux-6.1.150.patch
new file mode 100644
index 00000000..2f1a1584
--- /dev/null
+++ b/1149_linux-6.1.150.patch
@@ -0,0 +1,2165 @@
+diff --git a/Makefile b/Makefile
+index 18a7ced92ff8af..e1704e10c65477 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 1
+-SUBLEVEL = 149
++SUBLEVEL = 150
+ EXTRAVERSION =
+ NAME = Curry Ramen
+ 
+diff --git a/arch/mips/boot/dts/lantiq/danube_easy50712.dts 
b/arch/mips/boot/dts/lantiq/danube_easy50712.dts
+index 1ce20b7d05cb8c..c4d7aa5753b043 100644
+--- a/arch/mips/boot/dts/lantiq/danube_easy50712.dts
++++ b/arch/mips/boot/dts/lantiq/danube_easy50712.dts
+@@ -82,13 +82,16 @@ conf_out {
+                       };
+               };
+ 
+-              etop@e180000 {
++              ethernet@e180000 {
+                       compatible = "lantiq,etop-xway";
+                       reg = <0xe180000 0x40000>;
+                       interrupt-parent = <&icu0>;
+                       interrupts = <73 78>;
++                      interrupt-names = "tx", "rx";
+                       phy-mode = "rmii";
+                       mac-address = [ 00 11 22 33 44 55 ];
++                      lantiq,rx-burst-length = <4>;
++                      lantiq,tx-burst-length = <4>;
+               };
+ 
+               stp0: stp@e100bb0 {
+diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c
+index d444a1b98a724d..edf914393ad962 100644
+--- a/arch/mips/lantiq/xway/sysctrl.c
++++ b/arch/mips/lantiq/xway/sysctrl.c
+@@ -479,7 +479,7 @@ void __init ltq_soc_init(void)
+               ifccr = CGU_IFCCR_VR9;
+               pcicr = CGU_PCICR_VR9;
+       } else {
+-              clkdev_add_pmu("1e180000.etop", NULL, 1, 0, PMU_PPE);
++              clkdev_add_pmu("1e180000.ethernet", NULL, 1, 0, PMU_PPE);
+       }
+ 
+       if (!of_machine_is_compatible("lantiq,ase"))
+@@ -513,9 +513,9 @@ void __init ltq_soc_init(void)
+                                               CLOCK_133M, CLOCK_133M);
+               clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0);
+               clkdev_add_pmu("1f203018.usb2-phy", "phy", 1, 0, PMU_USB0_P);
+-              clkdev_add_pmu("1e180000.etop", "ppe", 1, 0, PMU_PPE);
+-              clkdev_add_cgu("1e180000.etop", "ephycgu", CGU_EPHY);
+-              clkdev_add_pmu("1e180000.etop", "ephy", 1, 0, PMU_EPHY);
++              clkdev_add_pmu("1e180000.ethernet", "ppe", 1, 0, PMU_PPE);
++              clkdev_add_cgu("1e180000.ethernet", "ephycgu", CGU_EPHY);
++              clkdev_add_pmu("1e180000.ethernet", "ephy", 1, 0, PMU_EPHY);
+               clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_ASE_SDIO);
+               clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
+       } else if (of_machine_is_compatible("lantiq,grx390")) {
+@@ -574,7 +574,7 @@ void __init ltq_soc_init(void)
+               clkdev_add_pmu("1e101000.usb", "otg", 1, 0, PMU_USB0 | 
PMU_AHBM);
+               clkdev_add_pmu("1f203034.usb2-phy", "phy", 1, 0, PMU_USB1_P);
+               clkdev_add_pmu("1e106000.usb", "otg", 1, 0, PMU_USB1 | 
PMU_AHBM);
+-              clkdev_add_pmu("1e180000.etop", "switch", 1, 0, PMU_SWITCH);
++              clkdev_add_pmu("1e180000.ethernet", "switch", 1, 0, PMU_SWITCH);
+               clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO);
+               clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU);
+               clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
+diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c
+index 5b3c093611baf1..7209d00a9c2576 100644
+--- a/arch/powerpc/kernel/kvm.c
++++ b/arch/powerpc/kernel/kvm.c
+@@ -632,19 +632,19 @@ static void __init kvm_check_ins(u32 *inst, u32 features)
+ #endif
+       }
+ 
+-      switch (inst_no_rt & ~KVM_MASK_RB) {
+ #ifdef CONFIG_PPC_BOOK3S_32
++      switch (inst_no_rt & ~KVM_MASK_RB) {
+       case KVM_INST_MTSRIN:
+               if (features & KVM_MAGIC_FEAT_SR) {
+                       u32 inst_rb = _inst & KVM_MASK_RB;
+                       kvm_patch_ins_mtsrin(inst, inst_rt, inst_rb);
+               }
+               break;
+-#endif
+       }
++#endif
+ 
+-      switch (_inst) {
+ #ifdef CONFIG_BOOKE
++      switch (_inst) {
+       case KVM_INST_WRTEEI_0:
+               kvm_patch_ins_wrteei_0(inst);
+               break;
+@@ -652,8 +652,8 @@ static void __init kvm_check_ins(u32 *inst, u32 features)
+       case KVM_INST_WRTEEI_1:
+               kvm_patch_ins_wrtee(inst, 0, 1);
+               break;
+-#endif
+       }
++#endif
+ }
+ 
+ extern u32 kvm_template_start[];
+diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
+index 9aae76b7441761..41d8474ce555d4 100644
+--- a/arch/x86/kvm/lapic.c
++++ b/arch/x86/kvm/lapic.c
+@@ -684,6 +684,8 @@ static int __pv_send_ipi(unsigned long *ipi_bitmap, struct 
kvm_apic_map *map,
+       if (min > map->max_apic_id)
+               return 0;
+ 
++      min = array_index_nospec(min, map->max_apic_id + 1);
++
+       for_each_set_bit(i, ipi_bitmap,
+               min((u32)BITS_PER_LONG, (map->max_apic_id - min + 1))) {
+               if (map->phys_map[min + i]) {
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index f542ab5e86981f..57ba9071841ea3 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -9681,8 +9681,11 @@ static void kvm_sched_yield(struct kvm_vcpu *vcpu, 
unsigned long dest_id)
+       rcu_read_lock();
+       map = rcu_dereference(vcpu->kvm->arch.apic_map);
+ 
+-      if (likely(map) && dest_id <= map->max_apic_id && 
map->phys_map[dest_id])
+-              target = map->phys_map[dest_id]->vcpu;
++      if (likely(map) && dest_id <= map->max_apic_id) {
++              dest_id = array_index_nospec(dest_id, map->max_apic_id + 1);
++              if (map->phys_map[dest_id])
++                      target = map->phys_map[dest_id]->vcpu;
++      }
+ 
+       rcu_read_unlock();
+ 
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 57769873909074..15148513b050da 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -2288,6 +2288,12 @@ static const struct dmi_system_id acpi_ec_no_wakeup[] = 
{
+                       DMI_MATCH(DMI_PRODUCT_NAME, "83Q3"),
+               }
+       },
++      {
++              // TUXEDO InfinityBook Pro AMD Gen9
++              .matches = {
++                      DMI_MATCH(DMI_BOARD_NAME, "GXxHRXx"),
++              },
++      },
+       { },
+ };
+ 
+diff --git a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c
+index ff558908897f3e..9c83fb29b2f1b2 100644
+--- a/drivers/atm/atmtcp.c
++++ b/drivers/atm/atmtcp.c
+@@ -279,6 +279,19 @@ static struct atm_vcc *find_vcc(struct atm_dev *dev, 
short vpi, int vci)
+         return NULL;
+ }
+ 
++static int atmtcp_c_pre_send(struct atm_vcc *vcc, struct sk_buff *skb)
++{
++      struct atmtcp_hdr *hdr;
++
++      if (skb->len < sizeof(struct atmtcp_hdr))
++              return -EINVAL;
++
++      hdr = (struct atmtcp_hdr *)skb->data;
++      if (hdr->length == ATMTCP_HDR_MAGIC)
++              return -EINVAL;
++
++      return 0;
++}
+ 
+ static int atmtcp_c_send(struct atm_vcc *vcc,struct sk_buff *skb)
+ {
+@@ -288,9 +301,6 @@ static int atmtcp_c_send(struct atm_vcc *vcc,struct 
sk_buff *skb)
+       struct sk_buff *new_skb;
+       int result = 0;
+ 
+-      if (skb->len < sizeof(struct atmtcp_hdr))
+-              goto done;
+-
+       dev = vcc->dev_data;
+       hdr = (struct atmtcp_hdr *) skb->data;
+       if (hdr->length == ATMTCP_HDR_MAGIC) {
+@@ -347,6 +357,7 @@ static const struct atmdev_ops atmtcp_v_dev_ops = {
+ 
+ static const struct atmdev_ops atmtcp_c_dev_ops = {
+       .close          = atmtcp_c_close,
++      .pre_send       = atmtcp_c_pre_send,
+       .send           = atmtcp_c_send
+ };
+ 
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
+index 35e635c833f035..c6d4d41c4393e1 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
+@@ -93,8 +93,8 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct 
amdgpu_vm *vm,
+       }
+ 
+       r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size,
+-                           AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE 
|
+-                           AMDGPU_VM_PAGE_EXECUTABLE);
++                           AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE |
++                           AMDGPU_PTE_EXECUTABLE);
+ 
+       if (r) {
+               DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r);
+diff --git a/drivers/gpu/drm/display/drm_dp_helper.c 
b/drivers/gpu/drm/display/drm_dp_helper.c
+index ecb30e17d50c62..e839981c7b2f78 100644
+--- a/drivers/gpu/drm/display/drm_dp_helper.c
++++ b/drivers/gpu/drm/display/drm_dp_helper.c
+@@ -663,7 +663,7 @@ ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned 
int offset,
+        * monitor doesn't power down exactly after the throw away read.
+        */
+       if (!aux->is_remote) {
+-              ret = drm_dp_dpcd_probe(aux, DP_LANE0_1_STATUS);
++              ret = drm_dp_dpcd_probe(aux, DP_DPCD_REV);
+               if (ret < 0)
+                       return ret;
+       }
+diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c 
b/drivers/gpu/drm/msm/msm_gem_submit.c
+index 572dd662e80957..6a02f790624a90 100644
+--- a/drivers/gpu/drm/msm/msm_gem_submit.c
++++ b/drivers/gpu/drm/msm/msm_gem_submit.c
+@@ -929,12 +929,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void 
*data,
+ 
+       if (ret == 0 && args->flags & MSM_SUBMIT_FENCE_FD_OUT) {
+               sync_file = sync_file_create(submit->user_fence);
+-              if (!sync_file) {
++              if (!sync_file)
+                       ret = -ENOMEM;
+-              } else {
+-                      fd_install(out_fence_fd, sync_file->file);
+-                      args->fence_fd = out_fence_fd;
+-              }
+       }
+ 
+       submit_attach_object_fences(submit);
+@@ -959,10 +955,14 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void 
*data,
+ out_unlock:
+       mutex_unlock(&queue->lock);
+ out_post_unlock:
+-      if (ret && (out_fence_fd >= 0)) {
+-              put_unused_fd(out_fence_fd);
++      if (ret) {
++              if (out_fence_fd >= 0)
++                      put_unused_fd(out_fence_fd);
+               if (sync_file)
+                       fput(sync_file->file);
++      } else if (sync_file) {
++              fd_install(out_fence_fd, sync_file->file);
++              args->fence_fd = out_fence_fd;
+       }
+ 
+       if (!IS_ERR_OR_NULL(submit)) {
+diff --git a/drivers/gpu/drm/nouveau/dispnv50/wndw.c 
b/drivers/gpu/drm/nouveau/dispnv50/wndw.c
+index 7a2cceaee6e97f..1199dfc1194c80 100644
+--- a/drivers/gpu/drm/nouveau/dispnv50/wndw.c
++++ b/drivers/gpu/drm/nouveau/dispnv50/wndw.c
+@@ -663,6 +663,10 @@ static bool nv50_plane_format_mod_supported(struct 
drm_plane *plane,
+       struct nouveau_drm *drm = nouveau_drm(plane->dev);
+       uint8_t i;
+ 
++      /* All chipsets can display all formats in linear layout */
++      if (modifier == DRM_FORMAT_MOD_LINEAR)
++              return true;
++
+       if (drm->client.device.info.chipset < 0xc0) {
+               const struct drm_format_info *info = drm_format_info(format);
+               const uint8_t kind = (modifier >> 12) & 0xff;
+diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
+index 1015fc0b40cb11..ff301fd25725a4 100644
+--- a/drivers/hid/hid-asus.c
++++ b/drivers/hid/hid-asus.c
+@@ -1117,7 +1117,13 @@ static int asus_probe(struct hid_device *hdev, const 
struct hid_device_id *id)
+               return ret;
+       }
+ 
+-      if (!drvdata->input) {
++      /*
++       * Check that input registration succeeded. Checking that
++       * HID_CLAIMED_INPUT is set prevents a UAF when all input devices
++       * were freed during registration due to no usages being mapped,
++       * leaving drvdata->input pointing to freed memory.
++       */
++      if (!drvdata->input || !(hdev->claimed & HID_CLAIMED_INPUT)) {
+               hid_err(hdev, "Asus input not registered\n");
+               ret = -ENOMEM;
+               goto err_stop_hw;
+diff --git a/drivers/hid/hid-input-test.c b/drivers/hid/hid-input-test.c
+index 77c2d45ac62a7f..6f5c71660d823b 100644
+--- a/drivers/hid/hid-input-test.c
++++ b/drivers/hid/hid-input-test.c
+@@ -7,7 +7,7 @@
+ 
+ #include <kunit/test.h>
+ 
+-static void hid_test_input_set_battery_charge_status(struct kunit *test)
++static void hid_test_input_update_battery_charge_status(struct kunit *test)
+ {
+       struct hid_device *dev;
+       bool handled;
+@@ -15,15 +15,15 @@ static void 
hid_test_input_set_battery_charge_status(struct kunit *test)
+       dev = kunit_kzalloc(test, sizeof(*dev), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
+ 
+-      handled = hidinput_set_battery_charge_status(dev, HID_DG_HEIGHT, 0);
++      handled = hidinput_update_battery_charge_status(dev, HID_DG_HEIGHT, 0);
+       KUNIT_EXPECT_FALSE(test, handled);
+       KUNIT_EXPECT_EQ(test, dev->battery_charge_status, 
POWER_SUPPLY_STATUS_UNKNOWN);
+ 
+-      handled = hidinput_set_battery_charge_status(dev, HID_BAT_CHARGING, 0);
++      handled = hidinput_update_battery_charge_status(dev, HID_BAT_CHARGING, 
0);
+       KUNIT_EXPECT_TRUE(test, handled);
+       KUNIT_EXPECT_EQ(test, dev->battery_charge_status, 
POWER_SUPPLY_STATUS_DISCHARGING);
+ 
+-      handled = hidinput_set_battery_charge_status(dev, HID_BAT_CHARGING, 1);
++      handled = hidinput_update_battery_charge_status(dev, HID_BAT_CHARGING, 
1);
+       KUNIT_EXPECT_TRUE(test, handled);
+       KUNIT_EXPECT_EQ(test, dev->battery_charge_status, 
POWER_SUPPLY_STATUS_CHARGING);
+ }
+@@ -63,7 +63,7 @@ static void hid_test_input_get_battery_property(struct kunit 
*test)
+ }
+ 
+ static struct kunit_case hid_input_tests[] = {
+-      KUNIT_CASE(hid_test_input_set_battery_charge_status),
++      KUNIT_CASE(hid_test_input_update_battery_charge_status),
+       KUNIT_CASE(hid_test_input_get_battery_property),
+       { }
+ };
+diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
+index b0091819fd58a3..cd9d0318584381 100644
+--- a/drivers/hid/hid-input.c
++++ b/drivers/hid/hid-input.c
+@@ -609,13 +609,33 @@ static void hidinput_cleanup_battery(struct hid_device 
*dev)
+       dev->battery = NULL;
+ }
+ 
+-static void hidinput_update_battery(struct hid_device *dev, int value)
++static bool hidinput_update_battery_charge_status(struct hid_device *dev,
++                                                unsigned int usage, int value)
++{
++      switch (usage) {
++      case HID_BAT_CHARGING:
++              dev->battery_charge_status = value ?
++                                           POWER_SUPPLY_STATUS_CHARGING :
++                                           POWER_SUPPLY_STATUS_DISCHARGING;
++              return true;
++      }
++
++      return false;
++}
++
++static void hidinput_update_battery(struct hid_device *dev, unsigned int 
usage,
++                                  int value)
+ {
+       int capacity;
+ 
+       if (!dev->battery)
+               return;
+ 
++      if (hidinput_update_battery_charge_status(dev, usage, value)) {
++              power_supply_changed(dev->battery);
++              return;
++      }
++
+       if (value == 0 || value < dev->battery_min || value > dev->battery_max)
+               return;
+ 
+@@ -631,20 +651,6 @@ static void hidinput_update_battery(struct hid_device 
*dev, int value)
+               power_supply_changed(dev->battery);
+       }
+ }
+-
+-static bool hidinput_set_battery_charge_status(struct hid_device *dev,
+-                                             unsigned int usage, int value)
+-{
+-      switch (usage) {
+-      case HID_BAT_CHARGING:
+-              dev->battery_charge_status = value ?
+-                                           POWER_SUPPLY_STATUS_CHARGING :
+-                                           POWER_SUPPLY_STATUS_DISCHARGING;
+-              return true;
+-      }
+-
+-      return false;
+-}
+ #else  /* !CONFIG_HID_BATTERY_STRENGTH */
+ static int hidinput_setup_battery(struct hid_device *dev, unsigned 
report_type,
+                                 struct hid_field *field, bool is_percentage)
+@@ -656,14 +662,9 @@ static void hidinput_cleanup_battery(struct hid_device 
*dev)
+ {
+ }
+ 
+-static void hidinput_update_battery(struct hid_device *dev, int value)
+-{
+-}
+-
+-static bool hidinput_set_battery_charge_status(struct hid_device *dev,
+-                                             unsigned int usage, int value)
++static void hidinput_update_battery(struct hid_device *dev, unsigned int 
usage,
++                                  int value)
+ {
+-      return false;
+ }
+ #endif        /* CONFIG_HID_BATTERY_STRENGTH */
+ 
+@@ -1509,11 +1510,7 @@ void hidinput_hid_event(struct hid_device *hid, struct 
hid_field *field, struct
+               return;
+ 
+       if (usage->type == EV_PWR) {
+-              bool handled = hidinput_set_battery_charge_status(hid, 
usage->hid, value);
+-
+-              if (!handled)
+-                      hidinput_update_battery(hid, value);
+-
++              hidinput_update_battery(hid, usage->hid, value);
+               return;
+       }
+ 
+diff --git a/drivers/hid/hid-mcp2221.c b/drivers/hid/hid-mcp2221.c
+index b0dc0edc69c2fa..39d6c9724d81dc 100644
+--- a/drivers/hid/hid-mcp2221.c
++++ b/drivers/hid/hid-mcp2221.c
+@@ -44,6 +44,7 @@ enum {
+       MCP2221_I2C_MASK_ADDR_NACK = 0x40,
+       MCP2221_I2C_WRADDRL_SEND = 0x21,
+       MCP2221_I2C_ADDR_NACK = 0x25,
++      MCP2221_I2C_READ_PARTIAL = 0x54,
+       MCP2221_I2C_READ_COMPL = 0x55,
+       MCP2221_ALT_F_NOT_GPIOV = 0xEE,
+       MCP2221_ALT_F_NOT_GPIOD = 0xEF,
+@@ -169,6 +170,25 @@ static int mcp_cancel_last_cmd(struct mcp2221 *mcp)
+       return mcp_send_data_req_status(mcp, mcp->txbuf, 8);
+ }
+ 
++/* Check if the last command succeeded or failed and return the result.
++ * If the command did fail, cancel that command which will free the i2c bus.
++ */
++static int mcp_chk_last_cmd_status_free_bus(struct mcp2221 *mcp)
++{
++      int ret;
++
++      ret = mcp_chk_last_cmd_status(mcp);
++      if (ret) {
++              /* The last command was a failure.
++               * Send a cancel which will also free the bus.
++               */
++              usleep_range(980, 1000);
++              mcp_cancel_last_cmd(mcp);
++      }
++
++      return ret;
++}
++
+ static int mcp_set_i2c_speed(struct mcp2221 *mcp)
+ {
+       int ret;
+@@ -223,7 +243,7 @@ static int mcp_i2c_write(struct mcp2221 *mcp,
+               usleep_range(980, 1000);
+ 
+               if (last_status) {
+-                      ret = mcp_chk_last_cmd_status(mcp);
++                      ret = mcp_chk_last_cmd_status_free_bus(mcp);
+                       if (ret)
+                               return ret;
+               }
+@@ -260,6 +280,7 @@ static int mcp_i2c_smbus_read(struct mcp2221 *mcp,
+ {
+       int ret;
+       u16 total_len;
++      int retries = 0;
+ 
+       mcp->txbuf[0] = type;
+       if (msg) {
+@@ -283,20 +304,31 @@ static int mcp_i2c_smbus_read(struct mcp2221 *mcp,
+       mcp->rxbuf_idx = 0;
+ 
+       do {
++              /* Wait for the data to be read by the device */
++              usleep_range(980, 1000);
++
+               memset(mcp->txbuf, 0, 4);
+               mcp->txbuf[0] = MCP2221_I2C_GET_DATA;
+ 
+               ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
+-              if (ret)
+-                      return ret;
+-
+-              ret = mcp_chk_last_cmd_status(mcp);
+-              if (ret)
+-                      return ret;
+-
+-              usleep_range(980, 1000);
++              if (ret) {
++                      if (retries < 5) {
++                              /* The data wasn't ready to read.
++                               * Wait a bit longer and try again.
++                               */
++                              usleep_range(90, 100);
++                              retries++;
++                      } else {
++                              return ret;
++                      }
++              } else {
++                      retries = 0;
++              }
+       } while (mcp->rxbuf_idx < total_len);
+ 
++      usleep_range(980, 1000);
++      ret = mcp_chk_last_cmd_status_free_bus(mcp);
++
+       return ret;
+ }
+ 
+@@ -310,11 +342,6 @@ static int mcp_i2c_xfer(struct i2c_adapter *adapter,
+ 
+       mutex_lock(&mcp->lock);
+ 
+-      /* Setting speed before every transaction is required for mcp2221 */
+-      ret = mcp_set_i2c_speed(mcp);
+-      if (ret)
+-              goto exit;
+-
+       if (num == 1) {
+               if (msgs->flags & I2C_M_RD) {
+                       ret = mcp_i2c_smbus_read(mcp, msgs, MCP2221_I2C_RD_DATA,
+@@ -399,9 +426,7 @@ static int mcp_smbus_write(struct mcp2221 *mcp, u16 addr,
+       if (last_status) {
+               usleep_range(980, 1000);
+ 
+-              ret = mcp_chk_last_cmd_status(mcp);
+-              if (ret)
+-                      return ret;
++              ret = mcp_chk_last_cmd_status_free_bus(mcp);
+       }
+ 
+       return ret;
+@@ -419,10 +444,6 @@ static int mcp_smbus_xfer(struct i2c_adapter *adapter, 
u16 addr,
+ 
+       mutex_lock(&mcp->lock);
+ 
+-      ret = mcp_set_i2c_speed(mcp);
+-      if (ret)
+-              goto exit;
+-
+       switch (size) {
+ 
+       case I2C_SMBUS_QUICK:
+@@ -768,7 +789,8 @@ static int mcp2221_raw_event(struct hid_device *hdev,
+                               mcp->status = -EIO;
+                               break;
+                       }
+-                      if (data[2] == MCP2221_I2C_READ_COMPL) {
++                      if (data[2] == MCP2221_I2C_READ_COMPL ||
++                          data[2] == MCP2221_I2C_READ_PARTIAL) {
+                               buf = mcp->rxbuf;
+                               memcpy(&buf[mcp->rxbuf_idx], &data[4], data[3]);
+                               mcp->rxbuf_idx = mcp->rxbuf_idx + data[3];
+@@ -870,6 +892,11 @@ static int mcp2221_probe(struct hid_device *hdev,
+       if (i2c_clk_freq < 50)
+               i2c_clk_freq = 50;
+       mcp->cur_i2c_clk_div = (12000000 / (i2c_clk_freq * 1000)) - 3;
++      ret = mcp_set_i2c_speed(mcp);
++      if (ret) {
++              hid_err(hdev, "can't set i2c speed: %d\n", ret);
++              return ret;
++      }
+ 
+       mcp->adapter.owner = THIS_MODULE;
+       mcp->adapter.class = I2C_CLASS_HWMON;
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index becd4c1ccf93c1..a85581cd511fd3 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -1448,6 +1448,14 @@ static __u8 *mt_report_fixup(struct hid_device *hdev, 
__u8 *rdesc,
+       if (hdev->vendor == I2C_VENDOR_ID_GOODIX &&
+           (hdev->product == I2C_DEVICE_ID_GOODIX_01E8 ||
+            hdev->product == I2C_DEVICE_ID_GOODIX_01E9)) {
++              if (*size < 608) {
++                      dev_info(
++                              &hdev->dev,
++                              "GT7868Q fixup: report descriptor is only %u 
bytes, skipping\n",
++                              *size);
++                      return rdesc;
++              }
++
+               if (rdesc[607] == 0x15) {
+                       rdesc[607] = 0x25;
+                       dev_info(
+diff --git a/drivers/hid/hid-ntrig.c b/drivers/hid/hid-ntrig.c
+index b5d26f03fe6bb7..a1128c5315fffa 100644
+--- a/drivers/hid/hid-ntrig.c
++++ b/drivers/hid/hid-ntrig.c
+@@ -144,6 +144,9 @@ static void ntrig_report_version(struct hid_device *hdev)
+       struct usb_device *usb_dev = hid_to_usb_dev(hdev);
+       unsigned char *data = kmalloc(8, GFP_KERNEL);
+ 
++      if (!hid_is_usb(hdev))
++              return;
++
+       if (!data)
+               goto err_free;
+ 
+diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
+index ce54b8354a7d4e..3837394f29a0bf 100644
+--- a/drivers/hid/wacom_wac.c
++++ b/drivers/hid/wacom_wac.c
+@@ -679,6 +679,7 @@ static bool wacom_is_art_pen(int tool_id)
+       case 0x885:     /* Intuos3 Marker Pen */
+       case 0x804:     /* Intuos4/5 13HD/24HD Marker Pen */
+       case 0x10804:   /* Intuos4/5 13HD/24HD Art Pen */
++      case 0x204:     /* Art Pen 2 */
+               is_art_pen = true;
+               break;
+       }
+diff --git a/drivers/net/ethernet/dlink/dl2k.c 
b/drivers/net/ethernet/dlink/dl2k.c
+index dfc23cc173097f..2acb63b547c35a 100644
+--- a/drivers/net/ethernet/dlink/dl2k.c
++++ b/drivers/net/ethernet/dlink/dl2k.c
+@@ -1094,7 +1094,7 @@ get_stats (struct net_device *dev)
+       dev->stats.rx_bytes += dr32(OctetRcvOk);
+       dev->stats.tx_bytes += dr32(OctetXmtOk);
+ 
+-      dev->stats.multicast = dr32(McstFramesRcvdOk);
++      dev->stats.multicast += dr32(McstFramesRcvdOk);
+       dev->stats.collisions += dr32(SingleColFrames)
+                            +  dr32(MultiColFrames);
+ 
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c 
b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
+index 3749eb83d9e53e..64dcfac9ce724c 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
+@@ -108,7 +108,7 @@ static int mlx5_devlink_reload_fw_activate(struct devlink 
*devlink, struct netli
+       if (err)
+               return err;
+ 
+-      mlx5_unload_one_devl_locked(dev, true);
++      mlx5_unload_one_devl_locked(dev, false);
+       err = mlx5_health_wait_pci_up(dev);
+       if (err)
+               NL_SET_ERR_MSG_MOD(extack, "FW activate aborted, PCI reads fail 
after reset");
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
+index c9d5d8d93994d3..7899a7230299d9 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
+@@ -346,7 +346,6 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv 
*priv,
+               if (err)
+                       return err;
+       }
+-      priv->dcbx.xoff = xoff;
+ 
+       /* Apply the settings */
+       if (update_buffer) {
+@@ -355,6 +354,8 @@ int mlx5e_port_manual_buffer_config(struct mlx5e_priv 
*priv,
+                       return err;
+       }
+ 
++      priv->dcbx.xoff = xoff;
++
+       if (update_prio2buffer)
+               err = mlx5e_port_set_priority2buffer(priv->mdev, prio2buffer);
+ 
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h 
b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h
+index 80af7a5ac6046a..a23e3d810f3e44 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.h
+@@ -63,11 +63,23 @@ struct mlx5e_port_buffer {
+       struct mlx5e_bufferx_reg  buffer[MLX5E_MAX_BUFFER];
+ };
+ 
++#ifdef CONFIG_MLX5_CORE_EN_DCB
+ int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
+                                   u32 change, unsigned int mtu,
+                                   struct ieee_pfc *pfc,
+                                   u32 *buffer_size,
+                                   u8 *prio2buffer);
++#else
++static inline int
++mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
++                              u32 change, unsigned int mtu,
++                              void *pfc,
++                              u32 *buffer_size,
++                              u8 *prio2buffer)
++{
++      return 0;
++}
++#endif
+ 
+ int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
+                           struct mlx5e_port_buffer *port_buffer);
+diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+index 887d446354006d..ae3a7b96f79780 100644
+--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+@@ -42,6 +42,7 @@
+ #include "eswitch.h"
+ #include "en.h"
+ #include "en/txrx.h"
++#include "en/port_buffer.h"
+ #include "en_tc.h"
+ #include "en_rep.h"
+ #include "en_accel/ipsec.h"
+@@ -106,6 +107,8 @@ void mlx5e_update_carrier(struct mlx5e_priv *priv)
+       if (up) {
+               netdev_info(priv->netdev, "Link up\n");
+               netif_carrier_on(priv->netdev);
++              mlx5e_port_manual_buffer_config(priv, 0, priv->netdev->mtu,
++                                              NULL, NULL, NULL);
+       } else {
+               netdev_info(priv->netdev, "Link down\n");
+               netif_carrier_off(priv->netdev);
+@@ -2640,9 +2643,11 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
+       struct mlx5e_params *params = &priv->channels.params;
+       struct net_device *netdev = priv->netdev;
+       struct mlx5_core_dev *mdev = priv->mdev;
+-      u16 mtu;
++      u16 mtu, prev_mtu;
+       int err;
+ 
++      mlx5e_query_mtu(mdev, params, &prev_mtu);
++
+       err = mlx5e_set_mtu(mdev, params, params->sw_mtu);
+       if (err)
+               return err;
+@@ -2652,6 +2657,18 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
+               netdev_warn(netdev, "%s: VPort MTU %d is different than netdev 
mtu %d\n",
+                           __func__, mtu, params->sw_mtu);
+ 
++      if (mtu != prev_mtu && MLX5_BUFFER_SUPPORTED(mdev)) {
++              err = mlx5e_port_manual_buffer_config(priv, 0, mtu,
++                                                    NULL, NULL, NULL);
++              if (err) {
++                      netdev_warn(netdev, "%s: Failed to set Xon/Xoff values 
with MTU %d (err %d), setting back to previous MTU %d\n",
++                                  __func__, mtu, err, prev_mtu);
++
++                      mlx5e_set_mtu(mdev, params, prev_mtu);
++                      return err;
++              }
++      }
++
+       params->sw_mtu = mtu;
+       return 0;
+ }
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c 
b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c
+index 5e98355f422b39..3e4318d5dcdf5b 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c
+@@ -199,10 +199,6 @@ static void dwxgmac2_dma_rx_mode(void __iomem *ioaddr, 
int mode,
+       }
+ 
+       writel(value, ioaddr + XGMAC_MTL_RXQ_OPMODE(channel));
+-
+-      /* Enable MTL RX overflow */
+-      value = readl(ioaddr + XGMAC_MTL_QINTEN(channel));
+-      writel(value | XGMAC_RXOIE, ioaddr + XGMAC_MTL_QINTEN(channel));
+ }
+ 
+ static void dwxgmac2_dma_tx_mode(void __iomem *ioaddr, int mode,
+diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
+index 878298304430ca..fcfbff691b3c6b 100644
+--- a/drivers/net/phy/mscc/mscc.h
++++ b/drivers/net/phy/mscc/mscc.h
+@@ -474,6 +474,7 @@ static inline void vsc8584_config_macsec_intr(struct 
phy_device *phydev)
+ void vsc85xx_link_change_notify(struct phy_device *phydev);
+ void vsc8584_config_ts_intr(struct phy_device *phydev);
+ int vsc8584_ptp_init(struct phy_device *phydev);
++void vsc8584_ptp_deinit(struct phy_device *phydev);
+ int vsc8584_ptp_probe_once(struct phy_device *phydev);
+ int vsc8584_ptp_probe(struct phy_device *phydev);
+ irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev);
+@@ -488,6 +489,9 @@ static inline int vsc8584_ptp_init(struct phy_device 
*phydev)
+ {
+       return 0;
+ }
++static inline void vsc8584_ptp_deinit(struct phy_device *phydev)
++{
++}
+ static inline int vsc8584_ptp_probe_once(struct phy_device *phydev)
+ {
+       return 0;
+diff --git a/drivers/net/phy/mscc/mscc_main.c 
b/drivers/net/phy/mscc/mscc_main.c
+index 36734bb217e429..2fabb6a7d2415f 100644
+--- a/drivers/net/phy/mscc/mscc_main.c
++++ b/drivers/net/phy/mscc/mscc_main.c
+@@ -2326,9 +2326,7 @@ static int vsc85xx_probe(struct phy_device *phydev)
+ 
+ static void vsc85xx_remove(struct phy_device *phydev)
+ {
+-      struct vsc8531_private *priv = phydev->priv;
+-
+-      skb_queue_purge(&priv->rx_skbs_list);
++      vsc8584_ptp_deinit(phydev);
+ }
+ 
+ /* Microsemi VSC85xx PHYs */
+diff --git a/drivers/net/phy/mscc/mscc_ptp.c b/drivers/net/phy/mscc/mscc_ptp.c
+index add1a9ee721afa..1f6237705b44b7 100644
+--- a/drivers/net/phy/mscc/mscc_ptp.c
++++ b/drivers/net/phy/mscc/mscc_ptp.c
+@@ -1297,7 +1297,6 @@ static void vsc8584_set_input_clk_configured(struct 
phy_device *phydev)
+ 
+ static int __vsc8584_init_ptp(struct phy_device *phydev)
+ {
+-      struct vsc8531_private *vsc8531 = phydev->priv;
+       static const u32 ltc_seq_e[] = { 0, 400000, 0, 0, 0 };
+       static const u8  ltc_seq_a[] = { 8, 6, 5, 4, 2 };
+       u32 val;
+@@ -1514,17 +1513,7 @@ static int __vsc8584_init_ptp(struct phy_device *phydev)
+ 
+       vsc85xx_ts_eth_cmp1_sig(phydev);
+ 
+-      vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp;
+-      vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp;
+-      vsc8531->mii_ts.hwtstamp = vsc85xx_hwtstamp;
+-      vsc8531->mii_ts.ts_info  = vsc85xx_ts_info;
+-      phydev->mii_ts = &vsc8531->mii_ts;
+-
+-      memcpy(&vsc8531->ptp->caps, &vsc85xx_clk_caps, 
sizeof(vsc85xx_clk_caps));
+-
+-      vsc8531->ptp->ptp_clock = ptp_clock_register(&vsc8531->ptp->caps,
+-                                                   &phydev->mdio.dev);
+-      return PTR_ERR_OR_ZERO(vsc8531->ptp->ptp_clock);
++      return 0;
+ }
+ 
+ void vsc8584_config_ts_intr(struct phy_device *phydev)
+@@ -1551,6 +1540,16 @@ int vsc8584_ptp_init(struct phy_device *phydev)
+       return 0;
+ }
+ 
++void vsc8584_ptp_deinit(struct phy_device *phydev)
++{
++      struct vsc8531_private *vsc8531 = phydev->priv;
++
++      if (vsc8531->ptp->ptp_clock) {
++              ptp_clock_unregister(vsc8531->ptp->ptp_clock);
++              skb_queue_purge(&vsc8531->rx_skbs_list);
++      }
++}
++
+ irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev)
+ {
+       struct vsc8531_private *priv = phydev->priv;
+@@ -1608,7 +1607,16 @@ int vsc8584_ptp_probe(struct phy_device *phydev)
+ 
+       vsc8531->ptp->phydev = phydev;
+ 
+-      return 0;
++      vsc8531->mii_ts.rxtstamp = vsc85xx_rxtstamp;
++      vsc8531->mii_ts.txtstamp = vsc85xx_txtstamp;
++      vsc8531->mii_ts.hwtstamp = vsc85xx_hwtstamp;
++      vsc8531->mii_ts.ts_info  = vsc85xx_ts_info;
++      phydev->mii_ts = &vsc8531->mii_ts;
++
++      memcpy(&vsc8531->ptp->caps, &vsc85xx_clk_caps, 
sizeof(vsc85xx_clk_caps));
++      vsc8531->ptp->ptp_clock = ptp_clock_register(&vsc8531->ptp->caps,
++                                                   &phydev->mdio.dev);
++      return PTR_ERR_OR_ZERO(vsc8531->ptp->ptp_clock);
+ }
+ 
+ int vsc8584_ptp_probe_once(struct phy_device *phydev)
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 96656e56e809f9..28fd36234311a0 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1362,6 +1362,9 @@ static const struct usb_device_id products[] = {
+       {QMI_FIXED_INTF(0x2357, 0x0201, 4)},    /* TP-LINK HSUPA Modem MA180 */
+       {QMI_FIXED_INTF(0x2357, 0x9000, 4)},    /* TP-LINK MA260 */
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */
++      {QMI_QUIRK_SET_DTR(0x1bc7, 0x1034, 2)}, /* Telit LE910C4-WWX */
++      {QMI_QUIRK_SET_DTR(0x1bc7, 0x1037, 4)}, /* Telit LE910C4-WWX */
++      {QMI_QUIRK_SET_DTR(0x1bc7, 0x1038, 3)}, /* Telit LE910C4-WWX */
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */
+diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig
+index f71fefff400f5d..6d61be061ff547 100644
+--- a/drivers/pinctrl/Kconfig
++++ b/drivers/pinctrl/Kconfig
+@@ -438,6 +438,7 @@ config PINCTRL_STMFX
+       tristate "STMicroelectronics STMFX GPIO expander pinctrl driver"
+       depends on I2C
+       depends on OF_GPIO
++      depends on HAS_IOMEM
+       select GENERIC_PINCONF
+       select GPIOLIB_IRQCHIP
+       select MFD_STMFX
+diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
+index 1f531063d63312..456b92c3a78116 100644
+--- a/drivers/scsi/scsi_sysfs.c
++++ b/drivers/scsi/scsi_sysfs.c
+@@ -265,7 +265,7 @@ show_shost_supported_mode(struct device *dev, struct 
device_attribute *attr,
+       return show_shost_mode(supported_mode, buf);
+ }
+ 
+-static DEVICE_ATTR(supported_mode, S_IRUGO | S_IWUSR, 
show_shost_supported_mode, NULL);
++static DEVICE_ATTR(supported_mode, S_IRUGO, show_shost_supported_mode, NULL);
+ 
+ static ssize_t
+ show_shost_active_mode(struct device *dev,
+@@ -279,7 +279,7 @@ show_shost_active_mode(struct device *dev,
+               return show_shost_mode(shost->active_mode, buf);
+ }
+ 
+-static DEVICE_ATTR(active_mode, S_IRUGO | S_IWUSR, show_shost_active_mode, 
NULL);
++static DEVICE_ATTR(active_mode, S_IRUGO, show_shost_active_mode, NULL);
+ 
+ static int check_reset_type(const char *str)
+ {
+diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
+index 4418192ab8aaa8..2797cecc6c8be5 100644
+--- a/drivers/vhost/net.c
++++ b/drivers/vhost/net.c
+@@ -95,6 +95,7 @@ struct vhost_net_ubuf_ref {
+       atomic_t refcount;
+       wait_queue_head_t wait;
+       struct vhost_virtqueue *vq;
++      struct rcu_head rcu;
+ };
+ 
+ #define VHOST_NET_BATCH 64
+@@ -248,9 +249,13 @@ vhost_net_ubuf_alloc(struct vhost_virtqueue *vq, bool 
zcopy)
+ 
+ static int vhost_net_ubuf_put(struct vhost_net_ubuf_ref *ubufs)
+ {
+-      int r = atomic_sub_return(1, &ubufs->refcount);
++      int r;
++
++      rcu_read_lock();
++      r = atomic_sub_return(1, &ubufs->refcount);
+       if (unlikely(!r))
+               wake_up(&ubufs->wait);
++      rcu_read_unlock();
+       return r;
+ }
+ 
+@@ -263,7 +268,7 @@ static void vhost_net_ubuf_put_and_wait(struct 
vhost_net_ubuf_ref *ubufs)
+ static void vhost_net_ubuf_put_wait_and_free(struct vhost_net_ubuf_ref *ubufs)
+ {
+       vhost_net_ubuf_put_and_wait(ubufs);
+-      kfree(ubufs);
++      kfree_rcu(ubufs, rcu);
+ }
+ 
+ static void vhost_net_clear_ubuf_info(struct vhost_net *n)
+diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
+index b8c4641ed152b0..9025430cf2ad35 100644
+--- a/fs/efivarfs/super.c
++++ b/fs/efivarfs/super.c
+@@ -47,6 +47,10 @@ static int efivarfs_d_compare(const struct dentry *dentry,
+ {
+       int guid = len - EFI_VARIABLE_GUID_LEN;
+ 
++      /* Parallel lookups may produce a temporary invalid filename */
++      if (guid <= 0)
++              return 1;
++
+       if (name->len != len)
+               return 1;
+ 
+diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
+index 317cedfa52bf6d..6afa4195113e0d 100644
+--- a/fs/nfs/pagelist.c
++++ b/fs/nfs/pagelist.c
+@@ -167,83 +167,6 @@ nfs_page_group_lock_head(struct nfs_page *req)
+       return head;
+ }
+ 
+-/*
+- * nfs_unroll_locks -  unlock all newly locked reqs and wait on @req
+- * @head: head request of page group, must be holding head lock
+- * @req: request that couldn't lock and needs to wait on the req bit lock
+- *
+- * This is a helper function for nfs_lock_and_join_requests
+- * returns 0 on success, < 0 on error.
+- */
+-static void
+-nfs_unroll_locks(struct nfs_page *head, struct nfs_page *req)
+-{
+-      struct nfs_page *tmp;
+-
+-      /* relinquish all the locks successfully grabbed this run */
+-      for (tmp = head->wb_this_page ; tmp != req; tmp = tmp->wb_this_page) {
+-              if (!kref_read(&tmp->wb_kref))
+-                      continue;
+-              nfs_unlock_and_release_request(tmp);
+-      }
+-}
+-
+-/*
+- * nfs_page_group_lock_subreq -  try to lock a subrequest
+- * @head: head request of page group
+- * @subreq: request to lock
+- *
+- * This is a helper function for nfs_lock_and_join_requests which
+- * must be called with the head request and page group both locked.
+- * On error, it returns with the page group unlocked.
+- */
+-static int
+-nfs_page_group_lock_subreq(struct nfs_page *head, struct nfs_page *subreq)
+-{
+-      int ret;
+-
+-      if (!kref_get_unless_zero(&subreq->wb_kref))
+-              return 0;
+-      while (!nfs_lock_request(subreq)) {
+-              nfs_page_group_unlock(head);
+-              ret = nfs_wait_on_request(subreq);
+-              if (!ret)
+-                      ret = nfs_page_group_lock(head);
+-              if (ret < 0) {
+-                      nfs_unroll_locks(head, subreq);
+-                      nfs_release_request(subreq);
+-                      return ret;
+-              }
+-      }
+-      return 0;
+-}
+-
+-/*
+- * nfs_page_group_lock_subrequests -  try to lock the subrequests
+- * @head: head request of page group
+- *
+- * This is a helper function for nfs_lock_and_join_requests which
+- * must be called with the head request locked.
+- */
+-int nfs_page_group_lock_subrequests(struct nfs_page *head)
+-{
+-      struct nfs_page *subreq;
+-      int ret;
+-
+-      ret = nfs_page_group_lock(head);
+-      if (ret < 0)
+-              return ret;
+-      /* lock each request in the page group */
+-      for (subreq = head->wb_this_page; subreq != head;
+-                      subreq = subreq->wb_this_page) {
+-              ret = nfs_page_group_lock_subreq(head, subreq);
+-              if (ret < 0)
+-                      return ret;
+-      }
+-      nfs_page_group_unlock(head);
+-      return 0;
+-}
+-
+ /*
+  * nfs_page_set_headlock - set the request PG_HEADLOCK
+  * @req: request that is to be locked
+@@ -310,13 +233,14 @@ nfs_page_group_unlock(struct nfs_page *req)
+       nfs_page_clear_headlock(req);
+ }
+ 
+-/*
+- * nfs_page_group_sync_on_bit_locked
++/**
++ * nfs_page_group_sync_on_bit_locked - Test if all requests have @bit set
++ * @req: request in page group
++ * @bit: PG_* bit that is used to sync page group
+  *
+  * must be called with page group lock held
+  */
+-static bool
+-nfs_page_group_sync_on_bit_locked(struct nfs_page *req, unsigned int bit)
++bool nfs_page_group_sync_on_bit_locked(struct nfs_page *req, unsigned int bit)
+ {
+       struct nfs_page *head = req->wb_head;
+       struct nfs_page *tmp;
+diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+index 8e21caae4cae24..eb1fc33198be8d 100644
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -154,20 +154,10 @@ nfs_page_set_inode_ref(struct nfs_page *req, struct 
inode *inode)
+       }
+ }
+ 
+-static int
+-nfs_cancel_remove_inode(struct nfs_page *req, struct inode *inode)
++static void nfs_cancel_remove_inode(struct nfs_page *req, struct inode *inode)
+ {
+-      int ret;
+-
+-      if (!test_bit(PG_REMOVE, &req->wb_flags))
+-              return 0;
+-      ret = nfs_page_group_lock(req);
+-      if (ret)
+-              return ret;
+       if (test_and_clear_bit(PG_REMOVE, &req->wb_flags))
+               nfs_page_set_inode_ref(req, inode);
+-      nfs_page_group_unlock(req);
+-      return 0;
+ }
+ 
+ static struct nfs_page *
+@@ -239,36 +229,6 @@ static struct nfs_page *nfs_page_find_head_request(struct 
page *page)
+       return req;
+ }
+ 
+-static struct nfs_page *nfs_find_and_lock_page_request(struct page *page)
+-{
+-      struct inode *inode = page_file_mapping(page)->host;
+-      struct nfs_page *req, *head;
+-      int ret;
+-
+-      for (;;) {
+-              req = nfs_page_find_head_request(page);
+-              if (!req)
+-                      return req;
+-              head = nfs_page_group_lock_head(req);
+-              if (head != req)
+-                      nfs_release_request(req);
+-              if (IS_ERR(head))
+-                      return head;
+-              ret = nfs_cancel_remove_inode(head, inode);
+-              if (ret < 0) {
+-                      nfs_unlock_and_release_request(head);
+-                      return ERR_PTR(ret);
+-              }
+-              /* Ensure that nobody removed the request before we locked it */
+-              if (head == nfs_page_private_request(page))
+-                      break;
+-              if (PageSwapCache(page))
+-                      break;
+-              nfs_unlock_and_release_request(head);
+-      }
+-      return head;
+-}
+-
+ /* Adjust the file length if we're writing beyond the end */
+ static void nfs_grow_file(struct page *page, unsigned int offset, unsigned 
int count)
+ {
+@@ -547,6 +507,57 @@ nfs_join_page_group(struct nfs_page *head, struct inode 
*inode)
+       nfs_destroy_unlinked_subrequests(destroy_list, head, inode);
+ }
+ 
++/*
++ * nfs_unroll_locks -  unlock all newly locked reqs and wait on @req
++ * @head: head request of page group, must be holding head lock
++ * @req: request that couldn't lock and needs to wait on the req bit lock
++ *
++ * This is a helper function for nfs_lock_and_join_requests
++ * returns 0 on success, < 0 on error.
++ */
++static void
++nfs_unroll_locks(struct nfs_page *head, struct nfs_page *req)
++{
++      struct nfs_page *tmp;
++
++      /* relinquish all the locks successfully grabbed this run */
++      for (tmp = head->wb_this_page ; tmp != req; tmp = tmp->wb_this_page) {
++              if (!kref_read(&tmp->wb_kref))
++                      continue;
++              nfs_unlock_and_release_request(tmp);
++      }
++}
++
++/*
++ * nfs_page_group_lock_subreq -  try to lock a subrequest
++ * @head: head request of page group
++ * @subreq: request to lock
++ *
++ * This is a helper function for nfs_lock_and_join_requests which
++ * must be called with the head request and page group both locked.
++ * On error, it returns with the page group unlocked.
++ */
++static int
++nfs_page_group_lock_subreq(struct nfs_page *head, struct nfs_page *subreq)
++{
++      int ret;
++
++      if (!kref_get_unless_zero(&subreq->wb_kref))
++              return 0;
++      while (!nfs_lock_request(subreq)) {
++              nfs_page_group_unlock(head);
++              ret = nfs_wait_on_request(subreq);
++              if (!ret)
++                      ret = nfs_page_group_lock(head);
++              if (ret < 0) {
++                      nfs_unroll_locks(head, subreq);
++                      nfs_release_request(subreq);
++                      return ret;
++              }
++      }
++      return 0;
++}
++
+ /*
+  * nfs_lock_and_join_requests - join all subreqs to the head req
+  * @page: the page used to lookup the "page group" of nfs_page structures
+@@ -566,7 +577,7 @@ static struct nfs_page *
+ nfs_lock_and_join_requests(struct page *page)
+ {
+       struct inode *inode = page_file_mapping(page)->host;
+-      struct nfs_page *head;
++      struct nfs_page *head, *subreq;
+       int ret;
+ 
+       /*
+@@ -574,20 +585,49 @@ nfs_lock_and_join_requests(struct page *page)
+        * reference to the whole page group - the group will not be destroyed
+        * until the head reference is released.
+        */
+-      head = nfs_find_and_lock_page_request(page);
++retry:
++      head = nfs_page_find_head_request(page);
+       if (IS_ERR_OR_NULL(head))
+               return head;
+ 
+-      /* lock each request in the page group */
+-      ret = nfs_page_group_lock_subrequests(head);
+-      if (ret < 0) {
++      while (!nfs_lock_request(head)) {
++              ret = nfs_wait_on_request(head);
++              if (ret < 0) {
++                      nfs_release_request(head);
++                      return ERR_PTR(ret);
++              }
++      }
++
++      ret = nfs_page_group_lock(head);
++      if (ret < 0)
++              goto out_unlock;
++
++      /* Ensure that nobody removed the request before we locked it */
++      if (head != nfs_page_private_request(page) && !PageSwapCache(page)) {
++              nfs_page_group_unlock(head);
+               nfs_unlock_and_release_request(head);
+-              return ERR_PTR(ret);
++              goto retry;
+       }
+ 
+-      nfs_join_page_group(head, inode);
++      nfs_cancel_remove_inode(head, inode);
+ 
++      /* lock each request in the page group */
++      for (subreq = head->wb_this_page;
++           subreq != head;
++           subreq = subreq->wb_this_page) {
++              ret = nfs_page_group_lock_subreq(head, subreq);
++              if (ret < 0)
++                      goto out_unlock;
++      }
++
++      nfs_page_group_unlock(head);
++
++      nfs_join_page_group(head, inode);
+       return head;
++
++out_unlock:
++      nfs_unlock_and_release_request(head);
++      return ERR_PTR(ret);
+ }
+ 
+ static void nfs_write_error(struct nfs_page *req, int error)
+@@ -791,7 +831,8 @@ static void nfs_inode_remove_request(struct nfs_page *req)
+       struct nfs_inode *nfsi = NFS_I(inode);
+       struct nfs_page *head;
+ 
+-      if (nfs_page_group_sync_on_bit(req, PG_REMOVE)) {
++      nfs_page_group_lock(req);
++      if (nfs_page_group_sync_on_bit_locked(req, PG_REMOVE)) {
+               head = req->wb_head;
+ 
+               spin_lock(&mapping->private_lock);
+@@ -802,6 +843,7 @@ static void nfs_inode_remove_request(struct nfs_page *req)
+               }
+               spin_unlock(&mapping->private_lock);
+       }
++      nfs_page_group_unlock(req);
+ 
+       if (test_and_clear_bit(PG_INODE_REF, &req->wb_flags)) {
+               nfs_release_request(req);
+diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c
+index 350a1519173e90..32b008bc99a09b 100644
+--- a/fs/smb/client/cifsfs.c
++++ b/fs/smb/client/cifsfs.c
+@@ -1363,6 +1363,20 @@ static loff_t cifs_remap_file_range(struct file 
*src_file, loff_t off,
+                       netfs_resize_file(&target_cifsi->netfs, new_size);
+                       fscache_resize_cookie(cifs_inode_cookie(target_inode),
+                                             new_size);
++              } else if (rc == -EOPNOTSUPP) {
++                      /*
++                       * copy_file_range syscall man page indicates EINVAL
++                       * is returned e.g when "fd_in and fd_out refer to the
++                       * same file and the source and target ranges overlap."
++                       * Test generic/157 was what showed these cases where
++                       * we need to remap EOPNOTSUPP to EINVAL
++                       */
++                      if (off >= src_inode->i_size) {
++                              rc = -EINVAL;
++                      } else if (src_inode == target_inode) {
++                              if (off + len > destoff)
++                                      rc = -EINVAL;
++                      }
+               }
+       }
+ 
+diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c
+index 634f28f0d331ea..f3ed5134ecfa9a 100644
+--- a/fs/smb/client/inode.c
++++ b/fs/smb/client/inode.c
+@@ -1649,15 +1649,24 @@ int cifs_unlink(struct inode *dir, struct dentry 
*dentry)
+       struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
+       struct tcon_link *tlink;
+       struct cifs_tcon *tcon;
++      __u32 dosattr = 0, origattr = 0;
+       struct TCP_Server_Info *server;
+       struct iattr *attrs = NULL;
+-      __u32 dosattr = 0, origattr = 0;
++      bool rehash = false;
+ 
+       cifs_dbg(FYI, "cifs_unlink, dir=0x%p, dentry=0x%p\n", dir, dentry);
+ 
+       if (unlikely(cifs_forced_shutdown(cifs_sb)))
+               return -EIO;
+ 
++      /* Unhash dentry in advance to prevent any concurrent opens */
++      spin_lock(&dentry->d_lock);
++      if (!d_unhashed(dentry)) {
++              __d_drop(dentry);
++              rehash = true;
++      }
++      spin_unlock(&dentry->d_lock);
++
+       tlink = cifs_sb_tlink(cifs_sb);
+       if (IS_ERR(tlink))
+               return PTR_ERR(tlink);
+@@ -1706,7 +1715,8 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)
+               if (inode)
+                       cifs_drop_nlink(inode);
+       } else if (rc == -ENOENT) {
+-              d_drop(dentry);
++              if (simple_positive(dentry))
++                      d_delete(dentry);
+       } else if (rc == -EBUSY) {
+               if (server->ops->rename_pending_delete) {
+                       rc = server->ops->rename_pending_delete(full_path,
+@@ -1757,6 +1767,8 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry)
+       kfree(attrs);
+       free_xid(xid);
+       cifs_put_tlink(tlink);
++      if (rehash)
++              d_rehash(dentry);
+       return rc;
+ }
+ 
+@@ -2153,6 +2165,7 @@ cifs_rename2(struct user_namespace *mnt_userns, struct 
inode *source_dir,
+       struct cifs_sb_info *cifs_sb;
+       struct tcon_link *tlink;
+       struct cifs_tcon *tcon;
++      bool rehash = false;
+       unsigned int xid;
+       int rc, tmprc;
+       int retry_count = 0;
+@@ -2168,6 +2181,17 @@ cifs_rename2(struct user_namespace *mnt_userns, struct 
inode *source_dir,
+       if (unlikely(cifs_forced_shutdown(cifs_sb)))
+               return -EIO;
+ 
++      /*
++       * Prevent any concurrent opens on the target by unhashing the dentry.
++       * VFS already unhashes the target when renaming directories.
++       */
++      if (d_is_positive(target_dentry) && !d_is_dir(target_dentry)) {
++              if (!d_unhashed(target_dentry)) {
++                      d_drop(target_dentry);
++                      rehash = true;
++              }
++      }
++
+       tlink = cifs_sb_tlink(cifs_sb);
+       if (IS_ERR(tlink))
+               return PTR_ERR(tlink);
+@@ -2207,6 +2231,8 @@ cifs_rename2(struct user_namespace *mnt_userns, struct 
inode *source_dir,
+               }
+       }
+ 
++      if (!rc)
++              rehash = false;
+       /*
+        * No-replace is the natural behavior for CIFS, so skip unlink hacks.
+        */
+@@ -2265,6 +2291,8 @@ cifs_rename2(struct user_namespace *mnt_userns, struct 
inode *source_dir,
+                       goto cifs_rename_exit;
+               rc = cifs_do_rename(xid, source_dentry, from_name,
+                                   target_dentry, to_name);
++              if (!rc)
++                      rehash = false;
+       }
+ 
+       /* force revalidate to go get info when needed */
+@@ -2274,6 +2302,8 @@ cifs_rename2(struct user_namespace *mnt_userns, struct 
inode *source_dir,
+               target_dir->i_mtime = current_time(source_dir);
+ 
+ cifs_rename_exit:
++      if (rehash)
++              d_rehash(target_dentry);
+       kfree(info_buf_source);
+       free_dentry_path(page2);
+       free_dentry_path(page1);
+diff --git a/fs/smb/client/smb2inode.c b/fs/smb/client/smb2inode.c
+index 5ddc629e62168e..7d3685cd345fd8 100644
+--- a/fs/smb/client/smb2inode.c
++++ b/fs/smb/client/smb2inode.c
+@@ -81,8 +81,10 @@ static int smb2_compound_op(const unsigned int xid, struct 
cifs_tcon *tcon,
+       int len;
+ 
+       vars = kzalloc(sizeof(*vars), GFP_ATOMIC);
+-      if (vars == NULL)
+-              return -ENOMEM;
++      if (vars == NULL) {
++              rc = -ENOMEM;
++              goto out;
++      }
+       rqst = &vars->rqst[0];
+       rsp_iov = &vars->rsp_iov[0];
+ 
+@@ -510,6 +512,7 @@ static int smb2_compound_op(const unsigned int xid, struct 
cifs_tcon *tcon,
+               break;
+       }
+ 
++out:
+       if (cfile)
+               cifsFileInfo_put(cfile);
+ 
+diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c
+index 54de405cbab5ac..4d369876487bde 100644
+--- a/fs/xfs/libxfs/xfs_attr_remote.c
++++ b/fs/xfs/libxfs/xfs_attr_remote.c
+@@ -418,6 +418,13 @@ xfs_attr_rmtval_get(
+                       dblkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount);
+                       error = xfs_buf_read(mp->m_ddev_targp, dblkno, dblkcnt,
+                                       0, &bp, &xfs_attr3_rmt_buf_ops);
++                      /*
++                       * ENODATA from disk implies a disk medium failure;
++                       * ENODATA for xattrs means attribute not found, so
++                       * disambiguate that here.
++                       */
++                      if (error == -ENODATA)
++                              error = -EIO;
+                       if (error)
+                               return error;
+ 
+diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c
+index 12e3cca804b7ec..3ec681fdc075ba 100644
+--- a/fs/xfs/libxfs/xfs_da_btree.c
++++ b/fs/xfs/libxfs/xfs_da_btree.c
+@@ -2648,6 +2648,12 @@ xfs_da_read_buf(
+ 
+       error = xfs_trans_read_buf_map(mp, tp, mp->m_ddev_targp, mapp, nmap, 0,
+                       &bp, ops);
++      /*
++       * ENODATA from disk implies a disk medium failure; ENODATA for
++       * xattrs means attribute not found, so disambiguate that here.
++       */
++      if (error == -ENODATA && whichfork == XFS_ATTR_FORK)
++              error = -EIO;
+       if (error)
+               goto out_free;
+ 
+diff --git a/include/linux/atmdev.h b/include/linux/atmdev.h
+index 45f2f278b50a8a..70807c679f1abc 100644
+--- a/include/linux/atmdev.h
++++ b/include/linux/atmdev.h
+@@ -185,6 +185,7 @@ struct atmdev_ops { /* only send is required */
+       int (*compat_ioctl)(struct atm_dev *dev,unsigned int cmd,
+                           void __user *arg);
+ #endif
++      int (*pre_send)(struct atm_vcc *vcc, struct sk_buff *skb);
+       int (*send)(struct atm_vcc *vcc,struct sk_buff *skb);
+       int (*send_bh)(struct atm_vcc *vcc, struct sk_buff *skb);
+       int (*send_oam)(struct atm_vcc *vcc,void *cell,int flags);
+diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h
+index ba7e2e4b092645..cfda1108497ddb 100644
+--- a/include/linux/nfs_page.h
++++ b/include/linux/nfs_page.h
+@@ -144,11 +144,11 @@ extern  int nfs_wait_on_request(struct nfs_page *);
+ extern        void nfs_unlock_request(struct nfs_page *req);
+ extern        void nfs_unlock_and_release_request(struct nfs_page *);
+ extern        struct nfs_page *nfs_page_group_lock_head(struct nfs_page *req);
+-extern        int nfs_page_group_lock_subrequests(struct nfs_page *head);
+ extern        void nfs_join_page_group(struct nfs_page *head, struct inode 
*inode);
+ extern int nfs_page_group_lock(struct nfs_page *);
+ extern void nfs_page_group_unlock(struct nfs_page *);
+ extern bool nfs_page_group_sync_on_bit(struct nfs_page *, unsigned int);
++extern bool nfs_page_group_sync_on_bit_locked(struct nfs_page *, unsigned 
int);
+ extern        int nfs_page_set_headlock(struct nfs_page *req);
+ extern void nfs_page_clear_headlock(struct nfs_page *req);
+ extern bool nfs_async_iocounter_wait(struct rpc_task *, struct 
nfs_lock_context *);
+diff --git a/include/net/bluetooth/hci_sync.h 
b/include/net/bluetooth/hci_sync.h
+index 3a7658d660224e..a8b106d884d41d 100644
+--- a/include/net/bluetooth/hci_sync.h
++++ b/include/net/bluetooth/hci_sync.h
+@@ -65,7 +65,7 @@ int hci_update_class_sync(struct hci_dev *hdev);
+ 
+ int hci_update_eir_sync(struct hci_dev *hdev);
+ int hci_update_class_sync(struct hci_dev *hdev);
+-int hci_update_name_sync(struct hci_dev *hdev);
++int hci_update_name_sync(struct hci_dev *hdev, const u8 *name);
+ int hci_write_ssp_mode_sync(struct hci_dev *hdev, u8 mode);
+ 
+ int hci_get_random_address(struct hci_dev *hdev, bool require_privacy,
+diff --git a/include/net/rose.h b/include/net/rose.h
+index 23267b4efcfa32..2b5491bbf39ab5 100644
+--- a/include/net/rose.h
++++ b/include/net/rose.h
+@@ -8,6 +8,7 @@
+ #ifndef _ROSE_H
+ #define _ROSE_H 
+ 
++#include <linux/refcount.h>
+ #include <linux/rose.h>
+ #include <net/ax25.h>
+ #include <net/sock.h>
+@@ -96,7 +97,7 @@ struct rose_neigh {
+       ax25_cb                 *ax25;
+       struct net_device               *dev;
+       unsigned short          count;
+-      unsigned short          use;
++      refcount_t              use;
+       unsigned int            number;
+       char                    restarted;
+       char                    dce_mode;
+@@ -151,6 +152,21 @@ struct rose_sock {
+ 
+ #define rose_sk(sk) ((struct rose_sock *)(sk))
+ 
++static inline void rose_neigh_hold(struct rose_neigh *rose_neigh)
++{
++      refcount_inc(&rose_neigh->use);
++}
++
++static inline void rose_neigh_put(struct rose_neigh *rose_neigh)
++{
++      if (refcount_dec_and_test(&rose_neigh->use)) {
++              if (rose_neigh->ax25)
++                      ax25_cb_put(rose_neigh->ax25);
++              kfree(rose_neigh->digipeat);
++              kfree(rose_neigh);
++      }
++}
++
+ /* af_rose.c */
+ extern ax25_address rose_callsign;
+ extern int  sysctl_rose_restart_request_timeout;
+diff --git a/kernel/dma/pool.c b/kernel/dma/pool.c
+index 4d40dcce7604b3..37d3ddd36ae5b6 100644
+--- a/kernel/dma/pool.c
++++ b/kernel/dma/pool.c
+@@ -102,8 +102,8 @@ static int atomic_pool_expand(struct gen_pool *pool, 
size_t pool_size,
+ 
+ #ifdef CONFIG_DMA_DIRECT_REMAP
+       addr = dma_common_contiguous_remap(page, pool_size,
+-                                         pgprot_dmacoherent(PAGE_KERNEL),
+-                                         __builtin_return_address(0));
++                      pgprot_decrypted(pgprot_dmacoherent(PAGE_KERNEL)),
++                      __builtin_return_address(0));
+       if (!addr)
+               goto free_page;
+ #else
+diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
+index 874f869ae72e63..7e8ab09d98cc73 100644
+--- a/kernel/trace/trace.c
++++ b/kernel/trace/trace.c
+@@ -10183,10 +10183,10 @@ void ftrace_dump(enum ftrace_dump_mode 
oops_dump_mode)
+                       ret = print_trace_line(&iter);
+                       if (ret != TRACE_TYPE_NO_CONSUME)
+                               trace_consume(&iter);
++
++                      trace_printk_seq(&iter.seq);
+               }
+               touch_nmi_watchdog();
+-
+-              trace_printk_seq(&iter.seq);
+       }
+ 
+       if (!cnt)
+diff --git a/net/atm/common.c b/net/atm/common.c
+index 9cc82acbc73588..48bb3f66a3f2ab 100644
+--- a/net/atm/common.c
++++ b/net/atm/common.c
+@@ -635,18 +635,27 @@ int vcc_sendmsg(struct socket *sock, struct msghdr *m, 
size_t size)
+ 
+       skb->dev = NULL; /* for paths shared with net_device interfaces */
+       if (!copy_from_iter_full(skb_put(skb, size), size, &m->msg_iter)) {
+-              atm_return_tx(vcc, skb);
+-              kfree_skb(skb);
+               error = -EFAULT;
+-              goto out;
++              goto free_skb;
+       }
+       if (eff != size)
+               memset(skb->data + size, 0, eff-size);
++
++      if (vcc->dev->ops->pre_send) {
++              error = vcc->dev->ops->pre_send(vcc, skb);
++              if (error)
++                      goto free_skb;
++      }
++
+       error = vcc->dev->ops->send(vcc, skb);
+       error = error ? error : size;
+ out:
+       release_sock(sk);
+       return error;
++free_skb:
++      atm_return_tx(vcc, skb);
++      kfree_skb(skb);
++      goto out;
+ }
+ 
+ __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait)
+diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
+index 866462c97dbaff..3d81afcccff8b8 100644
+--- a/net/bluetooth/hci_event.c
++++ b/net/bluetooth/hci_event.c
+@@ -2767,7 +2767,7 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 
status)
+       if (!conn)
+               goto unlock;
+ 
+-      if (status) {
++      if (status && status != HCI_ERROR_UNKNOWN_CONN_ID) {
+               mgmt_disconnect_failed(hdev, &conn->dst, conn->type,
+                                      conn->dst_type, status);
+ 
+@@ -2782,6 +2782,12 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 
status)
+               goto done;
+       }
+ 
++      /* During suspend, mark connection as closed immediately
++       * since we might not receive HCI_EV_DISCONN_COMPLETE
++       */
++      if (hdev->suspended)
++              conn->state = BT_CLOSED;
++
+       mgmt_conn = test_and_clear_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags);
+ 
+       if (conn->type == ACL_LINK) {
+@@ -4403,7 +4409,17 @@ static void hci_num_comp_pkts_evt(struct hci_dev *hdev, 
void *data,
+               if (!conn)
+                       continue;
+ 
+-              conn->sent -= count;
++              /* Check if there is really enough packets outstanding before
++               * attempting to decrease the sent counter otherwise it could
++               * underflow..
++               */
++              if (conn->sent >= count) {
++                      conn->sent -= count;
++              } else {
++                      bt_dev_warn(hdev, "hcon %p sent %u < count %u",
++                                  conn, conn->sent, count);
++                      conn->sent = 0;
++              }
+ 
+               switch (conn->type) {
+               case ACL_LINK:
+diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
+index acff47da799aac..965b0f2b43a722 100644
+--- a/net/bluetooth/hci_sync.c
++++ b/net/bluetooth/hci_sync.c
+@@ -3424,13 +3424,13 @@ int hci_update_scan_sync(struct hci_dev *hdev)
+       return hci_write_scan_enable_sync(hdev, scan);
+ }
+ 
+-int hci_update_name_sync(struct hci_dev *hdev)
++int hci_update_name_sync(struct hci_dev *hdev, const u8 *name)
+ {
+       struct hci_cp_write_local_name cp;
+ 
+       memset(&cp, 0, sizeof(cp));
+ 
+-      memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
++      memcpy(cp.name, name, sizeof(cp.name));
+ 
+       return __hci_cmd_sync_status(hdev, HCI_OP_WRITE_LOCAL_NAME,
+                                           sizeof(cp), &cp,
+@@ -3482,7 +3482,7 @@ int hci_powered_update_sync(struct hci_dev *hdev)
+                       hci_write_fast_connectable_sync(hdev, false);
+               hci_update_scan_sync(hdev);
+               hci_update_class_sync(hdev);
+-              hci_update_name_sync(hdev);
++              hci_update_name_sync(hdev, hdev->dev_name);
+               hci_update_eir_sync(hdev);
+       }
+ 
+diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
+index 919e1bae2b2694..27876512c63a43 100644
+--- a/net/bluetooth/mgmt.c
++++ b/net/bluetooth/mgmt.c
+@@ -3897,8 +3897,11 @@ static void set_name_complete(struct hci_dev *hdev, 
void *data, int err)
+ 
+ static int set_name_sync(struct hci_dev *hdev, void *data)
+ {
++      struct mgmt_pending_cmd *cmd = data;
++      struct mgmt_cp_set_local_name *cp = cmd->param;
++
+       if (lmp_bredr_capable(hdev)) {
+-              hci_update_name_sync(hdev);
++              hci_update_name_sync(hdev, cp->name);
+               hci_update_eir_sync(hdev);
+       }
+ 
+diff --git a/net/ipv4/route.c b/net/ipv4/route.c
+index c57a1cee98e2ca..395bc567b15d37 100644
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -2549,12 +2549,16 @@ static struct rtable *__mkroute_output(const struct 
fib_result *res,
+                   !netif_is_l3_master(dev_out))
+                       return ERR_PTR(-EINVAL);
+ 
+-      if (ipv4_is_lbcast(fl4->daddr))
++      if (ipv4_is_lbcast(fl4->daddr)) {
+               type = RTN_BROADCAST;
+-      else if (ipv4_is_multicast(fl4->daddr))
++
++              /* reset fi to prevent gateway resolution */
++              fi = NULL;
++      } else if (ipv4_is_multicast(fl4->daddr)) {
+               type = RTN_MULTICAST;
+-      else if (ipv4_is_zeronet(fl4->daddr))
++      } else if (ipv4_is_zeronet(fl4->daddr)) {
+               return ERR_PTR(-EINVAL);
++      }
+ 
+       if (dev_out->flags & IFF_LOOPBACK)
+               flags |= RTCF_LOCAL;
+diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
+index b21c2ce4019281..5a0bf022a84bec 100644
+--- a/net/rose/af_rose.c
++++ b/net/rose/af_rose.c
+@@ -170,7 +170,7 @@ void rose_kill_by_neigh(struct rose_neigh *neigh)
+ 
+               if (rose->neighbour == neigh) {
+                       rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
+-                      rose->neighbour->use--;
++                      rose_neigh_put(rose->neighbour);
+                       rose->neighbour = NULL;
+               }
+       }
+@@ -212,7 +212,7 @@ static void rose_kill_by_device(struct net_device *dev)
+               if (rose->device == dev) {
+                       rose_disconnect(sk, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
+                       if (rose->neighbour)
+-                              rose->neighbour->use--;
++                              rose_neigh_put(rose->neighbour);
+                       netdev_put(rose->device, &rose->dev_tracker);
+                       rose->device = NULL;
+               }
+@@ -655,7 +655,7 @@ static int rose_release(struct socket *sock)
+               break;
+ 
+       case ROSE_STATE_2:
+-              rose->neighbour->use--;
++              rose_neigh_put(rose->neighbour);
+               release_sock(sk);
+               rose_disconnect(sk, 0, -1, -1);
+               lock_sock(sk);
+@@ -823,6 +823,7 @@ static int rose_connect(struct socket *sock, struct 
sockaddr *uaddr, int addr_le
+       rose->lci = rose_new_lci(rose->neighbour);
+       if (!rose->lci) {
+               err = -ENETUNREACH;
++              rose_neigh_put(rose->neighbour);
+               goto out_release;
+       }
+ 
+@@ -834,12 +835,14 @@ static int rose_connect(struct socket *sock, struct 
sockaddr *uaddr, int addr_le
+               dev = rose_dev_first();
+               if (!dev) {
+                       err = -ENETUNREACH;
++                      rose_neigh_put(rose->neighbour);
+                       goto out_release;
+               }
+ 
+               user = ax25_findbyuid(current_euid());
+               if (!user) {
+                       err = -EINVAL;
++                      rose_neigh_put(rose->neighbour);
+                       dev_put(dev);
+                       goto out_release;
+               }
+@@ -874,8 +877,6 @@ static int rose_connect(struct socket *sock, struct 
sockaddr *uaddr, int addr_le
+ 
+       rose->state = ROSE_STATE_1;
+ 
+-      rose->neighbour->use++;
+-
+       rose_write_internal(sk, ROSE_CALL_REQUEST);
+       rose_start_heartbeat(sk);
+       rose_start_t1timer(sk);
+@@ -1077,7 +1078,7 @@ int rose_rx_call_request(struct sk_buff *skb, struct 
net_device *dev, struct ros
+                            GFP_ATOMIC);
+       make_rose->facilities    = facilities;
+ 
+-      make_rose->neighbour->use++;
++      rose_neigh_hold(make_rose->neighbour);
+ 
+       if (rose_sk(sk)->defer) {
+               make_rose->state = ROSE_STATE_5;
+diff --git a/net/rose/rose_in.c b/net/rose/rose_in.c
+index 4d67f36dce1b49..7caae93937ee9b 100644
+--- a/net/rose/rose_in.c
++++ b/net/rose/rose_in.c
+@@ -56,7 +56,7 @@ static int rose_state1_machine(struct sock *sk, struct 
sk_buff *skb, int framety
+       case ROSE_CLEAR_REQUEST:
+               rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
+               rose_disconnect(sk, ECONNREFUSED, skb->data[3], skb->data[4]);
+-              rose->neighbour->use--;
++              rose_neigh_put(rose->neighbour);
+               break;
+ 
+       default:
+@@ -79,12 +79,12 @@ static int rose_state2_machine(struct sock *sk, struct 
sk_buff *skb, int framety
+       case ROSE_CLEAR_REQUEST:
+               rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
+               rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
+-              rose->neighbour->use--;
++              rose_neigh_put(rose->neighbour);
+               break;
+ 
+       case ROSE_CLEAR_CONFIRMATION:
+               rose_disconnect(sk, 0, -1, -1);
+-              rose->neighbour->use--;
++              rose_neigh_put(rose->neighbour);
+               break;
+ 
+       default:
+@@ -120,7 +120,7 @@ static int rose_state3_machine(struct sock *sk, struct 
sk_buff *skb, int framety
+       case ROSE_CLEAR_REQUEST:
+               rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
+               rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
+-              rose->neighbour->use--;
++              rose_neigh_put(rose->neighbour);
+               break;
+ 
+       case ROSE_RR:
+@@ -233,7 +233,7 @@ static int rose_state4_machine(struct sock *sk, struct 
sk_buff *skb, int framety
+       case ROSE_CLEAR_REQUEST:
+               rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
+               rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
+-              rose->neighbour->use--;
++              rose_neigh_put(rose->neighbour);
+               break;
+ 
+       default:
+@@ -253,7 +253,7 @@ static int rose_state5_machine(struct sock *sk, struct 
sk_buff *skb, int framety
+       if (frametype == ROSE_CLEAR_REQUEST) {
+               rose_write_internal(sk, ROSE_CLEAR_CONFIRMATION);
+               rose_disconnect(sk, 0, skb->data[3], skb->data[4]);
+-              rose_sk(sk)->neighbour->use--;
++              rose_neigh_put(rose_sk(sk)->neighbour);
+       }
+ 
+       return 0;
+diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
+index a7054546f52dfa..28746ae5a25828 100644
+--- a/net/rose/rose_route.c
++++ b/net/rose/rose_route.c
+@@ -93,11 +93,11 @@ static int __must_check rose_add_node(struct 
rose_route_struct *rose_route,
+               rose_neigh->ax25      = NULL;
+               rose_neigh->dev       = dev;
+               rose_neigh->count     = 0;
+-              rose_neigh->use       = 0;
+               rose_neigh->dce_mode  = 0;
+               rose_neigh->loopback  = 0;
+               rose_neigh->number    = rose_neigh_no++;
+               rose_neigh->restarted = 0;
++              refcount_set(&rose_neigh->use, 1);
+ 
+               skb_queue_head_init(&rose_neigh->queue);
+ 
+@@ -178,6 +178,7 @@ static int __must_check rose_add_node(struct 
rose_route_struct *rose_route,
+                       }
+               }
+               rose_neigh->count++;
++              rose_neigh_hold(rose_neigh);
+ 
+               goto out;
+       }
+@@ -187,6 +188,7 @@ static int __must_check rose_add_node(struct 
rose_route_struct *rose_route,
+               rose_node->neighbour[rose_node->count] = rose_neigh;
+               rose_node->count++;
+               rose_neigh->count++;
++              rose_neigh_hold(rose_neigh);
+       }
+ 
+ out:
+@@ -234,20 +236,12 @@ static void rose_remove_neigh(struct rose_neigh 
*rose_neigh)
+ 
+       if ((s = rose_neigh_list) == rose_neigh) {
+               rose_neigh_list = rose_neigh->next;
+-              if (rose_neigh->ax25)
+-                      ax25_cb_put(rose_neigh->ax25);
+-              kfree(rose_neigh->digipeat);
+-              kfree(rose_neigh);
+               return;
+       }
+ 
+       while (s != NULL && s->next != NULL) {
+               if (s->next == rose_neigh) {
+                       s->next = rose_neigh->next;
+-                      if (rose_neigh->ax25)
+-                              ax25_cb_put(rose_neigh->ax25);
+-                      kfree(rose_neigh->digipeat);
+-                      kfree(rose_neigh);
+                       return;
+               }
+ 
+@@ -263,10 +257,10 @@ static void rose_remove_route(struct rose_route 
*rose_route)
+       struct rose_route *s;
+ 
+       if (rose_route->neigh1 != NULL)
+-              rose_route->neigh1->use--;
++              rose_neigh_put(rose_route->neigh1);
+ 
+       if (rose_route->neigh2 != NULL)
+-              rose_route->neigh2->use--;
++              rose_neigh_put(rose_route->neigh2);
+ 
+       if ((s = rose_route_list) == rose_route) {
+               rose_route_list = rose_route->next;
+@@ -330,9 +324,12 @@ static int rose_del_node(struct rose_route_struct 
*rose_route,
+       for (i = 0; i < rose_node->count; i++) {
+               if (rose_node->neighbour[i] == rose_neigh) {
+                       rose_neigh->count--;
++                      rose_neigh_put(rose_neigh);
+ 
+-                      if (rose_neigh->count == 0 && rose_neigh->use == 0)
++                      if (rose_neigh->count == 0) {
+                               rose_remove_neigh(rose_neigh);
++                              rose_neigh_put(rose_neigh);
++                      }
+ 
+                       rose_node->count--;
+ 
+@@ -381,11 +378,11 @@ void rose_add_loopback_neigh(void)
+       sn->ax25      = NULL;
+       sn->dev       = NULL;
+       sn->count     = 0;
+-      sn->use       = 0;
+       sn->dce_mode  = 1;
+       sn->loopback  = 1;
+       sn->number    = rose_neigh_no++;
+       sn->restarted = 1;
++      refcount_set(&sn->use, 1);
+ 
+       skb_queue_head_init(&sn->queue);
+ 
+@@ -436,6 +433,7 @@ int rose_add_loopback_node(const rose_address *address)
+       rose_node_list  = rose_node;
+ 
+       rose_loopback_neigh->count++;
++      rose_neigh_hold(rose_loopback_neigh);
+ 
+ out:
+       spin_unlock_bh(&rose_node_list_lock);
+@@ -467,6 +465,7 @@ void rose_del_loopback_node(const rose_address *address)
+       rose_remove_node(rose_node);
+ 
+       rose_loopback_neigh->count--;
++      rose_neigh_put(rose_loopback_neigh);
+ 
+ out:
+       spin_unlock_bh(&rose_node_list_lock);
+@@ -506,6 +505,7 @@ void rose_rt_device_down(struct net_device *dev)
+                               memmove(&t->neighbour[i], &t->neighbour[i + 1],
+                                       sizeof(t->neighbour[0]) *
+                                               (t->count - i));
++                              rose_neigh_put(s);
+                       }
+ 
+                       if (t->count <= 0)
+@@ -513,6 +513,7 @@ void rose_rt_device_down(struct net_device *dev)
+               }
+ 
+               rose_remove_neigh(s);
++              rose_neigh_put(s);
+       }
+       spin_unlock_bh(&rose_neigh_list_lock);
+       spin_unlock_bh(&rose_node_list_lock);
+@@ -548,6 +549,7 @@ static int rose_clear_routes(void)
+ {
+       struct rose_neigh *s, *rose_neigh;
+       struct rose_node  *t, *rose_node;
++      int i;
+ 
+       spin_lock_bh(&rose_node_list_lock);
+       spin_lock_bh(&rose_neigh_list_lock);
+@@ -558,17 +560,21 @@ static int rose_clear_routes(void)
+       while (rose_node != NULL) {
+               t         = rose_node;
+               rose_node = rose_node->next;
+-              if (!t->loopback)
++
++              if (!t->loopback) {
++                      for (i = 0; i < t->count; i++)
++                              rose_neigh_put(t->neighbour[i]);
+                       rose_remove_node(t);
++              }
+       }
+ 
+       while (rose_neigh != NULL) {
+               s          = rose_neigh;
+               rose_neigh = rose_neigh->next;
+ 
+-              if (s->use == 0 && !s->loopback) {
+-                      s->count = 0;
++              if (!s->loopback) {
+                       rose_remove_neigh(s);
++                      rose_neigh_put(s);
+               }
+       }
+ 
+@@ -684,6 +690,7 @@ struct rose_neigh *rose_get_neigh(rose_address *addr, 
unsigned char *cause,
+                       for (i = 0; i < node->count; i++) {
+                               if (node->neighbour[i]->restarted) {
+                                       res = node->neighbour[i];
++                                      rose_neigh_hold(node->neighbour[i]);
+                                       goto out;
+                               }
+                       }
+@@ -695,6 +702,7 @@ struct rose_neigh *rose_get_neigh(rose_address *addr, 
unsigned char *cause,
+                               for (i = 0; i < node->count; i++) {
+                                       if 
(!rose_ftimer_running(node->neighbour[i])) {
+                                               res = node->neighbour[i];
++                                              
rose_neigh_hold(node->neighbour[i]);
+                                               goto out;
+                                       }
+                                       failed = 1;
+@@ -784,13 +792,13 @@ static void rose_del_route_by_neigh(struct rose_neigh 
*rose_neigh)
+               }
+ 
+               if (rose_route->neigh1 == rose_neigh) {
+-                      rose_route->neigh1->use--;
++                      rose_neigh_put(rose_route->neigh1);
+                       rose_route->neigh1 = NULL;
+                       rose_transmit_clear_request(rose_route->neigh2, 
rose_route->lci2, ROSE_OUT_OF_ORDER, 0);
+               }
+ 
+               if (rose_route->neigh2 == rose_neigh) {
+-                      rose_route->neigh2->use--;
++                      rose_neigh_put(rose_route->neigh2);
+                       rose_route->neigh2 = NULL;
+                       rose_transmit_clear_request(rose_route->neigh1, 
rose_route->lci1, ROSE_OUT_OF_ORDER, 0);
+               }
+@@ -919,7 +927,7 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
+                       rose_clear_queues(sk);
+                       rose->cause      = ROSE_NETWORK_CONGESTION;
+                       rose->diagnostic = 0;
+-                      rose->neighbour->use--;
++                      rose_neigh_put(rose->neighbour);
+                       rose->neighbour  = NULL;
+                       rose->lci        = 0;
+                       rose->state      = ROSE_STATE_0;
+@@ -1044,12 +1052,12 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb 
*ax25)
+ 
+       if ((new_lci = rose_new_lci(new_neigh)) == 0) {
+               rose_transmit_clear_request(rose_neigh, lci, 
ROSE_NETWORK_CONGESTION, 71);
+-              goto out;
++              goto put_neigh;
+       }
+ 
+       if ((rose_route = kmalloc(sizeof(*rose_route), GFP_ATOMIC)) == NULL) {
+               rose_transmit_clear_request(rose_neigh, lci, 
ROSE_NETWORK_CONGESTION, 120);
+-              goto out;
++              goto put_neigh;
+       }
+ 
+       rose_route->lci1      = lci;
+@@ -1062,8 +1070,8 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
+       rose_route->lci2      = new_lci;
+       rose_route->neigh2    = new_neigh;
+ 
+-      rose_route->neigh1->use++;
+-      rose_route->neigh2->use++;
++      rose_neigh_hold(rose_route->neigh1);
++      rose_neigh_hold(rose_route->neigh2);
+ 
+       rose_route->next = rose_route_list;
+       rose_route_list  = rose_route;
+@@ -1075,6 +1083,8 @@ int rose_route_frame(struct sk_buff *skb, ax25_cb *ax25)
+       rose_transmit_link(skb, rose_route->neigh2);
+       res = 1;
+ 
++put_neigh:
++      rose_neigh_put(new_neigh);
+ out:
+       spin_unlock_bh(&rose_route_list_lock);
+       spin_unlock_bh(&rose_neigh_list_lock);
+@@ -1190,7 +1200,7 @@ static int rose_neigh_show(struct seq_file *seq, void *v)
+                          (rose_neigh->loopback) ? "RSLOOP-0" : ax2asc(buf, 
&rose_neigh->callsign),
+                          rose_neigh->dev ? rose_neigh->dev->name : "???",
+                          rose_neigh->count,
+-                         rose_neigh->use,
++                         refcount_read(&rose_neigh->use) - rose_neigh->count 
- 1,
+                          (rose_neigh->dce_mode) ? "DCE" : "DTE",
+                          (rose_neigh->restarted) ? "yes" : "no",
+                          ax25_display_timer(&rose_neigh->t0timer) / HZ,
+@@ -1295,18 +1305,22 @@ void __exit rose_rt_free(void)
+       struct rose_neigh *s, *rose_neigh = rose_neigh_list;
+       struct rose_node  *t, *rose_node  = rose_node_list;
+       struct rose_route *u, *rose_route = rose_route_list;
++      int i;
+ 
+       while (rose_neigh != NULL) {
+               s          = rose_neigh;
+               rose_neigh = rose_neigh->next;
+ 
+               rose_remove_neigh(s);
++              rose_neigh_put(s);
+       }
+ 
+       while (rose_node != NULL) {
+               t         = rose_node;
+               rose_node = rose_node->next;
+ 
++              for (i = 0; i < t->count; i++)
++                      rose_neigh_put(t->neighbour[i]);
+               rose_remove_node(t);
+       }
+ 
+diff --git a/net/rose/rose_timer.c b/net/rose/rose_timer.c
+index 1525773e94aa17..c52d7d20c5199b 100644
+--- a/net/rose/rose_timer.c
++++ b/net/rose/rose_timer.c
+@@ -180,7 +180,7 @@ static void rose_timer_expiry(struct timer_list *t)
+               break;
+ 
+       case ROSE_STATE_2:      /* T3 */
+-              rose->neighbour->use--;
++              rose_neigh_put(rose->neighbour);
+               rose_disconnect(sk, ETIMEDOUT, -1, -1);
+               break;
+ 
+diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
+index d081858c2d073f..a1cb8ac0408af6 100644
+--- a/net/sctp/ipv6.c
++++ b/net/sctp/ipv6.c
+@@ -547,7 +547,9 @@ static void sctp_v6_from_sk(union sctp_addr *addr, struct 
sock *sk)
+ {
+       addr->v6.sin6_family = AF_INET6;
+       addr->v6.sin6_port = 0;
++      addr->v6.sin6_flowinfo = 0;
+       addr->v6.sin6_addr = sk->sk_v6_rcv_saddr;
++      addr->v6.sin6_scope_id = 0;
+ }
+ 
+ /* Initialize sk->sk_rcv_saddr from sctp_addr. */
+diff --git a/sound/soc/codecs/lpass-tx-macro.c 
b/sound/soc/codecs/lpass-tx-macro.c
+index 840bbe991cd3a7..aef2897e00fef4 100644
+--- a/sound/soc/codecs/lpass-tx-macro.c
++++ b/sound/soc/codecs/lpass-tx-macro.c
+@@ -1795,7 +1795,7 @@ static int tx_macro_register_mclk_output(struct tx_macro 
*tx)
+ }
+ 
+ static const struct snd_soc_component_driver tx_macro_component_drv = {
+-      .name = "RX-MACRO",
++      .name = "TX-MACRO",
+       .probe = tx_macro_component_probe,
+       .controls = tx_macro_snd_controls,
+       .num_controls = ARRAY_SIZE(tx_macro_snd_controls),

Reply via email to