Merge 4.19.139 into android-4.19-stable
Changes in 4.19.139
USB: serial: qcserial: add EM7305 QDL product ID
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
Revert "ALSA: hda: call runtime_allow() for all hda controllers"
ALSA: seq: oss: Serialize ioctls
staging: android: ashmem: Fix lockdep warning for write operation
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
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: 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
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()
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
ipv4: Silence suspicious RCU usage warning
ipv6: fix memory leaks on IPV6_ADDRFORM path
net: ethernet: mtk_eth_soc: fix MTU warnings
vxlan: Ensure FDB dump is performed under RCU
net: lan78xx: replace bogus endpoint lookup
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
rxrpc: Fix race between recvmsg and sendmsg on immediate call failure
i40e: add num_vectors checker in iwarp handler
i40e: Wrong truncation from u16 to u8
i40e: Fix of memory leak and integer truncation in i40e_virtchnl.c
i40e: Memory leak in i40e_config_iwarp_qvlist
Smack: fix use-after-free in smk_write_relabel_self()
Linux 4.19.139
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: If64996b6bc365365c5f06165ed8c7648336731bf
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 138
|
||||
SUBLEVEL = 139
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
||||
@@ -3081,6 +3081,12 @@ static void binder_transaction(struct binder_proc *proc,
|
||||
goto err_dead_binder;
|
||||
}
|
||||
e->to_node = target_node->debug_id;
|
||||
if (WARN_ON(proc == target_proc)) {
|
||||
return_error = BR_FAILED_REPLY;
|
||||
return_error_param = -EINVAL;
|
||||
return_error_line = __LINE__;
|
||||
goto err_invalid_target_handle;
|
||||
}
|
||||
if (security_binder_transaction(proc->tsk,
|
||||
target_proc->tsk) < 0) {
|
||||
return_error = BR_FAILED_REPLY;
|
||||
@@ -3683,10 +3689,17 @@ static int binder_thread_write(struct binder_proc *proc,
|
||||
struct binder_node *ctx_mgr_node;
|
||||
mutex_lock(&context->context_mgr_node_lock);
|
||||
ctx_mgr_node = context->binder_context_mgr_node;
|
||||
if (ctx_mgr_node)
|
||||
if (ctx_mgr_node) {
|
||||
if (ctx_mgr_node->proc == proc) {
|
||||
binder_user_error("%d:%d context manager tried to acquire desc 0\n",
|
||||
proc->pid, thread->pid);
|
||||
mutex_unlock(&context->context_mgr_node_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = binder_inc_ref_for_node(
|
||||
proc, ctx_mgr_node,
|
||||
strong, NULL, &rdata);
|
||||
}
|
||||
mutex_unlock(&context->context_mgr_node_lock);
|
||||
}
|
||||
if (ret)
|
||||
|
||||
@@ -432,9 +432,15 @@ static int atmtcp_remove_persistent(int itf)
|
||||
return -EMEDIUMTYPE;
|
||||
}
|
||||
dev_data = PRIV(dev);
|
||||
if (!dev_data->persist) return 0;
|
||||
if (!dev_data->persist) {
|
||||
atm_dev_put(dev);
|
||||
return 0;
|
||||
}
|
||||
dev_data->persist = 0;
|
||||
if (PRIV(dev)->vcc) return 0;
|
||||
if (PRIV(dev)->vcc) {
|
||||
atm_dev_put(dev);
|
||||
return 0;
|
||||
}
|
||||
kfree(dev_data);
|
||||
atm_dev_put(dev);
|
||||
atm_dev_deregister(dev);
|
||||
|
||||
@@ -605,8 +605,10 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
|
||||
/* register entry under "/sys/firmware/qemu_fw_cfg/by_key/" */
|
||||
err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype,
|
||||
fw_cfg_sel_ko, "%d", entry->select);
|
||||
if (err)
|
||||
goto err_register;
|
||||
if (err) {
|
||||
kobject_put(&entry->kobj);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* add raw binary content access */
|
||||
err = sysfs_create_bin_file(&entry->kobj, &fw_cfg_sysfs_attr_raw);
|
||||
@@ -622,7 +624,6 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
|
||||
|
||||
err_add_raw:
|
||||
kobject_del(&entry->kobj);
|
||||
err_register:
|
||||
kfree(entry);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -315,7 +315,7 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
|
||||
struct nouveau_framebuffer *fb;
|
||||
struct nouveau_channel *chan;
|
||||
struct nouveau_bo *nvbo;
|
||||
struct drm_mode_fb_cmd2 mode_cmd;
|
||||
struct drm_mode_fb_cmd2 mode_cmd = {};
|
||||
int ret;
|
||||
|
||||
mode_cmd.width = sizes->surface_width;
|
||||
@@ -599,6 +599,7 @@ nouveau_fbcon_init(struct drm_device *dev)
|
||||
drm_fb_helper_fini(&fbcon->helper);
|
||||
free:
|
||||
kfree(fbcon);
|
||||
drm->fbcon = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1249,6 +1249,8 @@ channel_message_table[CHANNELMSG_COUNT] = {
|
||||
{ CHANNELMSG_19, 0, NULL },
|
||||
{ CHANNELMSG_20, 0, NULL },
|
||||
{ CHANNELMSG_TL_CONNECT_REQUEST, 0, NULL },
|
||||
{ CHANNELMSG_22, 0, NULL },
|
||||
{ CHANNELMSG_TL_CONNECT_RESULT, 0, NULL },
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -1260,25 +1262,16 @@ void vmbus_onmessage(void *context)
|
||||
{
|
||||
struct hv_message *msg = context;
|
||||
struct vmbus_channel_message_header *hdr;
|
||||
int size;
|
||||
|
||||
hdr = (struct vmbus_channel_message_header *)msg->u.payload;
|
||||
size = msg->header.payload_size;
|
||||
|
||||
trace_vmbus_on_message(hdr);
|
||||
|
||||
if (hdr->msgtype >= CHANNELMSG_COUNT) {
|
||||
pr_err("Received invalid channel message type %d size %d\n",
|
||||
hdr->msgtype, size);
|
||||
print_hex_dump_bytes("", DUMP_PREFIX_NONE,
|
||||
(unsigned char *)msg->u.payload, size);
|
||||
return;
|
||||
}
|
||||
|
||||
if (channel_message_table[hdr->msgtype].message_handler)
|
||||
/*
|
||||
* vmbus_on_msg_dpc() makes sure the hdr->msgtype here can not go
|
||||
* out of bound and the message_handler pointer can not be NULL.
|
||||
*/
|
||||
channel_message_table[hdr->msgtype].message_handler(hdr);
|
||||
else
|
||||
pr_err("Unhandled channel message type %d\n", hdr->msgtype);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -939,6 +939,10 @@ void vmbus_on_msg_dpc(unsigned long data)
|
||||
}
|
||||
|
||||
entry = &channel_message_table[hdr->msgtype];
|
||||
|
||||
if (!entry->message_handler)
|
||||
goto msg_handled;
|
||||
|
||||
if (entry->handler_type == VMHT_BLOCKING) {
|
||||
ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
|
||||
if (ctx == NULL)
|
||||
|
||||
@@ -22,10 +22,8 @@ int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!client || !slave_cb) {
|
||||
WARN(1, "insufficient data\n");
|
||||
if (WARN(IS_ERR_OR_NULL(client) || !slave_cb, "insufficient data\n"))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!(client->flags & I2C_CLIENT_SLAVE))
|
||||
dev_warn(&client->dev, "%s: client slave flag not set. You might see address collisions\n",
|
||||
@@ -64,6 +62,9 @@ int i2c_slave_unregister(struct i2c_client *client)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (IS_ERR_OR_NULL(client))
|
||||
return -EINVAL;
|
||||
|
||||
if (!client->adapter->algo->unreg_slave) {
|
||||
dev_err(&client->dev, "%s: not supported by adapter\n", __func__);
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -207,21 +207,33 @@ static int pm860x_led_probe(struct platform_device *pdev)
|
||||
data->cdev.brightness_set_blocking = pm860x_led_set;
|
||||
mutex_init(&data->lock);
|
||||
|
||||
ret = devm_led_classdev_register(chip->dev, &data->cdev);
|
||||
ret = led_classdev_register(chip->dev, &data->cdev);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
pm860x_led_set(&data->cdev, 0);
|
||||
|
||||
platform_set_drvdata(pdev, data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pm860x_led_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pm860x_led *data = platform_get_drvdata(pdev);
|
||||
|
||||
led_classdev_unregister(&data->cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver pm860x_led_driver = {
|
||||
.driver = {
|
||||
.name = "88pm860x-led",
|
||||
},
|
||||
.probe = pm860x_led_probe,
|
||||
.remove = pm860x_led_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(pm860x_led_driver);
|
||||
|
||||
@@ -113,12 +113,23 @@ static int da903x_led_probe(struct platform_device *pdev)
|
||||
led->flags = pdata->flags;
|
||||
led->master = pdev->dev.parent;
|
||||
|
||||
ret = devm_led_classdev_register(led->master, &led->cdev);
|
||||
ret = led_classdev_register(led->master, &led->cdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register LED %d\n", id);
|
||||
return ret;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, led);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int da903x_led_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct da903x_led *led = platform_get_drvdata(pdev);
|
||||
|
||||
led_classdev_unregister(&led->cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -127,6 +138,7 @@ static struct platform_driver da903x_led_driver = {
|
||||
.name = "da903x-led",
|
||||
},
|
||||
.probe = da903x_led_probe,
|
||||
.remove = da903x_led_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(da903x_led_driver);
|
||||
|
||||
@@ -698,7 +698,7 @@ static int lm3533_led_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, led);
|
||||
|
||||
ret = devm_led_classdev_register(pdev->dev.parent, &led->cdev);
|
||||
ret = led_classdev_register(pdev->dev.parent, &led->cdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id);
|
||||
return ret;
|
||||
@@ -708,13 +708,18 @@ static int lm3533_led_probe(struct platform_device *pdev)
|
||||
|
||||
ret = lm3533_led_setup(led, pdata);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_deregister;
|
||||
|
||||
ret = lm3533_ctrlbank_enable(&led->cb);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_deregister;
|
||||
|
||||
return 0;
|
||||
|
||||
err_deregister:
|
||||
led_classdev_unregister(&led->cdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int lm3533_led_remove(struct platform_device *pdev)
|
||||
@@ -724,6 +729,7 @@ static int lm3533_led_remove(struct platform_device *pdev)
|
||||
dev_dbg(&pdev->dev, "%s\n", __func__);
|
||||
|
||||
lm3533_ctrlbank_disable(&led->cb);
|
||||
led_classdev_unregister(&led->cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -273,12 +273,23 @@ static int wm831x_status_probe(struct platform_device *pdev)
|
||||
drvdata->cdev.blink_set = wm831x_status_blink_set;
|
||||
drvdata->cdev.groups = wm831x_status_groups;
|
||||
|
||||
ret = devm_led_classdev_register(wm831x->dev, &drvdata->cdev);
|
||||
ret = led_classdev_register(wm831x->dev, &drvdata->cdev);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, drvdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wm831x_status_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct wm831x_status *drvdata = platform_get_drvdata(pdev);
|
||||
|
||||
led_classdev_unregister(&drvdata->cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -287,6 +298,7 @@ static struct platform_driver wm831x_status_driver = {
|
||||
.name = "wm831x-status",
|
||||
},
|
||||
.probe = wm831x_status_probe,
|
||||
.remove = wm831x_status_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(wm831x_status_driver);
|
||||
|
||||
@@ -368,9 +368,6 @@ static int mtdchar_writeoob(struct file *file, struct mtd_info *mtd,
|
||||
uint32_t retlen;
|
||||
int ret = 0;
|
||||
|
||||
if (!(file->f_mode & FMODE_WRITE))
|
||||
return -EPERM;
|
||||
|
||||
if (length > 4096)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -655,6 +652,48 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
|
||||
|
||||
pr_debug("MTD_ioctl\n");
|
||||
|
||||
/*
|
||||
* Check the file mode to require "dangerous" commands to have write
|
||||
* permissions.
|
||||
*/
|
||||
switch (cmd) {
|
||||
/* "safe" commands */
|
||||
case MEMGETREGIONCOUNT:
|
||||
case MEMGETREGIONINFO:
|
||||
case MEMGETINFO:
|
||||
case MEMREADOOB:
|
||||
case MEMREADOOB64:
|
||||
case MEMLOCK:
|
||||
case MEMUNLOCK:
|
||||
case MEMISLOCKED:
|
||||
case MEMGETOOBSEL:
|
||||
case MEMGETBADBLOCK:
|
||||
case MEMSETBADBLOCK:
|
||||
case OTPSELECT:
|
||||
case OTPGETREGIONCOUNT:
|
||||
case OTPGETREGIONINFO:
|
||||
case OTPLOCK:
|
||||
case ECCGETLAYOUT:
|
||||
case ECCGETSTATS:
|
||||
case MTDFILEMODE:
|
||||
case BLKPG:
|
||||
case BLKRRPART:
|
||||
break;
|
||||
|
||||
/* "dangerous" commands */
|
||||
case MEMERASE:
|
||||
case MEMERASE64:
|
||||
case MEMWRITEOOB:
|
||||
case MEMWRITEOOB64:
|
||||
case MEMWRITE:
|
||||
if (!(file->f_mode & FMODE_WRITE))
|
||||
return -EPERM;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
||||
switch (cmd) {
|
||||
case MEMGETREGIONCOUNT:
|
||||
if (copy_to_user(argp, &(mtd->numeraseregions), sizeof(int)))
|
||||
@@ -702,9 +741,6 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
|
||||
{
|
||||
struct erase_info *erase;
|
||||
|
||||
if(!(file->f_mode & FMODE_WRITE))
|
||||
return -EPERM;
|
||||
|
||||
erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL);
|
||||
if (!erase)
|
||||
ret = -ENOMEM;
|
||||
@@ -997,9 +1033,6 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
ret = -ENOTTY;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -1043,6 +1076,11 @@ static long mtdchar_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
struct mtd_oob_buf32 buf;
|
||||
struct mtd_oob_buf32 __user *buf_user = argp;
|
||||
|
||||
if (!(file->f_mode & FMODE_WRITE)) {
|
||||
ret = -EPERM;
|
||||
break;
|
||||
}
|
||||
|
||||
if (copy_from_user(&buf, argp, sizeof(buf)))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
|
||||
@@ -2015,11 +2015,11 @@ static void nicvf_set_rx_mode_task(struct work_struct *work_arg)
|
||||
/* Save message data locally to prevent them from
|
||||
* being overwritten by next ndo_set_rx_mode call().
|
||||
*/
|
||||
spin_lock(&nic->rx_mode_wq_lock);
|
||||
spin_lock_bh(&nic->rx_mode_wq_lock);
|
||||
mode = vf_work->mode;
|
||||
mc = vf_work->mc;
|
||||
vf_work->mc = NULL;
|
||||
spin_unlock(&nic->rx_mode_wq_lock);
|
||||
spin_unlock_bh(&nic->rx_mode_wq_lock);
|
||||
|
||||
__nicvf_set_rx_mode_task(mode, mc, nic);
|
||||
}
|
||||
|
||||
@@ -181,7 +181,7 @@ static inline bool i40e_vc_isvalid_vsi_id(struct i40e_vf *vf, u16 vsi_id)
|
||||
* check for the valid queue id
|
||||
**/
|
||||
static inline bool i40e_vc_isvalid_queue_id(struct i40e_vf *vf, u16 vsi_id,
|
||||
u8 qid)
|
||||
u16 qid)
|
||||
{
|
||||
struct i40e_pf *pf = vf->pf;
|
||||
struct i40e_vsi *vsi = i40e_find_vsi_from_id(pf, vsi_id);
|
||||
@@ -196,7 +196,7 @@ static inline bool i40e_vc_isvalid_queue_id(struct i40e_vf *vf, u16 vsi_id,
|
||||
*
|
||||
* check for the valid vector id
|
||||
**/
|
||||
static inline bool i40e_vc_isvalid_vector_id(struct i40e_vf *vf, u8 vector_id)
|
||||
static inline bool i40e_vc_isvalid_vector_id(struct i40e_vf *vf, u32 vector_id)
|
||||
{
|
||||
struct i40e_pf *pf = vf->pf;
|
||||
|
||||
@@ -441,14 +441,28 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,
|
||||
u32 v_idx, i, reg_idx, reg;
|
||||
u32 next_q_idx, next_q_type;
|
||||
u32 msix_vf, size;
|
||||
int ret = 0;
|
||||
|
||||
msix_vf = pf->hw.func_caps.num_msix_vectors_vf;
|
||||
|
||||
if (qvlist_info->num_vectors > msix_vf) {
|
||||
dev_warn(&pf->pdev->dev,
|
||||
"Incorrect number of iwarp vectors %u. Maximum %u allowed.\n",
|
||||
qvlist_info->num_vectors,
|
||||
msix_vf);
|
||||
ret = -EINVAL;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
size = sizeof(struct virtchnl_iwarp_qvlist_info) +
|
||||
(sizeof(struct virtchnl_iwarp_qv_info) *
|
||||
(qvlist_info->num_vectors - 1));
|
||||
kfree(vf->qvlist_info);
|
||||
vf->qvlist_info = kzalloc(size, GFP_KERNEL);
|
||||
if (!vf->qvlist_info)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!vf->qvlist_info) {
|
||||
ret = -ENOMEM;
|
||||
goto err_out;
|
||||
}
|
||||
vf->qvlist_info->num_vectors = qvlist_info->num_vectors;
|
||||
|
||||
msix_vf = pf->hw.func_caps.num_msix_vectors_vf;
|
||||
@@ -459,8 +473,10 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,
|
||||
v_idx = qv_info->v_idx;
|
||||
|
||||
/* Validate vector id belongs to this vf */
|
||||
if (!i40e_vc_isvalid_vector_id(vf, v_idx))
|
||||
goto err;
|
||||
if (!i40e_vc_isvalid_vector_id(vf, v_idx)) {
|
||||
ret = -EINVAL;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
vf->qvlist_info->qv_info[i] = *qv_info;
|
||||
|
||||
@@ -502,10 +518,11 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
err_free:
|
||||
kfree(vf->qvlist_info);
|
||||
vf->qvlist_info = NULL;
|
||||
return -EINVAL;
|
||||
err_out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3335,7 +3352,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (!vf->adq_enabled) {
|
||||
@@ -3343,7 +3360,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
|
||||
"VF %d: ADq is not enabled, can't apply cloud filter\n",
|
||||
vf->vf_id);
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if (i40e_validate_cloud_filter(vf, vcf)) {
|
||||
@@ -3351,7 +3368,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
|
||||
"VF %d: Invalid input/s, can't apply cloud filter\n",
|
||||
vf->vf_id);
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
cfilter = kzalloc(sizeof(*cfilter), GFP_KERNEL);
|
||||
@@ -3412,13 +3429,17 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
|
||||
"VF %d: Failed to add cloud filter, err %s aq_err %s\n",
|
||||
vf->vf_id, i40e_stat_str(&pf->hw, ret),
|
||||
i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
|
||||
goto err;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
INIT_HLIST_NODE(&cfilter->cloud_node);
|
||||
hlist_add_head(&cfilter->cloud_node, &vf->cloud_filter_list);
|
||||
/* release the pointer passing it to the collection */
|
||||
cfilter = NULL;
|
||||
vf->num_cloud_filters++;
|
||||
err:
|
||||
err_free:
|
||||
kfree(cfilter);
|
||||
err_out:
|
||||
return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_ADD_CLOUD_FILTER,
|
||||
aq_ret);
|
||||
}
|
||||
|
||||
@@ -6226,9 +6226,18 @@ static void igb_reset_task(struct work_struct *work)
|
||||
struct igb_adapter *adapter;
|
||||
adapter = container_of(work, struct igb_adapter, reset_task);
|
||||
|
||||
rtnl_lock();
|
||||
/* If we're already down or resetting, just bail */
|
||||
if (test_bit(__IGB_DOWN, &adapter->state) ||
|
||||
test_bit(__IGB_RESETTING, &adapter->state)) {
|
||||
rtnl_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
igb_dump(adapter);
|
||||
netdev_err(adapter->netdev, "Reset adapter\n");
|
||||
igb_reinit_locked(adapter);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2452,6 +2452,8 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
|
||||
eth->netdev[id]->irq = eth->irq[0];
|
||||
eth->netdev[id]->dev.of_node = np;
|
||||
|
||||
eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN;
|
||||
|
||||
return 0;
|
||||
|
||||
free_netdev:
|
||||
|
||||
@@ -543,12 +543,13 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
|
||||
u32 hash;
|
||||
struct hv_page_buffer pb[MAX_PAGE_BUFFER_COUNT];
|
||||
|
||||
/* if VF is present and up then redirect packets
|
||||
* already called with rcu_read_lock_bh
|
||||
/* If VF is present and up then redirect packets to it.
|
||||
* Skip the VF if it is marked down or has no carrier.
|
||||
* If netpoll is in uses, then VF can not be used either.
|
||||
*/
|
||||
vf_netdev = rcu_dereference_bh(net_device_ctx->vf_netdev);
|
||||
if (vf_netdev && netif_running(vf_netdev) &&
|
||||
!netpoll_tx_running(net))
|
||||
netif_carrier_ok(vf_netdev) && !netpoll_tx_running(net))
|
||||
return netvsc_vf_xmit(net, vf_netdev, skb);
|
||||
|
||||
/* We will atmost need two pages to describe the rndis
|
||||
|
||||
@@ -2274,12 +2274,14 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
|
||||
|
||||
minor = get_free_serial_index();
|
||||
if (minor < 0)
|
||||
goto exit;
|
||||
goto exit2;
|
||||
|
||||
/* register our minor number */
|
||||
serial->parent->dev = tty_port_register_device_attr(&serial->port,
|
||||
tty_drv, minor, &serial->parent->interface->dev,
|
||||
serial->parent, hso_serial_dev_groups);
|
||||
if (IS_ERR(serial->parent->dev))
|
||||
goto exit2;
|
||||
|
||||
/* fill in specific data for later use */
|
||||
serial->minor = minor;
|
||||
@@ -2324,6 +2326,7 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
|
||||
return 0;
|
||||
exit:
|
||||
hso_serial_tty_unregister(serial);
|
||||
exit2:
|
||||
hso_serial_common_free(serial);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -388,10 +388,6 @@ struct lan78xx_net {
|
||||
struct tasklet_struct bh;
|
||||
struct delayed_work wq;
|
||||
|
||||
struct usb_host_endpoint *ep_blkin;
|
||||
struct usb_host_endpoint *ep_blkout;
|
||||
struct usb_host_endpoint *ep_intr;
|
||||
|
||||
int msg_enable;
|
||||
|
||||
struct urb *urb_intr;
|
||||
@@ -2883,78 +2879,12 @@ lan78xx_start_xmit(struct sk_buff *skb, struct net_device *net)
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
lan78xx_get_endpoints(struct lan78xx_net *dev, struct usb_interface *intf)
|
||||
{
|
||||
int tmp;
|
||||
struct usb_host_interface *alt = NULL;
|
||||
struct usb_host_endpoint *in = NULL, *out = NULL;
|
||||
struct usb_host_endpoint *status = NULL;
|
||||
|
||||
for (tmp = 0; tmp < intf->num_altsetting; tmp++) {
|
||||
unsigned ep;
|
||||
|
||||
in = NULL;
|
||||
out = NULL;
|
||||
status = NULL;
|
||||
alt = intf->altsetting + tmp;
|
||||
|
||||
for (ep = 0; ep < alt->desc.bNumEndpoints; ep++) {
|
||||
struct usb_host_endpoint *e;
|
||||
int intr = 0;
|
||||
|
||||
e = alt->endpoint + ep;
|
||||
switch (e->desc.bmAttributes) {
|
||||
case USB_ENDPOINT_XFER_INT:
|
||||
if (!usb_endpoint_dir_in(&e->desc))
|
||||
continue;
|
||||
intr = 1;
|
||||
/* FALLTHROUGH */
|
||||
case USB_ENDPOINT_XFER_BULK:
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
if (usb_endpoint_dir_in(&e->desc)) {
|
||||
if (!intr && !in)
|
||||
in = e;
|
||||
else if (intr && !status)
|
||||
status = e;
|
||||
} else {
|
||||
if (!out)
|
||||
out = e;
|
||||
}
|
||||
}
|
||||
if (in && out)
|
||||
break;
|
||||
}
|
||||
if (!alt || !in || !out)
|
||||
return -EINVAL;
|
||||
|
||||
dev->pipe_in = usb_rcvbulkpipe(dev->udev,
|
||||
in->desc.bEndpointAddress &
|
||||
USB_ENDPOINT_NUMBER_MASK);
|
||||
dev->pipe_out = usb_sndbulkpipe(dev->udev,
|
||||
out->desc.bEndpointAddress &
|
||||
USB_ENDPOINT_NUMBER_MASK);
|
||||
dev->ep_intr = status;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf)
|
||||
{
|
||||
struct lan78xx_priv *pdata = NULL;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = lan78xx_get_endpoints(dev, intf);
|
||||
if (ret) {
|
||||
netdev_warn(dev->net, "lan78xx_get_endpoints failed: %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev->data[0] = (unsigned long)kzalloc(sizeof(*pdata), GFP_KERNEL);
|
||||
|
||||
pdata = (struct lan78xx_priv *)(dev->data[0]);
|
||||
@@ -3726,6 +3656,7 @@ static void lan78xx_stat_monitor(struct timer_list *t)
|
||||
static int lan78xx_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_host_endpoint *ep_blkin, *ep_blkout, *ep_intr;
|
||||
struct lan78xx_net *dev;
|
||||
struct net_device *netdev;
|
||||
struct usb_device *udev;
|
||||
@@ -3774,6 +3705,34 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
|
||||
mutex_init(&dev->stats.access_lock);
|
||||
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 3) {
|
||||
ret = -ENODEV;
|
||||
goto out2;
|
||||
}
|
||||
|
||||
dev->pipe_in = usb_rcvbulkpipe(udev, BULK_IN_PIPE);
|
||||
ep_blkin = usb_pipe_endpoint(udev, dev->pipe_in);
|
||||
if (!ep_blkin || !usb_endpoint_is_bulk_in(&ep_blkin->desc)) {
|
||||
ret = -ENODEV;
|
||||
goto out2;
|
||||
}
|
||||
|
||||
dev->pipe_out = usb_sndbulkpipe(udev, BULK_OUT_PIPE);
|
||||
ep_blkout = usb_pipe_endpoint(udev, dev->pipe_out);
|
||||
if (!ep_blkout || !usb_endpoint_is_bulk_out(&ep_blkout->desc)) {
|
||||
ret = -ENODEV;
|
||||
goto out2;
|
||||
}
|
||||
|
||||
ep_intr = &intf->cur_altsetting->endpoint[2];
|
||||
if (!usb_endpoint_is_int_in(&ep_intr->desc)) {
|
||||
ret = -ENODEV;
|
||||
goto out2;
|
||||
}
|
||||
|
||||
dev->pipe_intr = usb_rcvintpipe(dev->udev,
|
||||
usb_endpoint_num(&ep_intr->desc));
|
||||
|
||||
ret = lan78xx_bind(dev, intf);
|
||||
if (ret < 0)
|
||||
goto out2;
|
||||
@@ -3786,23 +3745,7 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
|
||||
netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER);
|
||||
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 3) {
|
||||
ret = -ENODEV;
|
||||
goto out3;
|
||||
}
|
||||
|
||||
dev->ep_blkin = (intf->cur_altsetting)->endpoint + 0;
|
||||
dev->ep_blkout = (intf->cur_altsetting)->endpoint + 1;
|
||||
dev->ep_intr = (intf->cur_altsetting)->endpoint + 2;
|
||||
|
||||
dev->pipe_in = usb_rcvbulkpipe(udev, BULK_IN_PIPE);
|
||||
dev->pipe_out = usb_sndbulkpipe(udev, BULK_OUT_PIPE);
|
||||
|
||||
dev->pipe_intr = usb_rcvintpipe(dev->udev,
|
||||
dev->ep_intr->desc.bEndpointAddress &
|
||||
USB_ENDPOINT_NUMBER_MASK);
|
||||
period = dev->ep_intr->desc.bInterval;
|
||||
|
||||
period = ep_intr->desc.bInterval;
|
||||
maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
|
||||
buf = kmalloc(maxp, GFP_KERNEL);
|
||||
if (buf) {
|
||||
|
||||
@@ -975,6 +975,7 @@ static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
|
||||
for (h = 0; h < FDB_HASH_SIZE; ++h) {
|
||||
struct vxlan_fdb *f;
|
||||
|
||||
rcu_read_lock();
|
||||
hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) {
|
||||
struct vxlan_rdst *rd;
|
||||
|
||||
@@ -987,12 +988,15 @@ static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
|
||||
cb->nlh->nlmsg_seq,
|
||||
RTM_NEWNEIGH,
|
||||
NLM_F_MULTI, rd);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
rcu_read_unlock();
|
||||
goto out;
|
||||
}
|
||||
skip:
|
||||
*idx += 1;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
@@ -2219,7 +2223,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
||||
ndst = &rt->dst;
|
||||
skb_tunnel_check_pmtu(skb, ndst, VXLAN_HEADROOM);
|
||||
|
||||
tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb);
|
||||
tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
|
||||
ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
|
||||
err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),
|
||||
vni, md, flags, udp_sum);
|
||||
@@ -2256,7 +2260,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
||||
|
||||
skb_tunnel_check_pmtu(skb, ndst, VXLAN6_HEADROOM);
|
||||
|
||||
tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb);
|
||||
tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
|
||||
ttl = ttl ? : ip6_dst_hoplimit(ndst);
|
||||
skb_scrub_packet(skb, xnet);
|
||||
err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
|
||||
|
||||
@@ -95,6 +95,15 @@ static DEFINE_MUTEX(ashmem_mutex);
|
||||
static struct kmem_cache *ashmem_area_cachep __read_mostly;
|
||||
static struct kmem_cache *ashmem_range_cachep __read_mostly;
|
||||
|
||||
/*
|
||||
* A separate lockdep class for the backing shmem inodes to resolve the lockdep
|
||||
* warning about the race between kswapd taking fs_reclaim before inode_lock
|
||||
* and write syscall taking inode_lock and then fs_reclaim.
|
||||
* Note that such race is impossible because ashmem does not support write
|
||||
* syscalls operating on the backing shmem.
|
||||
*/
|
||||
static struct lock_class_key backing_shmem_inode_class;
|
||||
|
||||
static inline unsigned long range_size(struct ashmem_range *range)
|
||||
{
|
||||
return range->pgend - range->pgstart + 1;
|
||||
@@ -395,6 +404,7 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
if (!asma->file) {
|
||||
char *name = ASHMEM_NAME_DEF;
|
||||
struct file *vmfile;
|
||||
struct inode *inode;
|
||||
|
||||
if (asma->name[ASHMEM_NAME_PREFIX_LEN] != '\0')
|
||||
name = asma->name;
|
||||
@@ -406,6 +416,8 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
goto out;
|
||||
}
|
||||
vmfile->f_mode |= FMODE_LSEEK;
|
||||
inode = file_inode(vmfile);
|
||||
lockdep_set_class(&inode->i_rwsem, &backing_shmem_inode_class);
|
||||
asma->file = vmfile;
|
||||
/*
|
||||
* override mmap operation of the vmfile so that it can't be
|
||||
|
||||
@@ -47,7 +47,10 @@
|
||||
#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba
|
||||
#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb
|
||||
#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc
|
||||
#define PCI_DEVICE_ID_ASMEDIA_1042_XHCI 0x1042
|
||||
#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142
|
||||
#define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242
|
||||
#define PCI_DEVICE_ID_ASMEDIA_2142_XHCI 0x2142
|
||||
|
||||
static const char hcd_name[] = "xhci_hcd";
|
||||
|
||||
@@ -226,13 +229,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
pdev->device == 0x1042)
|
||||
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI)
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
pdev->device == 0x1142)
|
||||
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI)
|
||||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
pdev->device == 0x2142)
|
||||
(pdev->device == PCI_DEVICE_ID_ASMEDIA_1142_XHCI ||
|
||||
pdev->device == PCI_DEVICE_ID_ASMEDIA_2142_XHCI))
|
||||
xhci->quirks |= XHCI_NO_64BIT_SUPPORT;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
/*
|
||||
* Native support for the I/O-Warrior USB devices
|
||||
*
|
||||
* Copyright (c) 2003-2005 Code Mercenaries GmbH
|
||||
* written by Christian Lucht <lucht@codemercs.com>
|
||||
* Copyright (c) 2003-2005, 2020 Code Mercenaries GmbH
|
||||
* written by Christian Lucht <lucht@codemercs.com> and
|
||||
* Christoph Jung <jung@codemercs.com>
|
||||
*
|
||||
* based on
|
||||
|
||||
@@ -817,14 +818,28 @@ static int iowarrior_probe(struct usb_interface *interface,
|
||||
|
||||
/* we have to check the report_size often, so remember it in the endianness suitable for our machine */
|
||||
dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint);
|
||||
if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) &&
|
||||
((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) ||
|
||||
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) ||
|
||||
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) ||
|
||||
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) ||
|
||||
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100)))
|
||||
/* IOWarrior56 has wMaxPacketSize different from report size */
|
||||
|
||||
/*
|
||||
* Some devices need the report size to be different than the
|
||||
* endpoint size.
|
||||
*/
|
||||
if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) {
|
||||
switch (dev->product_id) {
|
||||
case USB_DEVICE_ID_CODEMERCS_IOW56:
|
||||
case USB_DEVICE_ID_CODEMERCS_IOW56AM:
|
||||
dev->report_size = 7;
|
||||
break;
|
||||
|
||||
case USB_DEVICE_ID_CODEMERCS_IOW28:
|
||||
case USB_DEVICE_ID_CODEMERCS_IOW28L:
|
||||
dev->report_size = 4;
|
||||
break;
|
||||
|
||||
case USB_DEVICE_ID_CODEMERCS_IOW100:
|
||||
dev->report_size = 13;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* create the urb and buffer for reading */
|
||||
dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
|
||||
@@ -155,6 +155,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{DEVICE_SWI(0x1199, 0x9056)}, /* Sierra Wireless Modem */
|
||||
{DEVICE_SWI(0x1199, 0x9060)}, /* Sierra Wireless Modem */
|
||||
{DEVICE_SWI(0x1199, 0x9061)}, /* Sierra Wireless Modem */
|
||||
{DEVICE_SWI(0x1199, 0x9062)}, /* Sierra Wireless EM7305 QDL */
|
||||
{DEVICE_SWI(0x1199, 0x9063)}, /* Sierra Wireless EM7305 */
|
||||
{DEVICE_SWI(0x1199, 0x9070)}, /* Sierra Wireless MC74xx */
|
||||
{DEVICE_SWI(0x1199, 0x9071)}, /* Sierra Wireless MC74xx */
|
||||
|
||||
@@ -251,6 +251,10 @@ static void vgacon_scrollback_update(struct vc_data *c, int t, int count)
|
||||
p = (void *) (c->vc_origin + t * c->vc_size_row);
|
||||
|
||||
while (count--) {
|
||||
if ((vgacon_scrollback_cur->tail + c->vc_size_row) >
|
||||
vgacon_scrollback_cur->size)
|
||||
vgacon_scrollback_cur->tail = 0;
|
||||
|
||||
scr_memcpyw(vgacon_scrollback_cur->data +
|
||||
vgacon_scrollback_cur->tail,
|
||||
p, c->vc_size_row);
|
||||
|
||||
@@ -844,7 +844,7 @@ static const struct dss_features omap34xx_dss_feats = {
|
||||
};
|
||||
|
||||
static const struct dss_features omap3630_dss_feats = {
|
||||
.fck_div_max = 32,
|
||||
.fck_div_max = 31,
|
||||
.dss_fck_multiplier = 1,
|
||||
.parent_clk_name = "dpll4_ck",
|
||||
.dpi_select_source = &dss_dpi_select_source_omap2_omap3,
|
||||
|
||||
84
fs/xattr.c
84
fs/xattr.c
@@ -203,10 +203,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;
|
||||
@@ -215,15 +227,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_GPL(vfs_setxattr);
|
||||
@@ -386,8 +423,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;
|
||||
@@ -396,11 +443,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) {
|
||||
@@ -409,12 +459,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
|
||||
*/
|
||||
|
||||
@@ -428,6 +428,8 @@ enum vmbus_channel_message_type {
|
||||
CHANNELMSG_19 = 19,
|
||||
CHANNELMSG_20 = 20,
|
||||
CHANNELMSG_TL_CONNECT_REQUEST = 21,
|
||||
CHANNELMSG_22 = 22,
|
||||
CHANNELMSG_TL_CONNECT_RESULT = 23,
|
||||
CHANNELMSG_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -54,8 +54,10 @@ ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t);
|
||||
ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
|
||||
int __vfs_setxattr(struct dentry *, struct inode *, const char *, const void *, size_t, int);
|
||||
int __vfs_setxattr_noperm(struct dentry *, const char *, const void *, size_t, int);
|
||||
int __vfs_setxattr_locked(struct dentry *, const char *, const void *, size_t, int, struct inode **);
|
||||
int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int);
|
||||
int __vfs_removexattr(struct dentry *, const char *);
|
||||
int __vfs_removexattr_locked(struct dentry *, const char *, struct inode **);
|
||||
int vfs_removexattr(struct dentry *, const char *);
|
||||
|
||||
ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
|
||||
|
||||
@@ -317,6 +317,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex,
|
||||
const struct in6_addr *addr);
|
||||
int ipv6_sock_ac_drop(struct sock *sk, int ifindex,
|
||||
const struct in6_addr *addr);
|
||||
void __ipv6_sock_ac_close(struct sock *sk);
|
||||
void ipv6_sock_ac_close(struct sock *sk);
|
||||
|
||||
int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr);
|
||||
|
||||
@@ -831,20 +831,28 @@ static int p9_fd_open(struct p9_client *client, int rfd, int wfd)
|
||||
return -ENOMEM;
|
||||
|
||||
ts->rd = fget(rfd);
|
||||
if (!ts->rd)
|
||||
goto out_free_ts;
|
||||
if (!(ts->rd->f_mode & FMODE_READ))
|
||||
goto out_put_rd;
|
||||
ts->wr = fget(wfd);
|
||||
if (!ts->rd || !ts->wr) {
|
||||
if (ts->rd)
|
||||
fput(ts->rd);
|
||||
if (ts->wr)
|
||||
fput(ts->wr);
|
||||
kfree(ts);
|
||||
return -EIO;
|
||||
}
|
||||
if (!ts->wr)
|
||||
goto out_put_rd;
|
||||
if (!(ts->wr->f_mode & FMODE_WRITE))
|
||||
goto out_put_wr;
|
||||
|
||||
client->trans = ts;
|
||||
client->status = Connected;
|
||||
|
||||
return 0;
|
||||
|
||||
out_put_wr:
|
||||
fput(ts->wr);
|
||||
out_put_rd:
|
||||
fput(ts->rd);
|
||||
out_free_ts:
|
||||
kfree(ts);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static int p9_socket_open(struct p9_client *client, struct socket *csocket)
|
||||
|
||||
@@ -2360,7 +2360,7 @@ static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
|
||||
BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
|
||||
|
||||
if (!num_rsp)
|
||||
if (!num_rsp || skb->len < num_rsp * sizeof(*info) + 1)
|
||||
return;
|
||||
|
||||
if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
|
||||
@@ -3948,6 +3948,9 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
|
||||
struct inquiry_info_with_rssi_and_pscan_mode *info;
|
||||
info = (void *) (skb->data + 1);
|
||||
|
||||
if (skb->len < num_rsp * sizeof(*info) + 1)
|
||||
goto unlock;
|
||||
|
||||
for (; num_rsp; num_rsp--, info++) {
|
||||
u32 flags;
|
||||
|
||||
@@ -3969,6 +3972,9 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
|
||||
} else {
|
||||
struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
|
||||
|
||||
if (skb->len < num_rsp * sizeof(*info) + 1)
|
||||
goto unlock;
|
||||
|
||||
for (; num_rsp; num_rsp--, info++) {
|
||||
u32 flags;
|
||||
|
||||
@@ -3989,6 +3995,7 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
|
||||
}
|
||||
}
|
||||
|
||||
unlock:
|
||||
hci_dev_unlock(hdev);
|
||||
}
|
||||
|
||||
@@ -4151,7 +4158,7 @@ static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
|
||||
|
||||
BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
|
||||
|
||||
if (!num_rsp)
|
||||
if (!num_rsp || skb->len < num_rsp * sizeof(*info) + 1)
|
||||
return;
|
||||
|
||||
if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
|
||||
|
||||
@@ -1749,7 +1749,7 @@ struct fib_table *fib_trie_unmerge(struct fib_table *oldtb)
|
||||
while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
|
||||
struct key_vector *local_l = NULL, *local_tp;
|
||||
|
||||
hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
|
||||
hlist_for_each_entry(fa, &l->leaf, fa_list) {
|
||||
struct fib_alias *new_fa;
|
||||
|
||||
if (local_tb->tb_id != fa->tb_id)
|
||||
|
||||
@@ -19,12 +19,12 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
|
||||
netdev_features_t features)
|
||||
{
|
||||
int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb);
|
||||
bool need_csum, need_recompute_csum, gso_partial;
|
||||
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
||||
u16 mac_offset = skb->mac_header;
|
||||
__be16 protocol = skb->protocol;
|
||||
u16 mac_len = skb->mac_len;
|
||||
int gre_offset, outer_hlen;
|
||||
bool need_csum, gso_partial;
|
||||
|
||||
if (!skb->encapsulation)
|
||||
goto out;
|
||||
@@ -45,6 +45,7 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
|
||||
skb->protocol = skb->inner_protocol;
|
||||
|
||||
need_csum = !!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE_CSUM);
|
||||
need_recompute_csum = skb->csum_not_inet;
|
||||
skb->encap_hdr_csum = need_csum;
|
||||
|
||||
features &= skb->dev->hw_enc_features;
|
||||
@@ -102,7 +103,15 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
*(pcsum + 1) = 0;
|
||||
if (need_recompute_csum && !skb_is_gso(skb)) {
|
||||
__wsum csum;
|
||||
|
||||
csum = skb_checksum(skb, gre_offset,
|
||||
skb->len - gre_offset, 0);
|
||||
*pcsum = csum_fold(csum);
|
||||
} else {
|
||||
*pcsum = gso_make_checksum(skb, 0);
|
||||
}
|
||||
} while ((skb = skb->next));
|
||||
out:
|
||||
return segs;
|
||||
|
||||
@@ -173,7 +173,7 @@ int ipv6_sock_ac_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ipv6_sock_ac_close(struct sock *sk)
|
||||
void __ipv6_sock_ac_close(struct sock *sk)
|
||||
{
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct net_device *dev = NULL;
|
||||
@@ -181,10 +181,7 @@ void ipv6_sock_ac_close(struct sock *sk)
|
||||
struct net *net = sock_net(sk);
|
||||
int prev_index;
|
||||
|
||||
if (!np->ipv6_ac_list)
|
||||
return;
|
||||
|
||||
rtnl_lock();
|
||||
ASSERT_RTNL();
|
||||
pac = np->ipv6_ac_list;
|
||||
np->ipv6_ac_list = NULL;
|
||||
|
||||
@@ -201,6 +198,16 @@ void ipv6_sock_ac_close(struct sock *sk)
|
||||
sock_kfree_s(sk, pac, sizeof(*pac));
|
||||
pac = next;
|
||||
}
|
||||
}
|
||||
|
||||
void ipv6_sock_ac_close(struct sock *sk)
|
||||
{
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
|
||||
if (!np->ipv6_ac_list)
|
||||
return;
|
||||
rtnl_lock();
|
||||
__ipv6_sock_ac_close(sk);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -207,6 +207,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
||||
|
||||
fl6_free_socklist(sk);
|
||||
__ipv6_sock_mc_close(sk);
|
||||
__ipv6_sock_ac_close(sk);
|
||||
|
||||
/*
|
||||
* Sock is moving from IPv6 to IPv4 (sk_prot), so
|
||||
|
||||
@@ -283,10 +283,6 @@ void ovs_ct_fill_key(const struct sk_buff *skb, struct sw_flow_key *key)
|
||||
ovs_ct_update_key(skb, NULL, key, false, false);
|
||||
}
|
||||
|
||||
#define IN6_ADDR_INITIALIZER(ADDR) \
|
||||
{ (ADDR).s6_addr32[0], (ADDR).s6_addr32[1], \
|
||||
(ADDR).s6_addr32[2], (ADDR).s6_addr32[3] }
|
||||
|
||||
int ovs_ct_put_key(const struct sw_flow_key *swkey,
|
||||
const struct sw_flow_key *output, struct sk_buff *skb)
|
||||
{
|
||||
@@ -308,24 +304,30 @@ int ovs_ct_put_key(const struct sw_flow_key *swkey,
|
||||
|
||||
if (swkey->ct_orig_proto) {
|
||||
if (swkey->eth.type == htons(ETH_P_IP)) {
|
||||
struct ovs_key_ct_tuple_ipv4 orig = {
|
||||
output->ipv4.ct_orig.src,
|
||||
output->ipv4.ct_orig.dst,
|
||||
output->ct.orig_tp.src,
|
||||
output->ct.orig_tp.dst,
|
||||
output->ct_orig_proto,
|
||||
};
|
||||
struct ovs_key_ct_tuple_ipv4 orig;
|
||||
|
||||
memset(&orig, 0, sizeof(orig));
|
||||
orig.ipv4_src = output->ipv4.ct_orig.src;
|
||||
orig.ipv4_dst = output->ipv4.ct_orig.dst;
|
||||
orig.src_port = output->ct.orig_tp.src;
|
||||
orig.dst_port = output->ct.orig_tp.dst;
|
||||
orig.ipv4_proto = output->ct_orig_proto;
|
||||
|
||||
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4,
|
||||
sizeof(orig), &orig))
|
||||
return -EMSGSIZE;
|
||||
} else if (swkey->eth.type == htons(ETH_P_IPV6)) {
|
||||
struct ovs_key_ct_tuple_ipv6 orig = {
|
||||
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.src),
|
||||
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.dst),
|
||||
output->ct.orig_tp.src,
|
||||
output->ct.orig_tp.dst,
|
||||
output->ct_orig_proto,
|
||||
};
|
||||
struct ovs_key_ct_tuple_ipv6 orig;
|
||||
|
||||
memset(&orig, 0, sizeof(orig));
|
||||
memcpy(orig.ipv6_src, output->ipv6.ct_orig.src.s6_addr32,
|
||||
sizeof(orig.ipv6_src));
|
||||
memcpy(orig.ipv6_dst, output->ipv6.ct_orig.dst.s6_addr32,
|
||||
sizeof(orig.ipv6_dst));
|
||||
orig.src_port = output->ct.orig_tp.src;
|
||||
orig.dst_port = output->ct.orig_tp.dst;
|
||||
orig.ipv6_proto = output->ct_orig_proto;
|
||||
|
||||
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6,
|
||||
sizeof(orig), &orig))
|
||||
return -EMSGSIZE;
|
||||
|
||||
@@ -290,7 +290,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
||||
*/
|
||||
ret = rxrpc_connect_call(rx, call, cp, srx, gfp);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
goto error_attached_to_socket;
|
||||
|
||||
trace_rxrpc_call(call, rxrpc_call_connected, atomic_read(&call->usage),
|
||||
here, NULL);
|
||||
@@ -310,18 +310,29 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
||||
error_dup_user_ID:
|
||||
write_unlock(&rx->call_lock);
|
||||
release_sock(&rx->sk);
|
||||
ret = -EEXIST;
|
||||
|
||||
error:
|
||||
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
|
||||
RX_CALL_DEAD, ret);
|
||||
RX_CALL_DEAD, -EEXIST);
|
||||
trace_rxrpc_call(call, rxrpc_call_error, atomic_read(&call->usage),
|
||||
here, ERR_PTR(ret));
|
||||
here, ERR_PTR(-EEXIST));
|
||||
rxrpc_release_call(rx, call);
|
||||
mutex_unlock(&call->user_mutex);
|
||||
rxrpc_put_call(call, rxrpc_call_put);
|
||||
_leave(" = %d", ret);
|
||||
return ERR_PTR(ret);
|
||||
_leave(" = -EEXIST");
|
||||
return ERR_PTR(-EEXIST);
|
||||
|
||||
/* We got an error, but the call is attached to the socket and is in
|
||||
* need of release. However, we might now race with recvmsg() when
|
||||
* completing the call queues it. Return 0 from sys_sendmsg() and
|
||||
* leave the error to recvmsg() to deal with.
|
||||
*/
|
||||
error_attached_to_socket:
|
||||
trace_rxrpc_call(call, rxrpc_call_error, atomic_read(&call->usage),
|
||||
here, ERR_PTR(ret));
|
||||
set_bit(RXRPC_CALL_DISCONNECTED, &call->flags);
|
||||
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
|
||||
RX_CALL_DEAD, ret);
|
||||
_leave(" = c=%08x [err]", call->debug_id);
|
||||
return call;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -215,9 +215,11 @@ void rxrpc_disconnect_call(struct rxrpc_call *call)
|
||||
|
||||
call->peer->cong_cwnd = call->cong_cwnd;
|
||||
|
||||
spin_lock_bh(&conn->params.peer->lock);
|
||||
if (!hlist_unhashed(&call->error_link)) {
|
||||
spin_lock_bh(&call->peer->lock);
|
||||
hlist_del_rcu(&call->error_link);
|
||||
spin_unlock_bh(&conn->params.peer->lock);
|
||||
spin_unlock_bh(&call->peer->lock);
|
||||
}
|
||||
|
||||
if (rxrpc_is_client_call(call))
|
||||
return rxrpc_disconnect_client_call(call);
|
||||
|
||||
@@ -530,7 +530,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
goto error_unlock_call;
|
||||
}
|
||||
|
||||
if (msg->msg_name) {
|
||||
if (msg->msg_name && call->peer) {
|
||||
struct sockaddr_rxrpc *srx = msg->msg_name;
|
||||
size_t len = sizeof(call->peer->srx);
|
||||
|
||||
|
||||
@@ -654,6 +654,9 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
|
||||
if (IS_ERR(call))
|
||||
return PTR_ERR(call);
|
||||
/* ... and we have the call lock. */
|
||||
ret = 0;
|
||||
if (READ_ONCE(call->state) == RXRPC_CALL_COMPLETE)
|
||||
goto out_put_unlock;
|
||||
} else {
|
||||
switch (READ_ONCE(call->state)) {
|
||||
case RXRPC_CALL_UNINITIALISED:
|
||||
|
||||
@@ -12519,13 +12519,13 @@ static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
|
||||
if (!wdev_running(wdev))
|
||||
return -ENETDOWN;
|
||||
}
|
||||
|
||||
if (!vcmd->doit)
|
||||
return -EOPNOTSUPP;
|
||||
} else {
|
||||
wdev = NULL;
|
||||
}
|
||||
|
||||
if (!vcmd->doit)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
|
||||
data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
|
||||
len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
|
||||
|
||||
@@ -2746,7 +2746,6 @@ static int smk_open_relabel_self(struct inode *inode, struct file *file)
|
||||
static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct task_smack *tsp = current_security();
|
||||
char *data;
|
||||
int rc;
|
||||
LIST_HEAD(list_tmp);
|
||||
@@ -2771,11 +2770,21 @@ static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
|
||||
kfree(data);
|
||||
|
||||
if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) {
|
||||
struct cred *new;
|
||||
struct task_smack *tsp;
|
||||
|
||||
new = prepare_creds();
|
||||
if (!new) {
|
||||
rc = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
tsp = new->security;
|
||||
smk_destroy_label_list(&tsp->smk_relabel);
|
||||
list_splice(&list_tmp, &tsp->smk_relabel);
|
||||
commit_creds(new);
|
||||
return count;
|
||||
}
|
||||
|
||||
out:
|
||||
smk_destroy_label_list(&list_tmp);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -181,10 +181,16 @@ static long
|
||||
odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct seq_oss_devinfo *dp;
|
||||
long rc;
|
||||
|
||||
dp = file->private_data;
|
||||
if (snd_BUG_ON(!dp))
|
||||
return -ENXIO;
|
||||
return snd_seq_oss_ioctl(dp, cmd, arg);
|
||||
|
||||
mutex_lock(®ister_mutex);
|
||||
rc = snd_seq_oss_ioctl(dp, cmd, arg);
|
||||
mutex_unlock(®ister_mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
||||
@@ -2478,7 +2478,6 @@ static int azx_probe_continue(struct azx *chip)
|
||||
|
||||
if (azx_has_pm_runtime(chip)) {
|
||||
pm_runtime_use_autosuspend(&pci->dev);
|
||||
pm_runtime_allow(&pci->dev);
|
||||
pm_runtime_put_autosuspend(&pci->dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -2766,6 +2766,7 @@ process_dynamic_array_len(struct event_format *event, struct print_arg *arg,
|
||||
if (read_expected(EVENT_DELIM, ")") < 0)
|
||||
goto out_err;
|
||||
|
||||
free_token(token);
|
||||
type = read_token(&token);
|
||||
*tok = token;
|
||||
|
||||
|
||||
@@ -125,9 +125,8 @@ static int do_setcpu(int cpu)
|
||||
CPU_ZERO(&mask);
|
||||
CPU_SET(cpu, &mask);
|
||||
if (sched_setaffinity(0, sizeof(mask), &mask))
|
||||
error(1, 0, "setaffinity %d", cpu);
|
||||
|
||||
if (cfg_verbose)
|
||||
fprintf(stderr, "cpu: unable to pin, may increase variance.\n");
|
||||
else if (cfg_verbose)
|
||||
fprintf(stderr, "cpu: %u\n", cpu);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user