diff options
author | 2021-01-23 11:37:31 -0500 | |
---|---|---|
committer | 2021-01-23 11:37:31 -0500 | |
commit | 5dd74c704e193a9863d9b3138a3bd8efa8273f3e (patch) | |
tree | e776eff70ff97c31d9773d1fff9090cb93278e1d | |
parent | Linux patch 5.4.91 (diff) | |
download | linux-patches-5dd74c704e193a9863d9b3138a3bd8efa8273f3e.tar.gz linux-patches-5dd74c704e193a9863d9b3138a3bd8efa8273f3e.tar.bz2 linux-patches-5dd74c704e193a9863d9b3138a3bd8efa8273f3e.zip |
Linux patch 5.4.92
Signed-off-by: Mike Pagano <mpagano@gentoo.org>
-rw-r--r-- | 0000_README | 4 | ||||
-rw-r--r-- | 1091_linux-5.4.92.patch | 756 |
2 files changed, 760 insertions, 0 deletions
diff --git a/0000_README b/0000_README index d6e09931..29bc2f51 100644 --- a/0000_README +++ b/0000_README @@ -407,6 +407,10 @@ Patch: 1090_linux-5.4.91.patch From: http://www.kernel.org Desc: Linux 5.4.91 +Patch: 1091_linux-5.4.92.patch +From: http://www.kernel.org +Desc: Linux 5.4.92 + 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/1091_linux-5.4.92.patch b/1091_linux-5.4.92.patch new file mode 100644 index 00000000..65ab41d4 --- /dev/null +++ b/1091_linux-5.4.92.patch @@ -0,0 +1,756 @@ +diff --git a/Makefile b/Makefile +index a5edbd4f34145..5bae2206a35e7 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 4 +-SUBLEVEL = 91 ++SUBLEVEL = 92 + EXTRAVERSION = + NAME = Kleptomaniac Octopus + +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +index 6988bbf2576f5..9a77b70ad601b 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -4790,8 +4790,6 @@ static void mvpp2_phylink_validate(struct phylink_config *config, + + phylink_set(mask, Autoneg); + phylink_set_port_modes(mask); +- phylink_set(mask, Pause); +- phylink_set(mask, Asym_Pause); + + switch (state->interface) { + case PHY_INTERFACE_MODE_10GKR: +diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +index 71c90c8a9e943..c3fc1cc4bb2b9 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/core_thermal.c +@@ -19,7 +19,7 @@ + #define MLXSW_THERMAL_ASIC_TEMP_NORM 75000 /* 75C */ + #define MLXSW_THERMAL_ASIC_TEMP_HIGH 85000 /* 85C */ + #define MLXSW_THERMAL_ASIC_TEMP_HOT 105000 /* 105C */ +-#define MLXSW_THERMAL_ASIC_TEMP_CRIT 110000 /* 110C */ ++#define MLXSW_THERMAL_ASIC_TEMP_CRIT 140000 /* 140C */ + #define MLXSW_THERMAL_HYSTERESIS_TEMP 5000 /* 5C */ + #define MLXSW_THERMAL_MODULE_TEMP_SHIFT (MLXSW_THERMAL_HYSTERESIS_TEMP * 2) + #define MLXSW_THERMAL_ZONE_MAX_NAME 16 +@@ -177,6 +177,12 @@ mlxsw_thermal_module_trips_update(struct device *dev, struct mlxsw_core *core, + if (err) + return err; + ++ if (crit_temp > emerg_temp) { ++ dev_warn(dev, "%s : Critical threshold %d is above emergency threshold %d\n", ++ tz->tzdev->type, crit_temp, emerg_temp); ++ return 0; ++ } ++ + /* According to the system thermal requirements, the thermal zones are + * defined with four trip points. The critical and emergency + * temperature thresholds, provided by QSFP module are set as "active" +@@ -191,11 +197,8 @@ mlxsw_thermal_module_trips_update(struct device *dev, struct mlxsw_core *core, + tz->trips[MLXSW_THERMAL_TEMP_TRIP_NORM].temp = crit_temp; + tz->trips[MLXSW_THERMAL_TEMP_TRIP_HIGH].temp = crit_temp; + tz->trips[MLXSW_THERMAL_TEMP_TRIP_HOT].temp = emerg_temp; +- if (emerg_temp > crit_temp) +- tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp + ++ tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp + + MLXSW_THERMAL_MODULE_TEMP_SHIFT; +- else +- tz->trips[MLXSW_THERMAL_TEMP_TRIP_CRIT].temp = emerg_temp; + + return 0; + } +diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +index c692a41e45480..25b6f2ee2beb8 100644 +--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c ++++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +@@ -564,11 +564,6 @@ static const struct net_device_ops netxen_netdev_ops = { + .ndo_set_features = netxen_set_features, + }; + +-static inline bool netxen_function_zero(struct pci_dev *pdev) +-{ +- return (PCI_FUNC(pdev->devfn) == 0) ? true : false; +-} +- + static inline void netxen_set_interrupt_mode(struct netxen_adapter *adapter, + u32 mode) + { +@@ -664,7 +659,7 @@ static int netxen_setup_intr(struct netxen_adapter *adapter) + netxen_initialize_interrupt_registers(adapter); + netxen_set_msix_bit(pdev, 0); + +- if (netxen_function_zero(pdev)) { ++ if (adapter->portnum == 0) { + if (!netxen_setup_msi_interrupts(adapter, num_msix)) + netxen_set_interrupt_mode(adapter, NETXEN_MSI_MODE); + else +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 18c5a9bb6759c..ce5d3e9e5dff4 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -3739,6 +3739,7 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu) + { + struct stmmac_priv *priv = netdev_priv(dev); + int txfifosz = priv->plat->tx_fifo_size; ++ const int mtu = new_mtu; + + if (txfifosz == 0) + txfifosz = priv->dma_cap.tx_fifo_size; +@@ -3756,7 +3757,7 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu) + if ((txfifosz < new_mtu) || (new_mtu > BUF_SIZE_16KiB)) + return -EINVAL; + +- dev->mtu = new_mtu; ++ dev->mtu = mtu; + + netdev_update_features(dev); + +diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c +index 6fa7a009a24a4..f9b359d4e2939 100644 +--- a/drivers/net/usb/rndis_host.c ++++ b/drivers/net/usb/rndis_host.c +@@ -387,7 +387,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) + reply_len = sizeof *phym; + retval = rndis_query(dev, intf, u.buf, + RNDIS_OID_GEN_PHYSICAL_MEDIUM, +- 0, (void **) &phym, &reply_len); ++ reply_len, (void **)&phym, &reply_len); + if (retval != 0 || !phym) { + /* OID is optional so don't fail here. */ + phym_unspec = cpu_to_le32(RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED); +diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c +index 590a49e847626..418d62e945544 100644 +--- a/drivers/scsi/lpfc/lpfc_nportdisc.c ++++ b/drivers/scsi/lpfc/lpfc_nportdisc.c +@@ -286,7 +286,7 @@ lpfc_els_abort(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) + * This routine is only called if we are SLI3, direct connect pt2pt + * mode and the remote NPort issues the PLOGI after link up. + */ +-void ++static void + lpfc_defer_pt2pt_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *link_mbox) + { + LPFC_MBOXQ_t *login_mbox; +@@ -340,7 +340,7 @@ lpfc_defer_pt2pt_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *link_mbox) + * This routine is only called if we are SLI4, acting in target + * mode and the remote NPort issues the PLOGI after link up. + **/ +-void ++static void + lpfc_defer_acc_rsp(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) + { + struct lpfc_vport *vport = pmb->vport; +diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c +index 82a0ee09cbe14..1d0c335b0bf88 100644 +--- a/drivers/spi/spi-cadence.c ++++ b/drivers/spi/spi-cadence.c +@@ -115,6 +115,7 @@ struct cdns_spi { + void __iomem *regs; + struct clk *ref_clk; + struct clk *pclk; ++ unsigned int clk_rate; + u32 speed_hz; + const u8 *txbuf; + u8 *rxbuf; +@@ -250,7 +251,7 @@ static void cdns_spi_config_clock_freq(struct spi_device *spi, + u32 ctrl_reg, baud_rate_val; + unsigned long frequency; + +- frequency = clk_get_rate(xspi->ref_clk); ++ frequency = xspi->clk_rate; + + ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); + +@@ -558,8 +559,9 @@ static int cdns_spi_probe(struct platform_device *pdev) + master->auto_runtime_pm = true; + master->mode_bits = SPI_CPOL | SPI_CPHA; + ++ xspi->clk_rate = clk_get_rate(xspi->ref_clk); + /* Set to default valid value */ +- master->max_speed_hz = clk_get_rate(xspi->ref_clk) / 4; ++ master->max_speed_hz = xspi->clk_rate / 4; + xspi->speed_hz = master->max_speed_hz; + + master->bits_per_word_mask = SPI_BPW_MASK(8); +diff --git a/drivers/spi/spi-npcm-fiu.c b/drivers/spi/spi-npcm-fiu.c +index 5ed7c9e017fb1..1e770d6739050 100644 +--- a/drivers/spi/spi-npcm-fiu.c ++++ b/drivers/spi/spi-npcm-fiu.c +@@ -677,8 +677,7 @@ static int npcm_fiu_probe(struct platform_device *pdev) + struct npcm_fiu_spi *fiu; + void __iomem *regbase; + struct resource *res; +- int ret; +- int id; ++ int id, ret; + + ctrl = devm_spi_alloc_master(dev, sizeof(*fiu)); + if (!ctrl) +@@ -738,9 +737,9 @@ static int npcm_fiu_probe(struct platform_device *pdev) + + ret = devm_spi_register_master(dev, ctrl); + if (ret) +- return ret; ++ clk_disable_unprepare(fiu->clk); + +- return 0; ++ return ret; + } + + static int npcm_fiu_remove(struct platform_device *pdev) +diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c +index 5eb62240c7f87..833f51282accc 100644 +--- a/drivers/usb/host/ohci-hcd.c ++++ b/drivers/usb/host/ohci-hcd.c +@@ -102,7 +102,7 @@ static void io_watchdog_func(struct timer_list *t); + + + /* Some boards misreport power switching/overcurrent */ +-static bool distrust_firmware = true; ++static bool distrust_firmware; + module_param (distrust_firmware, bool, 0); + MODULE_PARM_DESC (distrust_firmware, + "true to distrust firmware power/overcurrent setup"); +diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c +index c6070e70dd73d..9c9422e9fac4d 100644 +--- a/drivers/xen/privcmd.c ++++ b/drivers/xen/privcmd.c +@@ -724,14 +724,15 @@ static long privcmd_ioctl_restrict(struct file *file, void __user *udata) + return 0; + } + +-static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata) ++static long privcmd_ioctl_mmap_resource(struct file *file, ++ struct privcmd_mmap_resource __user *udata) + { + struct privcmd_data *data = file->private_data; + struct mm_struct *mm = current->mm; + struct vm_area_struct *vma; + struct privcmd_mmap_resource kdata; + xen_pfn_t *pfns = NULL; +- struct xen_mem_acquire_resource xdata; ++ struct xen_mem_acquire_resource xdata = { }; + int rc; + + if (copy_from_user(&kdata, udata, sizeof(kdata))) +@@ -741,6 +742,22 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata) + if (data->domid != DOMID_INVALID && data->domid != kdata.dom) + return -EPERM; + ++ /* Both fields must be set or unset */ ++ if (!!kdata.addr != !!kdata.num) ++ return -EINVAL; ++ ++ xdata.domid = kdata.dom; ++ xdata.type = kdata.type; ++ xdata.id = kdata.id; ++ ++ if (!kdata.addr && !kdata.num) { ++ /* Query the size of the resource. */ ++ rc = HYPERVISOR_memory_op(XENMEM_acquire_resource, &xdata); ++ if (rc) ++ return rc; ++ return __put_user(xdata.nr_frames, &udata->num); ++ } ++ + down_write(&mm->mmap_sem); + + vma = find_vma(mm, kdata.addr); +@@ -775,10 +792,6 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata) + } else + vma->vm_private_data = PRIV_VMA_LOCKED; + +- memset(&xdata, 0, sizeof(xdata)); +- xdata.domid = kdata.dom; +- xdata.type = kdata.type; +- xdata.id = kdata.id; + xdata.frame = kdata.idx; + xdata.nr_frames = kdata.num; + set_xen_guest_handle(xdata.frame_list, pfns); +diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c +index 86e5658651f10..8f077e66e613f 100644 +--- a/fs/nfsd/nfs3xdr.c ++++ b/fs/nfsd/nfs3xdr.c +@@ -857,9 +857,14 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp, + if (isdotent(name, namlen)) { + if (namlen == 2) { + dchild = dget_parent(dparent); +- /* filesystem root - cannot return filehandle for ".." */ ++ /* ++ * Don't return filehandle for ".." if we're at ++ * the filesystem or export root: ++ */ + if (dchild == dparent) + goto out; ++ if (dparent == exp->ex_path.dentry) ++ goto out; + } else + dchild = dget(dparent); + } else +diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h +index d8fab3ecf5120..180b52419136f 100644 +--- a/include/linux/compiler-gcc.h ++++ b/include/linux/compiler-gcc.h +@@ -12,6 +12,12 @@ + + #if GCC_VERSION < 40600 + # error Sorry, your compiler is too old - please upgrade it. ++#elif defined(CONFIG_ARM64) && GCC_VERSION < 50100 ++/* ++ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63293 ++ * https://lore.kernel.org/r/20210107111841.GN1551@shell.armlinux.org.uk ++ */ ++# error Sorry, your version of GCC is too old - please use 5.1 or newer. + #endif + + /* +diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h +index 4cad0e784b286..b81f9e1d74b0a 100644 +--- a/include/linux/elfcore.h ++++ b/include/linux/elfcore.h +@@ -58,6 +58,7 @@ static inline int elf_core_copy_task_xfpregs(struct task_struct *t, elf_fpxregse + } + #endif + ++#if defined(CONFIG_UM) || defined(CONFIG_IA64) + /* + * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out + * extra segments containing the gate DSO contents. Dumping its +@@ -72,5 +73,26 @@ elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset); + extern int + elf_core_write_extra_data(struct coredump_params *cprm); + extern size_t elf_core_extra_data_size(void); ++#else ++static inline Elf_Half elf_core_extra_phdrs(void) ++{ ++ return 0; ++} ++ ++static inline int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset) ++{ ++ return 1; ++} ++ ++static inline int elf_core_write_extra_data(struct coredump_params *cprm) ++{ ++ return 1; ++} ++ ++static inline size_t elf_core_extra_data_size(void) ++{ ++ return 0; ++} ++#endif + + #endif /* _LINUX_ELFCORE_H */ +diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h +index 68139cc2f3ca3..6493c98c86317 100644 +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -1480,6 +1480,11 @@ static inline void skb_mark_not_on_list(struct sk_buff *skb) + skb->next = NULL; + } + ++/* Iterate through singly-linked GSO fragments of an skb. */ ++#define skb_list_walk_safe(first, skb, next_skb) \ ++ for ((skb) = (first), (next_skb) = (skb) ? (skb)->next : NULL; (skb); \ ++ (skb) = (next_skb), (next_skb) = (skb) ? (skb)->next : NULL) ++ + static inline void skb_list_del_init(struct sk_buff *skb) + { + __list_del_entry(&skb->list); +diff --git a/kernel/Makefile b/kernel/Makefile +index f2cc0d118a0bc..6aef13053a5c4 100644 +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -93,7 +93,6 @@ obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o + obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o + obj-$(CONFIG_TRACEPOINTS) += tracepoint.o + obj-$(CONFIG_LATENCYTOP) += latencytop.o +-obj-$(CONFIG_ELFCORE) += elfcore.o + obj-$(CONFIG_FUNCTION_TRACER) += trace/ + obj-$(CONFIG_TRACING) += trace/ + obj-$(CONFIG_TRACE_CLOCK) += trace/ +diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c +index b701af27a7799..5a8b4dfdb1419 100644 +--- a/kernel/bpf/cgroup.c ++++ b/kernel/bpf/cgroup.c +@@ -1057,12 +1057,13 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level, + if (ctx.optlen != 0) { + *optlen = ctx.optlen; + *kernel_optval = ctx.optval; ++ /* export and don't free sockopt buf */ ++ return 0; + } + } + + out: +- if (ret) +- sockopt_free_buf(&ctx); ++ sockopt_free_buf(&ctx); + return ret; + } + EXPORT_SYMBOL(__cgroup_bpf_run_filter_setsockopt); +diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c +index 5e28718928cad..a77d2814cac5d 100644 +--- a/kernel/bpf/helpers.c ++++ b/kernel/bpf/helpers.c +@@ -105,7 +105,7 @@ BPF_CALL_2(bpf_map_peek_elem, struct bpf_map *, map, void *, value) + } + + const struct bpf_func_proto bpf_map_peek_elem_proto = { +- .func = bpf_map_pop_elem, ++ .func = bpf_map_peek_elem, + .gpl_only = false, + .ret_type = RET_INTEGER, + .arg1_type = ARG_CONST_MAP_PTR, +diff --git a/kernel/elfcore.c b/kernel/elfcore.c +deleted file mode 100644 +index 57fb4dcff4349..0000000000000 +--- a/kernel/elfcore.c ++++ /dev/null +@@ -1,26 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-#include <linux/elf.h> +-#include <linux/fs.h> +-#include <linux/mm.h> +-#include <linux/binfmts.h> +-#include <linux/elfcore.h> +- +-Elf_Half __weak elf_core_extra_phdrs(void) +-{ +- return 0; +-} +- +-int __weak elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset) +-{ +- return 1; +-} +- +-int __weak elf_core_write_extra_data(struct coredump_params *cprm) +-{ +- return 1; +-} +- +-size_t __weak elf_core_extra_data_size(void) +-{ +- return 0; +-} +diff --git a/net/core/filter.c b/net/core/filter.c +index b040b7bf28582..2fa10fdcf6b1d 100644 +--- a/net/core/filter.c ++++ b/net/core/filter.c +@@ -1475,7 +1475,7 @@ struct bpf_prog *__get_filter(struct sock_fprog *fprog, struct sock *sk) + + if (copy_from_user(prog->insns, fprog->filter, fsize)) { + __bpf_prog_free(prog); +- return ERR_PTR(-EFAULT); ++ return ERR_PTR(-EINVAL); + } + + prog->len = fprog->len; +diff --git a/net/core/skbuff.c b/net/core/skbuff.c +index 49d923c227a21..961cb5a88c958 100644 +--- a/net/core/skbuff.c ++++ b/net/core/skbuff.c +@@ -496,13 +496,17 @@ EXPORT_SYMBOL(__netdev_alloc_skb); + struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, + gfp_t gfp_mask) + { +- struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache); ++ struct napi_alloc_cache *nc; + struct sk_buff *skb; + void *data; + + len += NET_SKB_PAD + NET_IP_ALIGN; + +- if ((len > SKB_WITH_OVERHEAD(PAGE_SIZE)) || ++ /* If requested length is either too small or too big, ++ * we use kmalloc() for skb->head allocation. ++ */ ++ if (len <= SKB_WITH_OVERHEAD(1024) || ++ len > SKB_WITH_OVERHEAD(PAGE_SIZE) || + (gfp_mask & (__GFP_DIRECT_RECLAIM | GFP_DMA))) { + skb = __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE); + if (!skb) +@@ -510,6 +514,7 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len, + goto skb_success; + } + ++ nc = this_cpu_ptr(&napi_alloc_cache); + len += SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + len = SKB_DATA_ALIGN(len); + +diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c +index 40829111fe00c..273c921751e49 100644 +--- a/net/core/sock_reuseport.c ++++ b/net/core/sock_reuseport.c +@@ -302,7 +302,7 @@ select_by_hash: + i = j = reciprocal_scale(hash, socks); + while (reuse->socks[i]->sk_state == TCP_ESTABLISHED) { + i++; +- if (i >= reuse->num_socks) ++ if (i >= socks) + i = 0; + if (i == j) + goto out; +diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c +index 0fd1c2aa13615..e9ecbb57df455 100644 +--- a/net/dcb/dcbnl.c ++++ b/net/dcb/dcbnl.c +@@ -1765,6 +1765,8 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh, + fn = &reply_funcs[dcb->cmd]; + if (!fn->cb) + return -EOPNOTSUPP; ++ if (fn->type == RTM_SETDCB && !netlink_capable(skb, CAP_NET_ADMIN)) ++ return -EPERM; + + if (!tb[DCB_ATTR_IFNAME]) + return -EINVAL; +diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c +index 5c967764041f4..00210e55b4cd1 100644 +--- a/net/ipv4/esp4.c ++++ b/net/ipv4/esp4.c +@@ -272,7 +272,6 @@ static int esp_output_udp_encap(struct xfrm_state *x, struct sk_buff *skb, struc + int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *esp) + { + u8 *tail; +- u8 *vaddr; + int nfrags; + int esph_offset; + struct page *page; +@@ -314,14 +313,10 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * + page = pfrag->page; + get_page(page); + +- vaddr = kmap_atomic(page); +- +- tail = vaddr + pfrag->offset; ++ tail = page_address(page) + pfrag->offset; + + esp_output_fill_trailer(tail, esp->tfclen, esp->plen, esp->proto); + +- kunmap_atomic(vaddr); +- + nfrags = skb_shinfo(skb)->nr_frags; + + __skb_fill_page_desc(skb, nfrags, page, pfrag->offset, +diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c +index a3b403ba8f8f0..7a739f16d82b2 100644 +--- a/net/ipv6/esp6.c ++++ b/net/ipv6/esp6.c +@@ -226,7 +226,6 @@ static void esp_output_fill_trailer(u8 *tail, int tfclen, int plen, __u8 proto) + int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *esp) + { + u8 *tail; +- u8 *vaddr; + int nfrags; + struct page *page; + struct sk_buff *trailer; +@@ -259,14 +258,10 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info + page = pfrag->page; + get_page(page); + +- vaddr = kmap_atomic(page); +- +- tail = vaddr + pfrag->offset; ++ tail = page_address(page) + pfrag->offset; + + esp_output_fill_trailer(tail, esp->tfclen, esp->plen, esp->proto); + +- kunmap_atomic(vaddr); +- + nfrags = skb_shinfo(skb)->nr_frags; + + __skb_fill_page_desc(skb, nfrags, page, pfrag->offset, +diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c +index 78d495581d696..7a80c42fcce2f 100644 +--- a/net/ipv6/ip6_output.c ++++ b/net/ipv6/ip6_output.c +@@ -124,8 +124,43 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff * + return -EINVAL; + } + ++static int ++ip6_finish_output_gso_slowpath_drop(struct net *net, struct sock *sk, ++ struct sk_buff *skb, unsigned int mtu) ++{ ++ struct sk_buff *segs, *nskb; ++ netdev_features_t features; ++ int ret = 0; ++ ++ /* Please see corresponding comment in ip_finish_output_gso ++ * describing the cases where GSO segment length exceeds the ++ * egress MTU. ++ */ ++ features = netif_skb_features(skb); ++ segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); ++ if (IS_ERR_OR_NULL(segs)) { ++ kfree_skb(skb); ++ return -ENOMEM; ++ } ++ ++ consume_skb(skb); ++ ++ skb_list_walk_safe(segs, segs, nskb) { ++ int err; ++ ++ skb_mark_not_on_list(segs); ++ err = ip6_fragment(net, sk, segs, ip6_finish_output2); ++ if (err && ret == 0) ++ ret = err; ++ } ++ ++ return ret; ++} ++ + static int __ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) + { ++ unsigned int mtu; ++ + #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) + /* Policy lookup after SNAT yielded a new policy */ + if (skb_dst(skb)->xfrm) { +@@ -134,7 +169,11 @@ static int __ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff + } + #endif + +- if ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || ++ mtu = ip6_skb_dst_mtu(skb); ++ if (skb_is_gso(skb) && !skb_gso_validate_network_len(skb, mtu)) ++ return ip6_finish_output_gso_slowpath_drop(net, sk, skb, mtu); ++ ++ if ((skb->len > mtu && !skb_is_gso(skb)) || + dst_allfrag(skb_dst(skb)) || + (IP6CB(skb)->frag_max_size && skb->len > IP6CB(skb)->frag_max_size)) + return ip6_fragment(net, sk, skb, ip6_finish_output2); +diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c +index 2872f7a00e863..de4c871787e2f 100644 +--- a/net/ipv6/sit.c ++++ b/net/ipv6/sit.c +@@ -1597,8 +1597,11 @@ static int ipip6_newlink(struct net *src_net, struct net_device *dev, + } + + #ifdef CONFIG_IPV6_SIT_6RD +- if (ipip6_netlink_6rd_parms(data, &ip6rd)) ++ if (ipip6_netlink_6rd_parms(data, &ip6rd)) { + err = ipip6_tunnel_update_6rd(nt, &ip6rd); ++ if (err < 0) ++ unregister_netdevice_queue(dev, NULL); ++ } + #endif + + return err; +diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c +index 30a0c7c6224b3..da0e285302f9d 100644 +--- a/net/mac80211/tx.c ++++ b/net/mac80211/tx.c +@@ -657,7 +657,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) + if (!skip_hw && tx->key && + tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) + info->control.hw_key = &tx->key->conf; +- } else if (!ieee80211_is_mgmt(hdr->frame_control) && tx->sta && ++ } else if (ieee80211_is_data_present(hdr->frame_control) && tx->sta && + test_sta_flag(tx->sta, WLAN_STA_USES_ENCRYPTION)) { + return TX_DROP; + } +@@ -3773,7 +3773,7 @@ void __ieee80211_schedule_txq(struct ieee80211_hw *hw, + * get immediately moved to the back of the list on the next + * call to ieee80211_next_txq(). + */ +- if (txqi->txq.sta && ++ if (txqi->txq.sta && local->airtime_flags && + wiphy_ext_feature_isset(local->hw.wiphy, + NL80211_EXT_FEATURE_AIRTIME_FAIRNESS)) + list_add(&txqi->schedule_order, +diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c +index 6cace43b217ee..916d1f455b218 100644 +--- a/net/rxrpc/input.c ++++ b/net/rxrpc/input.c +@@ -431,7 +431,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) + return; + } + +- if (call->state == RXRPC_CALL_SERVER_RECV_REQUEST) { ++ if (state == RXRPC_CALL_SERVER_RECV_REQUEST) { + unsigned long timo = READ_ONCE(call->next_req_timo); + unsigned long now, expect_req_by; + +diff --git a/net/rxrpc/key.c b/net/rxrpc/key.c +index 85a9ff8cd236a..2b26c4d229a5a 100644 +--- a/net/rxrpc/key.c ++++ b/net/rxrpc/key.c +@@ -1110,7 +1110,7 @@ static long rxrpc_read(const struct key *key, + default: /* we have a ticket we can't encode */ + pr_err("Unsupported key token type (%u)\n", + token->security_index); +- continue; ++ return -ENOPKG; + } + + _debug("token[%u]: toksize=%u", ntoks, toksize); +@@ -1225,7 +1225,9 @@ static long rxrpc_read(const struct key *key, + break; + + default: +- break; ++ pr_err("Unsupported key token type (%u)\n", ++ token->security_index); ++ return -ENOPKG; + } + + ASSERTCMP((unsigned long)xdr - (unsigned long)oldxdr, ==, +diff --git a/net/sctp/socket.c b/net/sctp/socket.c +index 1fcc13f6073ef..41abfff6a6a3d 100644 +--- a/net/sctp/socket.c ++++ b/net/sctp/socket.c +@@ -1319,7 +1319,7 @@ static int __sctp_setsockopt_connectx(struct sock *sk, + + kaddrs = memdup_user(addrs, addrs_size); + if (IS_ERR(kaddrs)) +- return PTR_ERR(kaddrs); ++ return PTR_ERR(kaddrs) == -EFAULT ? -EINVAL : PTR_ERR(kaddrs); + + /* Allow security module to validate connectx addresses. */ + err = security_sctp_bind_connect(sk, SCTP_SOCKOPT_CONNECTX, +diff --git a/net/tipc/link.c b/net/tipc/link.c +index a9d8a81e80cfd..f25010261a9e0 100644 +--- a/net/tipc/link.c ++++ b/net/tipc/link.c +@@ -939,9 +939,7 @@ void tipc_link_reset(struct tipc_link *l) + int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, + struct sk_buff_head *xmitq) + { +- struct tipc_msg *hdr = buf_msg(skb_peek(list)); + unsigned int maxwin = l->window; +- int imp = msg_importance(hdr); + unsigned int mtu = l->mtu; + u16 ack = l->rcv_nxt - 1; + u16 seqno = l->snd_nxt; +@@ -950,8 +948,14 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, + struct sk_buff_head *backlogq = &l->backlogq; + struct sk_buff *skb, *_skb, **tskb; + int pkt_cnt = skb_queue_len(list); ++ struct tipc_msg *hdr; + int rc = 0; ++ int imp; ++ ++ if (pkt_cnt <= 0) ++ return 0; + ++ hdr = buf_msg(skb_peek(list)); + if (unlikely(msg_size(hdr) > mtu)) { + pr_warn("Too large msg, purging xmit list %d %d %d %d %d!\n", + skb_queue_len(list), msg_user(hdr), +@@ -960,6 +964,7 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, + return -EMSGSIZE; + } + ++ imp = msg_importance(hdr); + /* Allow oversubscription of one data msg per source at congestion */ + if (unlikely(l->backlog[imp].len >= l->backlog[imp].limit)) { + if (imp == TIPC_SYSTEM_IMPORTANCE) { |