commit:     d9693e00e43bce95a9104cba1f4e710ba0918f36
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Wed Dec 21 18:56:47 2022 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Wed Dec 21 18:57:43 2022 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=d9693e00

Linux patch 6.1.1

Signed-off-by: Alice Ferrazzi <alicef <AT> gentoo.org>

 0000_README            |    4 +
 1000_linux-6.1.1.patch | 1127 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1131 insertions(+)

diff --git a/0000_README b/0000_README
index acaedd58..d85dd44f 100644
--- a/0000_README
+++ b/0000_README
@@ -43,6 +43,10 @@ EXPERIMENTAL
 Individual Patch Descriptions:
 --------------------------------------------------------------------------
 
+Patch:  1000_linux-6.1.1.patch
+From:   http://www.kernel.org
+Desc:   Linux 6.1.1
+
 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/1000_linux-6.1.1.patch b/1000_linux-6.1.1.patch
new file mode 100644
index 00000000..391da5ed
--- /dev/null
+++ b/1000_linux-6.1.1.patch
@@ -0,0 +1,1127 @@
+diff --git a/Documentation/security/keys/trusted-encrypted.rst 
b/Documentation/security/keys/trusted-encrypted.rst
+index 0bfb4c3397489..9bc9db8ec6517 100644
+--- a/Documentation/security/keys/trusted-encrypted.rst
++++ b/Documentation/security/keys/trusted-encrypted.rst
+@@ -350,7 +350,8 @@ Load an encrypted key "evm" from saved blob::
+ 
+ Instantiate an encrypted key "evm" using user-provided decrypted data::
+ 
+-    $ keyctl add encrypted evm "new default user:kmk 32 `cat 
evm_decrypted_data.blob`" @u
++    $ evmkey=$(dd if=/dev/urandom bs=1 count=32 | xxd -c32 -p)
++    $ keyctl add encrypted evm "new default user:kmk 32 $evmkey" @u
+     794890253
+ 
+     $ keyctl print 794890253
+diff --git a/Makefile b/Makefile
+index 997b677222920..7307ae6c2ef72 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 6
+ PATCHLEVEL = 1
+-SUBLEVEL = 0
++SUBLEVEL = 1
+ EXTRAVERSION =
+ NAME = Hurr durr I'ma ninja sloth
+ 
+diff --git a/arch/mips/include/asm/mach-ralink/mt7621.h 
b/arch/mips/include/asm/mach-ralink/mt7621.h
+index 6bbf082dd149e..79d5bb0e06d63 100644
+--- a/arch/mips/include/asm/mach-ralink/mt7621.h
++++ b/arch/mips/include/asm/mach-ralink/mt7621.h
+@@ -7,10 +7,12 @@
+ #ifndef _MT7621_REGS_H_
+ #define _MT7621_REGS_H_
+ 
++#define IOMEM(x)                      ((void __iomem *)(KSEG1ADDR(x)))
++
+ #define MT7621_PALMBUS_BASE           0x1C000000
+ #define MT7621_PALMBUS_SIZE           0x03FFFFFF
+ 
+-#define MT7621_SYSC_BASE              0x1E000000
++#define MT7621_SYSC_BASE              IOMEM(0x1E000000)
+ 
+ #define SYSC_REG_CHIP_NAME0           0x00
+ #define SYSC_REG_CHIP_NAME1           0x04
+diff --git a/arch/mips/ralink/mt7621.c b/arch/mips/ralink/mt7621.c
+index fb0565bc34fda..bbf5811afbf2c 100644
+--- a/arch/mips/ralink/mt7621.c
++++ b/arch/mips/ralink/mt7621.c
+@@ -25,6 +25,7 @@
+ #define MT7621_MEM_TEST_PATTERN         0xaa5555aa
+ 
+ static u32 detect_magic __initdata;
++static struct ralink_soc_info *soc_info_ptr;
+ 
+ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
+ {
+@@ -97,41 +98,83 @@ void __init ralink_of_remap(void)
+               panic("Failed to remap core resources");
+ }
+ 
+-static void soc_dev_init(struct ralink_soc_info *soc_info, u32 rev)
++static unsigned int __init mt7621_get_soc_name0(void)
++{
++      return __raw_readl(MT7621_SYSC_BASE + SYSC_REG_CHIP_NAME0);
++}
++
++static unsigned int __init mt7621_get_soc_name1(void)
++{
++      return __raw_readl(MT7621_SYSC_BASE + SYSC_REG_CHIP_NAME1);
++}
++
++static bool __init mt7621_soc_valid(void)
++{
++      if (mt7621_get_soc_name0() == MT7621_CHIP_NAME0 &&
++                      mt7621_get_soc_name1() == MT7621_CHIP_NAME1)
++              return true;
++      else
++              return false;
++}
++
++static const char __init *mt7621_get_soc_id(void)
++{
++      if (mt7621_soc_valid())
++              return "MT7621";
++      else
++              return "invalid";
++}
++
++static unsigned int __init mt7621_get_soc_rev(void)
++{
++      return __raw_readl(MT7621_SYSC_BASE + SYSC_REG_CHIP_REV);
++}
++
++static unsigned int __init mt7621_get_soc_ver(void)
++{
++      return (mt7621_get_soc_rev() >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK;
++}
++
++static unsigned int __init mt7621_get_soc_eco(void)
++{
++      return (mt7621_get_soc_rev() & CHIP_REV_ECO_MASK);
++}
++
++static const char __init *mt7621_get_soc_revision(void)
++{
++      if (mt7621_get_soc_rev() == 1 && mt7621_get_soc_eco() == 1)
++              return "E2";
++      else
++              return "E1";
++}
++
++static int __init mt7621_soc_dev_init(void)
+ {
+       struct soc_device *soc_dev;
+       struct soc_device_attribute *soc_dev_attr;
+ 
+       soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+       if (!soc_dev_attr)
+-              return;
++              return -ENOMEM;
+ 
+       soc_dev_attr->soc_id = "mt7621";
+       soc_dev_attr->family = "Ralink";
++      soc_dev_attr->revision = mt7621_get_soc_revision();
+ 
+-      if (((rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK) == 1 &&
+-          (rev & CHIP_REV_ECO_MASK) == 1)
+-              soc_dev_attr->revision = "E2";
+-      else
+-              soc_dev_attr->revision = "E1";
+-
+-      soc_dev_attr->data = soc_info;
++      soc_dev_attr->data = soc_info_ptr;
+ 
+       soc_dev = soc_device_register(soc_dev_attr);
+       if (IS_ERR(soc_dev)) {
+               kfree(soc_dev_attr);
+-              return;
++              return PTR_ERR(soc_dev);
+       }
++
++      return 0;
+ }
++device_initcall(mt7621_soc_dev_init);
+ 
+ void __init prom_soc_init(struct ralink_soc_info *soc_info)
+ {
+-      void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7621_SYSC_BASE);
+-      unsigned char *name = NULL;
+-      u32 n0;
+-      u32 n1;
+-      u32 rev;
+-
+       /* Early detection of CMP support */
+       mips_cm_probe();
+       mips_cpc_probe();
+@@ -154,27 +197,23 @@ void __init prom_soc_init(struct ralink_soc_info 
*soc_info)
+               __sync();
+       }
+ 
+-      n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
+-      n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
+-
+-      if (n0 == MT7621_CHIP_NAME0 && n1 == MT7621_CHIP_NAME1) {
+-              name = "MT7621";
++      if (mt7621_soc_valid())
+               soc_info->compatible = "mediatek,mt7621-soc";
+-      } else {
+-              panic("mt7621: unknown SoC, n0:%08x n1:%08x\n", n0, n1);
+-      }
++      else
++              panic("mt7621: unknown SoC, n0:%08x n1:%08x\n",
++                              mt7621_get_soc_name0(),
++                              mt7621_get_soc_name1());
+       ralink_soc = MT762X_SOC_MT7621AT;
+-      rev = __raw_readl(sysc + SYSC_REG_CHIP_REV);
+ 
+       snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
+               "MediaTek %s ver:%u eco:%u",
+-              name,
+-              (rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK,
+-              (rev & CHIP_REV_ECO_MASK));
++              mt7621_get_soc_id(),
++              mt7621_get_soc_ver(),
++              mt7621_get_soc_eco());
+ 
+       soc_info->mem_detect = mt7621_memory_detect;
+ 
+-      soc_dev_init(soc_info, rev);
++      soc_info_ptr = soc_info;
+ 
+       if (!register_cps_smp_ops())
+               return;
+diff --git a/arch/x86/entry/vdso/vdso.lds.S b/arch/x86/entry/vdso/vdso.lds.S
+index 4bf48462fca7a..e8c60ae7a7c83 100644
+--- a/arch/x86/entry/vdso/vdso.lds.S
++++ b/arch/x86/entry/vdso/vdso.lds.S
+@@ -27,7 +27,9 @@ VERSION {
+               __vdso_time;
+               clock_getres;
+               __vdso_clock_getres;
++#ifdef CONFIG_X86_SGX
+               __vdso_sgx_enter_enclave;
++#endif
+       local: *;
+       };
+ }
+diff --git a/drivers/irqchip/irq-ls-extirq.c b/drivers/irqchip/irq-ls-extirq.c
+index d8d48b1f7c29d..139f26b0a6ef8 100644
+--- a/drivers/irqchip/irq-ls-extirq.c
++++ b/drivers/irqchip/irq-ls-extirq.c
+@@ -203,7 +203,7 @@ ls_extirq_of_init(struct device_node *node, struct 
device_node *parent)
+       if (ret)
+               goto err_parse_map;
+ 
+-      priv->big_endian = of_device_is_big_endian(parent);
++      priv->big_endian = of_device_is_big_endian(node->parent);
+       priv->is_ls1021a_or_ls1043a = of_device_is_compatible(node, 
"fsl,ls1021a-extirq") ||
+                                     of_device_is_compatible(node, 
"fsl,ls1043a-extirq");
+       raw_spin_lock_init(&priv->lock);
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
+index f8e32833226c1..473158c09f1d7 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -7521,7 +7521,7 @@ static void igb_vf_reset_msg(struct igb_adapter 
*adapter, u32 vf)
+ {
+       struct e1000_hw *hw = &adapter->hw;
+       unsigned char *vf_mac = adapter->vf_data[vf].vf_mac_addresses;
+-      u32 reg, msgbuf[3];
++      u32 reg, msgbuf[3] = {};
+       u8 *addr = (u8 *)(&msgbuf[1]);
+ 
+       /* process all the same items cleared in a function level reset */
+diff --git a/drivers/pci/controller/pcie-mt7621.c 
b/drivers/pci/controller/pcie-mt7621.c
+index 4bd1abf26008f..ee7aad09d6277 100644
+--- a/drivers/pci/controller/pcie-mt7621.c
++++ b/drivers/pci/controller/pcie-mt7621.c
+@@ -466,7 +466,8 @@ static int mt7621_pcie_register_host(struct 
pci_host_bridge *host)
+ }
+ 
+ static const struct soc_device_attribute mt7621_pcie_quirks_match[] = {
+-      { .soc_id = "mt7621", .revision = "E2" }
++      { .soc_id = "mt7621", .revision = "E2" },
++      { /* sentinel */ }
+ };
+ 
+ static int mt7621_pcie_probe(struct platform_device *pdev)
+diff --git a/drivers/staging/r8188eu/core/rtw_led.c 
b/drivers/staging/r8188eu/core/rtw_led.c
+index 1e316e6358ea2..48c5db69929c3 100644
+--- a/drivers/staging/r8188eu/core/rtw_led.c
++++ b/drivers/staging/r8188eu/core/rtw_led.c
+@@ -32,40 +32,19 @@ static void ResetLedStatus(struct led_priv *pLed)
+ 
+ static void SwLedOn(struct adapter *padapter, struct led_priv *pLed)
+ {
+-      u8      LedCfg;
+-      int res;
+-
+       if (padapter->bDriverStopped)
+               return;
+ 
+-      res = rtw_read8(padapter, REG_LEDCFG2, &LedCfg);
+-      if (res)
+-              return;
+-
+-      rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0xf0) | BIT(5) | BIT(6)); 
/*  SW control led0 on. */
++      rtw_write8(padapter, REG_LEDCFG2, BIT(5)); /*  SW control led0 on. */
+       pLed->bLedOn = true;
+ }
+ 
+ static void SwLedOff(struct adapter *padapter, struct led_priv *pLed)
+ {
+-      u8      LedCfg;
+-      int res;
+-
+       if (padapter->bDriverStopped)
+               goto exit;
+ 
+-      res = rtw_read8(padapter, REG_LEDCFG2, &LedCfg);/* 0x4E */
+-      if (res)
+-              goto exit;
+-
+-      LedCfg &= 0x90; /*  Set to software control. */
+-      rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3)));
+-      res = rtw_read8(padapter, REG_MAC_PINMUX_CFG, &LedCfg);
+-      if (res)
+-              goto exit;
+-
+-      LedCfg &= 0xFE;
+-      rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg);
++      rtw_write8(padapter, REG_LEDCFG2, BIT(5) | BIT(3));
+ exit:
+       pLed->bLedOn = false;
+ }
+diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
+index fb14511b1e10f..89c9ab2b19f85 100644
+--- a/drivers/usb/dwc3/dwc3-pci.c
++++ b/drivers/usb/dwc3/dwc3-pci.c
+@@ -45,7 +45,7 @@
+ #define PCI_DEVICE_ID_INTEL_ADLN              0x465e
+ #define PCI_DEVICE_ID_INTEL_ADLN_PCH          0x54ee
+ #define PCI_DEVICE_ID_INTEL_ADLS              0x7ae1
+-#define PCI_DEVICE_ID_INTEL_RPL                       0x460e
++#define PCI_DEVICE_ID_INTEL_RPL                       0xa70e
+ #define PCI_DEVICE_ID_INTEL_RPLS              0x7a61
+ #define PCI_DEVICE_ID_INTEL_MTLP              0x7ec1
+ #define PCI_DEVICE_ID_INTEL_MTL                       0x7e7e
+diff --git a/drivers/usb/gadget/function/f_uvc.c 
b/drivers/usb/gadget/function/f_uvc.c
+index 6e196e06181ec..4419b7972e78f 100644
+--- a/drivers/usb/gadget/function/f_uvc.c
++++ b/drivers/usb/gadget/function/f_uvc.c
+@@ -216,8 +216,9 @@ uvc_function_ep0_complete(struct usb_ep *ep, struct 
usb_request *req)
+ 
+               memset(&v4l2_event, 0, sizeof(v4l2_event));
+               v4l2_event.type = UVC_EVENT_DATA;
+-              uvc_event->data.length = req->actual;
+-              memcpy(&uvc_event->data.data, req->buf, req->actual);
++              uvc_event->data.length = min_t(unsigned int, req->actual,
++                      sizeof(uvc_event->data.data));
++              memcpy(&uvc_event->data.data, req->buf, uvc_event->data.length);
+               v4l2_event_queue(&uvc->vdev, &v4l2_event);
+       }
+ }
+diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
+index 7bccbe50bab15..f98cf30a3c1a5 100644
+--- a/drivers/usb/host/xhci-pci.c
++++ b/drivers/usb/host/xhci-pci.c
+@@ -59,6 +59,7 @@
+ #define PCI_DEVICE_ID_INTEL_TIGER_LAKE_XHCI           0x9a13
+ #define PCI_DEVICE_ID_INTEL_MAPLE_RIDGE_XHCI          0x1138
+ #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI               0x51ed
++#define PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_PCH_XHCI     0x54ed
+ 
+ #define PCI_DEVICE_ID_AMD_RENOIR_XHCI                 0x1639
+ #define PCI_DEVICE_ID_AMD_PROMONTORYA_4                       0x43b9
+@@ -246,7 +247,8 @@ static void xhci_pci_quirks(struct device *dev, struct 
xhci_hcd *xhci)
+               xhci->quirks |= XHCI_MISSING_CAS;
+ 
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
+-          pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI)
++          (pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_PCH_XHCI ||
++           pdev->device == PCI_DEVICE_ID_INTEL_ALDER_LAKE_N_PCH_XHCI))
+               xhci->quirks |= XHCI_RESET_TO_DEFAULT;
+ 
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
+diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
+index 3bcec419f4632..f6fb23620e87a 100644
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -195,6 +195,8 @@ static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML 
Control, Monitoring and Data Logger */
+       { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */
+       { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D 
*/
++      { USB_DEVICE(0x17A8, 0x0011) }, /* Kamstrup 444 MHz RF sniffer */
++      { USB_DEVICE(0x17A8, 0x0013) }, /* Kamstrup 870 MHz RF sniffer */
+       { USB_DEVICE(0x17A8, 0x0101) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter 
Reader (Int Ant) */
+       { USB_DEVICE(0x17A8, 0x0102) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter 
Reader (Ext Ant) */
+       { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
+diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c
+index 2dd58cd9f0ccb..891fb1fe69df7 100644
+--- a/drivers/usb/serial/f81232.c
++++ b/drivers/usb/serial/f81232.c
+@@ -130,9 +130,6 @@ static u8 const clock_table[] = { F81232_CLK_1_846_MHZ, 
F81232_CLK_14_77_MHZ,
+ 
+ static int calc_baud_divisor(speed_t baudrate, speed_t clockrate)
+ {
+-      if (!baudrate)
+-              return 0;
+-
+       return DIV_ROUND_CLOSEST(clockrate, baudrate);
+ }
+ 
+@@ -498,9 +495,14 @@ static void f81232_set_baudrate(struct tty_struct *tty,
+       speed_t baud_list[] = { baudrate, old_baudrate, F81232_DEF_BAUDRATE };
+ 
+       for (i = 0; i < ARRAY_SIZE(baud_list); ++i) {
+-              idx = f81232_find_clk(baud_list[i]);
++              baudrate = baud_list[i];
++              if (baudrate == 0) {
++                      tty_encode_baud_rate(tty, 0, 0);
++                      return;
++              }
++
++              idx = f81232_find_clk(baudrate);
+               if (idx >= 0) {
+-                      baudrate = baud_list[i];
+                       tty_encode_baud_rate(tty, baudrate, baudrate);
+                       break;
+               }
+diff --git a/drivers/usb/serial/f81534.c b/drivers/usb/serial/f81534.c
+index ddfcd72eb0ae7..4083ae961be43 100644
+--- a/drivers/usb/serial/f81534.c
++++ b/drivers/usb/serial/f81534.c
+@@ -536,9 +536,6 @@ static int f81534_submit_writer(struct usb_serial_port 
*port, gfp_t mem_flags)
+ 
+ static u32 f81534_calc_baud_divisor(u32 baudrate, u32 clockrate)
+ {
+-      if (!baudrate)
+-              return 0;
+-
+       /* Round to nearest divisor */
+       return DIV_ROUND_CLOSEST(clockrate, baudrate);
+ }
+@@ -568,9 +565,14 @@ static int f81534_set_port_config(struct usb_serial_port 
*port,
+       u32 baud_list[] = {baudrate, old_baudrate, F81534_DEFAULT_BAUD_RATE};
+ 
+       for (i = 0; i < ARRAY_SIZE(baud_list); ++i) {
+-              idx = f81534_find_clk(baud_list[i]);
++              baudrate = baud_list[i];
++              if (baudrate == 0) {
++                      tty_encode_baud_rate(tty, 0, 0);
++                      return 0;
++              }
++
++              idx = f81534_find_clk(baudrate);
+               if (idx >= 0) {
+-                      baudrate = baud_list[i];
+                       tty_encode_baud_rate(tty, baudrate, baudrate);
+                       break;
+               }
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index c3b7f1d98e781..dee79c7d82d5c 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -255,6 +255,7 @@ static void option_instat_callback(struct urb *urb);
+ #define QUECTEL_PRODUCT_EP06                  0x0306
+ #define QUECTEL_PRODUCT_EM05G                 0x030a
+ #define QUECTEL_PRODUCT_EM060K                        0x030b
++#define QUECTEL_PRODUCT_EM05G_SG              0x0311
+ #define QUECTEL_PRODUCT_EM12                  0x0512
+ #define QUECTEL_PRODUCT_RM500Q                        0x0800
+ #define QUECTEL_PRODUCT_RM520N                        0x0801
+@@ -1160,6 +1161,8 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EP06, 0xff, 0, 0) },
+       { USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM05G, 
0xff),
+         .driver_info = RSVD(6) | ZLP },
++      { USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EM05G_SG, 0xff),
++        .driver_info = RSVD(6) | ZLP },
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EM060K, 0xff, 0x00, 0x40) },
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EM060K, 0xff, 0xff, 0x30) },
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EM060K, 0xff, 0xff, 0x40) },
+diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
+index a7987fc764cc6..eabe519013e78 100644
+--- a/drivers/usb/typec/ucsi/ucsi.c
++++ b/drivers/usb/typec/ucsi/ucsi.c
+@@ -1270,8 +1270,9 @@ err:
+       return ret;
+ }
+ 
+-int ucsi_resume(struct ucsi *ucsi)
++static void ucsi_resume_work(struct work_struct *work)
+ {
++      struct ucsi *ucsi = container_of(work, struct ucsi, resume_work);
+       struct ucsi_connector *con;
+       u64 command;
+       int ret;
+@@ -1279,15 +1280,21 @@ int ucsi_resume(struct ucsi *ucsi)
+       /* Restore UCSI notification enable mask after system resume */
+       command = UCSI_SET_NOTIFICATION_ENABLE | ucsi->ntfy;
+       ret = ucsi_send_command(ucsi, command, NULL, 0);
+-      if (ret < 0)
+-              return ret;
++      if (ret < 0) {
++              dev_err(ucsi->dev, "failed to re-enable notifications (%d)\n", 
ret);
++              return;
++      }
+ 
+       for (con = ucsi->connector; con->port; con++) {
+               mutex_lock(&con->lock);
+-              ucsi_check_connection(con);
++              ucsi_partner_task(con, ucsi_check_connection, 1, 0);
+               mutex_unlock(&con->lock);
+       }
++}
+ 
++int ucsi_resume(struct ucsi *ucsi)
++{
++      queue_work(system_long_wq, &ucsi->resume_work);
+       return 0;
+ }
+ EXPORT_SYMBOL_GPL(ucsi_resume);
+@@ -1347,6 +1354,7 @@ struct ucsi *ucsi_create(struct device *dev, const 
struct ucsi_operations *ops)
+       if (!ucsi)
+               return ERR_PTR(-ENOMEM);
+ 
++      INIT_WORK(&ucsi->resume_work, ucsi_resume_work);
+       INIT_DELAYED_WORK(&ucsi->work, ucsi_init_work);
+       mutex_init(&ucsi->ppm_lock);
+       ucsi->dev = dev;
+@@ -1401,6 +1409,7 @@ void ucsi_unregister(struct ucsi *ucsi)
+ 
+       /* Make sure that we are not in the middle of driver initialization */
+       cancel_delayed_work_sync(&ucsi->work);
++      cancel_work_sync(&ucsi->resume_work);
+ 
+       /* Disable notifications */
+       ucsi->ops->async_write(ucsi, UCSI_CONTROL, &cmd, sizeof(cmd));
+diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h
+index 8eb391e3e592c..c968474ee5473 100644
+--- a/drivers/usb/typec/ucsi/ucsi.h
++++ b/drivers/usb/typec/ucsi/ucsi.h
+@@ -287,6 +287,7 @@ struct ucsi {
+       struct ucsi_capability cap;
+       struct ucsi_connector *connector;
+ 
++      struct work_struct resume_work;
+       struct delayed_work work;
+       int work_count;
+ #define UCSI_ROLE_SWITCH_RETRY_PER_HZ 10
+diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
+index 1420acf987f03..157d3c0e3cc76 100644
+--- a/fs/cifs/cifsglob.h
++++ b/fs/cifs/cifsglob.h
+@@ -13,6 +13,8 @@
+ #include <linux/in6.h>
+ #include <linux/inet.h>
+ #include <linux/slab.h>
++#include <linux/scatterlist.h>
++#include <linux/mm.h>
+ #include <linux/mempool.h>
+ #include <linux/workqueue.h>
+ #include <linux/utsname.h>
+@@ -2137,4 +2139,70 @@ static inline void move_cifs_info_to_smb2(struct 
smb2_file_all_info *dst, const
+       dst->FileNameLength = src->FileNameLength;
+ }
+ 
++static inline unsigned int cifs_get_num_sgs(const struct smb_rqst *rqst,
++                                          int num_rqst,
++                                          const u8 *sig)
++{
++      unsigned int len, skip;
++      unsigned int nents = 0;
++      unsigned long addr;
++      int i, j;
++
++      /* Assumes the first rqst has a transform header as the first iov.
++       * I.e.
++       * rqst[0].rq_iov[0]  is transform header
++       * rqst[0].rq_iov[1+] data to be encrypted/decrypted
++       * rqst[1+].rq_iov[0+] data to be encrypted/decrypted
++       */
++      for (i = 0; i < num_rqst; i++) {
++              /*
++               * The first rqst has a transform header where the
++               * first 20 bytes are not part of the encrypted blob.
++               */
++              for (j = 0; j < rqst[i].rq_nvec; j++) {
++                      struct kvec *iov = &rqst[i].rq_iov[j];
++
++                      skip = (i == 0) && (j == 0) ? 20 : 0;
++                      addr = (unsigned long)iov->iov_base + skip;
++                      if (unlikely(is_vmalloc_addr((void *)addr))) {
++                              len = iov->iov_len - skip;
++                              nents += DIV_ROUND_UP(offset_in_page(addr) + 
len,
++                                                    PAGE_SIZE);
++                      } else {
++                              nents++;
++                      }
++              }
++              nents += rqst[i].rq_npages;
++      }
++      nents += DIV_ROUND_UP(offset_in_page(sig) + SMB2_SIGNATURE_SIZE, 
PAGE_SIZE);
++      return nents;
++}
++
++/* We can not use the normal sg_set_buf() as we will sometimes pass a
++ * stack object as buf.
++ */
++static inline struct scatterlist *cifs_sg_set_buf(struct scatterlist *sg,
++                                                const void *buf,
++                                                unsigned int buflen)
++{
++      unsigned long addr = (unsigned long)buf;
++      unsigned int off = offset_in_page(addr);
++
++      addr &= PAGE_MASK;
++      if (unlikely(is_vmalloc_addr((void *)addr))) {
++              do {
++                      unsigned int len = min_t(unsigned int, buflen, 
PAGE_SIZE - off);
++
++                      sg_set_page(sg++, vmalloc_to_page((void *)addr), len, 
off);
++
++                      off = 0;
++                      addr += PAGE_SIZE;
++                      buflen -= len;
++              } while (buflen);
++      } else {
++              sg_set_page(sg++, virt_to_page(addr), buflen, off);
++      }
++      return sg;
++}
++
+ #endif        /* _CIFS_GLOB_H */
+diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
+index 83e83d8beabba..eb1a0de9dd553 100644
+--- a/fs/cifs/cifsproto.h
++++ b/fs/cifs/cifsproto.h
+@@ -600,8 +600,8 @@ int setup_aio_ctx_iter(struct cifs_aio_ctx *ctx, struct 
iov_iter *iter, int rw);
+ int cifs_alloc_hash(const char *name, struct shash_desc **sdesc);
+ void cifs_free_hash(struct shash_desc **sdesc);
+ 
+-extern void rqst_page_get_length(struct smb_rqst *rqst, unsigned int page,
+-                              unsigned int *len, unsigned int *offset);
++void rqst_page_get_length(const struct smb_rqst *rqst, unsigned int page,
++                        unsigned int *len, unsigned int *offset);
+ struct cifs_chan *
+ cifs_ses_find_chan(struct cifs_ses *ses, struct TCP_Server_Info *server);
+ int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses 
*ses);
+diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
+index 3e68d8208cf5e..1cbecd64d697f 100644
+--- a/fs/cifs/misc.c
++++ b/fs/cifs/misc.c
+@@ -1136,8 +1136,8 @@ cifs_free_hash(struct shash_desc **sdesc)
+  * @len: Where to store the length for this page:
+  * @offset: Where to store the offset for this page
+  */
+-void rqst_page_get_length(struct smb_rqst *rqst, unsigned int page,
+-                              unsigned int *len, unsigned int *offset)
++void rqst_page_get_length(const struct smb_rqst *rqst, unsigned int page,
++                        unsigned int *len, unsigned int *offset)
+ {
+       *len = rqst->rq_pagesz;
+       *offset = (page == 0) ? rqst->rq_offset : 0;
+diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
+index bfaafd02fb1f2..b24e68b5ccd61 100644
+--- a/fs/cifs/smb2ops.c
++++ b/fs/cifs/smb2ops.c
+@@ -4204,69 +4204,82 @@ fill_transform_hdr(struct smb2_transform_hdr *tr_hdr, 
unsigned int orig_len,
+       memcpy(&tr_hdr->SessionId, &shdr->SessionId, 8);
+ }
+ 
+-/* We can not use the normal sg_set_buf() as we will sometimes pass a
+- * stack object as buf.
+- */
+-static inline void smb2_sg_set_buf(struct scatterlist *sg, const void *buf,
+-                                 unsigned int buflen)
++static void *smb2_aead_req_alloc(struct crypto_aead *tfm, const struct 
smb_rqst *rqst,
++                               int num_rqst, const u8 *sig, u8 **iv,
++                               struct aead_request **req, struct scatterlist 
**sgl,
++                               unsigned int *num_sgs)
+ {
+-      void *addr;
+-      /*
+-       * VMAP_STACK (at least) puts stack into the vmalloc address space
+-       */
+-      if (is_vmalloc_addr(buf))
+-              addr = vmalloc_to_page(buf);
+-      else
+-              addr = virt_to_page(buf);
+-      sg_set_page(sg, addr, buflen, offset_in_page(buf));
++      unsigned int req_size = sizeof(**req) + crypto_aead_reqsize(tfm);
++      unsigned int iv_size = crypto_aead_ivsize(tfm);
++      unsigned int len;
++      u8 *p;
++
++      *num_sgs = cifs_get_num_sgs(rqst, num_rqst, sig);
++
++      len = iv_size;
++      len += crypto_aead_alignmask(tfm) & ~(crypto_tfm_ctx_alignment() - 1);
++      len = ALIGN(len, crypto_tfm_ctx_alignment());
++      len += req_size;
++      len = ALIGN(len, __alignof__(struct scatterlist));
++      len += *num_sgs * sizeof(**sgl);
++
++      p = kmalloc(len, GFP_ATOMIC);
++      if (!p)
++              return NULL;
++
++      *iv = (u8 *)PTR_ALIGN(p, crypto_aead_alignmask(tfm) + 1);
++      *req = (struct aead_request *)PTR_ALIGN(*iv + iv_size,
++                                              crypto_tfm_ctx_alignment());
++      *sgl = (struct scatterlist *)PTR_ALIGN((u8 *)*req + req_size,
++                                             __alignof__(struct scatterlist));
++      return p;
+ }
+ 
+-/* Assumes the first rqst has a transform header as the first iov.
+- * I.e.
+- * rqst[0].rq_iov[0]  is transform header
+- * rqst[0].rq_iov[1+] data to be encrypted/decrypted
+- * rqst[1+].rq_iov[0+] data to be encrypted/decrypted
+- */
+-static struct scatterlist *
+-init_sg(int num_rqst, struct smb_rqst *rqst, u8 *sign)
++static void *smb2_get_aead_req(struct crypto_aead *tfm, const struct smb_rqst 
*rqst,
++                             int num_rqst, const u8 *sig, u8 **iv,
++                             struct aead_request **req, struct scatterlist 
**sgl)
+ {
+-      unsigned int sg_len;
++      unsigned int off, len, skip;
+       struct scatterlist *sg;
+-      unsigned int i;
+-      unsigned int j;
+-      unsigned int idx = 0;
+-      int skip;
+-
+-      sg_len = 1;
+-      for (i = 0; i < num_rqst; i++)
+-              sg_len += rqst[i].rq_nvec + rqst[i].rq_npages;
++      unsigned int num_sgs;
++      unsigned long addr;
++      int i, j;
++      void *p;
+ 
+-      sg = kmalloc_array(sg_len, sizeof(struct scatterlist), GFP_KERNEL);
+-      if (!sg)
++      p = smb2_aead_req_alloc(tfm, rqst, num_rqst, sig, iv, req, sgl, 
&num_sgs);
++      if (!p)
+               return NULL;
+ 
+-      sg_init_table(sg, sg_len);
++      sg_init_table(*sgl, num_sgs);
++      sg = *sgl;
++
++      /* Assumes the first rqst has a transform header as the first iov.
++       * I.e.
++       * rqst[0].rq_iov[0]  is transform header
++       * rqst[0].rq_iov[1+] data to be encrypted/decrypted
++       * rqst[1+].rq_iov[0+] data to be encrypted/decrypted
++       */
+       for (i = 0; i < num_rqst; i++) {
++              /*
++               * The first rqst has a transform header where the
++               * first 20 bytes are not part of the encrypted blob.
++               */
+               for (j = 0; j < rqst[i].rq_nvec; j++) {
+-                      /*
+-                       * The first rqst has a transform header where the
+-                       * first 20 bytes are not part of the encrypted blob
+-                       */
+-                      skip = (i == 0) && (j == 0) ? 20 : 0;
+-                      smb2_sg_set_buf(&sg[idx++],
+-                                      rqst[i].rq_iov[j].iov_base + skip,
+-                                      rqst[i].rq_iov[j].iov_len - skip);
+-                      }
++                      struct kvec *iov = &rqst[i].rq_iov[j];
+ 
++                      skip = (i == 0) && (j == 0) ? 20 : 0;
++                      addr = (unsigned long)iov->iov_base + skip;
++                      len = iov->iov_len - skip;
++                      sg = cifs_sg_set_buf(sg, (void *)addr, len);
++              }
+               for (j = 0; j < rqst[i].rq_npages; j++) {
+-                      unsigned int len, offset;
+-
+-                      rqst_page_get_length(&rqst[i], j, &len, &offset);
+-                      sg_set_page(&sg[idx++], rqst[i].rq_pages[j], len, 
offset);
++                      rqst_page_get_length(&rqst[i], j, &len, &off);
++                      sg_set_page(sg++, rqst[i].rq_pages[j], len, off);
+               }
+       }
+-      smb2_sg_set_buf(&sg[idx], sign, SMB2_SIGNATURE_SIZE);
+-      return sg;
++      cifs_sg_set_buf(sg, sig, SMB2_SIGNATURE_SIZE);
++
++      return p;
+ }
+ 
+ static int
+@@ -4314,11 +4327,11 @@ crypt_message(struct TCP_Server_Info *server, int 
num_rqst,
+       u8 sign[SMB2_SIGNATURE_SIZE] = {};
+       u8 key[SMB3_ENC_DEC_KEY_SIZE];
+       struct aead_request *req;
+-      char *iv;
+-      unsigned int iv_len;
++      u8 *iv;
+       DECLARE_CRYPTO_WAIT(wait);
+       struct crypto_aead *tfm;
+       unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
++      void *creq;
+ 
+       rc = smb2_get_enc_key(server, le64_to_cpu(tr_hdr->SessionId), enc, key);
+       if (rc) {
+@@ -4352,32 +4365,15 @@ crypt_message(struct TCP_Server_Info *server, int 
num_rqst,
+               return rc;
+       }
+ 
+-      req = aead_request_alloc(tfm, GFP_KERNEL);
+-      if (!req) {
+-              cifs_server_dbg(VFS, "%s: Failed to alloc aead request\n", 
__func__);
++      creq = smb2_get_aead_req(tfm, rqst, num_rqst, sign, &iv, &req, &sg);
++      if (unlikely(!creq))
+               return -ENOMEM;
+-      }
+ 
+       if (!enc) {
+               memcpy(sign, &tr_hdr->Signature, SMB2_SIGNATURE_SIZE);
+               crypt_len += SMB2_SIGNATURE_SIZE;
+       }
+ 
+-      sg = init_sg(num_rqst, rqst, sign);
+-      if (!sg) {
+-              cifs_server_dbg(VFS, "%s: Failed to init sg\n", __func__);
+-              rc = -ENOMEM;
+-              goto free_req;
+-      }
+-
+-      iv_len = crypto_aead_ivsize(tfm);
+-      iv = kzalloc(iv_len, GFP_KERNEL);
+-      if (!iv) {
+-              cifs_server_dbg(VFS, "%s: Failed to alloc iv\n", __func__);
+-              rc = -ENOMEM;
+-              goto free_sg;
+-      }
+-
+       if ((server->cipher_type == SMB2_ENCRYPTION_AES128_GCM) ||
+           (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM))
+               memcpy(iv, (char *)tr_hdr->Nonce, SMB3_AES_GCM_NONCE);
+@@ -4386,6 +4382,7 @@ crypt_message(struct TCP_Server_Info *server, int 
num_rqst,
+               memcpy(iv + 1, (char *)tr_hdr->Nonce, SMB3_AES_CCM_NONCE);
+       }
+ 
++      aead_request_set_tfm(req, tfm);
+       aead_request_set_crypt(req, sg, sg, crypt_len, iv);
+       aead_request_set_ad(req, assoc_data_len);
+ 
+@@ -4398,11 +4395,7 @@ crypt_message(struct TCP_Server_Info *server, int 
num_rqst,
+       if (!rc && enc)
+               memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE);
+ 
+-      kfree_sensitive(iv);
+-free_sg:
+-      kfree_sensitive(sg);
+-free_req:
+-      kfree_sensitive(req);
++      kfree_sensitive(creq);
+       return rc;
+ }
+ 
+diff --git a/fs/udf/inode.c b/fs/udf/inode.c
+index dce6ae9ae306c..f713d108f21d3 100644
+--- a/fs/udf/inode.c
++++ b/fs/udf/inode.c
+@@ -439,6 +439,12 @@ static int udf_get_block(struct inode *inode, sector_t 
block,
+               iinfo->i_next_alloc_goal++;
+       }
+ 
++      /*
++       * Block beyond EOF and prealloc extents? Just discard preallocation
++       * as it is not useful and complicates things.
++       */
++      if (((loff_t)block) << inode->i_blkbits > iinfo->i_lenExtents)
++              udf_discard_prealloc(inode);
+       udf_clear_extent_cache(inode);
+       phys = inode_getblk(inode, block, &err, &new);
+       if (!phys)
+@@ -488,8 +494,6 @@ static int udf_do_extend_file(struct inode *inode,
+       uint32_t add;
+       int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
+       struct super_block *sb = inode->i_sb;
+-      struct kernel_lb_addr prealloc_loc = {};
+-      uint32_t prealloc_len = 0;
+       struct udf_inode_info *iinfo;
+       int err;
+ 
+@@ -510,19 +514,6 @@ static int udf_do_extend_file(struct inode *inode,
+                       ~(sb->s_blocksize - 1);
+       }
+ 
+-      /* Last extent are just preallocated blocks? */
+-      if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) ==
+-                                              EXT_NOT_RECORDED_ALLOCATED) {
+-              /* Save the extent so that we can reattach it to the end */
+-              prealloc_loc = last_ext->extLocation;
+-              prealloc_len = last_ext->extLength;
+-              /* Mark the extent as a hole */
+-              last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
+-                      (last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
+-              last_ext->extLocation.logicalBlockNum = 0;
+-              last_ext->extLocation.partitionReferenceNum = 0;
+-      }
+-
+       /* Can we merge with the previous extent? */
+       if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) ==
+                                       EXT_NOT_RECORDED_NOT_ALLOCATED) {
+@@ -550,7 +541,7 @@ static int udf_do_extend_file(struct inode *inode,
+                * more extents, we may need to enter possible following
+                * empty indirect extent.
+                */
+-              if (new_block_bytes || prealloc_len)
++              if (new_block_bytes)
+                       udf_next_aext(inode, last_pos, &tmploc, &tmplen, 0);
+       }
+ 
+@@ -584,17 +575,6 @@ static int udf_do_extend_file(struct inode *inode,
+       }
+ 
+ out:
+-      /* Do we have some preallocated blocks saved? */
+-      if (prealloc_len) {
+-              err = udf_add_aext(inode, last_pos, &prealloc_loc,
+-                                 prealloc_len, 1);
+-              if (err)
+-                      return err;
+-              last_ext->extLocation = prealloc_loc;
+-              last_ext->extLength = prealloc_len;
+-              count++;
+-      }
+-
+       /* last_pos should point to the last written extent... */
+       if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
+               last_pos->offset -= sizeof(struct short_ad);
+@@ -610,13 +590,17 @@ out:
+ static void udf_do_extend_final_block(struct inode *inode,
+                                     struct extent_position *last_pos,
+                                     struct kernel_long_ad *last_ext,
+-                                    uint32_t final_block_len)
++                                    uint32_t new_elen)
+ {
+-      struct super_block *sb = inode->i_sb;
+       uint32_t added_bytes;
+ 
+-      added_bytes = final_block_len -
+-                    (last_ext->extLength & (sb->s_blocksize - 1));
++      /*
++       * Extent already large enough? It may be already rounded up to block
++       * size...
++       */
++      if (new_elen <= (last_ext->extLength & UDF_EXTENT_LENGTH_MASK))
++              return;
++      added_bytes = (last_ext->extLength & UDF_EXTENT_LENGTH_MASK) - new_elen;
+       last_ext->extLength += added_bytes;
+       UDF_I(inode)->i_lenExtents += added_bytes;
+ 
+@@ -633,12 +617,12 @@ static int udf_extend_file(struct inode *inode, loff_t 
newsize)
+       int8_t etype;
+       struct super_block *sb = inode->i_sb;
+       sector_t first_block = newsize >> sb->s_blocksize_bits, offset;
+-      unsigned long partial_final_block;
++      loff_t new_elen;
+       int adsize;
+       struct udf_inode_info *iinfo = UDF_I(inode);
+       struct kernel_long_ad extent;
+       int err = 0;
+-      int within_final_block;
++      bool within_last_ext;
+ 
+       if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
+               adsize = sizeof(struct short_ad);
+@@ -647,8 +631,17 @@ static int udf_extend_file(struct inode *inode, loff_t 
newsize)
+       else
+               BUG();
+ 
++      /*
++       * When creating hole in file, just don't bother with preserving
++       * preallocation. It likely won't be very useful anyway.
++       */
++      udf_discard_prealloc(inode);
++
+       etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset);
+-      within_final_block = (etype != -1);
++      within_last_ext = (etype != -1);
++      /* We don't expect extents past EOF... */
++      WARN_ON_ONCE(within_last_ext &&
++                   elen > ((loff_t)offset + 1) << inode->i_blkbits);
+ 
+       if ((!epos.bh && epos.offset == udf_file_entry_alloc_offset(inode)) ||
+           (epos.bh && epos.offset == sizeof(struct allocExtDesc))) {
+@@ -664,19 +657,17 @@ static int udf_extend_file(struct inode *inode, loff_t 
newsize)
+               extent.extLength |= etype << 30;
+       }
+ 
+-      partial_final_block = newsize & (sb->s_blocksize - 1);
++      new_elen = ((loff_t)offset << inode->i_blkbits) |
++                                      (newsize & (sb->s_blocksize - 1));
+ 
+       /* File has extent covering the new size (could happen when extending
+        * inside a block)?
+        */
+-      if (within_final_block) {
++      if (within_last_ext) {
+               /* Extending file within the last file block */
+-              udf_do_extend_final_block(inode, &epos, &extent,
+-                                        partial_final_block);
++              udf_do_extend_final_block(inode, &epos, &extent, new_elen);
+       } else {
+-              loff_t add = ((loff_t)offset << sb->s_blocksize_bits) |
+-                           partial_final_block;
+-              err = udf_do_extend_file(inode, &epos, &extent, add);
++              err = udf_do_extend_file(inode, &epos, &extent, new_elen);
+       }
+ 
+       if (err < 0)
+@@ -777,10 +768,11 @@ static sector_t inode_getblk(struct inode *inode, 
sector_t block,
+               goto out_free;
+       }
+ 
+-      /* Are we beyond EOF? */
++      /* Are we beyond EOF and preallocated extent? */
+       if (etype == -1) {
+               int ret;
+               loff_t hole_len;
++
+               isBeyondEOF = true;
+               if (count) {
+                       if (c)
+diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c
+index 532cda99644ee..036ebd892b852 100644
+--- a/fs/udf/truncate.c
++++ b/fs/udf/truncate.c
+@@ -120,60 +120,42 @@ void udf_truncate_tail_extent(struct inode *inode)
+ 
+ void udf_discard_prealloc(struct inode *inode)
+ {
+-      struct extent_position epos = { NULL, 0, {0, 0} };
++      struct extent_position epos = {};
++      struct extent_position prev_epos = {};
+       struct kernel_lb_addr eloc;
+       uint32_t elen;
+       uint64_t lbcount = 0;
+       int8_t etype = -1, netype;
+-      int adsize;
+       struct udf_inode_info *iinfo = UDF_I(inode);
++      int bsize = 1 << inode->i_blkbits;
+ 
+       if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB ||
+-          inode->i_size == iinfo->i_lenExtents)
++          ALIGN(inode->i_size, bsize) == ALIGN(iinfo->i_lenExtents, bsize))
+               return;
+ 
+-      if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
+-              adsize = sizeof(struct short_ad);
+-      else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
+-              adsize = sizeof(struct long_ad);
+-      else
+-              adsize = 0;
+-
+       epos.block = iinfo->i_location;
+ 
+       /* Find the last extent in the file */
+-      while ((netype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) {
+-              etype = netype;
++      while ((netype = udf_next_aext(inode, &epos, &eloc, &elen, 0)) != -1) {
++              brelse(prev_epos.bh);
++              prev_epos = epos;
++              if (prev_epos.bh)
++                      get_bh(prev_epos.bh);
++
++              etype = udf_next_aext(inode, &epos, &eloc, &elen, 1);
+               lbcount += elen;
+       }
+       if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) {
+-              epos.offset -= adsize;
+               lbcount -= elen;
+-              extent_trunc(inode, &epos, &eloc, etype, elen, 0);
+-              if (!epos.bh) {
+-                      iinfo->i_lenAlloc =
+-                              epos.offset -
+-                              udf_file_entry_alloc_offset(inode);
+-                      mark_inode_dirty(inode);
+-              } else {
+-                      struct allocExtDesc *aed =
+-                              (struct allocExtDesc *)(epos.bh->b_data);
+-                      aed->lengthAllocDescs =
+-                              cpu_to_le32(epos.offset -
+-                                          sizeof(struct allocExtDesc));
+-                      if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
+-                          UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
+-                              udf_update_tag(epos.bh->b_data, epos.offset);
+-                      else
+-                              udf_update_tag(epos.bh->b_data,
+-                                             sizeof(struct allocExtDesc));
+-                      mark_buffer_dirty_inode(epos.bh, inode);
+-              }
++              udf_delete_aext(inode, prev_epos);
++              udf_free_blocks(inode->i_sb, inode, &eloc, 0,
++                              DIV_ROUND_UP(elen, 1 << inode->i_blkbits));
+       }
+       /* This inode entry is in-memory only and thus we don't have to mark
+        * the inode dirty */
+       iinfo->i_lenExtents = lbcount;
+       brelse(epos.bh);
++      brelse(prev_epos.bh);
+ }
+ 
+ static void udf_update_alloc_ext_desc(struct inode *inode,
+diff --git a/security/keys/encrypted-keys/encrypted.c 
b/security/keys/encrypted-keys/encrypted.c
+index e05cfc2e49aeb..1e313982af02a 100644
+--- a/security/keys/encrypted-keys/encrypted.c
++++ b/security/keys/encrypted-keys/encrypted.c
+@@ -627,7 +627,7 @@ static struct encrypted_key_payload 
*encrypted_key_alloc(struct key *key,
+                       pr_err("encrypted key: instantiation of keys using 
provided decrypted data is disabled since CONFIG_USER_DECRYPTED_DATA is set to 
false\n");
+                       return ERR_PTR(-EINVAL);
+               }
+-              if (strlen(decrypted_data) != decrypted_datalen) {
++              if (strlen(decrypted_data) != decrypted_datalen * 2) {
+                       pr_err("encrypted key: decrypted data provided does not 
match decrypted data length provided\n");
+                       return ERR_PTR(-EINVAL);
+               }
+@@ -791,8 +791,8 @@ static int encrypted_init(struct encrypted_key_payload 
*epayload,
+               ret = encrypted_key_decrypt(epayload, format, hex_encoded_iv);
+       } else if (decrypted_data) {
+               get_random_bytes(epayload->iv, ivsize);
+-              memcpy(epayload->decrypted_data, decrypted_data,
+-                                 epayload->decrypted_datalen);
++              ret = hex2bin(epayload->decrypted_data, decrypted_data,
++                            epayload->decrypted_datalen);
+       } else {
+               get_random_bytes(epayload->iv, ivsize);
+               get_random_bytes(epayload->decrypted_data, 
epayload->decrypted_datalen);
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index e5c0363856664..cf7c825078dc7 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -9354,6 +9354,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
+        SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", 
ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook 
PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook 
PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
++      SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", 
ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
++      SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", 
ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+       SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
+       SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
+       SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", 
ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
+diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c
+index 4221f73a74d01..3937f66c7f8d6 100644
+--- a/tools/lib/bpf/btf_dump.c
++++ b/tools/lib/bpf/btf_dump.c
+@@ -1963,7 +1963,7 @@ static int btf_dump_struct_data(struct btf_dump *d,
+ {
+       const struct btf_member *m = btf_members(t);
+       __u16 n = btf_vlen(t);
+-      int i, err;
++      int i, err = 0;
+ 
+       /* note that we increment depth before calling btf_dump_print() below;
+        * this is intentional.  btf_dump_data_newline() will not print a


Reply via email to