mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
Merge 6.1.1 into android14-6.1
Changes in 6.1.1 x86/vdso: Conditionally export __vdso_sgx_enter_enclave() libbpf: Fix uninitialized warning in btf_dump_dump_type_data PCI: mt7621: Add sentinel to quirks table mips: ralink: mt7621: define MT7621_SYSC_BASE with __iomem mips: ralink: mt7621: soc queries and tests as functions mips: ralink: mt7621: do not use kzalloc too early irqchip/ls-extirq: Fix endianness detection udf: Discard preallocation before extending file with a hole udf: Fix preallocation discarding at indirect extent boundary udf: Do not bother looking for prealloc extents if i_lenExtents matches i_size udf: Fix extending file within last block usb: gadget: uvc: Prevent buffer overflow in setup handler USB: serial: option: add Quectel EM05-G modem USB: serial: cp210x: add Kamstrup RF sniffer PIDs USB: serial: f81232: fix division by zero on line-speed change USB: serial: f81534: fix division by zero on line-speed change ALSA: hda/realtek: fix mute/micmute LEDs for a HP ProBook xhci: Apply XHCI_RESET_TO_DEFAULT quirk to ADL-N staging: r8188eu: fix led register settings igb: Initialize mailbox message for VF reset usb: typec: ucsi: Resume in separate work usb: dwc3: pci: Update PCIe device ID for USB3 controller on CPU sub-system for Raptor Lake cifs: fix oops during encryption KEYS: encrypted: fix key instantiation with user-provided data Linux 6.1.1 Change-Id: I1a5f3cb051882695d6a33dc6a852415cd7a81b9a Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -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
|
||||
|
||||
2
Makefile
2
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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -27,7 +27,9 @@ VERSION {
|
||||
__vdso_time;
|
||||
clock_getres;
|
||||
__vdso_clock_getres;
|
||||
#ifdef CONFIG_X86_SGX
|
||||
__vdso_sgx_enter_enclave;
|
||||
#endif
|
||||
local: *;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) },
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
/* 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)
|
||||
{
|
||||
unsigned int sg_len;
|
||||
struct scatterlist *sg;
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
unsigned int idx = 0;
|
||||
int skip;
|
||||
*num_sgs = cifs_get_num_sgs(rqst, num_rqst, sig);
|
||||
|
||||
sg_len = 1;
|
||||
for (i = 0; i < num_rqst; i++)
|
||||
sg_len += rqst[i].rq_nvec + rqst[i].rq_npages;
|
||||
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);
|
||||
|
||||
sg = kmalloc_array(sg_len, sizeof(struct scatterlist), GFP_KERNEL);
|
||||
if (!sg)
|
||||
p = kmalloc(len, GFP_ATOMIC);
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
sg_init_table(sg, sg_len);
|
||||
*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;
|
||||
}
|
||||
|
||||
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 off, len, skip;
|
||||
struct scatterlist *sg;
|
||||
unsigned int num_sgs;
|
||||
unsigned long addr;
|
||||
int i, j;
|
||||
void *p;
|
||||
|
||||
p = smb2_aead_req_alloc(tfm, rqst, num_rqst, sig, iv, req, sgl, &num_sgs);
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
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
|
||||
*/
|
||||
struct kvec *iov = &rqst[i].rq_iov[j];
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user