commit:     77d4994b057e94128881c4219ff9431f8b22ff8a
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Wed Aug 12 23:36:35 2020 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Wed Aug 12 23:36:44 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=77d4994b

Linux patch 4.19.139

Signed-off-by: Alice Ferrazzi <alicef <AT> gentoo.org>

 0000_README               |    4 +
 1138_linux-4.19.139.patch | 1713 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1717 insertions(+)

diff --git a/0000_README b/0000_README
index c72d2c2..b90eb63 100644
--- a/0000_README
+++ b/0000_README
@@ -591,6 +591,10 @@ Patch:  1137_linux-4.19.138.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.19.138
 
+Patch:  1138_linux-4.19.139.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.19.139
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1138_linux-4.19.139.patch b/1138_linux-4.19.139.patch
new file mode 100644
index 0000000..7235e09
--- /dev/null
+++ b/1138_linux-4.19.139.patch
@@ -0,0 +1,1713 @@
+diff --git a/Makefile b/Makefile
+index daaa8ab2f550..f6012170995e 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 19
+-SUBLEVEL = 138
++SUBLEVEL = 139
+ EXTRAVERSION =
+ NAME = "People's Front"
+ 
+diff --git a/drivers/android/binder.c b/drivers/android/binder.c
+index cf4367135a00..112b5b50ad3c 100644
+--- a/drivers/android/binder.c
++++ b/drivers/android/binder.c
+@@ -2862,6 +2862,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;
+@@ -3366,10 +3372,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)
+diff --git a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c
+index afebeb1c3e1e..723bad1201cc 100644
+--- a/drivers/atm/atmtcp.c
++++ b/drivers/atm/atmtcp.c
+@@ -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);
+diff --git a/drivers/firmware/qemu_fw_cfg.c b/drivers/firmware/qemu_fw_cfg.c
+index 039e0f91dba8..6945c3c96637 100644
+--- a/drivers/firmware/qemu_fw_cfg.c
++++ b/drivers/firmware/qemu_fw_cfg.c
+@@ -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;
+ }
+diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c 
b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+index 0f64c0a1d4b3..406cb99af7f2 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
++++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+@@ -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 @@ fini:
+       drm_fb_helper_fini(&fbcon->helper);
+ free:
+       kfree(fbcon);
++      drm->fbcon = NULL;
+       return ret;
+ }
+ 
+diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
+index 3bf1f9ef8ea2..c83361a8e203 100644
+--- a/drivers/hv/channel_mgmt.c
++++ b/drivers/hv/channel_mgmt.c
+@@ -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)
+-              channel_message_table[hdr->msgtype].message_handler(hdr);
+-      else
+-              pr_err("Unhandled channel message type %d\n", hdr->msgtype);
++      /*
++       * 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);
+ }
+ 
+ /*
+diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
+index fb22b72fd535..0699c6018889 100644
+--- a/drivers/hv/vmbus_drv.c
++++ b/drivers/hv/vmbus_drv.c
+@@ -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)
+diff --git a/drivers/i2c/i2c-core-slave.c b/drivers/i2c/i2c-core-slave.c
+index 47a9f70a24a9..f2e7e373ee47 100644
+--- a/drivers/i2c/i2c-core-slave.c
++++ b/drivers/i2c/i2c-core-slave.c
+@@ -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;
+diff --git a/drivers/leds/leds-88pm860x.c b/drivers/leds/leds-88pm860x.c
+index 77a104d2b124..13f414ff6fd0 100644
+--- a/drivers/leds/leds-88pm860x.c
++++ b/drivers/leds/leds-88pm860x.c
+@@ -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);
+diff --git a/drivers/leds/leds-da903x.c b/drivers/leds/leds-da903x.c
+index 5ff7d72f73aa..ecc265bb69a0 100644
+--- a/drivers/leds/leds-da903x.c
++++ b/drivers/leds/leds-da903x.c
+@@ -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);
+diff --git a/drivers/leds/leds-lm3533.c b/drivers/leds/leds-lm3533.c
+index 72224b599ffc..c1e562a4d6ad 100644
+--- a/drivers/leds/leds-lm3533.c
++++ b/drivers/leds/leds-lm3533.c
+@@ -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;
+ }
+diff --git a/drivers/leds/leds-wm831x-status.c 
b/drivers/leds/leds-wm831x-status.c
+index c5798b92e4d3..d926edcb04ee 100644
+--- a/drivers/leds/leds-wm831x-status.c
++++ b/drivers/leds/leds-wm831x-status.c
+@@ -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);
+diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c
+index 02389528f622..5afc653c09e2 100644
+--- a/drivers/mtd/mtdchar.c
++++ b/drivers/mtd/mtdchar.c
+@@ -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
+diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c 
b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+index dca02b35c231..99eea9e6a8ea 100644
+--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
++++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+@@ -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);
+ }
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c 
b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+index 6a677fd540d6..bc4eda52372a 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+@@ -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,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->vf_id);
+               aq_ret = I40E_ERR_PARAM;
+-              goto err;
++              goto err_out;
+       }
+ 
+       if (i40e_validate_cloud_filter(vf, vcf)) {
+               dev_info(&pf->pdev->dev,
+                        "VF %d: Invalid input/s, can't apply cloud filter\n",
+                        vf->vf_id);
+-                      aq_ret = I40E_ERR_PARAM;
+-                      goto err;
++              aq_ret = I40E_ERR_PARAM;
++              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);
+ }
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
+index 36db874f3c92..d85eb80d8249 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -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();
+ }
+ 
+ /**
+diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c 
b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+index 1d55f014725e..b72a4fad7bc8 100644
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -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:
+diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
+index bdb55db4523b..e33cbb793b63 100644
+--- a/drivers/net/hyperv/netvsc_drv.c
++++ b/drivers/net/hyperv/netvsc_drv.c
+@@ -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
+diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
+index 61b9d3368148..bff268b4a9a4 100644
+--- a/drivers/net/usb/hso.c
++++ b/drivers/net/usb/hso.c
+@@ -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;
+ }
+diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
+index d198f36785a4..5bd07cdb3e6e 100644
+--- a/drivers/net/usb/lan78xx.c
++++ b/drivers/net/usb/lan78xx.c
+@@ -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) {
+diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
+index 09f0b53b2b77..abf85f0ab72f 100644
+--- a/drivers/net/vxlan.c
++++ b/drivers/net/vxlan.c
+@@ -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),
+diff --git a/drivers/staging/android/ashmem.c 
b/drivers/staging/android/ashmem.c
+index e3df4bf521b5..a97bbd89fae2 100644
+--- a/drivers/staging/android/ashmem.c
++++ b/drivers/staging/android/ashmem.c
+@@ -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
+diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
+index 9b02e3e3f998..1a6a23e57201 100644
+--- a/drivers/usb/host/xhci-pci.c
++++ b/drivers/usb/host/xhci-pci.c
+@@ -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 &&
+diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
+index 92875a264b14..9c1ca20d4139 100644
+--- a/drivers/usb/misc/iowarrior.c
++++ b/drivers/usb/misc/iowarrior.c
+@@ -2,8 +2,9 @@
+ /*
+  *  Native support for the I/O-Warrior USB devices
+  *
+- *  Copyright (c) 2003-2005  Code Mercenaries GmbH
+- *  written by Christian Lucht <lu...@codemercs.com>
++ *  Copyright (c) 2003-2005, 2020  Code Mercenaries GmbH
++ *  written by Christian Lucht <lu...@codemercs.com> and
++ *  Christoph Jung <j...@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 */
+-              dev->report_size = 7;
++
++      /*
++       * 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);
+diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
+index d147feae83e6..0f60363c1bbc 100644
+--- a/drivers/usb/serial/qcserial.c
++++ b/drivers/usb/serial/qcserial.c
+@@ -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 */
+diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
+index bfaa9ec4bc1f..e079b910feb2 100644
+--- a/drivers/video/console/vgacon.c
++++ b/drivers/video/console/vgacon.c
+@@ -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);
+diff --git a/drivers/video/fbdev/omap2/omapfb/dss/dss.c 
b/drivers/video/fbdev/omap2/omapfb/dss/dss.c
+index f0cac9e0eb94..b6c6c24979dd 100644
+--- a/drivers/video/fbdev/omap2/omapfb/dss/dss.c
++++ b/drivers/video/fbdev/omap2/omapfb/dss/dss.c
+@@ -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,
+diff --git a/fs/xattr.c b/fs/xattr.c
+index 0d6a6a4af861..470ee0af3200 100644
+--- a/fs/xattr.c
++++ b/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);
+@@ -377,8 +414,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;
+@@ -387,11 +434,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) {
+@@ -400,12 +450,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
+  */
+diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
+index c43e694fef7d..35461d49d3ae 100644
+--- a/include/linux/hyperv.h
++++ b/include/linux/hyperv.h
+@@ -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
+ };
+ 
+diff --git a/include/linux/xattr.h b/include/linux/xattr.h
+index 6dad031be3c2..3a71ad716da5 100644
+--- a/include/linux/xattr.h
++++ b/include/linux/xattr.h
+@@ -51,8 +51,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);
+diff --git a/include/net/addrconf.h b/include/net/addrconf.h
+index c8d5bb8b3616..db2a87981dd4 100644
+--- a/include/net/addrconf.h
++++ b/include/net/addrconf.h
+@@ -305,6 +305,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);
+diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
+index d28c2cc9618f..b6dcb40fa8a7 100644
+--- a/net/9p/trans_fd.c
++++ b/net/9p/trans_fd.c
+@@ -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)
+diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
+index cdb92b129906..2b4a7cf03041 100644
+--- a/net/bluetooth/hci_event.c
++++ b/net/bluetooth/hci_event.c
+@@ -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))
+diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
+index 3047fc4737c4..48d7125501b4 100644
+--- a/net/ipv4/fib_trie.c
++++ b/net/ipv4/fib_trie.c
+@@ -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)
+diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c
+index 6c63524f598a..89c613f19566 100644
+--- a/net/ipv4/gre_offload.c
++++ b/net/ipv4/gre_offload.c
+@@ -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;
+-              *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));
+ out:
+       return segs;
+diff --git a/net/ipv6/anycast.c b/net/ipv6/anycast.c
+index 4e0ff7031edd..55fbe330471c 100644
+--- a/net/ipv6/anycast.c
++++ b/net/ipv6/anycast.c
+@@ -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();
+ }
+ 
+diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
+index aa54303c43a6..4e1da6cb9ed7 100644
+--- a/net/ipv6/ipv6_sockglue.c
++++ b/net/ipv6/ipv6_sockglue.c
+@@ -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
+diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c
+index 6dcb59f272e1..f8e073ef1a67 100644
+--- a/net/openvswitch/conntrack.c
++++ b/net/openvswitch/conntrack.c
+@@ -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;
+diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c
+index 964c4e45de11..39f5fa3501ff 100644
+--- a/net/rxrpc/call_object.c
++++ b/net/rxrpc/call_object.c
+@@ -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;
+ }
+ 
+ /*
+diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c
+index c4c4450891e0..2adb7c5c8966 100644
+--- a/net/rxrpc/conn_object.c
++++ b/net/rxrpc/conn_object.c
+@@ -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);
+-      hlist_del_rcu(&call->error_link);
+-      spin_unlock_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(&call->peer->lock);
++      }
+ 
+       if (rxrpc_is_client_call(call))
+               return rxrpc_disconnect_client_call(call);
+diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c
+index 6e9d977f0797..e4fde33b887e 100644
+--- a/net/rxrpc/recvmsg.c
++++ b/net/rxrpc/recvmsg.c
+@@ -530,7 +530,7 @@ try_again:
+                       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);
+ 
+diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c
+index caee7632c257..edd76c41765f 100644
+--- a/net/rxrpc/sendmsg.c
++++ b/net/rxrpc/sendmsg.c
+@@ -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:
+diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
+index 0221849b7218..996b68b48a87 100644
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -12392,13 +12392,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]);
+diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
+index 371ae368da35..10ee51d04492 100644
+--- a/security/smack/smackfs.c
++++ b/security/smack/smackfs.c
+@@ -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;
+ }
+diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c
+index e1f44fc86885..ed5bca0db3e7 100644
+--- a/sound/core/seq/oss/seq_oss.c
++++ b/sound/core/seq/oss/seq_oss.c
+@@ -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(&register_mutex);
++      rc = snd_seq_oss_ioctl(dp, cmd, arg);
++      mutex_unlock(&register_mutex);
++      return rc;
+ }
+ 
+ #ifdef CONFIG_COMPAT
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index 8e1eb5f243a2..d43245937db7 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -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);
+       }
+ 
+diff --git a/tools/lib/traceevent/event-parse.c 
b/tools/lib/traceevent/event-parse.c
+index 382e476629fb..c0fcc8af2a3e 100644
+--- a/tools/lib/traceevent/event-parse.c
++++ b/tools/lib/traceevent/event-parse.c
+@@ -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;
+ 
+diff --git a/tools/testing/selftests/net/msg_zerocopy.c 
b/tools/testing/selftests/net/msg_zerocopy.c
+index 406cc70c571d..c539591937a1 100644
+--- a/tools/testing/selftests/net/msg_zerocopy.c
++++ b/tools/testing/selftests/net/msg_zerocopy.c
+@@ -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;

Reply via email to