Import of kernel-4.18.0-553.76.1.el8_10
This commit is contained in:
parent
4cdf272fc1
commit
b5ee3063db
@ -12,7 +12,7 @@ RHEL_MINOR = 10
|
|||||||
#
|
#
|
||||||
# Use this spot to avoid future merge conflicts.
|
# Use this spot to avoid future merge conflicts.
|
||||||
# Do not trim this comment.
|
# Do not trim this comment.
|
||||||
RHEL_RELEASE = 553.75.1
|
RHEL_RELEASE = 553.76.1
|
||||||
|
|
||||||
#
|
#
|
||||||
# ZSTREAM
|
# ZSTREAM
|
||||||
|
@ -50,6 +50,38 @@ static int hid_ignore_special_drivers = 0;
|
|||||||
module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600);
|
module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600);
|
||||||
MODULE_PARM_DESC(ignore_special_drivers, "Ignore any special drivers and handle all devices by generic driver");
|
MODULE_PARM_DESC(ignore_special_drivers, "Ignore any special drivers and handle all devices by generic driver");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a signed n-bit integer to signed 32-bit integer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static s32 snto32(__u32 value, unsigned int n)
|
||||||
|
{
|
||||||
|
if (!value || !n)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (n > 32)
|
||||||
|
n = 32;
|
||||||
|
|
||||||
|
return sign_extend32(value, n - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a signed 32-bit integer to a signed n-bit integer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static u32 s32ton(__s32 value, unsigned int n)
|
||||||
|
{
|
||||||
|
s32 a;
|
||||||
|
|
||||||
|
if (!value || !n)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
a = value >> (n - 1);
|
||||||
|
if (a && a != -1)
|
||||||
|
return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1;
|
||||||
|
return value & ((1 << n) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register a new report for a device.
|
* Register a new report for a device.
|
||||||
*/
|
*/
|
||||||
@ -423,7 +455,7 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
|
|||||||
* both this and the standard encoding. */
|
* both this and the standard encoding. */
|
||||||
raw_value = item_sdata(item);
|
raw_value = item_sdata(item);
|
||||||
if (!(raw_value & 0xfffffff0))
|
if (!(raw_value & 0xfffffff0))
|
||||||
parser->global.unit_exponent = hid_snto32(raw_value, 4);
|
parser->global.unit_exponent = snto32(raw_value, 4);
|
||||||
else
|
else
|
||||||
parser->global.unit_exponent = raw_value;
|
parser->global.unit_exponent = raw_value;
|
||||||
return 0;
|
return 0;
|
||||||
@ -1299,43 +1331,6 @@ alloc_err:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hid_open_report);
|
EXPORT_SYMBOL_GPL(hid_open_report);
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert a signed n-bit integer to signed 32-bit integer. Common
|
|
||||||
* cases are done through the compiler, the screwed things has to be
|
|
||||||
* done by hand.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static s32 snto32(__u32 value, unsigned n)
|
|
||||||
{
|
|
||||||
if (!value || !n)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch (n) {
|
|
||||||
case 8: return ((__s8)value);
|
|
||||||
case 16: return ((__s16)value);
|
|
||||||
case 32: return ((__s32)value);
|
|
||||||
}
|
|
||||||
return value & (1 << (n - 1)) ? value | (~0U << n) : value;
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 hid_snto32(__u32 value, unsigned n)
|
|
||||||
{
|
|
||||||
return snto32(value, n);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(hid_snto32);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert a signed 32-bit integer to a signed n-bit integer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static u32 s32ton(__s32 value, unsigned n)
|
|
||||||
{
|
|
||||||
s32 a = value >> (n - 1);
|
|
||||||
if (a && a != -1)
|
|
||||||
return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1;
|
|
||||||
return value & ((1 << n) - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extract/implement a data field from/to a little endian report (bit array).
|
* Extract/implement a data field from/to a little endian report (bit array).
|
||||||
*
|
*
|
||||||
|
@ -3013,13 +3013,13 @@ static int m560_raw_event(struct hid_device *hdev, u8 *data, int size)
|
|||||||
120);
|
120);
|
||||||
}
|
}
|
||||||
|
|
||||||
v = hid_snto32(hid_field_extract(hdev, data+3, 0, 12), 12);
|
v = sign_extend32(hid_field_extract(hdev, data + 3, 0, 12), 11);
|
||||||
input_report_rel(hidpp->input, REL_X, v);
|
input_report_rel(hidpp->input, REL_X, v);
|
||||||
|
|
||||||
v = hid_snto32(hid_field_extract(hdev, data+3, 12, 12), 12);
|
v = sign_extend32(hid_field_extract(hdev, data + 3, 12, 12), 11);
|
||||||
input_report_rel(hidpp->input, REL_Y, v);
|
input_report_rel(hidpp->input, REL_Y, v);
|
||||||
|
|
||||||
v = hid_snto32(data[6], 8);
|
v = sign_extend32(data[6], 7);
|
||||||
if (v != 0)
|
if (v != 0)
|
||||||
hidpp_scroll_counter_handle_scroll(hidpp->input,
|
hidpp_scroll_counter_handle_scroll(hidpp->input,
|
||||||
&hidpp->vertical_wheel_counter, v);
|
&hidpp->vertical_wheel_counter, v);
|
||||||
|
@ -2254,6 +2254,19 @@ static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp)
|
|||||||
return attach_recursive_mnt(mnt, p, mp, NULL);
|
return attach_recursive_mnt(mnt, p, mp, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int may_change_propagation(const struct mount *m)
|
||||||
|
{
|
||||||
|
struct mnt_namespace *ns = m->mnt_ns;
|
||||||
|
|
||||||
|
// it must be mounted in some namespace
|
||||||
|
if (IS_ERR_OR_NULL(ns)) // is_mounted()
|
||||||
|
return -EINVAL;
|
||||||
|
// and the caller must be admin in userns of that namespace
|
||||||
|
if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN))
|
||||||
|
return -EPERM;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sanity check the flags to change_mnt_propagation.
|
* Sanity check the flags to change_mnt_propagation.
|
||||||
*/
|
*/
|
||||||
@ -2290,6 +2303,10 @@ static int do_change_type(struct path *path, int ms_flags)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
namespace_lock();
|
namespace_lock();
|
||||||
|
err = may_change_propagation(mnt);
|
||||||
|
if (err)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
if (type == MS_SHARED) {
|
if (type == MS_SHARED) {
|
||||||
err = invent_group_ids(mnt, recurse);
|
err = invent_group_ids(mnt, recurse);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -802,11 +802,12 @@ xfs_log_sb(
|
|||||||
* the counters from the AGF block counts.
|
* the counters from the AGF block counts.
|
||||||
*/
|
*/
|
||||||
if (xfs_sb_version_haslazysbcount(&mp->m_sb)) {
|
if (xfs_sb_version_haslazysbcount(&mp->m_sb)) {
|
||||||
mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount);
|
mp->m_sb.sb_icount = percpu_counter_sum_positive(&mp->m_icount);
|
||||||
mp->m_sb.sb_ifree = min_t(uint64_t,
|
mp->m_sb.sb_ifree = min_t(uint64_t,
|
||||||
percpu_counter_sum(&mp->m_ifree),
|
percpu_counter_sum_positive(&mp->m_ifree),
|
||||||
mp->m_sb.sb_icount);
|
mp->m_sb.sb_icount);
|
||||||
mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks);
|
mp->m_sb.sb_fdblocks =
|
||||||
|
percpu_counter_sum_positive(&mp->m_fdblocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
xfs_sb_to_disk(bp->b_addr, &mp->m_sb);
|
xfs_sb_to_disk(bp->b_addr, &mp->m_sb);
|
||||||
|
@ -919,7 +919,6 @@ const struct hid_device_id *hid_match_device(struct hid_device *hdev,
|
|||||||
struct hid_driver *hdrv);
|
struct hid_driver *hdrv);
|
||||||
bool hid_compare_device_paths(struct hid_device *hdev_a,
|
bool hid_compare_device_paths(struct hid_device *hdev_a,
|
||||||
struct hid_device *hdev_b, char separator);
|
struct hid_device *hdev_b, char separator);
|
||||||
s32 hid_snto32(__u32 value, unsigned n);
|
|
||||||
__u32 hid_field_extract(const struct hid_device *hid, __u8 *report,
|
__u32 hid_field_extract(const struct hid_device *hid, __u8 *report,
|
||||||
unsigned offset, unsigned n);
|
unsigned offset, unsigned n);
|
||||||
|
|
||||||
|
@ -400,6 +400,8 @@ EXPORT_SYMBOL_GPL(vsock_enqueue_accept);
|
|||||||
|
|
||||||
static bool vsock_use_local_transport(unsigned int remote_cid)
|
static bool vsock_use_local_transport(unsigned int remote_cid)
|
||||||
{
|
{
|
||||||
|
lockdep_assert_held(&vsock_register_mutex);
|
||||||
|
|
||||||
if (!transport_local)
|
if (!transport_local)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -457,6 +459,8 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
|
|||||||
|
|
||||||
remote_flags = vsk->remote_addr.svm_flags;
|
remote_flags = vsk->remote_addr.svm_flags;
|
||||||
|
|
||||||
|
mutex_lock(&vsock_register_mutex);
|
||||||
|
|
||||||
switch (sk->sk_type) {
|
switch (sk->sk_type) {
|
||||||
case SOCK_DGRAM:
|
case SOCK_DGRAM:
|
||||||
new_transport = transport_dgram;
|
new_transport = transport_dgram;
|
||||||
@ -471,12 +475,15 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
|
|||||||
new_transport = transport_h2g;
|
new_transport = transport_h2g;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -ESOCKTNOSUPPORT;
|
ret = -ESOCKTNOSUPPORT;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vsk->transport) {
|
if (vsk->transport) {
|
||||||
if (vsk->transport == new_transport)
|
if (vsk->transport == new_transport) {
|
||||||
return 0;
|
ret = 0;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* transport->release() must be called with sock lock acquired.
|
/* transport->release() must be called with sock lock acquired.
|
||||||
* This path can only be taken during vsock_stream_connect(),
|
* This path can only be taken during vsock_stream_connect(),
|
||||||
@ -491,8 +498,16 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
|
|||||||
/* We increase the module refcnt to prevent the transport unloading
|
/* We increase the module refcnt to prevent the transport unloading
|
||||||
* while there are open sockets assigned to it.
|
* while there are open sockets assigned to it.
|
||||||
*/
|
*/
|
||||||
if (!new_transport || !try_module_get(new_transport->module))
|
if (!new_transport || !try_module_get(new_transport->module)) {
|
||||||
return -ENODEV;
|
ret = -ENODEV;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* It's safe to release the mutex after a successful try_module_get().
|
||||||
|
* Whichever transport `new_transport` points at, it won't go away until
|
||||||
|
* the last module_put() below or in vsock_deassign_transport().
|
||||||
|
*/
|
||||||
|
mutex_unlock(&vsock_register_mutex);
|
||||||
|
|
||||||
ret = new_transport->init(vsk, psk);
|
ret = new_transport->init(vsk, psk);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -503,6 +518,9 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
|
|||||||
vsk->transport = new_transport;
|
vsk->transport = new_transport;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
err:
|
||||||
|
mutex_unlock(&vsock_register_mutex);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(vsock_assign_transport);
|
EXPORT_SYMBOL_GPL(vsock_assign_transport);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user