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
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 19
|
PATCHLEVEL = 19
|
||||||
SUBLEVEL = 138
|
SUBLEVEL = 139
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = "People's Front"
|
NAME = "People's Front"
|
||||||
|
|
||||||
|
|||||||
@@ -3081,6 +3081,12 @@ static void binder_transaction(struct binder_proc *proc,
|
|||||||
goto err_dead_binder;
|
goto err_dead_binder;
|
||||||
}
|
}
|
||||||
e->to_node = target_node->debug_id;
|
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,
|
if (security_binder_transaction(proc->tsk,
|
||||||
target_proc->tsk) < 0) {
|
target_proc->tsk) < 0) {
|
||||||
return_error = BR_FAILED_REPLY;
|
return_error = BR_FAILED_REPLY;
|
||||||
@@ -3683,10 +3689,17 @@ static int binder_thread_write(struct binder_proc *proc,
|
|||||||
struct binder_node *ctx_mgr_node;
|
struct binder_node *ctx_mgr_node;
|
||||||
mutex_lock(&context->context_mgr_node_lock);
|
mutex_lock(&context->context_mgr_node_lock);
|
||||||
ctx_mgr_node = context->binder_context_mgr_node;
|
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(
|
ret = binder_inc_ref_for_node(
|
||||||
proc, ctx_mgr_node,
|
proc, ctx_mgr_node,
|
||||||
strong, NULL, &rdata);
|
strong, NULL, &rdata);
|
||||||
|
}
|
||||||
mutex_unlock(&context->context_mgr_node_lock);
|
mutex_unlock(&context->context_mgr_node_lock);
|
||||||
}
|
}
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|||||||
@@ -432,9 +432,15 @@ static int atmtcp_remove_persistent(int itf)
|
|||||||
return -EMEDIUMTYPE;
|
return -EMEDIUMTYPE;
|
||||||
}
|
}
|
||||||
dev_data = PRIV(dev);
|
dev_data = PRIV(dev);
|
||||||
if (!dev_data->persist) return 0;
|
if (!dev_data->persist) {
|
||||||
|
atm_dev_put(dev);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
dev_data->persist = 0;
|
dev_data->persist = 0;
|
||||||
if (PRIV(dev)->vcc) return 0;
|
if (PRIV(dev)->vcc) {
|
||||||
|
atm_dev_put(dev);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
kfree(dev_data);
|
kfree(dev_data);
|
||||||
atm_dev_put(dev);
|
atm_dev_put(dev);
|
||||||
atm_dev_deregister(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/" */
|
/* register entry under "/sys/firmware/qemu_fw_cfg/by_key/" */
|
||||||
err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype,
|
err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype,
|
||||||
fw_cfg_sel_ko, "%d", entry->select);
|
fw_cfg_sel_ko, "%d", entry->select);
|
||||||
if (err)
|
if (err) {
|
||||||
goto err_register;
|
kobject_put(&entry->kobj);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
/* add raw binary content access */
|
/* add raw binary content access */
|
||||||
err = sysfs_create_bin_file(&entry->kobj, &fw_cfg_sysfs_attr_raw);
|
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:
|
err_add_raw:
|
||||||
kobject_del(&entry->kobj);
|
kobject_del(&entry->kobj);
|
||||||
err_register:
|
|
||||||
kfree(entry);
|
kfree(entry);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
|
|||||||
struct nouveau_framebuffer *fb;
|
struct nouveau_framebuffer *fb;
|
||||||
struct nouveau_channel *chan;
|
struct nouveau_channel *chan;
|
||||||
struct nouveau_bo *nvbo;
|
struct nouveau_bo *nvbo;
|
||||||
struct drm_mode_fb_cmd2 mode_cmd;
|
struct drm_mode_fb_cmd2 mode_cmd = {};
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mode_cmd.width = sizes->surface_width;
|
mode_cmd.width = sizes->surface_width;
|
||||||
@@ -599,6 +599,7 @@ nouveau_fbcon_init(struct drm_device *dev)
|
|||||||
drm_fb_helper_fini(&fbcon->helper);
|
drm_fb_helper_fini(&fbcon->helper);
|
||||||
free:
|
free:
|
||||||
kfree(fbcon);
|
kfree(fbcon);
|
||||||
|
drm->fbcon = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1249,6 +1249,8 @@ channel_message_table[CHANNELMSG_COUNT] = {
|
|||||||
{ CHANNELMSG_19, 0, NULL },
|
{ CHANNELMSG_19, 0, NULL },
|
||||||
{ CHANNELMSG_20, 0, NULL },
|
{ CHANNELMSG_20, 0, NULL },
|
||||||
{ CHANNELMSG_TL_CONNECT_REQUEST, 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 hv_message *msg = context;
|
||||||
struct vmbus_channel_message_header *hdr;
|
struct vmbus_channel_message_header *hdr;
|
||||||
int size;
|
|
||||||
|
|
||||||
hdr = (struct vmbus_channel_message_header *)msg->u.payload;
|
hdr = (struct vmbus_channel_message_header *)msg->u.payload;
|
||||||
size = msg->header.payload_size;
|
|
||||||
|
|
||||||
trace_vmbus_on_message(hdr);
|
trace_vmbus_on_message(hdr);
|
||||||
|
|
||||||
if (hdr->msgtype >= CHANNELMSG_COUNT) {
|
/*
|
||||||
pr_err("Received invalid channel message type %d size %d\n",
|
* vmbus_on_msg_dpc() makes sure the hdr->msgtype here can not go
|
||||||
hdr->msgtype, size);
|
* out of bound and the message_handler pointer can not be NULL.
|
||||||
print_hex_dump_bytes("", DUMP_PREFIX_NONE,
|
*/
|
||||||
(unsigned char *)msg->u.payload, size);
|
channel_message_table[hdr->msgtype].message_handler(hdr);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (channel_message_table[hdr->msgtype].message_handler)
|
|
||||||
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];
|
entry = &channel_message_table[hdr->msgtype];
|
||||||
|
|
||||||
|
if (!entry->message_handler)
|
||||||
|
goto msg_handled;
|
||||||
|
|
||||||
if (entry->handler_type == VMHT_BLOCKING) {
|
if (entry->handler_type == VMHT_BLOCKING) {
|
||||||
ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
|
ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
|
||||||
if (ctx == NULL)
|
if (ctx == NULL)
|
||||||
|
|||||||
@@ -22,10 +22,8 @@ int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!client || !slave_cb) {
|
if (WARN(IS_ERR_OR_NULL(client) || !slave_cb, "insufficient data\n"))
|
||||||
WARN(1, "insufficient data\n");
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
|
||||||
|
|
||||||
if (!(client->flags & I2C_CLIENT_SLAVE))
|
if (!(client->flags & I2C_CLIENT_SLAVE))
|
||||||
dev_warn(&client->dev, "%s: client slave flag not set. You might see address collisions\n",
|
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;
|
int ret;
|
||||||
|
|
||||||
|
if (IS_ERR_OR_NULL(client))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!client->adapter->algo->unreg_slave) {
|
if (!client->adapter->algo->unreg_slave) {
|
||||||
dev_err(&client->dev, "%s: not supported by adapter\n", __func__);
|
dev_err(&client->dev, "%s: not supported by adapter\n", __func__);
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|||||||
@@ -207,21 +207,33 @@ static int pm860x_led_probe(struct platform_device *pdev)
|
|||||||
data->cdev.brightness_set_blocking = pm860x_led_set;
|
data->cdev.brightness_set_blocking = pm860x_led_set;
|
||||||
mutex_init(&data->lock);
|
mutex_init(&data->lock);
|
||||||
|
|
||||||
ret = devm_led_classdev_register(chip->dev, &data->cdev);
|
ret = led_classdev_register(chip->dev, &data->cdev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
|
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
pm860x_led_set(&data->cdev, 0);
|
pm860x_led_set(&data->cdev, 0);
|
||||||
|
|
||||||
|
platform_set_drvdata(pdev, data);
|
||||||
|
|
||||||
return 0;
|
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 = {
|
static struct platform_driver pm860x_led_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "88pm860x-led",
|
.name = "88pm860x-led",
|
||||||
},
|
},
|
||||||
.probe = pm860x_led_probe,
|
.probe = pm860x_led_probe,
|
||||||
|
.remove = pm860x_led_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_platform_driver(pm860x_led_driver);
|
module_platform_driver(pm860x_led_driver);
|
||||||
|
|||||||
@@ -113,12 +113,23 @@ static int da903x_led_probe(struct platform_device *pdev)
|
|||||||
led->flags = pdata->flags;
|
led->flags = pdata->flags;
|
||||||
led->master = pdev->dev.parent;
|
led->master = pdev->dev.parent;
|
||||||
|
|
||||||
ret = devm_led_classdev_register(led->master, &led->cdev);
|
ret = led_classdev_register(led->master, &led->cdev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to register LED %d\n", id);
|
dev_err(&pdev->dev, "failed to register LED %d\n", id);
|
||||||
return ret;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,6 +138,7 @@ static struct platform_driver da903x_led_driver = {
|
|||||||
.name = "da903x-led",
|
.name = "da903x-led",
|
||||||
},
|
},
|
||||||
.probe = da903x_led_probe,
|
.probe = da903x_led_probe,
|
||||||
|
.remove = da903x_led_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_platform_driver(da903x_led_driver);
|
module_platform_driver(da903x_led_driver);
|
||||||
|
|||||||
@@ -698,7 +698,7 @@ static int lm3533_led_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
platform_set_drvdata(pdev, led);
|
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) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id);
|
dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -708,13 +708,18 @@ static int lm3533_led_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
ret = lm3533_led_setup(led, pdata);
|
ret = lm3533_led_setup(led, pdata);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_deregister;
|
||||||
|
|
||||||
ret = lm3533_ctrlbank_enable(&led->cb);
|
ret = lm3533_ctrlbank_enable(&led->cb);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto err_deregister;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_deregister:
|
||||||
|
led_classdev_unregister(&led->cdev);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lm3533_led_remove(struct platform_device *pdev)
|
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__);
|
dev_dbg(&pdev->dev, "%s\n", __func__);
|
||||||
|
|
||||||
lm3533_ctrlbank_disable(&led->cb);
|
lm3533_ctrlbank_disable(&led->cb);
|
||||||
|
led_classdev_unregister(&led->cdev);
|
||||||
|
|
||||||
return 0;
|
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.blink_set = wm831x_status_blink_set;
|
||||||
drvdata->cdev.groups = wm831x_status_groups;
|
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) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
|
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
|
||||||
return 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,6 +298,7 @@ static struct platform_driver wm831x_status_driver = {
|
|||||||
.name = "wm831x-status",
|
.name = "wm831x-status",
|
||||||
},
|
},
|
||||||
.probe = wm831x_status_probe,
|
.probe = wm831x_status_probe,
|
||||||
|
.remove = wm831x_status_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_platform_driver(wm831x_status_driver);
|
module_platform_driver(wm831x_status_driver);
|
||||||
|
|||||||
@@ -368,9 +368,6 @@ static int mtdchar_writeoob(struct file *file, struct mtd_info *mtd,
|
|||||||
uint32_t retlen;
|
uint32_t retlen;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (!(file->f_mode & FMODE_WRITE))
|
|
||||||
return -EPERM;
|
|
||||||
|
|
||||||
if (length > 4096)
|
if (length > 4096)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@@ -655,6 +652,48 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
|
|||||||
|
|
||||||
pr_debug("MTD_ioctl\n");
|
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) {
|
switch (cmd) {
|
||||||
case MEMGETREGIONCOUNT:
|
case MEMGETREGIONCOUNT:
|
||||||
if (copy_to_user(argp, &(mtd->numeraseregions), sizeof(int)))
|
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;
|
struct erase_info *erase;
|
||||||
|
|
||||||
if(!(file->f_mode & FMODE_WRITE))
|
|
||||||
return -EPERM;
|
|
||||||
|
|
||||||
erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL);
|
erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL);
|
||||||
if (!erase)
|
if (!erase)
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@@ -997,9 +1033,6 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
|
||||||
ret = -ENOTTY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
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 buf;
|
||||||
struct mtd_oob_buf32 __user *buf_user = argp;
|
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)))
|
if (copy_from_user(&buf, argp, sizeof(buf)))
|
||||||
ret = -EFAULT;
|
ret = -EFAULT;
|
||||||
else
|
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
|
/* Save message data locally to prevent them from
|
||||||
* being overwritten by next ndo_set_rx_mode call().
|
* 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;
|
mode = vf_work->mode;
|
||||||
mc = vf_work->mc;
|
mc = vf_work->mc;
|
||||||
vf_work->mc = NULL;
|
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);
|
__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
|
* check for the valid queue id
|
||||||
**/
|
**/
|
||||||
static inline bool i40e_vc_isvalid_queue_id(struct i40e_vf *vf, u16 vsi_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_pf *pf = vf->pf;
|
||||||
struct i40e_vsi *vsi = i40e_find_vsi_from_id(pf, vsi_id);
|
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
|
* 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;
|
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 v_idx, i, reg_idx, reg;
|
||||||
u32 next_q_idx, next_q_type;
|
u32 next_q_idx, next_q_type;
|
||||||
u32 msix_vf, size;
|
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) +
|
size = sizeof(struct virtchnl_iwarp_qvlist_info) +
|
||||||
(sizeof(struct virtchnl_iwarp_qv_info) *
|
(sizeof(struct virtchnl_iwarp_qv_info) *
|
||||||
(qvlist_info->num_vectors - 1));
|
(qvlist_info->num_vectors - 1));
|
||||||
|
kfree(vf->qvlist_info);
|
||||||
vf->qvlist_info = kzalloc(size, GFP_KERNEL);
|
vf->qvlist_info = kzalloc(size, GFP_KERNEL);
|
||||||
if (!vf->qvlist_info)
|
if (!vf->qvlist_info) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
vf->qvlist_info->num_vectors = qvlist_info->num_vectors;
|
vf->qvlist_info->num_vectors = qvlist_info->num_vectors;
|
||||||
|
|
||||||
msix_vf = pf->hw.func_caps.num_msix_vectors_vf;
|
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;
|
v_idx = qv_info->v_idx;
|
||||||
|
|
||||||
/* Validate vector id belongs to this vf */
|
/* Validate vector id belongs to this vf */
|
||||||
if (!i40e_vc_isvalid_vector_id(vf, v_idx))
|
if (!i40e_vc_isvalid_vector_id(vf, v_idx)) {
|
||||||
goto err;
|
ret = -EINVAL;
|
||||||
|
goto err_free;
|
||||||
|
}
|
||||||
|
|
||||||
vf->qvlist_info->qv_info[i] = *qv_info;
|
vf->qvlist_info->qv_info[i] = *qv_info;
|
||||||
|
|
||||||
@@ -502,10 +518,11 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err:
|
err_free:
|
||||||
kfree(vf->qvlist_info);
|
kfree(vf->qvlist_info);
|
||||||
vf->qvlist_info = NULL;
|
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)) {
|
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||||
aq_ret = I40E_ERR_PARAM;
|
aq_ret = I40E_ERR_PARAM;
|
||||||
goto err;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vf->adq_enabled) {
|
if (!vf->adq_enabled) {
|
||||||
@@ -3343,15 +3360,15 @@ 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 %d: ADq is not enabled, can't apply cloud filter\n",
|
||||||
vf->vf_id);
|
vf->vf_id);
|
||||||
aq_ret = I40E_ERR_PARAM;
|
aq_ret = I40E_ERR_PARAM;
|
||||||
goto err;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i40e_validate_cloud_filter(vf, vcf)) {
|
if (i40e_validate_cloud_filter(vf, vcf)) {
|
||||||
dev_info(&pf->pdev->dev,
|
dev_info(&pf->pdev->dev,
|
||||||
"VF %d: Invalid input/s, can't apply cloud filter\n",
|
"VF %d: Invalid input/s, can't apply cloud filter\n",
|
||||||
vf->vf_id);
|
vf->vf_id);
|
||||||
aq_ret = I40E_ERR_PARAM;
|
aq_ret = I40E_ERR_PARAM;
|
||||||
goto err;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
cfilter = kzalloc(sizeof(*cfilter), GFP_KERNEL);
|
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 %d: Failed to add cloud filter, err %s aq_err %s\n",
|
||||||
vf->vf_id, i40e_stat_str(&pf->hw, ret),
|
vf->vf_id, i40e_stat_str(&pf->hw, ret),
|
||||||
i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
|
i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
|
||||||
goto err;
|
goto err_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT_HLIST_NODE(&cfilter->cloud_node);
|
INIT_HLIST_NODE(&cfilter->cloud_node);
|
||||||
hlist_add_head(&cfilter->cloud_node, &vf->cloud_filter_list);
|
hlist_add_head(&cfilter->cloud_node, &vf->cloud_filter_list);
|
||||||
|
/* release the pointer passing it to the collection */
|
||||||
|
cfilter = NULL;
|
||||||
vf->num_cloud_filters++;
|
vf->num_cloud_filters++;
|
||||||
err:
|
err_free:
|
||||||
|
kfree(cfilter);
|
||||||
|
err_out:
|
||||||
return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_ADD_CLOUD_FILTER,
|
return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_ADD_CLOUD_FILTER,
|
||||||
aq_ret);
|
aq_ret);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6226,9 +6226,18 @@ static void igb_reset_task(struct work_struct *work)
|
|||||||
struct igb_adapter *adapter;
|
struct igb_adapter *adapter;
|
||||||
adapter = container_of(work, struct igb_adapter, reset_task);
|
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);
|
igb_dump(adapter);
|
||||||
netdev_err(adapter->netdev, "Reset adapter\n");
|
netdev_err(adapter->netdev, "Reset adapter\n");
|
||||||
igb_reinit_locked(adapter);
|
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]->irq = eth->irq[0];
|
||||||
eth->netdev[id]->dev.of_node = np;
|
eth->netdev[id]->dev.of_node = np;
|
||||||
|
|
||||||
|
eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
free_netdev:
|
free_netdev:
|
||||||
|
|||||||
@@ -543,12 +543,13 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
|
|||||||
u32 hash;
|
u32 hash;
|
||||||
struct hv_page_buffer pb[MAX_PAGE_BUFFER_COUNT];
|
struct hv_page_buffer pb[MAX_PAGE_BUFFER_COUNT];
|
||||||
|
|
||||||
/* if VF is present and up then redirect packets
|
/* If VF is present and up then redirect packets to it.
|
||||||
* already called with rcu_read_lock_bh
|
* 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);
|
vf_netdev = rcu_dereference_bh(net_device_ctx->vf_netdev);
|
||||||
if (vf_netdev && netif_running(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);
|
return netvsc_vf_xmit(net, vf_netdev, skb);
|
||||||
|
|
||||||
/* We will atmost need two pages to describe the rndis
|
/* 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();
|
minor = get_free_serial_index();
|
||||||
if (minor < 0)
|
if (minor < 0)
|
||||||
goto exit;
|
goto exit2;
|
||||||
|
|
||||||
/* register our minor number */
|
/* register our minor number */
|
||||||
serial->parent->dev = tty_port_register_device_attr(&serial->port,
|
serial->parent->dev = tty_port_register_device_attr(&serial->port,
|
||||||
tty_drv, minor, &serial->parent->interface->dev,
|
tty_drv, minor, &serial->parent->interface->dev,
|
||||||
serial->parent, hso_serial_dev_groups);
|
serial->parent, hso_serial_dev_groups);
|
||||||
|
if (IS_ERR(serial->parent->dev))
|
||||||
|
goto exit2;
|
||||||
|
|
||||||
/* fill in specific data for later use */
|
/* fill in specific data for later use */
|
||||||
serial->minor = minor;
|
serial->minor = minor;
|
||||||
@@ -2324,6 +2326,7 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
|
|||||||
return 0;
|
return 0;
|
||||||
exit:
|
exit:
|
||||||
hso_serial_tty_unregister(serial);
|
hso_serial_tty_unregister(serial);
|
||||||
|
exit2:
|
||||||
hso_serial_common_free(serial);
|
hso_serial_common_free(serial);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -388,10 +388,6 @@ struct lan78xx_net {
|
|||||||
struct tasklet_struct bh;
|
struct tasklet_struct bh;
|
||||||
struct delayed_work wq;
|
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;
|
int msg_enable;
|
||||||
|
|
||||||
struct urb *urb_intr;
|
struct urb *urb_intr;
|
||||||
@@ -2883,78 +2879,12 @@ lan78xx_start_xmit(struct sk_buff *skb, struct net_device *net)
|
|||||||
return NETDEV_TX_OK;
|
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)
|
static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf)
|
||||||
{
|
{
|
||||||
struct lan78xx_priv *pdata = NULL;
|
struct lan78xx_priv *pdata = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
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);
|
dev->data[0] = (unsigned long)kzalloc(sizeof(*pdata), GFP_KERNEL);
|
||||||
|
|
||||||
pdata = (struct lan78xx_priv *)(dev->data[0]);
|
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,
|
static int lan78xx_probe(struct usb_interface *intf,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
|
struct usb_host_endpoint *ep_blkin, *ep_blkout, *ep_intr;
|
||||||
struct lan78xx_net *dev;
|
struct lan78xx_net *dev;
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
struct usb_device *udev;
|
struct usb_device *udev;
|
||||||
@@ -3774,6 +3705,34 @@ static int lan78xx_probe(struct usb_interface *intf,
|
|||||||
|
|
||||||
mutex_init(&dev->stats.access_lock);
|
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);
|
ret = lan78xx_bind(dev, intf);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out2;
|
goto out2;
|
||||||
@@ -3786,23 +3745,7 @@ static int lan78xx_probe(struct usb_interface *intf,
|
|||||||
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
|
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
|
||||||
netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER);
|
netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER);
|
||||||
|
|
||||||
if (intf->cur_altsetting->desc.bNumEndpoints < 3) {
|
period = ep_intr->desc.bInterval;
|
||||||
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;
|
|
||||||
|
|
||||||
maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
|
maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
|
||||||
buf = kmalloc(maxp, GFP_KERNEL);
|
buf = kmalloc(maxp, GFP_KERNEL);
|
||||||
if (buf) {
|
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) {
|
for (h = 0; h < FDB_HASH_SIZE; ++h) {
|
||||||
struct vxlan_fdb *f;
|
struct vxlan_fdb *f;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) {
|
hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) {
|
||||||
struct vxlan_rdst *rd;
|
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,
|
cb->nlh->nlmsg_seq,
|
||||||
RTM_NEWNEIGH,
|
RTM_NEWNEIGH,
|
||||||
NLM_F_MULTI, rd);
|
NLM_F_MULTI, rd);
|
||||||
if (err < 0)
|
if (err < 0) {
|
||||||
|
rcu_read_unlock();
|
||||||
goto out;
|
goto out;
|
||||||
|
}
|
||||||
skip:
|
skip:
|
||||||
*idx += 1;
|
*idx += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
return err;
|
return err;
|
||||||
@@ -2219,7 +2223,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
|||||||
ndst = &rt->dst;
|
ndst = &rt->dst;
|
||||||
skb_tunnel_check_pmtu(skb, ndst, VXLAN_HEADROOM);
|
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);
|
ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
|
||||||
err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),
|
err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),
|
||||||
vni, md, flags, udp_sum);
|
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);
|
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);
|
ttl = ttl ? : ip6_dst_hoplimit(ndst);
|
||||||
skb_scrub_packet(skb, xnet);
|
skb_scrub_packet(skb, xnet);
|
||||||
err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
|
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_area_cachep __read_mostly;
|
||||||
static struct kmem_cache *ashmem_range_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)
|
static inline unsigned long range_size(struct ashmem_range *range)
|
||||||
{
|
{
|
||||||
return range->pgend - range->pgstart + 1;
|
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) {
|
if (!asma->file) {
|
||||||
char *name = ASHMEM_NAME_DEF;
|
char *name = ASHMEM_NAME_DEF;
|
||||||
struct file *vmfile;
|
struct file *vmfile;
|
||||||
|
struct inode *inode;
|
||||||
|
|
||||||
if (asma->name[ASHMEM_NAME_PREFIX_LEN] != '\0')
|
if (asma->name[ASHMEM_NAME_PREFIX_LEN] != '\0')
|
||||||
name = asma->name;
|
name = asma->name;
|
||||||
@@ -406,6 +416,8 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
vmfile->f_mode |= FMODE_LSEEK;
|
vmfile->f_mode |= FMODE_LSEEK;
|
||||||
|
inode = file_inode(vmfile);
|
||||||
|
lockdep_set_class(&inode->i_rwsem, &backing_shmem_inode_class);
|
||||||
asma->file = vmfile;
|
asma->file = vmfile;
|
||||||
/*
|
/*
|
||||||
* override mmap operation of the vmfile so that it can't be
|
* 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_3 0x43ba
|
||||||
#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb
|
#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb
|
||||||
#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc
|
#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_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";
|
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;
|
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||||
pdev->device == 0x1042)
|
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI)
|
||||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||||
pdev->device == 0x1142)
|
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI)
|
||||||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
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;
|
xhci->quirks |= XHCI_NO_64BIT_SUPPORT;
|
||||||
|
|
||||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
/*
|
/*
|
||||||
* Native support for the I/O-Warrior USB devices
|
* Native support for the I/O-Warrior USB devices
|
||||||
*
|
*
|
||||||
* Copyright (c) 2003-2005 Code Mercenaries GmbH
|
* Copyright (c) 2003-2005, 2020 Code Mercenaries GmbH
|
||||||
* written by Christian Lucht <lucht@codemercs.com>
|
* written by Christian Lucht <lucht@codemercs.com> and
|
||||||
|
* Christoph Jung <jung@codemercs.com>
|
||||||
*
|
*
|
||||||
* based on
|
* 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 */
|
/* 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);
|
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) ||
|
* Some devices need the report size to be different than the
|
||||||
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) ||
|
* endpoint size.
|
||||||
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) ||
|
*/
|
||||||
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100)))
|
if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) {
|
||||||
/* IOWarrior56 has wMaxPacketSize different from report size */
|
switch (dev->product_id) {
|
||||||
dev->report_size = 7;
|
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 */
|
/* create the urb and buffer for reading */
|
||||||
dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);
|
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, 0x9056)}, /* Sierra Wireless Modem */
|
||||||
{DEVICE_SWI(0x1199, 0x9060)}, /* Sierra Wireless Modem */
|
{DEVICE_SWI(0x1199, 0x9060)}, /* Sierra Wireless Modem */
|
||||||
{DEVICE_SWI(0x1199, 0x9061)}, /* 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, 0x9063)}, /* Sierra Wireless EM7305 */
|
||||||
{DEVICE_SWI(0x1199, 0x9070)}, /* Sierra Wireless MC74xx */
|
{DEVICE_SWI(0x1199, 0x9070)}, /* Sierra Wireless MC74xx */
|
||||||
{DEVICE_SWI(0x1199, 0x9071)}, /* 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);
|
p = (void *) (c->vc_origin + t * c->vc_size_row);
|
||||||
|
|
||||||
while (count--) {
|
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 +
|
scr_memcpyw(vgacon_scrollback_cur->data +
|
||||||
vgacon_scrollback_cur->tail,
|
vgacon_scrollback_cur->tail,
|
||||||
p, c->vc_size_row);
|
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 = {
|
static const struct dss_features omap3630_dss_feats = {
|
||||||
.fck_div_max = 32,
|
.fck_div_max = 31,
|
||||||
.dss_fck_multiplier = 1,
|
.dss_fck_multiplier = 1,
|
||||||
.parent_clk_name = "dpll4_ck",
|
.parent_clk_name = "dpll4_ck",
|
||||||
.dpi_select_source = &dss_dpi_select_source_omap2_omap3,
|
.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;
|
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
|
int
|
||||||
vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
__vfs_setxattr_locked(struct dentry *dentry, const char *name,
|
||||||
size_t size, int flags)
|
const void *value, size_t size, int flags,
|
||||||
|
struct inode **delegated_inode)
|
||||||
{
|
{
|
||||||
struct inode *inode = dentry->d_inode;
|
struct inode *inode = dentry->d_inode;
|
||||||
int error;
|
int error;
|
||||||
@@ -215,15 +227,40 @@ vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
|||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
inode_lock(inode);
|
|
||||||
error = security_inode_setxattr(dentry, name, value, size, flags);
|
error = security_inode_setxattr(dentry, name, value, size, flags);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
error = try_break_deleg(inode, delegated_inode);
|
||||||
|
if (error)
|
||||||
|
goto out;
|
||||||
|
|
||||||
error = __vfs_setxattr_noperm(dentry, name, value, size, flags);
|
error = __vfs_setxattr_noperm(dentry, name, value, size, flags);
|
||||||
|
|
||||||
out:
|
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);
|
inode_unlock(inode);
|
||||||
|
|
||||||
|
if (delegated_inode) {
|
||||||
|
error = break_deleg_wait(&delegated_inode);
|
||||||
|
if (!error)
|
||||||
|
goto retry_deleg;
|
||||||
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(vfs_setxattr);
|
EXPORT_SYMBOL_GPL(vfs_setxattr);
|
||||||
@@ -386,8 +423,18 @@ __vfs_removexattr(struct dentry *dentry, const char *name)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__vfs_removexattr);
|
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
|
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;
|
struct inode *inode = dentry->d_inode;
|
||||||
int error;
|
int error;
|
||||||
@@ -396,11 +443,14 @@ vfs_removexattr(struct dentry *dentry, const char *name)
|
|||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
inode_lock(inode);
|
|
||||||
error = security_inode_removexattr(dentry, name);
|
error = security_inode_removexattr(dentry, name);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
error = try_break_deleg(inode, delegated_inode);
|
||||||
|
if (error)
|
||||||
|
goto out;
|
||||||
|
|
||||||
error = __vfs_removexattr(dentry, name);
|
error = __vfs_removexattr(dentry, name);
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
@@ -409,12 +459,32 @@ vfs_removexattr(struct dentry *dentry, const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
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);
|
inode_unlock(inode);
|
||||||
|
|
||||||
|
if (delegated_inode) {
|
||||||
|
error = break_deleg_wait(&delegated_inode);
|
||||||
|
if (!error)
|
||||||
|
goto retry_deleg;
|
||||||
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(vfs_removexattr);
|
EXPORT_SYMBOL_GPL(vfs_removexattr);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extended attribute SET operations
|
* Extended attribute SET operations
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -428,6 +428,8 @@ enum vmbus_channel_message_type {
|
|||||||
CHANNELMSG_19 = 19,
|
CHANNELMSG_19 = 19,
|
||||||
CHANNELMSG_20 = 20,
|
CHANNELMSG_20 = 20,
|
||||||
CHANNELMSG_TL_CONNECT_REQUEST = 21,
|
CHANNELMSG_TL_CONNECT_REQUEST = 21,
|
||||||
|
CHANNELMSG_22 = 22,
|
||||||
|
CHANNELMSG_TL_CONNECT_RESULT = 23,
|
||||||
CHANNELMSG_COUNT
|
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);
|
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(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_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_setxattr(struct dentry *, const char *, const void *, size_t, int);
|
||||||
int __vfs_removexattr(struct dentry *, const char *);
|
int __vfs_removexattr(struct dentry *, const char *);
|
||||||
|
int __vfs_removexattr_locked(struct dentry *, const char *, struct inode **);
|
||||||
int vfs_removexattr(struct dentry *, const char *);
|
int vfs_removexattr(struct dentry *, const char *);
|
||||||
|
|
||||||
ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
|
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);
|
const struct in6_addr *addr);
|
||||||
int ipv6_sock_ac_drop(struct sock *sk, int ifindex,
|
int ipv6_sock_ac_drop(struct sock *sk, int ifindex,
|
||||||
const struct in6_addr *addr);
|
const struct in6_addr *addr);
|
||||||
|
void __ipv6_sock_ac_close(struct sock *sk);
|
||||||
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);
|
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;
|
return -ENOMEM;
|
||||||
|
|
||||||
ts->rd = fget(rfd);
|
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);
|
ts->wr = fget(wfd);
|
||||||
if (!ts->rd || !ts->wr) {
|
if (!ts->wr)
|
||||||
if (ts->rd)
|
goto out_put_rd;
|
||||||
fput(ts->rd);
|
if (!(ts->wr->f_mode & FMODE_WRITE))
|
||||||
if (ts->wr)
|
goto out_put_wr;
|
||||||
fput(ts->wr);
|
|
||||||
kfree(ts);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
client->trans = ts;
|
client->trans = ts;
|
||||||
client->status = Connected;
|
client->status = Connected;
|
||||||
|
|
||||||
return 0;
|
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)
|
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);
|
BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
|
||||||
|
|
||||||
if (!num_rsp)
|
if (!num_rsp || skb->len < num_rsp * sizeof(*info) + 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
|
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;
|
struct inquiry_info_with_rssi_and_pscan_mode *info;
|
||||||
info = (void *) (skb->data + 1);
|
info = (void *) (skb->data + 1);
|
||||||
|
|
||||||
|
if (skb->len < num_rsp * sizeof(*info) + 1)
|
||||||
|
goto unlock;
|
||||||
|
|
||||||
for (; num_rsp; num_rsp--, info++) {
|
for (; num_rsp; num_rsp--, info++) {
|
||||||
u32 flags;
|
u32 flags;
|
||||||
|
|
||||||
@@ -3969,6 +3972,9 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
|
|||||||
} else {
|
} else {
|
||||||
struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
|
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++) {
|
for (; num_rsp; num_rsp--, info++) {
|
||||||
u32 flags;
|
u32 flags;
|
||||||
|
|
||||||
@@ -3989,6 +3995,7 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock:
|
||||||
hci_dev_unlock(hdev);
|
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);
|
BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
|
||||||
|
|
||||||
if (!num_rsp)
|
if (!num_rsp || skb->len < num_rsp * sizeof(*info) + 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
|
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) {
|
while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
|
||||||
struct key_vector *local_l = NULL, *local_tp;
|
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;
|
struct fib_alias *new_fa;
|
||||||
|
|
||||||
if (local_tb->tb_id != fa->tb_id)
|
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)
|
netdev_features_t features)
|
||||||
{
|
{
|
||||||
int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb);
|
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);
|
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
||||||
u16 mac_offset = skb->mac_header;
|
u16 mac_offset = skb->mac_header;
|
||||||
__be16 protocol = skb->protocol;
|
__be16 protocol = skb->protocol;
|
||||||
u16 mac_len = skb->mac_len;
|
u16 mac_len = skb->mac_len;
|
||||||
int gre_offset, outer_hlen;
|
int gre_offset, outer_hlen;
|
||||||
bool need_csum, gso_partial;
|
|
||||||
|
|
||||||
if (!skb->encapsulation)
|
if (!skb->encapsulation)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -45,6 +45,7 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
|
|||||||
skb->protocol = skb->inner_protocol;
|
skb->protocol = skb->inner_protocol;
|
||||||
|
|
||||||
need_csum = !!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE_CSUM);
|
need_csum = !!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE_CSUM);
|
||||||
|
need_recompute_csum = skb->csum_not_inet;
|
||||||
skb->encap_hdr_csum = need_csum;
|
skb->encap_hdr_csum = need_csum;
|
||||||
|
|
||||||
features &= skb->dev->hw_enc_features;
|
features &= skb->dev->hw_enc_features;
|
||||||
@@ -102,7 +103,15 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
*(pcsum + 1) = 0;
|
*(pcsum + 1) = 0;
|
||||||
*pcsum = gso_make_checksum(skb, 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));
|
} while ((skb = skb->next));
|
||||||
out:
|
out:
|
||||||
return segs;
|
return segs;
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ int ipv6_sock_ac_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
|
|||||||
return 0;
|
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 ipv6_pinfo *np = inet6_sk(sk);
|
||||||
struct net_device *dev = NULL;
|
struct net_device *dev = NULL;
|
||||||
@@ -181,10 +181,7 @@ void ipv6_sock_ac_close(struct sock *sk)
|
|||||||
struct net *net = sock_net(sk);
|
struct net *net = sock_net(sk);
|
||||||
int prev_index;
|
int prev_index;
|
||||||
|
|
||||||
if (!np->ipv6_ac_list)
|
ASSERT_RTNL();
|
||||||
return;
|
|
||||||
|
|
||||||
rtnl_lock();
|
|
||||||
pac = np->ipv6_ac_list;
|
pac = np->ipv6_ac_list;
|
||||||
np->ipv6_ac_list = NULL;
|
np->ipv6_ac_list = NULL;
|
||||||
|
|
||||||
@@ -201,6 +198,16 @@ void ipv6_sock_ac_close(struct sock *sk)
|
|||||||
sock_kfree_s(sk, pac, sizeof(*pac));
|
sock_kfree_s(sk, pac, sizeof(*pac));
|
||||||
pac = next;
|
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();
|
rtnl_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -207,6 +207,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||||||
|
|
||||||
fl6_free_socklist(sk);
|
fl6_free_socklist(sk);
|
||||||
__ipv6_sock_mc_close(sk);
|
__ipv6_sock_mc_close(sk);
|
||||||
|
__ipv6_sock_ac_close(sk);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sock is moving from IPv6 to IPv4 (sk_prot), so
|
* 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);
|
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,
|
int ovs_ct_put_key(const struct sw_flow_key *swkey,
|
||||||
const struct sw_flow_key *output, struct sk_buff *skb)
|
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->ct_orig_proto) {
|
||||||
if (swkey->eth.type == htons(ETH_P_IP)) {
|
if (swkey->eth.type == htons(ETH_P_IP)) {
|
||||||
struct ovs_key_ct_tuple_ipv4 orig = {
|
struct ovs_key_ct_tuple_ipv4 orig;
|
||||||
output->ipv4.ct_orig.src,
|
|
||||||
output->ipv4.ct_orig.dst,
|
memset(&orig, 0, sizeof(orig));
|
||||||
output->ct.orig_tp.src,
|
orig.ipv4_src = output->ipv4.ct_orig.src;
|
||||||
output->ct.orig_tp.dst,
|
orig.ipv4_dst = output->ipv4.ct_orig.dst;
|
||||||
output->ct_orig_proto,
|
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,
|
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4,
|
||||||
sizeof(orig), &orig))
|
sizeof(orig), &orig))
|
||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
} else if (swkey->eth.type == htons(ETH_P_IPV6)) {
|
} else if (swkey->eth.type == htons(ETH_P_IPV6)) {
|
||||||
struct ovs_key_ct_tuple_ipv6 orig = {
|
struct ovs_key_ct_tuple_ipv6 orig;
|
||||||
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.src),
|
|
||||||
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.dst),
|
memset(&orig, 0, sizeof(orig));
|
||||||
output->ct.orig_tp.src,
|
memcpy(orig.ipv6_src, output->ipv6.ct_orig.src.s6_addr32,
|
||||||
output->ct.orig_tp.dst,
|
sizeof(orig.ipv6_src));
|
||||||
output->ct_orig_proto,
|
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,
|
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6,
|
||||||
sizeof(orig), &orig))
|
sizeof(orig), &orig))
|
||||||
return -EMSGSIZE;
|
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);
|
ret = rxrpc_connect_call(rx, call, cp, srx, gfp);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error_attached_to_socket;
|
||||||
|
|
||||||
trace_rxrpc_call(call, rxrpc_call_connected, atomic_read(&call->usage),
|
trace_rxrpc_call(call, rxrpc_call_connected, atomic_read(&call->usage),
|
||||||
here, NULL);
|
here, NULL);
|
||||||
@@ -310,18 +310,29 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
|||||||
error_dup_user_ID:
|
error_dup_user_ID:
|
||||||
write_unlock(&rx->call_lock);
|
write_unlock(&rx->call_lock);
|
||||||
release_sock(&rx->sk);
|
release_sock(&rx->sk);
|
||||||
ret = -EEXIST;
|
|
||||||
|
|
||||||
error:
|
|
||||||
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_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),
|
trace_rxrpc_call(call, rxrpc_call_error, atomic_read(&call->usage),
|
||||||
here, ERR_PTR(ret));
|
here, ERR_PTR(-EEXIST));
|
||||||
rxrpc_release_call(rx, call);
|
rxrpc_release_call(rx, call);
|
||||||
mutex_unlock(&call->user_mutex);
|
mutex_unlock(&call->user_mutex);
|
||||||
rxrpc_put_call(call, rxrpc_call_put);
|
rxrpc_put_call(call, rxrpc_call_put);
|
||||||
_leave(" = %d", ret);
|
_leave(" = -EEXIST");
|
||||||
return ERR_PTR(ret);
|
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;
|
call->peer->cong_cwnd = call->cong_cwnd;
|
||||||
|
|
||||||
spin_lock_bh(&conn->params.peer->lock);
|
if (!hlist_unhashed(&call->error_link)) {
|
||||||
hlist_del_rcu(&call->error_link);
|
spin_lock_bh(&call->peer->lock);
|
||||||
spin_unlock_bh(&conn->params.peer->lock);
|
hlist_del_rcu(&call->error_link);
|
||||||
|
spin_unlock_bh(&call->peer->lock);
|
||||||
|
}
|
||||||
|
|
||||||
if (rxrpc_is_client_call(call))
|
if (rxrpc_is_client_call(call))
|
||||||
return rxrpc_disconnect_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;
|
goto error_unlock_call;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg->msg_name) {
|
if (msg->msg_name && call->peer) {
|
||||||
struct sockaddr_rxrpc *srx = msg->msg_name;
|
struct sockaddr_rxrpc *srx = msg->msg_name;
|
||||||
size_t len = sizeof(call->peer->srx);
|
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))
|
if (IS_ERR(call))
|
||||||
return PTR_ERR(call);
|
return PTR_ERR(call);
|
||||||
/* ... and we have the call lock. */
|
/* ... and we have the call lock. */
|
||||||
|
ret = 0;
|
||||||
|
if (READ_ONCE(call->state) == RXRPC_CALL_COMPLETE)
|
||||||
|
goto out_put_unlock;
|
||||||
} else {
|
} else {
|
||||||
switch (READ_ONCE(call->state)) {
|
switch (READ_ONCE(call->state)) {
|
||||||
case RXRPC_CALL_UNINITIALISED:
|
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))
|
if (!wdev_running(wdev))
|
||||||
return -ENETDOWN;
|
return -ENETDOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!vcmd->doit)
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
} else {
|
} else {
|
||||||
wdev = NULL;
|
wdev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!vcmd->doit)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
|
if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
|
||||||
data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
|
data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
|
||||||
len = nla_len(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,
|
static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct task_smack *tsp = current_security();
|
|
||||||
char *data;
|
char *data;
|
||||||
int rc;
|
int rc;
|
||||||
LIST_HEAD(list_tmp);
|
LIST_HEAD(list_tmp);
|
||||||
@@ -2771,11 +2770,21 @@ static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
|
|||||||
kfree(data);
|
kfree(data);
|
||||||
|
|
||||||
if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) {
|
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);
|
smk_destroy_label_list(&tsp->smk_relabel);
|
||||||
list_splice(&list_tmp, &tsp->smk_relabel);
|
list_splice(&list_tmp, &tsp->smk_relabel);
|
||||||
|
commit_creds(new);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
smk_destroy_label_list(&list_tmp);
|
smk_destroy_label_list(&list_tmp);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -181,10 +181,16 @@ static long
|
|||||||
odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
struct seq_oss_devinfo *dp;
|
struct seq_oss_devinfo *dp;
|
||||||
|
long rc;
|
||||||
|
|
||||||
dp = file->private_data;
|
dp = file->private_data;
|
||||||
if (snd_BUG_ON(!dp))
|
if (snd_BUG_ON(!dp))
|
||||||
return -ENXIO;
|
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
|
#ifdef CONFIG_COMPAT
|
||||||
|
|||||||
@@ -2478,7 +2478,6 @@ static int azx_probe_continue(struct azx *chip)
|
|||||||
|
|
||||||
if (azx_has_pm_runtime(chip)) {
|
if (azx_has_pm_runtime(chip)) {
|
||||||
pm_runtime_use_autosuspend(&pci->dev);
|
pm_runtime_use_autosuspend(&pci->dev);
|
||||||
pm_runtime_allow(&pci->dev);
|
|
||||||
pm_runtime_put_autosuspend(&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)
|
if (read_expected(EVENT_DELIM, ")") < 0)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
|
free_token(token);
|
||||||
type = read_token(&token);
|
type = read_token(&token);
|
||||||
*tok = token;
|
*tok = token;
|
||||||
|
|
||||||
|
|||||||
@@ -125,9 +125,8 @@ static int do_setcpu(int cpu)
|
|||||||
CPU_ZERO(&mask);
|
CPU_ZERO(&mask);
|
||||||
CPU_SET(cpu, &mask);
|
CPU_SET(cpu, &mask);
|
||||||
if (sched_setaffinity(0, sizeof(mask), &mask))
|
if (sched_setaffinity(0, sizeof(mask), &mask))
|
||||||
error(1, 0, "setaffinity %d", cpu);
|
fprintf(stderr, "cpu: unable to pin, may increase variance.\n");
|
||||||
|
else if (cfg_verbose)
|
||||||
if (cfg_verbose)
|
|
||||||
fprintf(stderr, "cpu: %u\n", cpu);
|
fprintf(stderr, "cpu: %u\n", cpu);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user