Linux 4.19.170
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.19.170 kernel.
All users of the 4.19 kernel series must upgrade.
The updated 4.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.19.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/x86/crypto/crc32c-pcl-intel-asm_64.S | 2 drivers/md/dm-bufio.c | 6 ++ drivers/md/dm-integrity.c | 50 +++++++++++++++++-- drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | 2 drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c | 7 -- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 3 - drivers/net/usb/rndis_host.c | 2 drivers/spi/spi-cadence.c | 6 +- drivers/usb/host/ohci-hcd.c | 2 fs/nfsd/nfs3xdr.c | 7 ++ include/linux/compiler-gcc.h | 6 ++ include/linux/dm-bufio.h | 1 include/linux/skbuff.h | 5 + net/core/skbuff.c | 9 ++- net/core/sock_reuseport.c | 2 net/dcb/dcbnl.c | 2 net/ipv4/esp4.c | 7 -- net/ipv6/esp6.c | 7 -- net/ipv6/ip6_output.c | 40 ++++++++++++++- net/ipv6/sit.c | 5 + net/rxrpc/input.c | 2 net/rxrpc/key.c | 6 +- net/tipc/link.c | 9 ++- 24 files changed, 147 insertions(+), 43 deletions(-)
Andrey Zhizhikin (1):
rndis_host: set proper input size for OID_GEN_PHYSICAL_MEDIUM request
Arnd Bergmann (1):
crypto: x86/crc32c - fix building with clang ias
Aya Levin (1):
net: ipv6: Validate GSO SKB before finish IPv6 processing
Baptiste Lepers (2):
udp: Prevent reuseport_select_sock from reading uninitialized socks
rxrpc: Call state should be read with READ_ONCE() under some circumstances
David Howells (1):
rxrpc: Fix handling of an unsupported token type in rxrpc_read()
David Wu (1):
net: stmmac: Fixed mtu channged by cache aligned
Eric Dumazet (1):
net: avoid 32 x truesize under-estimation for tiny skbs
Greg Kroah-Hartman (1):
Linux 4.19.170
Hamish Martin (1):
usb: ohci: Make distrust_firmware param default to false
Hoang Le (1):
tipc: fix NULL deref in tipc_link_xmit()
J. Bruce Fields (1):
nfsd4: readdirplus shouldn't return parent of export
Jakub Kicinski (1):
net: sit: unregister_netdevice on newlink's error path
Jason A. Donenfeld (2):
net: introduce skb_list_walk_safe for skb segment walking
net: skbuff: disambiguate argument and member for skb_list_walk_safe helper
Manish Chopra (1):
netxen_nic: fix MSI/MSI-x interrupts
Michael Hennerich (1):
spi: cadence: cache reference clock rate during probe
Mikulas Patocka (1):
dm integrity: fix flush with external metadata device
Petr Machata (2):
net: dcb: Validate netlink message in DCB handler
net: dcb: Accept RTM_GETDCB messages carrying set-like DCB commands
Stefan Chulski (1):
net: mvpp2: Remove Pause and Asym_Pause support
Will Deacon (1):
compiler.h: Raise minimum version of GCC to 5.1 for arm64
Willem de Bruijn (1):
esp: avoid unneeded kmap_atomic call
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 169 +SUBLEVEL = 170 EXTRAVERSION = NAME = "People's Front"
arch/x86/crypto/crc32c-pcl-intel-asm_64.S +1 -1
@@ -170,7 +170,7 @@ continue_block: ## branch into array lea jump_table(%rip), bufp - movzxw (bufp, %rax, 2), len + movzwq (bufp, %rax, 2), len lea crc_array(%rip), bufp lea (bufp, len, 1), bufp JMP_NOSPEC bufp
drivers/md/dm-bufio.c +6 -0
@@ -1471,6 +1471,12 @@ sector_t dm_bufio_get_device_size(struct dm_bufio_client *c) }EXPORT_SYMBOL_GPL (dm_bufio_get_device_size); +struct dm_io_client *dm_bufio_get_dm_io_client (struct dm_bufio_client *c) +{ +return c->dm_io; +} +EXPORT_SYMBOL_GPL (dm_bufio_get_dm_io_client); +sector_t dm_bufio_get_block_number (struct dm_buffer *b) {return b->block;
drivers/md/dm-integrity.c +45 -5
85 lines not on this page · raw message
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +0 -2
@@ -4266,8 +4266,6 @@ static void mvpp2_phylink_validate(struct net_device *dev,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 :
drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +1 -6
@@ -580,11 +580,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) {
@@ -680,7 +675,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
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +2 -1
@@ -3596,6 +3596,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;
@@ -3613,7 +3614,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);
drivers/net/usb/rndis_host.c +1 -1
@@ -399,7 +399,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 );
drivers/spi/spi-cadence.c +4 -2
@@ -119,6 +119,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;
@@ -258,7 +259,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 );
@@ -628,8 +629,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 );
drivers/usb/host/ohci-hcd.c +1 -1
@@ -101,7 +101,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" );
fs/nfsd/nfs3xdr.c +6 -1
@@ -844,9 +844,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
include/linux/compiler-gcc.h +6 -0
@@ -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/[email protected] +*/ +# error Sorry, your version of GCC is too old - please use 5.1 or newer.#endif /*
include/linux/dm-bufio.h +1 -0
@@ -138,6 +138,7 @@ void dm_bufio_set_minimum_buffers(struct dm_bufio_client *c, unsigned n);unsigned dm_bufio_get_block_size (struct dm_bufio_client *c);sector_t dm_bufio_get_device_size (struct dm_bufio_client *c); +struct dm_io_client *dm_bufio_get_dm_io_client (struct dm_bufio_client *c);sector_t dm_bufio_get_block_number (struct dm_buffer *b);void *dm_bufio_get_block_data (struct dm_buffer *b);void *dm_bufio_get_aux_data (struct dm_buffer *b);
include/linux/skbuff.h +5 -0
@@ -1363,6 +1363,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);
net/core/skbuff.c +7 -2
@@ -459,13 +459,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)
@@ -473,6 +477,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);
net/core/sock_reuseport.c +1 -1
@@ -299,7 +299,7 @@ struct sock *reuseport_select_sock(struct sock *sk, 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;
net/dcb/dcbnl.c +2 -0
@@ -1756,6 +1756,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 ;
net/ipv4/esp4.c +1 -6
@@ -270,7 +270,6 @@ static int esp_output_udp_encap(struct xfrm_state *x, struct sk_buff *skb, strucint 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;
@@ -312,14 +311,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,
net/ipv6/esp6.c +1 -6
@@ -237,7 +237,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;
@@ -270,14 +269,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,
net/ipv6/ip6_output.c +39 -1
@@ -128,8 +128,42 @@ 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;int ret; ret =BPF_CGROUP_RUN_PROG_INET_EGRESS (sk, skb);
@@ -146,7 +180,11 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *s }#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);
net/ipv6/sit.c +4 -1
@@ -1596,8 +1596,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;
net/rxrpc/input.c +1 -1
@@ -446,7 +446,7 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb,if (state >=RXRPC_CALL_COMPLETE )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;
net/rxrpc/key.c +4 -2
@@ -1112,7 +1112,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);
@@ -1227,7 +1227,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, ==,
net/tipc/link.c +7 -2
@@ -914,9 +914,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;
@@ -925,13 +923,20 @@ 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)) {__skb_queue_purge (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 ) {