This is the 4.19.190 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmCU/1kACgkQONu9yGCS aT6KzBAAg01iYun5vyWHW6hIgKNeZ6CEDc6AL9awQbuwLUjaaQQKhfWfT5dUMxdQ ICE+y+obXX67Fzdd0JaTVtSOiu2stnCuEHFdJlproDYjKaodOmv6Vd1K2Noj8JyD B0tbGkQcWX57RZl3W1Lc+vyR7BRBjFSh6iHimI85y6s+q0WJvcYm2ScrQIJM3L4b Bd5g323lfPdTMgP+e/5hSHNk242hWoHY1RY/hHtOY4HoFg3M+gBYMBASrMAtdFgH bZArEAE7zIJQgdfcCWpUT5yuugZOJLXUQKIw8A5XvRtaL1cQQnH/+tlU8NZ0FqgA llyfAt0X6sO82lDPaUk3CZeFHKTljH5Gu6+0d6COyljv01xTk9fDxy0/G5t3dWU7 lDq4mutCBkLIMMU/PkEz4OVjMTy29spJk3EVpwEWeUoPmrrLf5Bx5AGe7ruadyR8 3h1IKXGF5yYf27X5mPB5049OhmeEUFS+xPEEVyioQruRv9nD+Kibp+UVgBaQstt+ qfjcIeeETfsWwUnI91kRBqgfHNf22bre3r2ve6lyNjb7bRNHcOu9GeyMxte6Iszt T+ifrLhHeGzKdrkDuZ8RY+zjK0iZgNVGfl4eXk8AUXzH5xaUW7Ys/blW5XZTP181 aD1Ul2YXQtGDJwZzfZIjN/7kT9RnSJ4MQcenMiewVjzScitxyOA= =OUid -----END PGP SIGNATURE----- Merge 4.19.190 into android-4.19-stable Changes in 4.19.190 erofs: fix extended inode could cross boundary ACPI: tables: x86: Reserve memory occupied by ACPI tables ACPI: x86: Call acpi_boot_table_init() after acpi_table_upgrade() net: usb: ax88179_178a: initialize local variables before use iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_enqueue_hcmd() mips: Do not include hi and lo in clobber list for R6 bpf: Fix masking negation logic upon negative dst register iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_gen2_enqueue_hcmd() ALSA: usb-audio: Add MIDI quirk for Vox ToneLab EX USB: Add LPM quirk for Lenovo ThinkPad USB-C Dock Gen2 Ethernet USB: Add reset-resume quirk for WD19's Realtek Hub platform/x86: thinkpad_acpi: Correct thermal sensor allocation ovl: allow upperdir inside lowerdir Linux 4.19.190 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ic34f20acac4f14f3d6c659086fcf5dfe6c3fed04
This commit is contained in:
commit
8ce2f3d6f2
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 189
|
||||
SUBLEVEL = 190
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
@ -18,6 +18,12 @@
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/vdso.h>
|
||||
|
||||
#if MIPS_ISA_REV < 6
|
||||
#define VDSO_SYSCALL_CLOBBERS "hi", "lo",
|
||||
#else
|
||||
#define VDSO_SYSCALL_CLOBBERS
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
||||
|
||||
static __always_inline long gettimeofday_fallback(struct timeval *_tv,
|
||||
@ -34,7 +40,9 @@ static __always_inline long gettimeofday_fallback(struct timeval *_tv,
|
||||
: "=r" (ret), "=r" (error)
|
||||
: "r" (tv), "r" (tz), "r" (nr)
|
||||
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
|
||||
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
|
||||
"$14", "$15", "$24", "$25",
|
||||
VDSO_SYSCALL_CLOBBERS
|
||||
"memory");
|
||||
|
||||
return error ? -ret : ret;
|
||||
}
|
||||
@ -55,7 +63,9 @@ static __always_inline long clock_gettime_fallback(clockid_t _clkid,
|
||||
: "=r" (ret), "=r" (error)
|
||||
: "r" (clkid), "r" (ts), "r" (nr)
|
||||
: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
|
||||
"$14", "$15", "$24", "$25", "hi", "lo", "memory");
|
||||
"$14", "$15", "$24", "$25",
|
||||
VDSO_SYSCALL_CLOBBERS
|
||||
"memory");
|
||||
|
||||
return error ? -ret : ret;
|
||||
}
|
||||
|
@ -1565,10 +1565,18 @@ void __init acpi_boot_table_init(void)
|
||||
/*
|
||||
* Initialize the ACPI boot-time table parser.
|
||||
*/
|
||||
if (acpi_table_init()) {
|
||||
if (acpi_locate_initial_tables())
|
||||
disable_acpi();
|
||||
return;
|
||||
}
|
||||
else
|
||||
acpi_reserve_initial_tables();
|
||||
}
|
||||
|
||||
int __init early_acpi_boot_init(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return 1;
|
||||
|
||||
acpi_table_init_complete();
|
||||
|
||||
acpi_table_parse(ACPI_SIG_BOOT, acpi_parse_sbf);
|
||||
|
||||
@ -1581,18 +1589,9 @@ void __init acpi_boot_table_init(void)
|
||||
} else {
|
||||
printk(KERN_WARNING PREFIX "Disabling ACPI support\n");
|
||||
disable_acpi();
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int __init early_acpi_boot_init(void)
|
||||
{
|
||||
/*
|
||||
* If acpi_disabled, bail out
|
||||
*/
|
||||
if (acpi_disabled)
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* Process the Multiple APIC Description Table (MADT), if present
|
||||
|
@ -1176,6 +1176,8 @@ void __init setup_arch(char **cmdline_p)
|
||||
reserve_initrd();
|
||||
|
||||
acpi_table_upgrade();
|
||||
/* Look for ACPI tables and reserve memory occupied by them. */
|
||||
acpi_boot_table_init();
|
||||
|
||||
vsmp_init();
|
||||
|
||||
@ -1183,11 +1185,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
early_platform_quirks();
|
||||
|
||||
/*
|
||||
* Parse the ACPI tables for possible boot-time SMP configuration.
|
||||
*/
|
||||
acpi_boot_table_init();
|
||||
|
||||
early_acpi_boot_init();
|
||||
|
||||
initmem_init();
|
||||
|
@ -732,7 +732,7 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
|
||||
}
|
||||
|
||||
/*
|
||||
* acpi_table_init()
|
||||
* acpi_locate_initial_tables()
|
||||
*
|
||||
* find RSDP, find and checksum SDT/XSDT.
|
||||
* checksum all tables, print SDT/XSDT
|
||||
@ -740,7 +740,7 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
|
||||
* result: sdt_entry[] is initialized
|
||||
*/
|
||||
|
||||
int __init acpi_table_init(void)
|
||||
int __init acpi_locate_initial_tables(void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
@ -755,9 +755,45 @@ int __init acpi_table_init(void)
|
||||
status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -EINVAL;
|
||||
acpi_table_initrd_scan();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init acpi_reserve_initial_tables(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ACPI_MAX_TABLES; i++) {
|
||||
struct acpi_table_desc *table_desc = &initial_tables[i];
|
||||
u64 start = table_desc->address;
|
||||
u64 size = table_desc->length;
|
||||
|
||||
if (!start || !size)
|
||||
break;
|
||||
|
||||
pr_info("Reserving %4s table memory at [mem 0x%llx-0x%llx]\n",
|
||||
table_desc->signature.ascii, start, start + size - 1);
|
||||
|
||||
memblock_reserve(start, size);
|
||||
}
|
||||
}
|
||||
|
||||
void __init acpi_table_init_complete(void)
|
||||
{
|
||||
acpi_table_initrd_scan();
|
||||
check_multiple_madt();
|
||||
}
|
||||
|
||||
int __init acpi_table_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = acpi_locate_initial_tables();
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
acpi_table_init_complete();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -307,12 +307,12 @@ static int ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
|
||||
int ret;
|
||||
|
||||
if (2 == size) {
|
||||
u16 buf;
|
||||
u16 buf = 0;
|
||||
ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 0);
|
||||
le16_to_cpus(&buf);
|
||||
*((u16 *)data) = buf;
|
||||
} else if (4 == size) {
|
||||
u32 buf;
|
||||
u32 buf = 0;
|
||||
ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 0);
|
||||
le32_to_cpus(&buf);
|
||||
*((u32 *)data) = buf;
|
||||
|
@ -654,6 +654,7 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans,
|
||||
const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD];
|
||||
u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD];
|
||||
struct iwl_tfh_tfd *tfd;
|
||||
unsigned long flags2;
|
||||
|
||||
copy_size = sizeof(struct iwl_cmd_header_wide);
|
||||
cmd_size = sizeof(struct iwl_cmd_header_wide);
|
||||
@ -722,14 +723,14 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans,
|
||||
goto free_dup_buf;
|
||||
}
|
||||
|
||||
spin_lock_bh(&txq->lock);
|
||||
spin_lock_irqsave(&txq->lock, flags2);
|
||||
|
||||
idx = iwl_pcie_get_cmd_index(txq, txq->write_ptr);
|
||||
tfd = iwl_pcie_get_tfd(trans, txq, txq->write_ptr);
|
||||
memset(tfd, 0, sizeof(*tfd));
|
||||
|
||||
if (iwl_queue_space(trans, txq) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
|
||||
spin_unlock_bh(&txq->lock);
|
||||
spin_unlock_irqrestore(&txq->lock, flags2);
|
||||
|
||||
IWL_ERR(trans, "No space in command queue\n");
|
||||
iwl_op_mode_cmd_queue_full(trans->op_mode);
|
||||
@ -870,7 +871,7 @@ static int iwl_pcie_gen2_enqueue_hcmd(struct iwl_trans *trans,
|
||||
spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
|
||||
|
||||
out:
|
||||
spin_unlock_bh(&txq->lock);
|
||||
spin_unlock_irqrestore(&txq->lock, flags2);
|
||||
free_dup_buf:
|
||||
if (idx < 0)
|
||||
kfree(dup_buf);
|
||||
|
@ -1495,6 +1495,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
|
||||
u32 cmd_pos;
|
||||
const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD];
|
||||
u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD];
|
||||
unsigned long flags2;
|
||||
|
||||
if (WARN(!trans->wide_cmd_header &&
|
||||
group_id > IWL_ALWAYS_LONG_GROUP,
|
||||
@ -1578,10 +1579,10 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
|
||||
goto free_dup_buf;
|
||||
}
|
||||
|
||||
spin_lock_bh(&txq->lock);
|
||||
spin_lock_irqsave(&txq->lock, flags2);
|
||||
|
||||
if (iwl_queue_space(trans, txq) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
|
||||
spin_unlock_bh(&txq->lock);
|
||||
spin_unlock_irqrestore(&txq->lock, flags2);
|
||||
|
||||
IWL_ERR(trans, "No space in command queue\n");
|
||||
iwl_op_mode_cmd_queue_full(trans->op_mode);
|
||||
@ -1742,7 +1743,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
|
||||
spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
|
||||
|
||||
out:
|
||||
spin_unlock_bh(&txq->lock);
|
||||
spin_unlock_irqrestore(&txq->lock, flags2);
|
||||
free_dup_buf:
|
||||
if (idx < 0)
|
||||
kfree(dup_buf);
|
||||
|
@ -6300,6 +6300,7 @@ enum thermal_access_mode {
|
||||
enum { /* TPACPI_THERMAL_TPEC_* */
|
||||
TP_EC_THERMAL_TMP0 = 0x78, /* ACPI EC regs TMP 0..7 */
|
||||
TP_EC_THERMAL_TMP8 = 0xC0, /* ACPI EC regs TMP 8..15 */
|
||||
TP_EC_FUNCREV = 0xEF, /* ACPI EC Functional revision */
|
||||
TP_EC_THERMAL_TMP_NA = -128, /* ACPI EC sensor not available */
|
||||
|
||||
TPACPI_THERMAL_SENSOR_NA = -128000, /* Sensor not available */
|
||||
@ -6498,7 +6499,7 @@ static const struct attribute_group thermal_temp_input8_group = {
|
||||
|
||||
static int __init thermal_init(struct ibm_init_struct *iibm)
|
||||
{
|
||||
u8 t, ta1, ta2;
|
||||
u8 t, ta1, ta2, ver = 0;
|
||||
int i;
|
||||
int acpi_tmp7;
|
||||
int res;
|
||||
@ -6513,7 +6514,14 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
|
||||
* 0x78-0x7F, 0xC0-0xC7. Registers return 0x00 for
|
||||
* non-implemented, thermal sensors return 0x80 when
|
||||
* not available
|
||||
* The above rule is unfortunately flawed. This has been seen with
|
||||
* 0xC2 (power supply ID) causing thermal control problems.
|
||||
* The EC version can be determined by offset 0xEF and at least for
|
||||
* version 3 the Lenovo firmware team confirmed that registers 0xC0-0xC7
|
||||
* are not thermal registers.
|
||||
*/
|
||||
if (!acpi_ec_read(TP_EC_FUNCREV, &ver))
|
||||
pr_warn("Thinkpad ACPI EC unable to access EC version\n");
|
||||
|
||||
ta1 = ta2 = 0;
|
||||
for (i = 0; i < 8; i++) {
|
||||
@ -6523,11 +6531,13 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
|
||||
ta1 = 0;
|
||||
break;
|
||||
}
|
||||
if (acpi_ec_read(TP_EC_THERMAL_TMP8 + i, &t)) {
|
||||
ta2 |= t;
|
||||
} else {
|
||||
ta1 = 0;
|
||||
break;
|
||||
if (ver < 3) {
|
||||
if (acpi_ec_read(TP_EC_THERMAL_TMP8 + i, &t)) {
|
||||
ta2 |= t;
|
||||
} else {
|
||||
ta1 = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ta1 == 0) {
|
||||
@ -6540,9 +6550,12 @@ static int __init thermal_init(struct ibm_init_struct *iibm)
|
||||
thermal_read_mode = TPACPI_THERMAL_NONE;
|
||||
}
|
||||
} else {
|
||||
thermal_read_mode =
|
||||
(ta2 != 0) ?
|
||||
TPACPI_THERMAL_TPEC_16 : TPACPI_THERMAL_TPEC_8;
|
||||
if (ver >= 3)
|
||||
thermal_read_mode = TPACPI_THERMAL_TPEC_8;
|
||||
else
|
||||
thermal_read_mode =
|
||||
(ta2 != 0) ?
|
||||
TPACPI_THERMAL_TPEC_16 : TPACPI_THERMAL_TPEC_8;
|
||||
}
|
||||
} else if (acpi_tmp7) {
|
||||
if (tpacpi_is_ibm() &&
|
||||
|
@ -14,26 +14,78 @@
|
||||
|
||||
#include <trace/events/erofs.h>
|
||||
|
||||
/* no locking */
|
||||
static int read_inode(struct inode *inode, void *data)
|
||||
/*
|
||||
* if inode is successfully read, return its inode page (or sometimes
|
||||
* the inode payload page if it's an extended inode) in order to fill
|
||||
* inline data if possible.
|
||||
*/
|
||||
static struct page *read_inode(struct inode *inode, unsigned int *ofs)
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct erofs_sb_info *sbi = EROFS_SB(sb);
|
||||
struct erofs_vnode *vi = EROFS_V(inode);
|
||||
struct erofs_inode_v1 *v1 = data;
|
||||
const unsigned advise = le16_to_cpu(v1->i_advise);
|
||||
const erofs_off_t inode_loc = iloc(sbi, vi->nid);
|
||||
erofs_blk_t blkaddr;
|
||||
struct page *page;
|
||||
struct erofs_inode_v1 *v1;
|
||||
struct erofs_inode_v2 *v2, *copied = NULL;
|
||||
unsigned int ifmt;
|
||||
int err;
|
||||
|
||||
vi->data_mapping_mode = __inode_data_mapping(advise);
|
||||
blkaddr = erofs_blknr(inode_loc);
|
||||
*ofs = erofs_blkoff(inode_loc);
|
||||
|
||||
debugln("%s, reading inode nid %llu at %u of blkaddr %u",
|
||||
__func__, vi->nid, *ofs, blkaddr);
|
||||
|
||||
page = erofs_get_meta_page(sb, blkaddr, false);
|
||||
if (IS_ERR(page)) {
|
||||
errln("failed to get inode (nid: %llu) page, err %ld",
|
||||
vi->nid, PTR_ERR(page));
|
||||
return page;
|
||||
}
|
||||
|
||||
v1 = page_address(page) + *ofs;
|
||||
ifmt = le16_to_cpu(v1->i_advise);
|
||||
|
||||
vi->data_mapping_mode = __inode_data_mapping(ifmt);
|
||||
if (unlikely(vi->data_mapping_mode >= EROFS_INODE_LAYOUT_MAX)) {
|
||||
errln("unknown data mapping mode %u of nid %llu",
|
||||
vi->data_mapping_mode, vi->nid);
|
||||
DBG_BUGON(1);
|
||||
return -EIO;
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (__inode_version(advise) == EROFS_INODE_LAYOUT_V2) {
|
||||
struct erofs_inode_v2 *v2 = data;
|
||||
|
||||
switch (__inode_version(ifmt)) {
|
||||
case EROFS_INODE_LAYOUT_V2:
|
||||
vi->inode_isize = sizeof(struct erofs_inode_v2);
|
||||
/* check if the inode acrosses page boundary */
|
||||
if (*ofs + vi->inode_isize <= PAGE_SIZE) {
|
||||
*ofs += vi->inode_isize;
|
||||
v2 = (struct erofs_inode_v2 *)v1;
|
||||
} else {
|
||||
const unsigned int gotten = PAGE_SIZE - *ofs;
|
||||
|
||||
copied = kmalloc(vi->inode_isize, GFP_NOFS);
|
||||
if (!copied) {
|
||||
err = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
memcpy(copied, v1, gotten);
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
|
||||
page = erofs_get_meta_page(sb, blkaddr + 1, false);
|
||||
if (IS_ERR(page)) {
|
||||
errln("failed to get inode payload page (nid: %llu), err %ld",
|
||||
vi->nid, PTR_ERR(page));
|
||||
kfree(copied);
|
||||
return page;
|
||||
}
|
||||
*ofs = vi->inode_isize - gotten;
|
||||
memcpy((u8 *)copied + gotten, page_address(page), *ofs);
|
||||
v2 = copied;
|
||||
}
|
||||
vi->xattr_isize = ondisk_xattr_ibody_size(v2->i_xattr_icount);
|
||||
|
||||
inode->i_mode = le16_to_cpu(v2->i_mode);
|
||||
@ -46,7 +98,7 @@ static int read_inode(struct inode *inode, void *data)
|
||||
} else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
|
||||
inode->i_rdev = 0;
|
||||
} else {
|
||||
return -EIO;
|
||||
goto bogusimode;
|
||||
}
|
||||
|
||||
i_uid_write(inode, le32_to_cpu(v2->i_uid));
|
||||
@ -58,10 +110,11 @@ static int read_inode(struct inode *inode, void *data)
|
||||
inode->i_ctime.tv_nsec = le32_to_cpu(v2->i_ctime_nsec);
|
||||
|
||||
inode->i_size = le64_to_cpu(v2->i_size);
|
||||
} else if (__inode_version(advise) == EROFS_INODE_LAYOUT_V1) {
|
||||
struct erofs_sb_info *sbi = EROFS_SB(inode->i_sb);
|
||||
|
||||
kfree(copied);
|
||||
break;
|
||||
case EROFS_INODE_LAYOUT_V1:
|
||||
vi->inode_isize = sizeof(struct erofs_inode_v1);
|
||||
*ofs += vi->inode_isize;
|
||||
vi->xattr_isize = ondisk_xattr_ibody_size(v1->i_xattr_icount);
|
||||
|
||||
inode->i_mode = le16_to_cpu(v1->i_mode);
|
||||
@ -74,7 +127,7 @@ static int read_inode(struct inode *inode, void *data)
|
||||
} else if (S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
|
||||
inode->i_rdev = 0;
|
||||
} else {
|
||||
return -EIO;
|
||||
goto bogusimode;
|
||||
}
|
||||
|
||||
i_uid_write(inode, le16_to_cpu(v1->i_uid));
|
||||
@ -86,11 +139,12 @@ static int read_inode(struct inode *inode, void *data)
|
||||
inode->i_ctime.tv_nsec = sbi->build_time_nsec;
|
||||
|
||||
inode->i_size = le32_to_cpu(v1->i_size);
|
||||
} else {
|
||||
break;
|
||||
default:
|
||||
errln("unsupported on-disk inode version %u of nid %llu",
|
||||
__inode_version(advise), vi->nid);
|
||||
DBG_BUGON(1);
|
||||
return -EIO;
|
||||
__inode_version(ifmt), vi->nid);
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
inode->i_mtime.tv_sec = inode->i_ctime.tv_sec;
|
||||
@ -100,7 +154,16 @@ static int read_inode(struct inode *inode, void *data)
|
||||
|
||||
/* measure inode.i_blocks as the generic filesystem */
|
||||
inode->i_blocks = ((inode->i_size - 1) >> 9) + 1;
|
||||
return 0;
|
||||
return page;
|
||||
bogusimode:
|
||||
errln("bogus i_mode (%o) @ nid %llu", inode->i_mode, vi->nid);
|
||||
err = -EIO;
|
||||
err_out:
|
||||
DBG_BUGON(1);
|
||||
kfree(copied);
|
||||
unlock_page(page);
|
||||
put_page(page);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -132,7 +195,7 @@ static int fill_inline_data(struct inode *inode, void *data, unsigned m_pofs)
|
||||
if (unlikely(lnk == NULL))
|
||||
return -ENOMEM;
|
||||
|
||||
m_pofs += vi->inode_isize + vi->xattr_isize;
|
||||
m_pofs += vi->xattr_isize;
|
||||
|
||||
/* inline symlink data shouldn't across page boundary as well */
|
||||
if (unlikely(m_pofs + inode->i_size > PAGE_SIZE)) {
|
||||
@ -153,35 +216,17 @@ static int fill_inline_data(struct inode *inode, void *data, unsigned m_pofs)
|
||||
|
||||
static int fill_inode(struct inode *inode, int isdir)
|
||||
{
|
||||
struct erofs_sb_info *sbi = EROFS_SB(inode->i_sb);
|
||||
struct erofs_vnode *vi = EROFS_V(inode);
|
||||
struct page *page;
|
||||
void *data;
|
||||
int err;
|
||||
erofs_blk_t blkaddr;
|
||||
unsigned ofs;
|
||||
unsigned int ofs;
|
||||
int err = 0;
|
||||
|
||||
trace_erofs_fill_inode(inode, isdir);
|
||||
|
||||
blkaddr = erofs_blknr(iloc(sbi, vi->nid));
|
||||
ofs = erofs_blkoff(iloc(sbi, vi->nid));
|
||||
|
||||
debugln("%s, reading inode nid %llu at %u of blkaddr %u",
|
||||
__func__, vi->nid, ofs, blkaddr);
|
||||
|
||||
page = erofs_get_meta_page(inode->i_sb, blkaddr, isdir);
|
||||
|
||||
/* read inode base data from disk */
|
||||
page = read_inode(inode, &ofs);
|
||||
if (IS_ERR(page)) {
|
||||
errln("failed to get inode (nid: %llu) page, err %ld",
|
||||
vi->nid, PTR_ERR(page));
|
||||
return PTR_ERR(page);
|
||||
}
|
||||
|
||||
DBG_BUGON(!PageUptodate(page));
|
||||
data = page_address(page);
|
||||
|
||||
err = read_inode(inode, data + ofs);
|
||||
if (!err) {
|
||||
} else {
|
||||
/* setup the new inode */
|
||||
if (S_ISREG(inode->i_mode)) {
|
||||
#ifdef CONFIG_EROFS_FS_XATTR
|
||||
@ -229,7 +274,7 @@ static int fill_inode(struct inode *inode, int isdir)
|
||||
inode->i_mapping->a_ops = &erofs_raw_access_aops;
|
||||
|
||||
/* fill last page if inline data is available */
|
||||
fill_inline_data(inode, data, ofs);
|
||||
fill_inline_data(inode, page_address(page), ofs);
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
|
@ -406,6 +406,7 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
|
||||
/* Realtek hub in Dell WD19 (Type-C) */
|
||||
{ USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
|
||||
{ USB_DEVICE(0x0bda, 0x5487), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Generic RTL8153 based ethernet adapters */
|
||||
{ USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM },
|
||||
@ -438,6 +439,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
{ USB_DEVICE(0x17ef, 0xa012), .driver_info =
|
||||
USB_QUIRK_DISCONNECT_SUSPEND },
|
||||
|
||||
/* Lenovo ThinkPad USB-C Dock Gen2 Ethernet (RTL8153 GigE) */
|
||||
{ USB_DEVICE(0x17ef, 0xa387), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* BUILDWIN Photo Frame */
|
||||
{ USB_DEVICE(0x1908, 0x1315), .driver_info =
|
||||
USB_QUIRK_HONOR_BNUMINTERFACES },
|
||||
|
@ -1518,7 +1518,8 @@ out_err:
|
||||
* - upper/work dir of any overlayfs instance
|
||||
*/
|
||||
static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs,
|
||||
struct dentry *dentry, const char *name)
|
||||
struct dentry *dentry, const char *name,
|
||||
bool is_lower)
|
||||
{
|
||||
struct dentry *next = dentry, *parent;
|
||||
int err = 0;
|
||||
@ -1530,7 +1531,7 @@ static int ovl_check_layer(struct super_block *sb, struct ovl_fs *ofs,
|
||||
|
||||
/* Walk back ancestors to root (inclusive) looking for traps */
|
||||
while (!err && parent != next) {
|
||||
if (ovl_lookup_trap_inode(sb, parent)) {
|
||||
if (is_lower && ovl_lookup_trap_inode(sb, parent)) {
|
||||
err = -ELOOP;
|
||||
pr_err("overlayfs: overlapping %s path\n", name);
|
||||
} else if (ovl_is_inuse(parent)) {
|
||||
@ -1556,7 +1557,7 @@ static int ovl_check_overlapping_layers(struct super_block *sb,
|
||||
|
||||
if (ofs->upper_mnt) {
|
||||
err = ovl_check_layer(sb, ofs, ofs->upper_mnt->mnt_root,
|
||||
"upperdir");
|
||||
"upperdir", false);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -1567,7 +1568,8 @@ static int ovl_check_overlapping_layers(struct super_block *sb,
|
||||
* workbasedir. In that case, we already have their traps in
|
||||
* inode cache and we will catch that case on lookup.
|
||||
*/
|
||||
err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir");
|
||||
err = ovl_check_layer(sb, ofs, ofs->workbasedir, "workdir",
|
||||
false);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@ -1575,7 +1577,7 @@ static int ovl_check_overlapping_layers(struct super_block *sb,
|
||||
for (i = 0; i < ofs->numlower; i++) {
|
||||
err = ovl_check_layer(sb, ofs,
|
||||
ofs->lower_layers[i].mnt->mnt_root,
|
||||
"lowerdir");
|
||||
"lowerdir", true);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
@ -230,10 +230,14 @@ void __iomem *__acpi_map_table(unsigned long phys, unsigned long size);
|
||||
void __acpi_unmap_table(void __iomem *map, unsigned long size);
|
||||
int early_acpi_boot_init(void);
|
||||
int acpi_boot_init (void);
|
||||
void acpi_boot_table_prepare (void);
|
||||
void acpi_boot_table_init (void);
|
||||
int acpi_mps_check (void);
|
||||
int acpi_numa_init (void);
|
||||
|
||||
int acpi_locate_initial_tables (void);
|
||||
void acpi_reserve_initial_tables (void);
|
||||
void acpi_table_init_complete (void);
|
||||
int acpi_table_init (void);
|
||||
int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
|
||||
int __init acpi_table_parse_entries(char *id, unsigned long table_size,
|
||||
@ -734,9 +738,12 @@ static inline int acpi_boot_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void acpi_boot_table_prepare(void)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void acpi_boot_table_init(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int acpi_mps_check(void)
|
||||
|
@ -6099,14 +6099,10 @@ static int fixup_bpf_calls(struct bpf_verifier_env *env)
|
||||
*patch++ = BPF_ALU64_REG(BPF_OR, BPF_REG_AX, off_reg);
|
||||
*patch++ = BPF_ALU64_IMM(BPF_NEG, BPF_REG_AX, 0);
|
||||
*patch++ = BPF_ALU64_IMM(BPF_ARSH, BPF_REG_AX, 63);
|
||||
if (issrc) {
|
||||
*patch++ = BPF_ALU64_REG(BPF_AND, BPF_REG_AX,
|
||||
off_reg);
|
||||
insn->src_reg = BPF_REG_AX;
|
||||
} else {
|
||||
*patch++ = BPF_ALU64_REG(BPF_AND, off_reg,
|
||||
BPF_REG_AX);
|
||||
}
|
||||
*patch++ = BPF_ALU64_REG(BPF_AND, BPF_REG_AX, off_reg);
|
||||
if (!issrc)
|
||||
*patch++ = BPF_MOV64_REG(insn->dst_reg, insn->src_reg);
|
||||
insn->src_reg = BPF_REG_AX;
|
||||
if (isneg)
|
||||
insn->code = insn->code == code_add ?
|
||||
code_sub : code_add;
|
||||
|
@ -2499,6 +2499,16 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
USB_DEVICE_VENDOR_SPEC(0x0944, 0x0204),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "KORG, Inc.",
|
||||
/* .product_name = "ToneLab EX", */
|
||||
.ifnum = 3,
|
||||
.type = QUIRK_MIDI_STANDARD_INTERFACE,
|
||||
}
|
||||
},
|
||||
|
||||
/* AKAI devices */
|
||||
{
|
||||
USB_DEVICE(0x09e8, 0x0062),
|
||||
|
Loading…
Reference in New Issue
Block a user