This is the 5.10.160 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmOgSqgACgkQONu9yGCS aT6PWg//bFmnSISFtQsDr4zPa+72T57cQYifyZhz0hQWjVQltUbfDtTwY7VEp2ec SWW7Nv6A+n0iH4jGOUJjK1/9R2ZrNwBxAsDT/8d7gHh08HUfogZAKZ3dUh/xj+QL djMM/yBfRa+RIn4x9rtnBNz7rENFKW15cF329xVyPK/zMYyNuiqhx/m+jbmed9Fd 5rTNyK46MuxP76uVvm+SdG4az52/S3llIVEHRoeUSV3RLgj9wG2DMrezI6jKhc7+ vqPBpsLKvrd6MQX39psbbtoNuHyfD/hSRBoqFvXj0MzO6PbDRRe67/myxr56jxtx vRniuU92jp1ttuFwWChuC1vGcmhHqaMazfi2pa6qhBMbL0cGr4XxerrT8w32Daun Lb0v214gaTY8QvsWlHJivtBRh3A64pwn1Ne02QTantq7OnGA8RNpoEjku7Grcd69 yGJOsFq+Dsm5JithVhOa1p/zpBF5ZabfMslKSPJ4tXOM42GcxshY9oTmbJXbDDNb xijJYxiLqi6NJlzTxzRswTufk8/ctZ9jvAR9NaJ+dcvQ8dgnpvJJ4iNQVC6/CTgO OZRCAcXcDp/lRqadomrYhnMJUHK2f+V/7pgMVQsqaZTmXz4j9F6FYgKKc3Y1qBNu 3TVlmfyQb7NzoTFqAddA5mXtbUZGGAbSGEWQ4uxCXwxmuRo2seM= =09AO -----END PGP SIGNATURE----- Merge 5.10.160 into android12-5.10-lts Changes in 5.10.160 x86/smpboot: Move rcu_cpu_starting() earlier vfs: fix copy_file_range() regression in cross-fs copies vfs: fix copy_file_range() averts filesystem freeze protection nfp: fix use-after-free in area_cache_get() fuse: always revalidate if exclusive create io_uring: add missing item types for splice request ASoC: fsl_micfil: explicitly clear software reset bit ASoC: fsl_micfil: explicitly clear CHnF flags ASoC: ops: Check bounds for second channel in snd_soc_put_volsw_sx() libbpf: Use page size as max_entries when probing ring buffer map pinctrl: meditatek: Startup with the IRQs disabled can: sja1000: fix size of OCR_MODE_MASK define can: mcba_usb: Fix termination command argument ASoC: cs42l51: Correct PGA Volume minimum value nvme-pci: clear the prp2 field when not used ASoC: ops: Correct bounds check for second channel on SX controls Linux 5.10.160 Change-Id: Id555b76c84a3e036cff308e47db60e7538980eb2 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
003c389455
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 159
|
||||
SUBLEVEL = 160
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
|
@ -794,8 +794,6 @@ void mtrr_ap_init(void)
|
||||
if (!use_intel() || mtrr_aps_delayed_init)
|
||||
return;
|
||||
|
||||
rcu_cpu_starting(smp_processor_id());
|
||||
|
||||
/*
|
||||
* Ideally we should hold mtrr_mutex here to avoid mtrr entries
|
||||
* changed, but this routine will be called in cpu boot time,
|
||||
|
@ -229,6 +229,7 @@ static void notrace start_secondary(void *unused)
|
||||
#endif
|
||||
cpu_init_exception_handling();
|
||||
cpu_init();
|
||||
rcu_cpu_starting(raw_smp_processor_id());
|
||||
x86_cpuinit.early_percpu_clock_init();
|
||||
smp_callin();
|
||||
|
||||
|
@ -47,6 +47,10 @@
|
||||
#define MCBA_VER_REQ_USB 1
|
||||
#define MCBA_VER_REQ_CAN 2
|
||||
|
||||
/* Drive the CAN_RES signal LOW "0" to activate R24 and R25 */
|
||||
#define MCBA_VER_TERMINATION_ON 0
|
||||
#define MCBA_VER_TERMINATION_OFF 1
|
||||
|
||||
#define MCBA_SIDL_EXID_MASK 0x8
|
||||
#define MCBA_DLC_MASK 0xf
|
||||
#define MCBA_DLC_RTR_MASK 0x40
|
||||
@ -469,7 +473,7 @@ static void mcba_usb_process_ka_usb(struct mcba_priv *priv,
|
||||
priv->usb_ka_first_pass = false;
|
||||
}
|
||||
|
||||
if (msg->termination_state)
|
||||
if (msg->termination_state == MCBA_VER_TERMINATION_ON)
|
||||
priv->can.termination = MCBA_TERMINATION_ENABLED;
|
||||
else
|
||||
priv->can.termination = MCBA_TERMINATION_DISABLED;
|
||||
@ -789,9 +793,9 @@ static int mcba_set_termination(struct net_device *netdev, u16 term)
|
||||
};
|
||||
|
||||
if (term == MCBA_TERMINATION_ENABLED)
|
||||
usb_msg.termination = 1;
|
||||
usb_msg.termination = MCBA_VER_TERMINATION_ON;
|
||||
else
|
||||
usb_msg.termination = 0;
|
||||
usb_msg.termination = MCBA_VER_TERMINATION_OFF;
|
||||
|
||||
mcba_usb_xmit_cmd(priv, (struct mcba_usb_msg *)&usb_msg);
|
||||
|
||||
|
@ -874,7 +874,6 @@ area_cache_get(struct nfp_cpp *cpp, u32 id,
|
||||
}
|
||||
|
||||
/* Adjust the start address to be cache size aligned */
|
||||
cache->id = id;
|
||||
cache->addr = addr & ~(u64)(cache->size - 1);
|
||||
|
||||
/* Re-init to the new ID and address */
|
||||
@ -894,6 +893,8 @@ area_cache_get(struct nfp_cpp *cpp, u32 id,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cache->id = id;
|
||||
|
||||
exit:
|
||||
/* Adjust offset */
|
||||
*offset = addr - cache->addr;
|
||||
|
@ -817,6 +817,8 @@ static blk_status_t nvme_setup_prp_simple(struct nvme_dev *dev,
|
||||
cmnd->dptr.prp1 = cpu_to_le64(iod->first_dma);
|
||||
if (bv->bv_len > first_prp_len)
|
||||
cmnd->dptr.prp2 = cpu_to_le64(iod->first_dma + first_prp_len);
|
||||
else
|
||||
cmnd->dptr.prp2 = 0;
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
|
@ -278,12 +278,15 @@ static struct irq_chip mtk_eint_irq_chip = {
|
||||
|
||||
static unsigned int mtk_eint_hw_init(struct mtk_eint *eint)
|
||||
{
|
||||
void __iomem *reg = eint->base + eint->regs->dom_en;
|
||||
void __iomem *dom_en = eint->base + eint->regs->dom_en;
|
||||
void __iomem *mask_set = eint->base + eint->regs->mask_set;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < eint->hw->ap_num; i += 32) {
|
||||
writel(0xffffffff, reg);
|
||||
reg += 4;
|
||||
writel(0xffffffff, dom_en);
|
||||
writel(0xffffffff, mask_set);
|
||||
dom_en += 4;
|
||||
mask_set += 4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -205,7 +205,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
|
||||
if (inode && fuse_is_bad(inode))
|
||||
goto invalid;
|
||||
else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) ||
|
||||
(flags & LOOKUP_REVAL)) {
|
||||
(flags & (LOOKUP_EXCL | LOOKUP_REVAL))) {
|
||||
struct fuse_entry_out outarg;
|
||||
FUSE_ARGS(args);
|
||||
struct fuse_forget_link *forget;
|
||||
|
@ -936,7 +936,7 @@ static const struct io_op_def io_op_defs[] = {
|
||||
.needs_file = 1,
|
||||
.hash_reg_file = 1,
|
||||
.unbound_nonreg_file = 1,
|
||||
.work_flags = IO_WQ_WORK_BLKCG,
|
||||
.work_flags = IO_WQ_WORK_BLKCG | IO_WQ_WORK_FILES,
|
||||
},
|
||||
[IORING_OP_PROVIDE_BUFFERS] = {},
|
||||
[IORING_OP_REMOVE_BUFFERS] = {},
|
||||
|
@ -570,6 +570,7 @@ __be32 nfsd4_clone_file_range(struct nfsd_file *nf_src, u64 src_pos,
|
||||
ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst,
|
||||
u64 dst_pos, u64 count)
|
||||
{
|
||||
ssize_t ret;
|
||||
|
||||
/*
|
||||
* Limit copy to 4MB to prevent indefinitely blocking an nfsd
|
||||
@ -580,7 +581,12 @@ ssize_t nfsd_copy_file_range(struct file *src, u64 src_pos, struct file *dst,
|
||||
* limit like this and pipeline multiple COPY requests.
|
||||
*/
|
||||
count = min_t(u64, count, 1 << 22);
|
||||
return vfs_copy_file_range(src, src_pos, dst, dst_pos, count, 0);
|
||||
ret = vfs_copy_file_range(src, src_pos, dst, dst_pos, count, 0);
|
||||
|
||||
if (ret == -EOPNOTSUPP || ret == -EXDEV)
|
||||
ret = vfs_copy_file_range(src, src_pos, dst, dst_pos, count,
|
||||
COPY_FILE_SPLICE);
|
||||
return ret;
|
||||
}
|
||||
|
||||
__be32 nfsd4_vfs_fallocate(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
|
@ -1388,28 +1388,6 @@ ssize_t generic_copy_file_range(struct file *file_in, loff_t pos_in,
|
||||
}
|
||||
EXPORT_SYMBOL(generic_copy_file_range);
|
||||
|
||||
static ssize_t do_copy_file_range(struct file *file_in, loff_t pos_in,
|
||||
struct file *file_out, loff_t pos_out,
|
||||
size_t len, unsigned int flags)
|
||||
{
|
||||
/*
|
||||
* Although we now allow filesystems to handle cross sb copy, passing
|
||||
* a file of the wrong filesystem type to filesystem driver can result
|
||||
* in an attempt to dereference the wrong type of ->private_data, so
|
||||
* avoid doing that until we really have a good reason. NFS defines
|
||||
* several different file_system_type structures, but they all end up
|
||||
* using the same ->copy_file_range() function pointer.
|
||||
*/
|
||||
if (file_out->f_op->copy_file_range &&
|
||||
file_out->f_op->copy_file_range == file_in->f_op->copy_file_range)
|
||||
return file_out->f_op->copy_file_range(file_in, pos_in,
|
||||
file_out, pos_out,
|
||||
len, flags);
|
||||
|
||||
return generic_copy_file_range(file_in, pos_in, file_out, pos_out, len,
|
||||
flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Performs necessary checks before doing a file copy
|
||||
*
|
||||
@ -1431,6 +1409,26 @@ static int generic_copy_file_checks(struct file *file_in, loff_t pos_in,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* We allow some filesystems to handle cross sb copy, but passing
|
||||
* a file of the wrong filesystem type to filesystem driver can result
|
||||
* in an attempt to dereference the wrong type of ->private_data, so
|
||||
* avoid doing that until we really have a good reason.
|
||||
*
|
||||
* nfs and cifs define several different file_system_type structures
|
||||
* and several different sets of file_operations, but they all end up
|
||||
* using the same ->copy_file_range() function pointer.
|
||||
*/
|
||||
if (flags & COPY_FILE_SPLICE) {
|
||||
/* cross sb splice is allowed */
|
||||
} else if (file_out->f_op->copy_file_range) {
|
||||
if (file_in->f_op->copy_file_range !=
|
||||
file_out->f_op->copy_file_range)
|
||||
return -EXDEV;
|
||||
} else if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) {
|
||||
return -EXDEV;
|
||||
}
|
||||
|
||||
/* Don't touch certain kinds of inodes */
|
||||
if (IS_IMMUTABLE(inode_out))
|
||||
return -EPERM;
|
||||
@ -1473,8 +1471,9 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,
|
||||
size_t len, unsigned int flags)
|
||||
{
|
||||
ssize_t ret;
|
||||
bool splice = flags & COPY_FILE_SPLICE;
|
||||
|
||||
if (flags != 0)
|
||||
if (flags & ~COPY_FILE_SPLICE)
|
||||
return -EINVAL;
|
||||
|
||||
ret = generic_copy_file_checks(file_in, pos_in, file_out, pos_out, &len,
|
||||
@ -1496,26 +1495,43 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in,
|
||||
file_start_write(file_out);
|
||||
|
||||
/*
|
||||
* Try cloning first, this is supported by more file systems, and
|
||||
* more efficient if both clone and copy are supported (e.g. NFS).
|
||||
* Cloning is supported by more file systems, so we implement copy on
|
||||
* same sb using clone, but for filesystems where both clone and copy
|
||||
* are supported (e.g. nfs,cifs), we only call the copy method.
|
||||
*/
|
||||
if (file_in->f_op->remap_file_range &&
|
||||
file_inode(file_in)->i_sb == file_inode(file_out)->i_sb) {
|
||||
loff_t cloned;
|
||||
if (!splice && file_out->f_op->copy_file_range) {
|
||||
ret = file_out->f_op->copy_file_range(file_in, pos_in,
|
||||
file_out, pos_out,
|
||||
len, flags);
|
||||
goto done;
|
||||
}
|
||||
|
||||
cloned = file_in->f_op->remap_file_range(file_in, pos_in,
|
||||
if (!splice && file_in->f_op->remap_file_range &&
|
||||
file_inode(file_in)->i_sb == file_inode(file_out)->i_sb) {
|
||||
ret = file_in->f_op->remap_file_range(file_in, pos_in,
|
||||
file_out, pos_out,
|
||||
min_t(loff_t, MAX_RW_COUNT, len),
|
||||
REMAP_FILE_CAN_SHORTEN);
|
||||
if (cloned > 0) {
|
||||
ret = cloned;
|
||||
if (ret > 0)
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
ret = do_copy_file_range(file_in, pos_in, file_out, pos_out, len,
|
||||
/*
|
||||
* We can get here for same sb copy of filesystems that do not implement
|
||||
* ->copy_file_range() in case filesystem does not support clone or in
|
||||
* case filesystem supports clone but rejected the clone request (e.g.
|
||||
* because it was not block aligned).
|
||||
*
|
||||
* In both cases, fall back to kernel copy so we are able to maintain a
|
||||
* consistent story about which filesystems support copy_file_range()
|
||||
* and which filesystems do not, that will allow userspace tools to
|
||||
* make consistent desicions w.r.t using copy_file_range().
|
||||
*
|
||||
* We also get here if caller (e.g. nfsd) requested COPY_FILE_SPLICE.
|
||||
*/
|
||||
ret = generic_copy_file_range(file_in, pos_in, file_out, pos_out, len,
|
||||
flags);
|
||||
WARN_ON_ONCE(ret == -EOPNOTSUPP);
|
||||
|
||||
done:
|
||||
if (ret > 0) {
|
||||
fsnotify_access(file_in);
|
||||
@ -1566,6 +1582,10 @@ SYSCALL_DEFINE6(copy_file_range, int, fd_in, loff_t __user *, off_in,
|
||||
pos_out = f_out.file->f_pos;
|
||||
}
|
||||
|
||||
ret = -EINVAL;
|
||||
if (flags != 0)
|
||||
goto out;
|
||||
|
||||
ret = vfs_copy_file_range(f_in.file, pos_in, f_out.file, pos_out, len,
|
||||
flags);
|
||||
if (ret > 0) {
|
||||
|
@ -14,7 +14,7 @@
|
||||
#define OCR_MODE_TEST 0x01
|
||||
#define OCR_MODE_NORMAL 0x02
|
||||
#define OCR_MODE_CLOCK 0x03
|
||||
#define OCR_MODE_MASK 0x07
|
||||
#define OCR_MODE_MASK 0x03
|
||||
#define OCR_TX0_INVERT 0x04
|
||||
#define OCR_TX0_PULLDOWN 0x08
|
||||
#define OCR_TX0_PULLUP 0x10
|
||||
|
@ -1865,6 +1865,14 @@ struct dir_context {
|
||||
*/
|
||||
#define REMAP_FILE_ADVISORY (REMAP_FILE_CAN_SHORTEN)
|
||||
|
||||
/*
|
||||
* These flags control the behavior of vfs_copy_file_range().
|
||||
* They are not available to the user via syscall.
|
||||
*
|
||||
* COPY_FILE_SPLICE: call splice direct instead of fs clone/copy ops
|
||||
*/
|
||||
#define COPY_FILE_SPLICE (1 << 0)
|
||||
|
||||
struct iov_iter;
|
||||
|
||||
struct file_operations {
|
||||
|
@ -146,7 +146,7 @@ static const struct snd_kcontrol_new cs42l51_snd_controls[] = {
|
||||
0, 0xA0, 96, adc_att_tlv),
|
||||
SOC_DOUBLE_R_SX_TLV("PGA Volume",
|
||||
CS42L51_ALC_PGA_CTL, CS42L51_ALC_PGB_CTL,
|
||||
0, 0x19, 30, pga_tlv),
|
||||
0, 0x1A, 30, pga_tlv),
|
||||
SOC_SINGLE("Playback Deemphasis Switch", CS42L51_DAC_CTL, 3, 1, 0),
|
||||
SOC_SINGLE("Auto-Mute Switch", CS42L51_DAC_CTL, 2, 1, 0),
|
||||
SOC_SINGLE("Soft Ramp Switch", CS42L51_DAC_CTL, 1, 1, 0),
|
||||
|
@ -190,6 +190,25 @@ static int fsl_micfil_reset(struct device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* SRES is self-cleared bit, but REG_MICFIL_CTRL1 is defined
|
||||
* as non-volatile register, so SRES still remain in regmap
|
||||
* cache after set, that every update of REG_MICFIL_CTRL1,
|
||||
* software reset happens. so clear it explicitly.
|
||||
*/
|
||||
ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
|
||||
MICFIL_CTRL1_SRES);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Set SRES should clear CHnF flags, But even add delay here
|
||||
* the CHnF may not be cleared sometimes, so clear CHnF explicitly.
|
||||
*/
|
||||
ret = regmap_write_bits(micfil->regmap, REG_MICFIL_STAT, 0xFF, 0xFF);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -445,8 +445,15 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
|
||||
return err;
|
||||
|
||||
if (snd_soc_volsw_is_stereo(mc)) {
|
||||
val2 = ucontrol->value.integer.value[1];
|
||||
|
||||
if (mc->platform_max && val2 > mc->platform_max)
|
||||
return -EINVAL;
|
||||
if (val2 > max)
|
||||
return -EINVAL;
|
||||
|
||||
val_mask = mask << rshift;
|
||||
val2 = (ucontrol->value.integer.value[1] + min) & mask;
|
||||
val2 = (val2 + min) & mask;
|
||||
val2 = val2 << rshift;
|
||||
|
||||
err = snd_soc_component_update_bits(component, reg2, val_mask,
|
||||
|
@ -244,7 +244,7 @@ bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex)
|
||||
case BPF_MAP_TYPE_RINGBUF:
|
||||
key_size = 0;
|
||||
value_size = 0;
|
||||
max_entries = 4096;
|
||||
max_entries = sysconf(_SC_PAGE_SIZE);
|
||||
break;
|
||||
case BPF_MAP_TYPE_UNSPEC:
|
||||
case BPF_MAP_TYPE_HASH:
|
||||
|
Loading…
Reference in New Issue
Block a user