mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
This is the 5.4.58 stable release
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl8ynngACgkQONu9yGCS
aT5cPw/9GiiNZCLyjB3jVyalmN9uDYKQ+eS8H97GG7IBVYyg9whOKIrOCZHcLINH
DV5s/qnhRWJPzmQ47410ySuPb6QMvkhWTK7i5Xf+K7BOvoz/snfFGcmdu1CA4KxR
CuuH449Y4l3sH+5fPv7+EToovBqA2cfeiz/i5d5Di/N4yODWBCbHHAsZIt0oGvuK
sI1aI1K//R7vKZQvQo85tvENbWJWQwDN7eYVQj3aSbvnq8JqVpwTKTBpKfshzgzB
RmMSOVpQoQYNivW9oleG0NTQeHqj7alG8anFs3Drgu1hs5dzQhqAFlKddhtRS69j
mtrSJuf0GgJEYA6n+PfacoM4l7kHUZcQH9+bglbCXTA3nH24DLT7h0Lybm+ETPXc
ZAYo7cHqrS1BWv8VHZggSbqPr6YNKvgeflgS394wAgNEFcaJmaPfS6+elmc0qf2t
VPSas7QQruRS1Bqwb6CF2tHsl4N+VdvxX1a2JjHHcF5N3z5aqDm1qaVVQHxAg2rE
gXepFNGkEIBhWRxPz+5quxN1XBcUDiQYrzdoaKHxwY+OcdCf635P5Ob+1WK3w1oa
qhl/2scs44D67wZSgXHo5N4vMi9HhPOSV77jklgFcg75IzM9YWwYnJADQRHxo7nT
25XEgUlMfxm0ngw+CZWR0ssaP6rB9V1rRLDqb1W5HbqA7lp2YE8=
=Fe6H
-----END PGP SIGNATURE-----
Merge 5.4.58 into android11-5.4
Changes in 5.4.58
USB: serial: qcserial: add EM7305 QDL product ID
perf/core: Fix endless multiplex timer
USB: iowarrior: fix up report size handling for some devices
usb: xhci: define IDs for various ASMedia host controllers
usb: xhci: Fix ASMedia ASM1142 DMA addressing
io_uring: prevent re-read of sqe->opcode
io_uring: Fix use-after-free in io_sq_wq_submit_work()
Revert "ALSA: hda: call runtime_allow() for all hda controllers"
ALSA: hda/realtek: Add alc269/alc662 pin-tables for Loongson-3 laptops
ALSA: hda/ca0132 - Add new quirk ID for Recon3D.
ALSA: hda/ca0132 - Fix ZxR Headphone gain control get value.
ALSA: hda/ca0132 - Fix AE-5 microphone selection commands.
ALSA: seq: oss: Serialize ioctls
staging: android: ashmem: Fix lockdep warning for write operation
staging: rtl8712: handle firmware load failure
Staging: rtl8188eu: rtw_mlme: Fix uninitialized variable authmode
Bluetooth: Fix slab-out-of-bounds read in hci_extended_inquiry_result_evt()
Bluetooth: Prevent out-of-bounds read in hci_inquiry_result_evt()
Bluetooth: Prevent out-of-bounds read in hci_inquiry_result_with_rssi_evt()
omapfb: dss: Fix max fclk divider for omap36xx
binder: Prevent context manager from incrementing ref 0
Smack: fix use-after-free in smk_write_relabel_self()
scripts: add dummy report mode to add_namespace.cocci
vgacon: Fix for missing check in scrollback handling
mtd: properly check all write ioctls for permissions
leds: wm831x-status: fix use-after-free on unbind
leds: lm36274: fix use-after-free on unbind
leds: da903x: fix use-after-free on unbind
leds: lm3533: fix use-after-free on unbind
leds: 88pm860x: fix use-after-free on unbind
net/9p: validate fds in p9_fd_open
drm/nouveau/fbcon: fix module unload when fbcon init has failed for some reason
drm/nouveau/fbcon: zero-initialise the mode_cmd2 structure
nvme-pci: prevent SK hynix PC400 from using Write Zeroes command
drm/drm_fb_helper: fix fbdev with sparc64
i2c: slave: improve sanity check when registering
i2c: slave: add sanity check when unregistering
usb: hso: check for return value in hso_serial_common_create()
net: ethernet: mtk_eth_soc: Always call mtk_gmac0_rgmii_adjust() for mt7623
ALSA: hda: fix NULL pointer dereference during suspend
firmware: Fix a reference count leak.
cfg80211: check vendor command doit pointer before use
igb: reinit_locked() should be called with rtnl_lock
atm: fix atm_dev refcnt leaks in atmtcp_remove_persistent
tools lib traceevent: Fix memory leak in process_dynamic_array_len
Drivers: hv: vmbus: Ignore CHANNELMSG_TL_CONNECT_RESULT(23)
xattr: break delegations in {set,remove}xattr
Revert "powerpc/kasan: Fix shadow pages allocation failure"
PCI: tegra: Revert tegra124 raw_violation_fixup
ipv4: Silence suspicious RCU usage warning
ipv6: fix memory leaks on IPV6_ADDRFORM path
ipv6: Fix nexthop refcnt leak when creating ipv6 route info
net: ethernet: mtk_eth_soc: fix MTU warnings
rxrpc: Fix race between recvmsg and sendmsg on immediate call failure
vxlan: Ensure FDB dump is performed under RCU
net: lan78xx: replace bogus endpoint lookup
appletalk: Fix atalk_proc_init() return path
dpaa2-eth: Fix passing zero to 'PTR_ERR' warning
hv_netvsc: do not use VF device if link is down
net: gre: recompute gre csum for sctp over gre tunnels
net: thunderx: use spin_lock_bh in nicvf_set_rx_mode_task()
openvswitch: Prevent kernel-infoleak in ovs_ct_put_key()
Revert "vxlan: fix tos value before xmit"
selftests/net: relax cpu affinity requirement in msg_zerocopy test
tcp: apply a floor of 1 for RTT samples from TCP timestamps
ima: move APPRAISE_BOOTPARAM dependency on ARCH_POLICY to runtime
nfsd: Fix NFSv4 READ on RDMA when using readv
Linux 5.4.58
Signed-off-by: Greg Kroah-Hartman <[email protected]>
Change-Id: I0e89e2c0faf90bdf1f6ac37f9a2c2395cacab054
This commit is contained in:
commit
3a9b53bc89
82 changed files with 817 additions and 341 deletions
|
|
@ -279,6 +279,7 @@ struct sqe_submit {
|
|||
bool has_user;
|
||||
bool needs_lock;
|
||||
bool needs_fixed_file;
|
||||
u8 opcode;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -505,7 +506,7 @@ static inline void io_queue_async_work(struct io_ring_ctx *ctx,
|
|||
int rw = 0;
|
||||
|
||||
if (req->submit.sqe) {
|
||||
switch (req->submit.sqe->opcode) {
|
||||
switch (req->submit.opcode) {
|
||||
case IORING_OP_WRITEV:
|
||||
case IORING_OP_WRITE_FIXED:
|
||||
rw = !(req->rw.ki_flags & IOCB_DIRECT);
|
||||
|
|
@ -1254,23 +1255,15 @@ static int io_import_fixed(struct io_ring_ctx *ctx, int rw,
|
|||
}
|
||||
|
||||
static ssize_t io_import_iovec(struct io_ring_ctx *ctx, int rw,
|
||||
const struct sqe_submit *s, struct iovec **iovec,
|
||||
struct io_kiocb *req, struct iovec **iovec,
|
||||
struct iov_iter *iter)
|
||||
{
|
||||
const struct io_uring_sqe *sqe = s->sqe;
|
||||
const struct io_uring_sqe *sqe = req->submit.sqe;
|
||||
void __user *buf = u64_to_user_ptr(READ_ONCE(sqe->addr));
|
||||
size_t sqe_len = READ_ONCE(sqe->len);
|
||||
u8 opcode;
|
||||
|
||||
/*
|
||||
* We're reading ->opcode for the second time, but the first read
|
||||
* doesn't care whether it's _FIXED or not, so it doesn't matter
|
||||
* whether ->opcode changes concurrently. The first read does care
|
||||
* about whether it is a READ or a WRITE, so we don't trust this read
|
||||
* for that purpose and instead let the caller pass in the read/write
|
||||
* flag.
|
||||
*/
|
||||
opcode = READ_ONCE(sqe->opcode);
|
||||
opcode = req->submit.opcode;
|
||||
if (opcode == IORING_OP_READ_FIXED ||
|
||||
opcode == IORING_OP_WRITE_FIXED) {
|
||||
ssize_t ret = io_import_fixed(ctx, rw, sqe, iter);
|
||||
|
|
@ -1278,7 +1271,7 @@ static ssize_t io_import_iovec(struct io_ring_ctx *ctx, int rw,
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (!s->has_user)
|
||||
if (!req->submit.has_user)
|
||||
return -EFAULT;
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
|
@ -1425,7 +1418,7 @@ static int io_read(struct io_kiocb *req, const struct sqe_submit *s,
|
|||
if (unlikely(!(file->f_mode & FMODE_READ)))
|
||||
return -EBADF;
|
||||
|
||||
ret = io_import_iovec(req->ctx, READ, s, &iovec, &iter);
|
||||
ret = io_import_iovec(req->ctx, READ, req, &iovec, &iter);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
@ -1490,7 +1483,7 @@ static int io_write(struct io_kiocb *req, const struct sqe_submit *s,
|
|||
if (unlikely(!(file->f_mode & FMODE_WRITE)))
|
||||
return -EBADF;
|
||||
|
||||
ret = io_import_iovec(req->ctx, WRITE, s, &iovec, &iter);
|
||||
ret = io_import_iovec(req->ctx, WRITE, req, &iovec, &iter);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
@ -2109,15 +2102,14 @@ static int io_req_defer(struct io_ring_ctx *ctx, struct io_kiocb *req,
|
|||
static int __io_submit_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req,
|
||||
const struct sqe_submit *s, bool force_nonblock)
|
||||
{
|
||||
int ret, opcode;
|
||||
int ret;
|
||||
|
||||
req->user_data = READ_ONCE(s->sqe->user_data);
|
||||
|
||||
if (unlikely(s->index >= ctx->sq_entries))
|
||||
return -EINVAL;
|
||||
|
||||
opcode = READ_ONCE(s->sqe->opcode);
|
||||
switch (opcode) {
|
||||
switch (req->submit.opcode) {
|
||||
case IORING_OP_NOP:
|
||||
ret = io_nop(req, req->user_data);
|
||||
break;
|
||||
|
|
@ -2181,10 +2173,10 @@ static int __io_submit_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct async_list *io_async_list_from_sqe(struct io_ring_ctx *ctx,
|
||||
const struct io_uring_sqe *sqe)
|
||||
static struct async_list *io_async_list_from_req(struct io_ring_ctx *ctx,
|
||||
struct io_kiocb *req)
|
||||
{
|
||||
switch (sqe->opcode) {
|
||||
switch (req->submit.opcode) {
|
||||
case IORING_OP_READV:
|
||||
case IORING_OP_READ_FIXED:
|
||||
return &ctx->pending_async[READ];
|
||||
|
|
@ -2196,12 +2188,10 @@ static struct async_list *io_async_list_from_sqe(struct io_ring_ctx *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
static inline bool io_sqe_needs_user(const struct io_uring_sqe *sqe)
|
||||
static inline bool io_req_needs_user(struct io_kiocb *req)
|
||||
{
|
||||
u8 opcode = READ_ONCE(sqe->opcode);
|
||||
|
||||
return !(opcode == IORING_OP_READ_FIXED ||
|
||||
opcode == IORING_OP_WRITE_FIXED);
|
||||
return !(req->submit.opcode == IORING_OP_READ_FIXED ||
|
||||
req->submit.opcode == IORING_OP_WRITE_FIXED);
|
||||
}
|
||||
|
||||
static void io_sq_wq_submit_work(struct work_struct *work)
|
||||
|
|
@ -2217,7 +2207,7 @@ static void io_sq_wq_submit_work(struct work_struct *work)
|
|||
int ret;
|
||||
|
||||
old_cred = override_creds(ctx->creds);
|
||||
async_list = io_async_list_from_sqe(ctx, req->submit.sqe);
|
||||
async_list = io_async_list_from_req(ctx, req);
|
||||
|
||||
allow_kernel_signal(SIGINT);
|
||||
restart:
|
||||
|
|
@ -2239,9 +2229,10 @@ restart:
|
|||
}
|
||||
|
||||
ret = 0;
|
||||
if (io_sqe_needs_user(sqe) && !cur_mm) {
|
||||
if (io_req_needs_user(req) && !cur_mm) {
|
||||
if (!mmget_not_zero(ctx->sqo_mm)) {
|
||||
ret = -EFAULT;
|
||||
goto end_req;
|
||||
} else {
|
||||
cur_mm = ctx->sqo_mm;
|
||||
use_mm(cur_mm);
|
||||
|
|
@ -2387,11 +2378,9 @@ static bool io_add_to_prev_work(struct async_list *list, struct io_kiocb *req)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static bool io_op_needs_file(const struct io_uring_sqe *sqe)
|
||||
static bool io_op_needs_file(struct io_kiocb *req)
|
||||
{
|
||||
int op = READ_ONCE(sqe->opcode);
|
||||
|
||||
switch (op) {
|
||||
switch (req->submit.opcode) {
|
||||
case IORING_OP_NOP:
|
||||
case IORING_OP_POLL_REMOVE:
|
||||
case IORING_OP_TIMEOUT:
|
||||
|
|
@ -2419,7 +2408,7 @@ static int io_req_set_file(struct io_ring_ctx *ctx, const struct sqe_submit *s,
|
|||
*/
|
||||
req->sequence = s->sequence;
|
||||
|
||||
if (!io_op_needs_file(s->sqe))
|
||||
if (!io_op_needs_file(req))
|
||||
return 0;
|
||||
|
||||
if (flags & IOSQE_FIXED_FILE) {
|
||||
|
|
@ -2460,7 +2449,7 @@ static int __io_queue_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req,
|
|||
|
||||
s->sqe = sqe_copy;
|
||||
memcpy(&req->submit, s, sizeof(*s));
|
||||
list = io_async_list_from_sqe(ctx, s->sqe);
|
||||
list = io_async_list_from_req(ctx, req);
|
||||
if (!io_add_to_prev_work(list, req)) {
|
||||
if (list)
|
||||
atomic_inc(&list->cnt);
|
||||
|
|
@ -2582,7 +2571,7 @@ err:
|
|||
req->user_data = s->sqe->user_data;
|
||||
|
||||
#if defined(CONFIG_NET)
|
||||
switch (READ_ONCE(s->sqe->opcode)) {
|
||||
switch (req->submit.opcode) {
|
||||
case IORING_OP_SENDMSG:
|
||||
case IORING_OP_RECVMSG:
|
||||
spin_lock(¤t->fs->lock);
|
||||
|
|
@ -2697,6 +2686,7 @@ static bool io_get_sqring(struct io_ring_ctx *ctx, struct sqe_submit *s)
|
|||
if (head < ctx->sq_entries) {
|
||||
s->index = head;
|
||||
s->sqe = &ctx->sq_sqes[head];
|
||||
s->opcode = READ_ONCE(s->sqe->opcode);
|
||||
s->sequence = ctx->cached_sq_head;
|
||||
ctx->cached_sq_head++;
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -3530,17 +3530,17 @@ static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
|
|||
u32 zzz = 0;
|
||||
int pad;
|
||||
|
||||
/*
|
||||
* svcrdma requires every READ payload to start somewhere
|
||||
* in xdr->pages.
|
||||
*/
|
||||
if (xdr->iov == xdr->buf->head) {
|
||||
xdr->iov = NULL;
|
||||
xdr->end = xdr->p;
|
||||
}
|
||||
|
||||
len = maxcount;
|
||||
v = 0;
|
||||
|
||||
thislen = min_t(long, len, ((void *)xdr->end - (void *)xdr->p));
|
||||
p = xdr_reserve_space(xdr, (thislen+3)&~3);
|
||||
WARN_ON_ONCE(!p);
|
||||
resp->rqstp->rq_vec[v].iov_base = p;
|
||||
resp->rqstp->rq_vec[v].iov_len = thislen;
|
||||
v++;
|
||||
len -= thislen;
|
||||
|
||||
while (len) {
|
||||
thislen = min_t(long, len, PAGE_SIZE);
|
||||
p = xdr_reserve_space(xdr, (thislen+3)&~3);
|
||||
|
|
@ -3559,6 +3559,8 @@ static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
|
|||
read->rd_length = maxcount;
|
||||
if (nfserr)
|
||||
return nfserr;
|
||||
if (svc_encode_read_payload(resp->rqstp, starting_len + 8, maxcount))
|
||||
return nfserr_io;
|
||||
xdr_truncate_encode(xdr, starting_len + 8 + ((maxcount+3)&~3));
|
||||
|
||||
tmp = htonl(eof);
|
||||
|
|
|
|||
84
fs/xattr.c
84
fs/xattr.c
|
|
@ -204,10 +204,22 @@ int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
|
|||
return error;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* __vfs_setxattr_locked: set an extended attribute while holding the inode
|
||||
* lock
|
||||
*
|
||||
* @dentry - object to perform setxattr on
|
||||
* @name - xattr name to set
|
||||
* @value - value to set @name to
|
||||
* @size - size of @value
|
||||
* @flags - flags to pass into filesystem operations
|
||||
* @delegated_inode - on return, will contain an inode pointer that
|
||||
* a delegation was broken on, NULL if none.
|
||||
*/
|
||||
int
|
||||
vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
||||
size_t size, int flags)
|
||||
__vfs_setxattr_locked(struct dentry *dentry, const char *name,
|
||||
const void *value, size_t size, int flags,
|
||||
struct inode **delegated_inode)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
int error;
|
||||
|
|
@ -216,15 +228,40 @@ vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
inode_lock(inode);
|
||||
error = security_inode_setxattr(dentry, name, value, size, flags);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
error = try_break_deleg(inode, delegated_inode);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
error = __vfs_setxattr_noperm(dentry, name, value, size, flags);
|
||||
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__vfs_setxattr_locked);
|
||||
|
||||
int
|
||||
vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
||||
size_t size, int flags)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct inode *delegated_inode = NULL;
|
||||
int error;
|
||||
|
||||
retry_deleg:
|
||||
inode_lock(inode);
|
||||
error = __vfs_setxattr_locked(dentry, name, value, size, flags,
|
||||
&delegated_inode);
|
||||
inode_unlock(inode);
|
||||
|
||||
if (delegated_inode) {
|
||||
error = break_deleg_wait(&delegated_inode);
|
||||
if (!error)
|
||||
goto retry_deleg;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(vfs_setxattr, ANDROID_GKI_VFS_EXPORT_ONLY);
|
||||
|
|
@ -378,8 +415,18 @@ __vfs_removexattr(struct dentry *dentry, const char *name)
|
|||
}
|
||||
EXPORT_SYMBOL(__vfs_removexattr);
|
||||
|
||||
/**
|
||||
* __vfs_removexattr_locked: set an extended attribute while holding the inode
|
||||
* lock
|
||||
*
|
||||
* @dentry - object to perform setxattr on
|
||||
* @name - name of xattr to remove
|
||||
* @delegated_inode - on return, will contain an inode pointer that
|
||||
* a delegation was broken on, NULL if none.
|
||||
*/
|
||||
int
|
||||
vfs_removexattr(struct dentry *dentry, const char *name)
|
||||
__vfs_removexattr_locked(struct dentry *dentry, const char *name,
|
||||
struct inode **delegated_inode)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
int error;
|
||||
|
|
@ -388,11 +435,14 @@ vfs_removexattr(struct dentry *dentry, const char *name)
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
inode_lock(inode);
|
||||
error = security_inode_removexattr(dentry, name);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
error = try_break_deleg(inode, delegated_inode);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
error = __vfs_removexattr(dentry, name);
|
||||
|
||||
if (!error) {
|
||||
|
|
@ -401,12 +451,32 @@ vfs_removexattr(struct dentry *dentry, const char *name)
|
|||
}
|
||||
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__vfs_removexattr_locked);
|
||||
|
||||
int
|
||||
vfs_removexattr(struct dentry *dentry, const char *name)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
struct inode *delegated_inode = NULL;
|
||||
int error;
|
||||
|
||||
retry_deleg:
|
||||
inode_lock(inode);
|
||||
error = __vfs_removexattr_locked(dentry, name, &delegated_inode);
|
||||
inode_unlock(inode);
|
||||
|
||||
if (delegated_inode) {
|
||||
error = break_deleg_wait(&delegated_inode);
|
||||
if (!error)
|
||||
goto retry_deleg;
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vfs_removexattr);
|
||||
|
||||
|
||||
/*
|
||||
* Extended attribute SET operations
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue