Linux 4.9.252
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.252 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.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/arm/mach-omap2/omap_device.c | 8 arch/arm64/kvm/sys_regs.c | 4 arch/powerpc/include/asm/book3s/32/pgtable.h | 4 arch/powerpc/include/asm/nohash/pgtable.h | 4 block/genhd.c | 9 drivers/block/Kconfig | 1 drivers/cpufreq/powernow-k8.c | 9 drivers/dma/xilinx/xilinx_dma.c | 8 drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 drivers/iommu/intel_irq_remapping.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en_fs.c | 1 drivers/net/wan/Kconfig | 1 drivers/net/wireless/ath/wil6210/Kconfig | 1 drivers/spi/spi-pxa2xx.c | 3 drivers/target/target_core_transport.c | 24 ++ drivers/target/target_core_xcopy.c | 220 ++++++++++++++---------- drivers/target/target_core_xcopy.h | 1 fs/ubifs/io.c | 13 + include/asm-generic/vmlinux.lds.h | 5 include/target/target_core_base.h | 4 net/core/skbuff.c | 6 net/ipv4/ip_output.c | 2 net/ipv4/ip_tunnel.c | 10 - 24 files changed, 228 insertions(+), 116 deletions(-)
Andreas Kemnade (1):
ARM: OMAP2+: omap_device: fix idling of devices during probe
Arnd Bergmann (3):
wil6210: select CONFIG_CRC32
block: rsxx: select CONFIG_CRC32
wan: ds26522: select CONFIG_BITREVERSE
Chris Wilson (1):
drm/i915: Fix mismatch between misplaced vma check and vma insert
Colin Ian King (1):
cpufreq: powernow-k8: pass policy rather than use cpufreq_cpu_get()
David Disseldorp (5):
target: bounds check XCOPY segment descriptor list
target: simplify XCOPY wwn->se_dev lookup helper
target: use XCOPY segment descriptor CSCD IDs
scsi: target: Fix XCOPY NAA identifier lookup
target: add XCOPY target/segment desc sense codes
Dinghao Liu (2):
iommu/intel: Fix memleak in intel_irq_remapping_alloc net/mlx5e: Fix memleak in mlx5e_create_l2_table_groups
Florian Westphal (2):
net: ip: always refragment ip defragmented packets
net: fix pmtu check in nopmtudisc mode
Greg Kroah-Hartman (1):
Linux 4.9.252
Lukas Wunner (1):
spi: pxa2xx: Fix use-after-free on unbind
Marc Zyngier (1):
KVM: arm64: Don't access PMCR_EL0 when no PMU is available
Mathieu Desnoyers (1):
powerpc: Fix incorrect stw{, ux, u, x} instructions in __set_pte_at
Mike Christie (1):
xcopy: loop over devices using idr helper
Ming Lei (1):
block: fix use-after-free in disk_part_iter_next
Nick Desaulniers (1):
vmlinux.lds.h: Add PGO and AutoFDO input sections
Richard Weinberger (1):
ubifs: wbuf: Don't leak kernel memory to flash
Shravya Kumbham (2):
dmaengine: xilinx_dma: check dma_async_device_register return value
dmaengine: xilinx_dma: fix mixed_enum_type coverity warning
Vasily Averin (1):
net: drop bogus skb with CHECKSUM_PARTIAL and offset beyond end of trimmed packet
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 251 +SUBLEVEL = 252 EXTRAVERSION = NAME = Roaring Lionus
arch/arm/mach-omap2/omap_device.c +5 -3
@@ -224,10 +224,12 @@ static int _omap_device_notifier_call(struct notifier_block *nb,break ;case BUS_NOTIFY_BIND_DRIVER : od =to_omap_device (pdev); -if (od && (od->_state ==OMAP_DEVICE_STATE_ENABLED ) && -pm_runtime_status_suspended (dev)) { +if (od) { od->_driver_status =BUS_NOTIFY_BIND_DRIVER ; -pm_runtime_set_active (dev); +if (od->_state ==OMAP_DEVICE_STATE_ENABLED && +pm_runtime_status_suspended (dev)) { +pm_runtime_set_active (dev); + } }break ;case BUS_NOTIFY_ADD_DEVICE :
arch/arm64/kvm/sys_regs.c +4 -0
@@ -450,6 +450,10 @@ static void reset_pmcr(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r) {u64 pmcr, val; +/* No PMU available, PMCR_EL0 may UNDEF... */ +if (!kvm_arm_support_pmu_v3 ()) +return ; + pmcr =read_sysreg (pmcr_el0);/* * Writable bits of PMCR_EL0 (ARMV8_PMU_PMCR_MASK) are reset to UNKNOWN
arch/powerpc/include/asm/book3s/32/pgtable.h +2 -2
@@ -411,9 +411,9 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,if (pte_val (*ptep) & _PAGE_HASHPTE)flush_hash_entry (mm, ptep, addr); __asm__ __volatile__("\ -stw%U0%X0 %2,%0\n\ +stw%X0 %2,%0\n\ eieio\n\ -stw%U0%X0 %L2,%1" +stw%X1 %L2,%1" :"=m" (*ptep),"=m" (*((unsigned char *)ptep+4 )) :"r" (pte) :"memory" );
arch/powerpc/include/asm/nohash/pgtable.h +2 -2
@@ -155,9 +155,9 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,flush_hash_entry (mm, ptep, addr);#endif __asm__ __volatile__("\ -stw%U0%X0 %2,%0\n\ +stw%X0 %2,%0\n\ eieio\n\ -stw%U0%X0 %L2,%1" +stw%X1 %L2,%1" :"=m" (*ptep),"=m" (*((unsigned char *)ptep+4 )) :"r" (pte) :"memory" );
block/genhd.c +6 -3
@@ -159,14 +159,17 @@ struct hd_struct *disk_part_iter_next(struct disk_part_iter *piter) part =rcu_dereference (ptbl->part[piter->idx]);if (!part)continue ; +get_device (part_to_dev (part)); + piter->part = part;if (!part_nr_sects_read (part) && !(piter->flags &DISK_PITER_INCL_EMPTY ) && !(piter->flags &DISK_PITER_INCL_EMPTY_PART0 && - piter->idx ==0 )) + piter->idx ==0 )) { +put_device (part_to_dev (part)); + piter->part =NULL ;continue ; + } -get_device (part_to_dev (part)); - piter->part = part; piter->idx += inc;break ; }
drivers/block/Kconfig +1 -0
@@ -530,6 +530,7 @@ config BLK_DEV_RBD config BLK_DEV_RSXX tristate "IBM Flash Adapter 900GB Full Height PCIe Device Driver" depends on PCI + select CRC32 help Device driver for IBM's high speed PCIe SSD storage device: Flash Adapter 900GB Full Height.
drivers/cpufreq/powernow-k8.c +3 -6
@@ -887,9 +887,9 @@ static int get_transition_latency(struct powernow_k8_data *data)/* Take a frequency, and issue the fid/vid transition command */ static int transition_frequency_fidvid (struct powernow_k8_data *data, -unsigned int index) +unsigned int index, +struct cpufreq_policy *policy) { -struct cpufreq_policy *policy;u32 fid =0 ;u32 vid =0 ;int res;
@@ -921,9 +921,6 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data, freqs.old =find_khz_freq_from_fid (data->currfid); freqs.new =find_khz_freq_from_fid (fid); - policy =cpufreq_cpu_get (smp_processor_id ()); -cpufreq_cpu_put (policy); -cpufreq_freq_transition_begin (policy, &freqs); res =transition_fid_vid (data, fid, vid);cpufreq_freq_transition_end (policy, &freqs, res);
@@ -978,7 +975,7 @@ static long powernowk8_target_fn(void *arg)powernow_k8_acpi_pst_values (data, newstate); - ret =transition_frequency_fidvid (data, newstate); + ret =transition_frequency_fidvid (data, newstate, pol);if (ret) {pr_err ("transition frequency failed\n" );
drivers/dma/xilinx/xilinx_dma.c +6 -2
@@ -2357,7 +2357,7 @@ static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev, has_dre = false;if (!has_dre) - xdev->common.copy_align =fls (width -1 ); + xdev->common.copy_align = (enum dmaengine_alignment )fls (width -1 ); if (of_device_is_compatible(node, "xlnx,axi-vdma-mm2s-channel") || of_device_is_compatible(node, "xlnx,axi-dma-mm2s-channel") ||
@@ -2630,7 +2630,11 @@ static int xilinx_dma_probe(struct platform_device *pdev) }/* Register the DMA engine with the core */ -dma_async_device_register (&xdev->common); + err =dma_async_device_register (&xdev->common); +if (err) { +dev_err (xdev->dev,"failed to register the dma device\n" ); + goto error; + } err =of_dma_controller_register (node, of_dma_xilinx_xlate, xdev);
drivers/gpu/drm/i915/i915_gem_execbuffer.c +1 -1
@@ -882,7 +882,7 @@ eb_vma_misplaced(struct i915_vma *vma)return !only_mappable_for_reloc (entry->flags);if ((entry->flags &EXEC_OBJECT_SUPPORTS_48B_ADDRESS ) ==0 && - (vma->node.start + vma->node.size -1 ) >>32 ) + (vma->node.start + vma->node.size +4095 ) >>32 )return true;return false;
drivers/iommu/intel_irq_remapping.c +2 -0
@@ -1350,6 +1350,8 @@ static int intel_irq_remapping_alloc(struct irq_domain *domain, irq_data =irq_domain_get_irq_data (domain, virq + i); irq_cfg =irqd_cfg (irq_data);if (!irq_data || !irq_cfg) { +if (!i) +kfree (data); ret = -EINVAL ; goto out_free_data; }
drivers/net/ethernet/mellanox/mlx5/core/en_fs.c +1 -0
@@ -930,6 +930,7 @@ static int mlx5e_create_l2_table_groups(struct mlx5e_l2_table *l2_table) ft->g[ft->num_groups] =NULL ;mlx5e_destroy_groups (ft);kvfree (in); +kfree (ft->g);return err; }
drivers/net/wan/Kconfig +1 -0
@@ -295,6 +295,7 @@ config SLIC_DS26522 tristate "Slic Maxim ds26522 card support" depends on SPI depends on FSL_SOC || ARCH_MXC || ARCH_LAYERSCAPE || COMPILE_TEST + select BITREVERSE help This module initializes and configures the slic maxim card in T1 or E1 mode.
drivers/net/wireless/ath/wil6210/Kconfig +1 -0
@@ -1,6 +1,7 @@ config WIL6210 tristate "Wilocity 60g WiFi card wil6210 support" select WANT_DEV_COREDUMP + select CRC32 depends on CFG80211 depends on PCI default n
drivers/spi/spi-pxa2xx.c +1 -2
@@ -1606,7 +1606,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)return -ENODEV ; } - master =spi_alloc_master (dev,sizeof (struct driver_data )); + master =devm_spi_alloc_master (dev,sizeof (*drv_data));if (!master) {dev_err (&pdev->dev,"cannot alloc spi_master\n" );pxa_ssp_free (ssp);
@@ -1788,7 +1788,6 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)free_irq (ssp->irq, drv_data); out_error_master_alloc: -spi_master_put (master);pxa_ssp_free (ssp);return status; }
drivers/target/target_core_transport.c +24 -0
@@ -1736,6 +1736,10 @@ void transport_generic_request_failure(struct se_cmd *cmd,case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED :case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED :case TCM_COPY_TARGET_DEVICE_NOT_REACHABLE : +case TCM_TOO_MANY_TARGET_DESCS : +case TCM_UNSUPPORTED_TARGET_DESC_TYPE_CODE : +case TCM_TOO_MANY_SEGMENT_DESCS : +case TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE :break ;case TCM_OUT_OF_RESOURCES : sense_reason =TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE ;
@@ -2886,6 +2890,26 @@ static const struct sense_info sense_info_table[] = { .key = ILLEGAL_REQUEST, .asc = 0x26, /* INVALID FIELD IN PARAMETER LIST */ }, + [TCM_TOO_MANY_TARGET_DESCS] = { + .key = ILLEGAL_REQUEST, + .asc = 0x26, + .ascq = 0x06, /* TOO MANY TARGET DESCRIPTORS */ + }, + [TCM_UNSUPPORTED_TARGET_DESC_TYPE_CODE] = { + .key = ILLEGAL_REQUEST, + .asc = 0x26, + .ascq = 0x07, /* UNSUPPORTED TARGET DESCRIPTOR TYPE CODE */ + }, + [TCM_TOO_MANY_SEGMENT_DESCS] = { + .key = ILLEGAL_REQUEST, + .asc = 0x26, + .ascq = 0x08, /* TOO MANY SEGMENT DESCRIPTORS */ + }, + [TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE] = { + .key = ILLEGAL_REQUEST, + .asc = 0x26, + .ascq = 0x09, /* UNSUPPORTED SEGMENT DESCRIPTOR TYPE CODE */ + }, [TCM_PARAMETER_LIST_LENGTH_ERROR] = { .key = ILLEGAL_REQUEST, .asc = 0x1a, /* PARAMETER LIST LENGTH ERROR */
drivers/target/target_core_xcopy.c +135 -85
326 lines not on this page · raw message
drivers/target/target_core_xcopy.h +1 -0
@@ -19,6 +19,7 @@ struct xcopy_op {struct se_device *dst_dev;unsigned char dst_tid_wwn[XCOPY_NAA_IEEE_REGEX_LEN ];unsigned char local_dev_wwn[XCOPY_NAA_IEEE_REGEX_LEN ]; +struct percpu_ref *remote_lun_ref;sector_t src_lba;sector_t dst_lba;
fs/ubifs/io.c +11 -2
@@ -331,7 +331,7 @@ void ubifs_pad(const struct ubifs_info *c, void *buf, int pad) {uint32_t crc; -ubifs_assert (pad >=0 && !(pad &7 )); +ubifs_assert (pad >=0 );if (pad >=UBIFS_PAD_NODE_SZ ) {struct ubifs_ch *ch = buf;
@@ -721,6 +721,10 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len)* write-buffer. */ memcpy (wbuf->buf + wbuf->used, buf, len); +if (aligned_len > len) { +ubifs_assert (aligned_len - len <8 ); +ubifs_pad (c, wbuf->buf + wbuf->used + len, aligned_len - len); + }if (aligned_len == wbuf->avail) { dbg_io("flush jhead %s wbuf to LEB %d:%d",
@@ -813,13 +817,18 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len) }spin_lock (&wbuf->lock); -if (aligned_len) +if (aligned_len) {/* * And now we have what's left and what does not take whole * max. write unit, so write it to the write-buffer and we are * done. */ memcpy (wbuf->buf, buf + written, len); +if (aligned_len > len) { +ubifs_assert (aligned_len - len <8 ); +ubifs_pad (c, wbuf->buf + len, aligned_len - len); + } + }if (c->leb_size - wbuf->offs >= c->max_write_size) wbuf->size = c->max_write_size;
include/asm-generic/vmlinux.lds.h +4 -1
@@ -460,7 +460,10 @@*/ #define TEXT_TEXT \ ALIGN_FUNCTION(); \ - *(.text.hot TEXT_MAIN .text.fixup .text.unlikely) \ + *(.text.hot .text.hot.*) \ + *(TEXT_MAIN .text.fixup) \ + *(.text.unlikely .text.unlikely.*) \ + *(.text.unknown .text.unknown.*) \ *(.ref.text) \ MEM_KEEP(init.text) \ MEM_KEEP(exit.text) \
include/target/target_core_base.h +4 -0
@@ -178,6 +178,10 @@ enum tcm_sense_reason_table {TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED =R (0x16 ),TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED =R (0x17 ),TCM_COPY_TARGET_DEVICE_NOT_REACHABLE =R (0x18 ), +TCM_TOO_MANY_TARGET_DESCS =R (0x19 ), +TCM_UNSUPPORTED_TARGET_DESC_TYPE_CODE =R (0x1a ), +TCM_TOO_MANY_SEGMENT_DESCS =R (0x1b ), +TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE =R (0x1c ), #undef R };
net/core/skbuff.c +6 -0
@@ -1592,6 +1592,12 @@ int pskb_trim_rcsum_slow(struct sk_buff *skb, unsigned int len) skb->csum =csum_block_sub (skb->csum,skb_checksum (skb, len, delta,0 ), len); + }else if (skb->ip_summed ==CHECKSUM_PARTIAL ) { +int hdlen = (len >skb_headlen (skb)) ?skb_headlen (skb) : len; +int offset =skb_checksum_start_offset (skb) + skb->csum_offset; + +if (offset +sizeof (__sum16) > hdlen) +return -EINVAL ; }return __pskb_trim (skb, len); }
net/ipv4/ip_output.c +1 -1
@@ -300,7 +300,7 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *skif (skb_is_gso (skb))return ip_finish_output_gso (net, sk, skb, mtu); -if (skb->len > mtu || (IPCB (skb)->flags &IPSKB_FRAG_PMTU )) +if (skb->len > mtu ||IPCB (skb)->frag_max_size)return ip_fragment (net, sk, skb, mtu, ip_finish_output2);return ip_finish_output2 (net, sk, skb);
net/ipv4/ip_tunnel.c +5 -5
@@ -743,7 +743,11 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, goto tx_error; } -if (tnl_update_pmtu (dev, skb, rt, tnl_params->frag_off, inner_iph)) { + df = tnl_params->frag_off; +if (skb->protocol ==htons (ETH_P_IP ) && !tunnel->ignore_df) + df |= (inner_iph->frag_off &htons (IP_DF )); + +if (tnl_update_pmtu (dev, skb, rt, df, inner_iph)) {ip_rt_put (rt); goto tx_error; }
@@ -771,10 +775,6 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, ttl =ip4_dst_hoplimit (&rt->dst); } - df = tnl_params->frag_off; -if (skb->protocol ==htons (ETH_P_IP ) && !tunnel->ignore_df) - df |= (inner_iph->frag_off&htons (IP_DF )); - max_headroom =LL_RESERVED_SPACE (rt->dst.dev) +sizeof (struct iphdr ) + rt->dst.header_len +ip_encap_hlen (&tunnel->encap);if (max_headroom > dev->needed_headroom)