Linux 4.4.252
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.4.252 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.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/powerpc/include/asm/pgtable.h | 4 block/genhd.c | 9 - drivers/block/Kconfig | 1 drivers/cpufreq/powernow-k8.c | 9 - drivers/iommu/intel_irq_remapping.c | 2 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 - 17 files changed, 208 insertions(+), 108 deletions(-)
Arnd Bergmann (2):
wil6210: select CONFIG_CRC32
block: rsxx: select CONFIG_CRC32
Colin Ian King (1):
cpufreq: powernow-k8: pass policy rather than use cpufreq_cpu_get()
David Disseldorp (5):
target: add XCOPY target/segment desc sense codes
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
Dinghao Liu (1):
iommu/intel: Fix memleak in intel_irq_remapping_alloc
Florian Westphal (2):
net: ip: always refragment ip defragmented packets
net: fix pmtu check in nopmtudisc mode
Greg Kroah-Hartman (1):
Linux 4.4.252
Lukas Wunner (1):
spi: pxa2xx: Fix use-after-free on unbind
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
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 = 4 -SUBLEVEL = 251 +SUBLEVEL = 252 EXTRAVERSION = NAME = Blurry Fish Butt
arch/powerpc/include/asm/pgtable.h +2 -2
@@ -149,9 +149,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
@@ -158,14 +158,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
@@ -540,6 +540,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/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/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
@@ -1479,7 +1479,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);
@@ -1619,7 +1619,6 @@ out_error_clock_enabled: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
@@ -1730,6 +1730,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 ;
@@ -2864,6 +2868,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
@@ -422,7 +422,10 @@* during second ld run in second ld pass when generating System.map */ #define TEXT_TEXT \ ALIGN_FUNCTION(); \ - *(.text.hot .text .text.fixup .text.unlikely) \ + *(.text.hot .text.hot.*) \ + *(.text .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
@@ -181,6 +181,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
@@ -1516,6 +1516,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
@@ -283,7 +283,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
@@ -708,7 +708,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 )) + 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; }
@@ -736,10 +740,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 )) - 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)