4.4.31-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.4.31-stable review
This is the start of the stable review cycle for the 4.4.31 release. There are 69 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri Nov 11 10:28:46 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.31-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.31-rc1
Oliver Neukum <[email protected]>
HID: usbhid: add ATEN CS962 to list of quirky devices
Boris Brezillon <[email protected]>
ubi: fastmap: Fix add_vol() return value test in ubi_attach_fastmap()
Owen Hofmann <[email protected]>
kvm: x86: Check memopp before dereference (CVE-2016-8630)
Jiri Slaby <[email protected]>
tty: vt, fix bogus division in csi_J
Christophe JAILLET <[email protected]>
usb: dwc3: Fix size used in dma_free_coherent()
David Hsu <[email protected]>
pwm: Unexport children before chip removal
Boris Brezillon <[email protected]>
UBI: fastmap: scrub PEB when bitflips are detected in a free PEB EC header
Linus Torvalds <[email protected]>
Disable "frame-address" warning
Arnd Bergmann <[email protected]>
smc91x: avoid self-comparison warning
Arnd Bergmann <[email protected]>
cgroup: avoid false positive gcc-6 warning
Arnd Bergmann <[email protected]>
drm/exynos: fix error handling in exynos_drm_subdrv_open
Stephen Rothwell <[email protected]>
mm/cma: silence warnings due to max() usage
Arnd Bergmann <[email protected]>
ARM: 8584/1: floppy: avoid gcc-6 warning
Khem Raj <[email protected]>
powerpc/ptrace: Fix out of bounds array access warning
Juergen Gross <[email protected]>
x86/xen: fix upper bound of pmd loop in xen_cleanhighmap()
Jiri Olsa <[email protected]>
perf build: Fix traceevent plugins build race
Ville Syrjälä <[email protected]>
drm/dp/mst: Check peer device type before attempting EDID read
Lucas Stach <[email protected]>
drm/radeon: drop register readback in cayman_cp_int_cntl_setup
Alex Deucher <[email protected]>
drm/radeon/si_dpm: workaround for SI kickers
Tom St Denis <[email protected]>
drm/radeon/si_dpm: Limit clocks on HD86xx part
Michel Dänzer <[email protected]>
Revert "drm/radeon: fix DP link training issue with second 4K monitor"
Jaehoon Chung <[email protected]>
mmc: dw_mmc-pltfm: fix the potential NULL pointer dereference
Ching Huang <[email protected]>
scsi: arcmsr: Send SYNCHRONIZE_CACHE command to firmware
Ewan D. Milne <[email protected]>
scsi: scsi_debug: Fix memory leak if LBP enabled and module is unloaded
Kashyap Desai <[email protected]>
scsi: megaraid_sas: Fix data integrity failure for JBOD (passthrough) devices
Johannes Berg <[email protected]>
mac80211: discard multicast and 4-addr A-MSDUs
Stefan Richter <[email protected]>
firewire: net: fix fragmented datagram_size off-by-one
Stefan Richter <[email protected]>
firewire: net: guard against rx buffer overflows
Patrick Scheuring <[email protected]>
Input: i8042 - add XMG C504 to keyboard reset table
Heinz Mauelshagen <[email protected]>
dm mirror: fix read error on recovery after default leg failure
Matt Redfearn <[email protected]>
virtio: console: Unlock vqs while freeing buffers
Ladi Prosek <[email protected]>
virtio_ring: Make interrupt suppression spec compliant
John David Anglin <[email protected]>
parisc: Ensure consistent state when switching to kernel stack at syscall entry
Miklos Szeredi <[email protected]>
ovl: fsync after copy-up
James Hogan <[email protected]>
KVM: MIPS: Make ERET handle ERL before EXL
Ido Yariv <[email protected]>
KVM: x86: fix wbinvd_dirty_mask use-after-free
Tahsin Erdogan <[email protected]>
dm: free io_barrier after blk_cleanup_queue call
Johan Hovold <[email protected]>
USB: serial: cp210x: fix tiocmget error handling
Dmitry Vyukov <[email protected]>
tty: limit terminal size to 4M chars
Mathias Nyman <[email protected]>
xhci: add restart quirk for Intel Wildcatpoint PCH
Long Li <[email protected]>
hv: do not lose pending heartbeat vmbus packets
Scot Doyle <[email protected]>
vt: clear selection before resizing
Linus Torvalds <[email protected]>
Fix potential infoleak in older kernels
Gerald Schaefer <[email protected]>
GenWQE: Fix bad page access during abort of resource allocation
Bryan Paluch <[email protected]>
usb: increase ohci watchdog delay to 275 msec
Mathias Nyman <[email protected]>
xhci: use default USB_RESUME_TIMEOUT when resuming ports.
Stefan Tauner <[email protected]>
USB: serial: ftdi_sio: add support for Infineon TriBoard TC2X7
Johan Hovold <[email protected]>
USB: serial: fix potential NULL-dereference at probe
Felipe Balbi <[email protected]>
usb: gadget: function: u_ether: don't starve tx request queue
Alexander Usyskin <[email protected]>
mei: txe: don't clean an unprocessed interrupt cause.
Richard Weinberger <[email protected]>
ubifs: Fix regression in ubifs_readdir()
Richard Weinberger <[email protected]>
ubifs: Abort readdir upon error
Chris Mason <[email protected]>
btrfs: fix races on root_log_ctx lists
Arve Hjønnevåg <[email protected]>
ANDROID: binder: Clear binder and cookie when setting handle in flat binder struct
Arve Hjønnevåg <[email protected]>
ANDROID: binder: Add strong ref checks
Hui Wang <[email protected]>
ALSA: hda - Fix headset mic detection problem for two Dell laptops
Hui Wang <[email protected]>
ALSA: hda - Adding a new group of pin cfg into ALC295 pin quirk table
Ard Biesheuvel <[email protected]>
ALSA: hda - allow 40 bit DMA mask for NVidia devices
Takashi Iwai <[email protected]>
ALSA: hda - Raise AZX_DCAPS_RIRB_DELAY handling into top drivers
Takashi Iwai <[email protected]>
ALSA: hda - Merge RIRB_PRE_DELAY into CTX_WORKAROUND caps
Marcel Hasler <[email protected]>
ALSA: usb-audio: Add quirk for Syntek STK1160
David Howells <[email protected]>
KEYS: Fix short sprintf buffer in /proc/keys show function
Johannes Weiner <[email protected]>
mm: memcontrol: do not recurse in direct reclaim
Alexander Polakov <[email protected]>
mm/list_lru.c: avoid error-path NULL pointer deref
Darrick J. Wong <[email protected]>
libxfs: clean up _calc_dquots_per_chunk
Mark Rutland <[email protected]>
h8300: fix syscall restarting
Ville Syrjälä <[email protected]>
drm/dp/mst: Clear port->pdt when tearing down the i2c adapter
Vladimir Zapolskiy <[email protected]>
i2c: core: fix NULL pointer dereference under race condition
Hoan Tran <[email protected]>
i2c: xgene: Avoid dma_buffer overrun
-------------
Diffstat:
Makefile | 5 +-- arch/arm/include/asm/floppy.h | 2 +- arch/h8300/include/asm/thread_info.h | 4 --- arch/h8300/kernel/signal.c | 2 +- arch/mips/kvm/emulate.c | 8 ++--- arch/parisc/kernel/syscall.S | 11 ++++-- arch/powerpc/kernel/ptrace.c | 4 +-- arch/x86/include/asm/uaccess.h | 10 +++--- arch/x86/kvm/emulate.c | 2 +- arch/x86/kvm/x86.c | 4 ++- arch/x86/xen/mmu.c | 2 +- drivers/android/binder.c | 35 +++++++++++++----- drivers/char/virtio_console.c | 22 ++++++++---- drivers/firewire/net.c | 59 ++++++++++++++++++++----------- drivers/gpu/drm/drm_dp_mst_topology.c | 6 +++- drivers/gpu/drm/exynos/exynos_drm_core.c | 2 +- drivers/gpu/drm/radeon/ni.c | 4 +-- drivers/gpu/drm/radeon/radeon_dp_auxch.c | 2 +- drivers/gpu/drm/radeon/si_dpm.c | 53 +++++++++++++++++++++------ drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + drivers/hv/hv_util.c | 10 ++++-- drivers/i2c/busses/i2c-xgene-slimpro.c | 2 +- drivers/i2c/i2c-core.c | 2 +- drivers/input/serio/i8042-x86ia64io.h | 7 ++++ drivers/md/dm-raid1.c | 1 + drivers/md/dm.c | 4 +-- drivers/misc/genwqe/card_utils.c | 12 ++++++- drivers/misc/mei/hw-txe.c | 6 ++-- drivers/mmc/host/dw_mmc-pltfm.c | 5 +-- drivers/mtd/ubi/fastmap.c | 17 ++++----- drivers/net/ethernet/smsc/smc91x.c | 2 +- drivers/pwm/core.c | 2 ++ drivers/pwm/sysfs.c | 18 ++++++++++ drivers/scsi/arcmsr/arcmsr_hba.c | 9 ----- drivers/scsi/megaraid/megaraid_sas_base.c | 13 +++---- drivers/scsi/scsi_debug.c | 1 + drivers/tty/vt/vt.c | 7 +++- drivers/usb/dwc3/gadget.c | 4 +-- drivers/usb/gadget/function/u_ether.c | 5 +-- drivers/usb/host/ohci-hcd.c | 2 +- drivers/usb/host/xhci-hub.c | 4 +-- drivers/usb/host/xhci-pci.c | 4 ++- drivers/usb/serial/cp210x.c | 4 ++- drivers/usb/serial/ftdi_sio.c | 3 +- drivers/usb/serial/ftdi_sio_ids.h | 5 +-- drivers/usb/serial/usb-serial.c | 3 +- drivers/virtio/virtio_ring.c | 14 +++++--- fs/btrfs/tree-log.c | 20 ++++------- fs/overlayfs/copy_up.c | 2 ++ fs/ubifs/dir.c | 16 ++++++--- fs/xfs/libxfs/xfs_dquot_buf.c | 3 +- include/linux/pwm.h | 5 +++ kernel/cgroup.c | 3 ++ mm/cma.c | 7 ++-- mm/list_lru.c | 2 ++ mm/memcontrol.c | 9 +++++ mm/vmscan.c | 2 ++ net/mac80211/rx.c | 24 ++++++++----- security/keys/proc.c | 2 +- sound/pci/hda/hda_controller.c | 7 +--- sound/pci/hda/hda_controller.h | 4 +-- sound/pci/hda/hda_intel.c | 18 ++++++---- sound/pci/hda/hda_tegra.c | 5 +-- sound/pci/hda/patch_realtek.c | 18 ++++++++-- sound/usb/quirks-table.h | 17 +++++++++ tools/perf/Makefile.perf | 2 +- 67 files changed, 385 insertions(+), 186 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/69 i2c: xgene: Avoid dma_buffer overrun
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hoan Tran <[email protected]>
commit 603616017c35f4d0fbdbcace72adf9bf949c4a65 upstream.
SMBus block command uses the first byte of buffer for the data length. The dma_buffer should be increased by 1 to avoid the overrun issue.
--- drivers/i2c/busses/i2c-xgene-slimpro.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/busses/i2c-xgene-slimpro.c +1 -1
@@ -105,7 +105,7 @@ struct slimpro_i2c_dev {struct mbox_chan *mbox_chan;struct mbox_client mbox_client;struct completion rd_complete; -u8 dma_buffer[I2C_SMBUS_BLOCK_MAX ]; +u8 dma_buffer[I2C_SMBUS_BLOCK_MAX +1 ];/* dma_buffer[0] is used for length */ u32 *resp_msg; };
Greg Kroah-Hartman
maintainerPATCH 2/69 i2c: core: fix NULL pointer dereference under race condition
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Zapolskiy <[email protected]>
commit 147b36d5b70c083cc76770c47d60b347e8eaf231 upstream.
Race condition between registering an I2C device driver and deregistering an I2C adapter device which is assumed to manage that I2C device may lead to a NULL pointer dereference due to the uninitialized list head of driver clients.
The root cause of the issue is that the I2C bus may know about the registered device driver and thus it is matched by bus_for_each_drv(), but the list of clients is not initialized and commonly it is NULL, because I2C device drivers define struct i2c_driver as static and clients field is expected to be initialized by I2C core:
i2c_register_driver() i2c_del_adapter()
driver_register() ...
bus_add_driver() ...
... bus_for_each_drv(..., __process_removed_adapter)
... i2c_do_del_adapter()
... list_for_each_entry_safe(..., &driver->clients, ...)
INIT_LIST_HEAD(&driver->clients);To solve the problem it is sufficient to do clients list head initialization before calling driver_register().
The problem was found while using an I2C device driver with a sluggish registration routine on a bus provided by a physically detachable I2C master controller, but practically the oops may be reproduced under the race between arbitraty I2C device driver registration and managing I2C bus device removal e.g. by unbinding the latter over sysfs:
% echo 21a4000.i2c > /sys/bus/platform/drivers/imx-i2c/unbind
Unable to handle kernel NULL pointer dereference at virtual address 00000000 Internal error: Oops: 17 [#1] SMP ARM CPU: 2 PID: 533 Comm: sh Not tainted 4.9.0-rc3+ #61 Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree) task: e5ada400 task.stack: e4936000 PC is at i2c_do_del_adapter+0x20/0xcc LR is at __process_removed_adapter+0x14/0x1c Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none Control: 10c5387d Table: 35bd004a DAC: 00000051 Process sh (pid: 533, stack limit = 0xe4936210) Stack: (0xe4937d28 to 0xe4938000) Backtrace: [<c0667be0>] (i2c_do_del_adapter) from [<c0667cc0>] (__process_removed_adapter+0x14/0x1c) [<c0667cac>] (__process_removed_adapter) from [<c0516998>] (bus_for_each_drv+0x6c/0xa0) [<c051692c>] (bus_for_each_drv) from [<c06685ec>] (i2c_del_adapter+0xbc/0x284) [<c0668530>] (i2c_del_adapter) from [<bf0110ec>] (i2c_imx_remove+0x44/0x164 [i2c_imx]) [<bf0110a8>] (i2c_imx_remove [i2c_imx]) from [<c051a838>] (platform_drv_remove+0x2c/0x44) [<c051a80c>] (platform_drv_remove) from [<c05183d8>] (__device_release_driver+0x90/0x12c) [<c0518348>] (__device_release_driver) from [<c051849c>] (device_release_driver+0x28/0x34) [<c0518474>] (device_release_driver) from [<c0517150>] (unbind_store+0x80/0x104) [<c05170d0>] (unbind_store) from [<c0516520>] (drv_attr_store+0x28/0x34) [<c05164f8>] (drv_attr_store) from [<c0298acc>] (sysfs_kf_write+0x50/0x54) [<c0298a7c>] (sysfs_kf_write) from [<c029801c>] (kernfs_fop_write+0x100/0x214) [<c0297f1c>] (kernfs_fop_write) from [<c0220130>] (__vfs_write+0x34/0x120) [<c02200fc>] (__vfs_write) from [<c0221088>] (vfs_write+0xa8/0x170) [<c0220fe0>] (vfs_write) from [<c0221e74>] (SyS_write+0x4c/0xa8) [<c0221e28>] (SyS_write) from [<c0108a20>] (ret_fast_syscall+0x0/0x1c)
--- drivers/i2c/i2c-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/i2c-core.c +1 -1
@@ -1876,6 +1876,7 @@ int i2c_register_driver(struct module *o/* add the driver to the list of i2c drivers in the driver core */ driver->driver.owner = owner; driver->driver.bus = &i2c_bus_type; +INIT_LIST_HEAD (&driver->clients);/* When registration returns, the driver core * will have called probe() for all matching-but-unbound devices.
@@ -1886,7 +1887,6 @@ int i2c_register_driver(struct module *opr_debug ("i2c-core: driver [%s] registered\n" , driver->driver.name); -INIT_LIST_HEAD (&driver->clients);/* Walk the adapters that are already present */ i2c_for_each_dev (driver, __process_new_driver);
Greg Kroah-Hartman
maintainerPATCH 4/69 h8300: fix syscall restarting
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
commit 21753583056d48a5fad964d6f272e28168426845 upstream.
Back in commit f56141e3e2d9 ("all arches, signal: move restart_block to struct task_struct"), all architectures and core code were changed to use task_struct::restart_block. However, when h8300 support was subsequently restored in v4.2, it was not updated to account for this, and maintains thread_info::restart_block, which is not kept in sync.
This patch drops the redundant restart_block from thread_info, and moves h8300 to the common one in task_struct, ensuring that syscall restarting always works as expected.
--- arch/h8300/include/asm/thread_info.h | 4 ---- arch/h8300/kernel/signal.c | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-)
arch/h8300/include/asm/thread_info.h +0 -4
@@ -31,7 +31,6 @@ struct thread_info {int cpu;/* cpu we're on */ int preempt_count;/* 0 => preemptable, <0 => BUG */ mm_segment_t addr_limit; -struct restart_block restart_block; };/*
@@ -44,9 +43,6 @@ struct thread_info { .cpu = 0, \ .preempt_count = INIT_PREEMPT_COUNT, \ .addr_limit = KERNEL_DS, \ - .restart_block = { \ - .fn = do_no_restart_syscall, \ - }, \ }#define init_thread_info (init_thread_union.thread_info)
arch/h8300/kernel/signal.c +1 -1
@@ -79,7 +79,7 @@ restore_sigcontext(struct sigcontext *usunsigned int er0;/* Always make any pending restarted system calls return -EINTR */ -current_thread_info ()->restart_block.fn = do_no_restart_syscall; + current->restart_block.fn = do_no_restart_syscall;/* restore passed registers */ #define COPY (r) do { err |= get_user(regs->r, &usc->sc_##r); } while (0)
Greg Kroah-Hartman
maintainerPATCH 5/69 libxfs: clean up _calc_dquots_per_chunk
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Darrick J. Wong <[email protected]>
commit 58d789678546d46d7bbd809dd7dab417c0f23655 upstream.
The function xfs_calc_dquots_per_chunk takes a parameter in units of basic blocks. The kernel seems to get the units wrong, but userspace got 'fixed' by commenting out the unnecessary conversion. Fix both.
--- fs/xfs/libxfs/xfs_dquot_buf.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/xfs/libxfs/xfs_dquot_buf.c +1 -2
@@ -191,8 +191,7 @@ xfs_dquot_buf_verify_crc(if (mp->m_quotainfo) ndquots = mp->m_quotainfo->qi_dqperchunk;else - ndquots =xfs_calc_dquots_per_chunk ( -XFS_BB_TO_FSB (mp, bp->b_length)); + ndquots =xfs_calc_dquots_per_chunk (bp->b_length); for (i = 0; i < ndquots; i++, d++) { if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk),
Greg Kroah-Hartman
maintainerPATCH 6/69 mm/list_lru.c: avoid error-path NULL pointer deref
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Polakov <[email protected]>
commit 1bc11d70b5db7c6bb1414b283d7f09b1fe1ac0d0 upstream.
As described in https://bugzilla.kernel.org/show_bug.cgi?id=177821:
After some analysis it seems to be that the problem is in alloc_super(). In case list_lru_init_memcg() fails it goes into destroy_super(), which calls list_lru_destroy().
And in list_lru_init() we see that in case memcg_init_list_lru() fails, lru->node is freed, but not set NULL, which then leads list_lru_destroy() to believe it is initialized and call memcg_destroy_list_lru(). memcg_destroy_list_lru() in turn can access lru->node[i].memcg_lrus, which is NULL.
--- mm/list_lru.c | 2 ++ 1 file changed, 2 insertions(+)
mm/list_lru.c +2 -0
@@ -554,6 +554,8 @@ int __list_lru_init(struct list_lru *lru err =memcg_init_list_lru (lru, memcg_aware);if (err) {kfree (lru->node); +/* Do this so a list_lru_destroy() doesn't crash: */ + lru->node =NULL ; goto out; }
Greg Kroah-Hartman
maintainerPATCH 7/69 mm: memcontrol: do not recurse in direct reclaim
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Weiner <[email protected]>
commit 89a2848381b5fcd9c4d9c0cd97680e3b28730e31 upstream.
On 4.0, we saw a stack corruption from a page fault entering direct memory cgroup reclaim, calling into btrfs_releasepage(), which then tried to allocate an extent and recursed back into a kmem charge ad nauseam:
[...]
btrfs_releasepage+0x2c/0x30 try_to_release_page+0x32/0x50 shrink_page_list+0x6da/0x7a0 shrink_inactive_list+0x1e5/0x510 shrink_lruvec+0x605/0x7f0 shrink_zone+0xee/0x320 do_try_to_free_pages+0x174/0x440 try_to_free_mem_cgroup_pages+0xa7/0x130 try_charge+0x17b/0x830 memcg_charge_kmem+0x40/0x80 new_slab+0x2d9/0x5a0 __slab_alloc+0x2fd/0x44f kmem_cache_alloc+0x193/0x1e0 alloc_extent_state+0x21/0xc0 __clear_extent_bit+0x2b5/0x400 try_release_extent_mapping+0x1a3/0x220 __btrfs_releasepage+0x31/0x70 btrfs_releasepage+0x2c/0x30 try_to_release_page+0x32/0x50 shrink_page_list+0x6da/0x7a0 shrink_inactive_list+0x1e5/0x510 shrink_lruvec+0x605/0x7f0 shrink_zone+0xee/0x320 do_try_to_free_pages+0x174/0x440 try_to_free_mem_cgroup_pages+0xa7/0x130 try_charge+0x17b/0x830 mem_cgroup_try_charge+0x65/0x1c0 handle_mm_fault+0x117f/0x1510 __do_page_fault+0x177/0x420 do_page_fault+0xc/0x10 page_fault+0x22/0x30
On later kernels, kmem charging is opt-in rather than opt-out, and that particular kmem allocation in btrfs_releasepage() is no longer being charged and won't recurse and overrun the stack anymore.
But it's not impossible for an accounted allocation to happen from the memcg direct reclaim context, and we needed to reproduce this crash many times before we even got a useful stack trace out of it.
Like other direct reclaimers, mark tasks in memcg reclaim PF_MEMALLOC to avoid recursing into any other form of direct reclaim. Then let recursive charges from PF_MEMALLOC contexts bypass the cgroup limit.
--- mm/memcontrol.c | 9 +++++++++ mm/vmscan.c | 2 ++ 2 files changed, 11 insertions(+)
mm/memcontrol.c +9 -0
@@ -2055,6 +2055,15 @@ retry: current->flags & PF_EXITING)) goto force; +/* +* Prevent unbounded recursion when reclaim operations need to +* allocate memory. This might exceed the limits temporarily, +* but we prefer facilitating memory reclaim and getting back +* under the limit over triggering OOM kills in these cases. +*/ +if (unlikely (current->flags &PF_MEMALLOC )) + goto force; +if (unlikely (task_in_memcg_oom (current))) goto nomem;
mm/vmscan.c +2 -0
@@ -2910,7 +2910,9 @@ unsigned long try_to_free_mem_cgroup_pag sc.may_writepage, sc.gfp_mask); + current->flags |=PF_MEMALLOC ; nr_reclaimed =do_try_to_free_pages (zonelist, &sc); + current->flags &= ~PF_MEMALLOC ;trace_mm_vmscan_memcg_reclaim_end (nr_reclaimed);
Greg Kroah-Hartman
maintainerPATCH 8/69 KEYS: Fix short sprintf buffer in /proc/keys show function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit 03dab869b7b239c4e013ec82aea22e181e441cfc upstream.
This fixes CVE-2016-7042.
Fix a short sprintf buffer in proc_keys_show(). If the gcc stack protector is turned on, this can cause a panic due to stack corruption.
The problem is that xbuf[] is not big enough to hold a 64-bit timeout rendered as weeks:
(gdb) p 0xffffffffffffffffULL/(60*60*24*7) $2 = 30500568904943
That's 14 chars plus NUL, not 11 chars plus NUL.
Expand the buffer to 16 chars.
I think the unpatched code apparently works if the stack-protector is not enabled because on a 32-bit machine the buffer won't be overflowed and on a 64-bit machine there's a 64-bit aligned pointer at one side and an int that isn't checked again on the other side.
The panic incurred looks something like:
Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: ffffffff81352ebe CPU: 0 PID: 1692 Comm: reproducer Not tainted 4.7.2-201.fc24.x86_64 #1 Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 0000000000000086 00000000fbbd2679 ffff8800a044bc00 ffffffff813d941f ffffffff81a28d58 ffff8800a044bc98 ffff8800a044bc88 ffffffff811b2cb6 ffff880000000010 ffff8800a044bc98 ffff8800a044bc30 00000000fbbd2679 Call Trace: [<ffffffff813d941f>] dump_stack+0x63/0x84 [<ffffffff811b2cb6>] panic+0xde/0x22a [<ffffffff81352ebe>] ? proc_keys_show+0x3ce/0x3d0 [<ffffffff8109f7f9>] __stack_chk_fail+0x19/0x30 [<ffffffff81352ebe>] proc_keys_show+0x3ce/0x3d0 [<ffffffff81350410>] ? key_validate+0x50/0x50 [<ffffffff8134db30>] ? key_default_cmp+0x20/0x20 [<ffffffff8126b31c>] seq_read+0x2cc/0x390 [<ffffffff812b6b12>] proc_reg_read+0x42/0x70 [<ffffffff81244fc7>] __vfs_read+0x37/0x150 [<ffffffff81357020>] ? security_file_permission+0xa0/0xc0 [<ffffffff81246156>] vfs_read+0x96/0x130 [<ffffffff81247635>] SyS_read+0x55/0xc0 [<ffffffff817eb872>] entry_SYSCALL_64_fastpath+0x1a/0xa4
--- security/keys/proc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
security/keys/proc.c +1 -1
@@ -181,7 +181,7 @@ static int proc_keys_show(struct seq_filstruct timespec now;unsigned long timo;key_ref_t key_ref, skey_ref; -char xbuf[12 ]; +char xbuf[16 ];int rc;struct keyring_search_context ctx = {
Greg Kroah-Hartman
maintainerPATCH 9/69 ALSA: usb-audio: Add quirk for Syntek STK1160
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcel Hasler <[email protected]>
commit bdc3478f90cd4d2928197f36629d5cf93b64dbe9 upstream.
The stk1160 chip needs QUIRK_AUDIO_ALIGN_TRANSFER. This patch resolves the issue reported on the mailing list
(http://marc.info/?l=linux-sound&m=139223599126215&w=2) and also fixes bug 180071 (https://bugzilla.kernel.org/show_bug.cgi?id=180071).
--- sound/usb/quirks-table.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
sound/usb/quirks-table.h +17 -0
@@ -2907,6 +2907,23 @@ AU0828_DEVICE(0x2040, 0x7260, "HauppaugeAU0828_DEVICE (0x2040 ,0x7213 ,"Hauppauge" ,"HVR-950Q" ),AU0828_DEVICE (0x2040 ,0x7270 ,"Hauppauge" ,"HVR-950Q" ), +/* Syntek STK1160 */ +{ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | +USB_DEVICE_ID_MATCH_INT_CLASS | +USB_DEVICE_ID_MATCH_INT_SUBCLASS , + .idVendor = 0x05e1, + .idProduct = 0x0408, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { + .vendor_name ="Syntek" , + .product_name ="STK1160" , + .ifnum =QUIRK_ANY_INTERFACE , + .type =QUIRK_AUDIO_ALIGN_TRANSFER + } +}, + /* Digidesign Mbox */ {/* Thanks to Clemens Ladisch <[email protected]> */
Greg Kroah-Hartman
maintainerPATCH 10/69 ALSA: hda - Merge RIRB_PRE_DELAY into CTX_WORKAROUND caps
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit ef85f299c74e6c5dd98ec0230183be33f4c2813d upstream.
AZX_DCAPS_RIRB_PRE_DELAY is always tied with AZX_DCAPS_CTX_WORKAROUND, which is Creative's XFi specific. So, we can replace it and reduce one more bit free for DCAPS.
--- sound/pci/hda/hda_controller.c | 2 +- sound/pci/hda/hda_controller.h | 2 +- sound/pci/hda/hda_intel.c | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-)
sound/pci/hda/hda_controller.c +1 -1
@@ -956,7 +956,7 @@ irqreturn_t azx_interrupt(int irq, void status =azx_readb (chip,RIRBSTS );if (status &RIRB_INT_MASK ) {if (status &RIRB_INT_RESPONSE ) { -if (chip->driver_caps &AZX_DCAPS_RIRB_PRE_DELAY ) +if (chip->driver_caps &AZX_DCAPS_CTX_WORKAROUND )udelay (80 );snd_hdac_bus_update_rirb (bus); }
sound/pci/hda/hda_controller.h +1 -1
@@ -33,7 +33,7 @@#define AZX_DCAPS_SNOOP_MASK (3 << 10)/* snoop type mask */ #define AZX_DCAPS_SNOOP_OFF (1 << 12)/* snoop default off */ #define AZX_DCAPS_RIRB_DELAY (1 << 13)/* Long delay in read loop */ -#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14)/* Put a delay before read */ +/* 14 unused */ #define AZX_DCAPS_CTX_WORKAROUND (1 << 15)/* X-Fi workaround */ #define AZX_DCAPS_POSFIX_LPIB (1 << 16)/* Use LPIB as default */ #define AZX_DCAPS_POSFIX_VIA (1 << 17)/* Use VIACOMBO as default */
sound/pci/hda/hda_intel.c +2 -4
@@ -2406,14 +2406,12 @@ static const struct pci_device_id azx_id .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, .class_mask = 0xffffff, .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | - AZX_DCAPS_NO_64BIT | - AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB }, + AZX_DCAPS_NO_64BIT | AZX_DCAPS_POSFIX_LPIB },#else /* this entry seems still valid -- i.e. without emu20kx chip */ { PCI_DEVICE(0x1102, 0x0009), .driver_data =AZX_DRIVER_CTX |AZX_DCAPS_CTX_WORKAROUND | -AZX_DCAPS_NO_64BIT | - AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB }, + AZX_DCAPS_NO_64BIT | AZX_DCAPS_POSFIX_LPIB }, #endif /* CM8888 */ { PCI_DEVICE(0x13f6, 0x5011),
Greg Kroah-Hartman
maintainerPATCH 11/69 ALSA: hda - Raise AZX_DCAPS_RIRB_DELAY handling into top drivers
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 7d9a180895ee8c301df7f9447429009795c56c21 upstream.
AZX_DCAPS_RIRB_DELAY is dedicated only for Nvidia and its purpose is just to set a flag in bus. So it's better to be set in the toplevel driver, either hda_intel.c or hda_tegra.c, instead of the common hda_controller.c. This also allows us to strip this flag from dcaps, so save one more bit there.
--- sound/pci/hda/hda_controller.c | 5 ----- sound/pci/hda/hda_controller.h | 2 +- sound/pci/hda/hda_intel.c | 7 ++++++- sound/pci/hda/hda_tegra.c | 5 +++-- 4 files changed, 10 insertions(+), 9 deletions(-)
sound/pci/hda/hda_controller.c +0 -5
@@ -1055,11 +1055,6 @@ int azx_bus_init(struct azx *chip, constif (chip->driver_caps &AZX_DCAPS_CORBRP_SELF_CLEAR ) bus->core.corbrp_self_clear = true; -if (chip->driver_caps &AZX_DCAPS_RIRB_DELAY ) { -dev_dbg (chip->card->dev,"Enable delay in RIRB handling\n" ); - bus->needs_damn_long_delay =1 ; - } -if (chip->driver_caps &AZX_DCAPS_4K_BDLE_BOUNDARY ) bus->core.align_bdle_4k = true;
sound/pci/hda/hda_controller.h +1 -1
@@ -32,7 +32,7 @@#define AZX_DCAPS_NO_MSI (1 << 9)/* No MSI support */ #define AZX_DCAPS_SNOOP_MASK (3 << 10)/* snoop type mask */ #define AZX_DCAPS_SNOOP_OFF (1 << 12)/* snoop default off */ -#define AZX_DCAPS_RIRB_DELAY (1 << 13)/* Long delay in read loop */ +/* 13 unused */ /* 14 unused */ #define AZX_DCAPS_CTX_WORKAROUND (1 << 15)/* X-Fi workaround */ #define AZX_DCAPS_POSFIX_LPIB (1 << 16)/* Use LPIB as default */
sound/pci/hda/hda_intel.c +6 -1
@@ -334,7 +334,7 @@ enum {/* quirks for Nvidia */ #define AZX_DCAPS_PRESET_NVIDIA \ - (AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI | /*AZX_DCAPS_ALIGN_BUFSIZE |*/ \ + (AZX_DCAPS_NO_MSI | /*AZX_DCAPS_ALIGN_BUFSIZE |*/ \AZX_DCAPS_NO_64BIT | AZX_DCAPS_CORBRP_SELF_CLEAR |\ AZX_DCAPS_SNOOP_TYPE(NVIDIA))
@@ -1637,6 +1637,11 @@ static int azx_create(struct snd_card *creturn err; } +if (chip->driver_type ==AZX_DRIVER_NVIDIA ) { +dev_dbg (chip->card->dev,"Enable delay in RIRB handling\n" ); + chip->bus.needs_damn_long_delay =1 ; + } + err =snd_device_new (card,SNDRV_DEV_LOWLEVEL , chip, &ops);if (err <0 ) {dev_err (card->dev,"Error creating device [card]!\n" );
sound/pci/hda/hda_tegra.c +3 -2
@@ -464,6 +464,8 @@ static int hda_tegra_create(struct snd_cif (err <0 )return err; + chip->bus.needs_damn_long_delay =1 ; + err =snd_device_new (card,SNDRV_DEV_LOWLEVEL , chip, &ops);if (err <0 ) {dev_err (card->dev,"Error creating device\n" );
@@ -481,8 +483,7 @@ MODULE_DEVICE_TABLE(of, hda_tegra_match)static int hda_tegra_probe (struct platform_device *pdev) { -const unsigned int driver_flags =AZX_DCAPS_RIRB_DELAY | -AZX_DCAPS_CORBRP_SELF_CLEAR ; +const unsigned int driver_flags =AZX_DCAPS_CORBRP_SELF_CLEAR ;struct snd_card *card;struct azx *chip;struct hda_tegra *hda;
Greg Kroah-Hartman
maintainerPATCH 12/69 ALSA: hda - allow 40 bit DMA mask for NVidia devices
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 3ab7511eafdd5c4f40d2832f09554478dfbea170 upstream.
Commit 49d9e77e72cf ("ALSA: hda - Fix system panic when DMA > 40 bits for Nvidia audio controllers") simply disabled any DMA exceeding 32 bits for NVidia devices, even though they are capable of performing DMA up to 40 bits. On some architectures (such as arm64), system memory is not guaranteed to be 32-bit addressable by PCI devices, and so this change prevents NVidia devices from working on platforms such as AMD Seattle.
Since the original commit already mentioned that up to 40 bits of DMA is supported, and given that the code has been updated in the meantime to support a 40 bit DMA mask on other devices, revert commit 49d9e77e72cf and explicitly set the DMA mask to 40 bits for NVidia devices.
--- sound/pci/hda/hda_intel.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
sound/pci/hda/hda_intel.c +5 -2
@@ -334,8 +334,7 @@ enum {/* quirks for Nvidia */ #define AZX_DCAPS_PRESET_NVIDIA \ - (AZX_DCAPS_NO_MSI | /*AZX_DCAPS_ALIGN_BUFSIZE |*/ \ -AZX_DCAPS_NO_64BIT | AZX_DCAPS_CORBRP_SELF_CLEAR |\ + (AZX_DCAPS_NO_MSI | AZX_DCAPS_CORBRP_SELF_CLEAR |\ AZX_DCAPS_SNOOP_TYPE(NVIDIA))#define AZX_DCAPS_PRESET_CTHDA \
@@ -1725,6 +1724,10 @@ static int azx_first_init(struct azx *ch } } +/* NVidia hardware normally only supports up to 40 bits of DMA */ +if (chip->pci->vendor ==PCI_VENDOR_ID_NVIDIA ) + dma_bits =40 ; +/* disable 64bit DMA address on some devices */ if (chip->driver_caps &AZX_DCAPS_NO_64BIT ) {dev_dbg (card->dev,"Disabling 64bit DMA\n" );
Greg Kroah-Hartman
maintainerPATCH 13/69 ALSA: hda - Adding a new group of pin cfg into ALC295 pin quirk table
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
commit f771d5bb71d4df9573d12386400540516672208b upstream.
We have a new Dell laptop model which uses ALC295, the pin definition is different from the existing ones in the pin quirk table, to fix the headset mic detection and mic mute led's problem, we need to add the new pin defintion into the pin quirk table.
--- sound/pci/hda/patch_realtek.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
sound/pci/hda/patch_realtek.c +7 -3
@@ -5793,8 +5793,6 @@ static const struct hda_model_fixup alc2#define ALC295_STANDARD_PINS \ {0x12, 0xb7a60130}, \ {0x14, 0x90170110}, \ - {0x17, 0x21014020}, \ - {0x18, 0x21a19030}, \ {0x21, 0x04211020}#define ALC298_STANDARD_PINS \
@@ -6021,7 +6019,13 @@ static const struct snd_hda_pin_quirk alALC292_STANDARD_PINS , {0x13, 0x90a60140}),SND_HDA_PIN_QUIRK (0x10ec0295 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL1_MIC_NO_PRESENCE , -ALC295_STANDARD_PINS ), +ALC295_STANDARD_PINS , + {0x17, 0x21014020}, + {0x18, 0x21a19030}), +SND_HDA_PIN_QUIRK (0x10ec0295 ,0x1028 ,"Dell" ,ALC269_FIXUP_DELL1_MIC_NO_PRESENCE , +ALC295_STANDARD_PINS , + {0x17, 0x21014040}, + {0x18, 0x21a19050}),SND_HDA_PIN_QUIRK (0x10ec0298 ,0x1028 ,"Dell" ,ALC298_FIXUP_DELL1_MIC_NO_PRESENCE ,ALC298_STANDARD_PINS , {0x17, 0x90170110}),
Greg Kroah-Hartman
maintainerPATCH 14/69 ALSA: hda - Fix headset mic detection problem for two Dell laptops
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
commit 6aecd8715802d23dc6a0859b50c62d2b0a99de3a upstream.
They uses the codec ALC255, and have the different pin cfg definition from the ones in the existing pin quirk table. Now adding them into the table to fix the problem.
--- sound/pci/hda/patch_realtek.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/pci/hda/patch_realtek.c +8 -0
@@ -5839,11 +5839,19 @@ static const struct snd_hda_pin_quirk al {0x1b, 0x02011020}, {0x21, 0x0221101f}),SND_HDA_PIN_QUIRK (0x10ec0255 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , + {0x14, 0x90170110}, + {0x1b, 0x01011020}, + {0x21, 0x0221101f}), +SND_HDA_PIN_QUIRK (0x10ec0255 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , {0x14, 0x90170130}, {0x1b, 0x01014020}, {0x21, 0x0221103f}),SND_HDA_PIN_QUIRK (0x10ec0255 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , {0x14, 0x90170130}, + {0x1b, 0x01011020}, + {0x21, 0x0221103f}), +SND_HDA_PIN_QUIRK (0x10ec0255 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , + {0x14, 0x90170130}, {0x1b, 0x02011020}, {0x21, 0x0221103f}), SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Greg Kroah-Hartman
maintainerPATCH 17/69 btrfs: fix races on root_log_ctx lists
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit 570dd45042a7c8a7aba1ee029c5dd0f5ccf41b9b upstream.
btrfs_remove_all_log_ctxs takes a shortcut where it avoids walking the list because it knows all of the waiters are patiently waiting for the commit to finish.
But, there's a small race where btrfs_sync_log can remove itself from the list if it finds a log commit is already done. Also, it uses list_del_init() to remove itself from the list, but there's no way to know if btrfs_remove_all_log_ctxs has already run, so we don't know for sure if it is safe to call list_del_init().
This gets rid of all the shortcuts for btrfs_remove_all_log_ctxs(), and just calls it with the proper locking.
This is part two of the corruption fixed by cbd60aa7cd1. I should have done this in the first place, but convinced myself the optimizations were safe. A 12 hour run of dbench 2048 will eventually trigger a list debug WARN_ON for the list_del_init() in btrfs_sync_log().
--- fs/btrfs/tree-log.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-)
fs/btrfs/tree-log.c +6 -14
@@ -2696,14 +2696,12 @@ static inline void btrfs_remove_all_log_ int index, int error) {struct btrfs_log_ctx *ctx; +struct btrfs_log_ctx *safe; -if (!error) { -INIT_LIST_HEAD (&root->log_ctxs[index]); -return ; - } - -list_for_each_entry (ctx, &root->log_ctxs[index], list) +list_for_each_entry_safe (ctx, safe, &root->log_ctxs[index], list) { +list_del_init (&ctx->list); ctx->log_ret = error; + }INIT_LIST_HEAD (&root->log_ctxs[index]); }
@@ -2944,13 +2942,9 @@ int btrfs_sync_log(struct btrfs_trans_hamutex_unlock (&root->log_mutex); out_wake_log_root: -/* -* We needn't get log_mutex here because we are sure all -* the other tasks are blocked. -*/ +mutex_lock (&log_root_tree->log_mutex);btrfs_remove_all_log_ctxs (log_root_tree, index2, ret); -mutex_lock (&log_root_tree->log_mutex); log_root_tree->log_transid_committed++;atomic_set (&log_root_tree->log_commit[index2],0 );mutex_unlock (&log_root_tree->log_mutex);
@@ -2961,10 +2955,8 @@ out_wake_log_root:if (waitqueue_active (&log_root_tree->log_commit_wait[index2]))wake_up (&log_root_tree->log_commit_wait[index2]); out: -/* See above. */ -btrfs_remove_all_log_ctxs (root, index1, ret); -mutex_lock (&root->log_mutex); +btrfs_remove_all_log_ctxs (root, index1, ret); root->log_transid_committed++;atomic_set (&root->log_commit[index1],0 );mutex_unlock (&root->log_mutex);
Greg Kroah-Hartman
maintainerPATCH 18/69 ubifs: Abort readdir upon error
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Weinberger <[email protected]>
commit c83ed4c9dbb358b9e7707486e167e940d48bfeed upstream.
If UBIFS is facing an error while walking a directory, it reports this error and ubifs_readdir() returns the error code. But the VFS readdir logic does not make the getdents system call fail in all cases. When the readdir cursor indicates that more entries are present, the system call will just return and the libc wrapper will try again since it also knows that more entries are present.
This causes the libc wrapper to busy loop for ever when a directory is corrupted on UBIFS.
A common approach do deal with corrupted directory entries is skipping them by setting the cursor to the next entry. On UBIFS this approach is not possible since we cannot compute the next directory entry cursor position without reading the current entry. So all we can do is setting the cursor to the "no more entries" position and make getdents exit.
--- fs/ubifs/dir.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
fs/ubifs/dir.c +3 -5
@@ -350,7 +350,7 @@ static unsigned int vfs_dent_type(uint8_*/ static int ubifs_readdir (struct file *file,struct dir_context *ctx) { -int err; +int err =0 ;struct qstr nm;union ubifs_key key;struct ubifs_dent_node *dent;
@@ -452,14 +452,12 @@ out:kfree (file->private_data); file->private_data =NULL ; -if (err != -ENOENT ) { +if (err != -ENOENT )ubifs_err (c,"cannot find next direntry, error %d" , err); -return err; - }/* 2 is a special value indicating that there are no more direntries */ ctx->pos =2 ; -return 0 ; +return err; }/* Free saved readdir() state when the directory is closed */
Greg Kroah-Hartman
maintainerPATCH 19/69 ubifs: Fix regression in ubifs_readdir()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Richard Weinberger <[email protected]>
commit a00052a296e54205cf238c75bd98d17d5d02a6db upstream.
Commit c83ed4c9dbb35 ("ubifs: Abort readdir upon error") broke overlayfs support because the fix exposed an internal error code to VFS.
--- fs/ubifs/dir.c | 8 ++++++++ 1 file changed, 8 insertions(+)
fs/ubifs/dir.c +8 -0
@@ -454,6 +454,14 @@ out:if (err != -ENOENT )ubifs_err (c,"cannot find next direntry, error %d" , err); +else +/* +* -ENOENT is a non-fatal error in this context, the TNC uses +* it to indicate that the cursor moved past the current directory +* and readdir() has to stop. +*/ + err =0 ; +/* 2 is a special value indicating that there are no more direntries */ ctx->pos =2 ;
Greg Kroah-Hartman
maintainerPATCH 20/69 mei: txe: dont clean an unprocessed interrupt cause.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Usyskin <[email protected]>
commit 43605e293eb13c07acb546c14f407a271837af17 upstream.
SEC registers are not accessible when the TXE device is in low power state, hence the SEC interrupt cannot be processed if device is not awake.
In some rare cases entrance to low power state (aliveness off) and input ready bits can be signaled at the same time, resulting in communication stall as input ready won't be signaled again after waking up. To resolve this IPC_HHIER_SEC bit in HHISR_REG should not be cleaned if the interrupt is not processed.
--- drivers/misc/mei/hw-txe.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/misc/mei/hw-txe.c +4 -2
@@ -972,11 +972,13 @@ static bool mei_txe_check_and_ack_intrs( hisr =mei_txe_br_reg_read (hw,HISR_REG ); aliveness =mei_txe_aliveness_get (dev); -if (hhisr &IPC_HHIER_SEC && aliveness) +if (hhisr &IPC_HHIER_SEC && aliveness) { ipc_isr =mei_txe_sec_reg_read_silent (hw,SEC_IPC_HOST_INT_STATUS_REG ); -else + }else { ipc_isr =0 ; + hhisr &= ~IPC_HHIER_SEC ; + } generated = generated || (hisr & HISR_INT_STS_MSK) ||
Greg Kroah-Hartman
maintainerPATCH 22/69 USB: serial: fix potential NULL-dereference at probe
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 126d26f66d9890a69158812a6caa248c05359daa upstream.
Make sure we have at least one port before attempting to register a console.
Currently, at least one driver binds to a "dummy" interface and requests zero ports for it. Should such an interface also lack endpoints, we get a NULL-deref during probe.
--- drivers/usb/serial/usb-serial.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/serial/usb-serial.c +2 -1
@@ -1077,7 +1077,8 @@ static int usb_serial_probe(struct usb_i serial->disconnected =0 ; -usb_serial_console_init (serial->port[0 ]->minor); +if (num_ports >0 ) +usb_serial_console_init (serial->port[0 ]->minor); exit:module_put (type->driver.owner);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 23/69 USB: serial: ftdi_sio: add support for Infineon TriBoard TC2X7
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Tauner <[email protected]>
commit ca006f785fbfd7a5c901900bd3fe2b26e946a1ee upstream.
This adds support to ftdi_sio for the Infineon TriBoard TC2X7 engineering board for first-generation Aurix SoCs with Tricore CPUs. Mere addition of the device IDs does the job.
--- drivers/usb/serial/ftdi_sio.c | 3 ++- drivers/usb/serial/ftdi_sio_ids.h | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-)
drivers/usb/serial/ftdi_sio.c +2 -1
@@ -986,7 +986,8 @@ static const struct usb_device_id id_tab/* ekey Devices */ { USB_DEVICE(FTDI_VID, FTDI_EKEY_CONV_USB_PID) },/* Infineon Devices */ - { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) }, + { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_TC1798_PID, 1) }, + { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_TC2X7_PID, 1) },/* GE Healthcare devices */ { USB_DEVICE(GE_HEALTHCARE_VID, GE_HEALTHCARE_NEMO_TRACKER_PID) },/* Active Research (Actisense) devices */
drivers/usb/serial/ftdi_sio_ids.h +3 -2
@@ -626,8 +626,9 @@/* * Infineon Technologies */ -#define INFINEON_VID 0x058b -#define INFINEON_TRIBOARD_PID 0x0028/* DAS JTAG TriBoard TC1798 V1.0 */ +#define INFINEON_VID 0x058b +#define INFINEON_TRIBOARD_TC1798_PID 0x0028/* DAS JTAG TriBoard TC1798 V1.0 */ +#define INFINEON_TRIBOARD_TC2X7_PID 0x0043/* DAS JTAG TriBoard TC2X7 V1.0 */ /* * Acton Research Corp.
Greg Kroah-Hartman
maintainerPATCH 24/69 xhci: use default USB_RESUME_TIMEOUT when resuming ports.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit 7d3b016a6f5a0fa610dfd02b05654c08fa4ae514 upstream.
USB2 host inititated resume, and system suspend bus resume need to use the same USB_RESUME_TIMEOUT as elsewhere.
This resolves a device disconnect issue at system resume seen on Intel Braswell and Apollolake, but is in no way limited to those platforms.
--- drivers/usb/host/xhci-hub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/host/xhci-hub.c +2 -2
@@ -1157,7 +1157,7 @@ int xhci_hub_control(struct usb_hcd *hcdxhci_set_link_state (xhci, port_array, wIndex,XDEV_RESUME );spin_unlock_irqrestore (&xhci->lock, flags); -msleep (20 ); +msleep (USB_RESUME_TIMEOUT );spin_lock_irqsave (&xhci->lock, flags);xhci_set_link_state (xhci, port_array, wIndex,XDEV_U0 );
@@ -1401,7 +1401,7 @@ int xhci_bus_resume(struct usb_hcd *hcd)if (need_usb2_u3_exit) {spin_unlock_irqrestore (&xhci->lock, flags); -msleep (20 ); +msleep (USB_RESUME_TIMEOUT );spin_lock_irqsave (&xhci->lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 25/69 usb: increase ohci watchdog delay to 275 msec
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bryan Paluch <[email protected]>
commit ed6d6f8f42d7302f6f9b6245f34927ec20d26c12 upstream.
Increase ohci watchout delay to 275 ms. Previous delay was 250 ms with 20 ms of slack, after removing slack time some ohci controllers don't respond in time. Logs from systems with controllers that have the issue would show "HcDoneHead not written back; disabled"
--- drivers/usb/host/ohci-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/ohci-hcd.c +1 -1
@@ -72,7 +72,7 @@static const char hcd_name [] ="ohci_hcd" ;#define STATECHANGE_DELAY msecs_to_jiffies(300) -#define IO_WATCHDOG_DELAY msecs_to_jiffies(250) +#define IO_WATCHDOG_DELAY msecs_to_jiffies(275)#include "ohci.h" #include "pci-quirks.h"
Greg Kroah-Hartman
maintainerPATCH 26/69 GenWQE: Fix bad page access during abort of resource allocation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerald Schaefer <[email protected]>
commit a7a7aeefbca2982586ba2c9fd7739b96416a6d1d upstream.
When interrupting an application which was allocating DMAable memory, it was possible, that the DMA memory was deallocated twice, leading to the error symptoms below.
Thanks to Gerald, who analyzed the problem and provided this patch.
I agree with his analysis of the problem: ddcb_cmd_fixups() -> genwqe_alloc_sync_sgl() (fails in f/lpage, but sgl->sgl != NULL and f/lpage maybe also != NULL) -> ddcb_cmd_cleanup() -> genwqe_free_sync_sgl() (double free, because sgl->sgl != NULL and f/lpage maybe also != NULL)
In this scenario we would have exactly the kind of double free that would explain the WARNING / Bad page state, and as expected it is caused by broken error handling (cleanup).
Using the Ubuntu git source, tag Ubuntu-4.4.0-33.52, he was able to reproduce the "Bad page state" issue, and with the patch on top he could not reproduce it any more.
------------[ cut here ]------------
WARNING: at /build/linux-o03cxz/linux-4.4.0/arch/s390/include/asm/pci_dma.h:141
Modules linked in: qeth_l2 ghash_s390 prng aes_s390 des_s390 des_generic sha512_s390 sha256_s390 sha1_s390 sha_common genwqe_card qeth crc_itu_t qdio ccwgroup vmur dm_multipath dasd_eckd_mod dasd_mod
CPU: 2 PID: 3293 Comm: genwqe_gunzip Not tainted 4.4.0-33-generic #52-Ubuntu
task: 0000000032c7e270 ti: 00000000324e4000 task.ti: 00000000324e4000
Krnl PSW : 0404c00180000000 0000000000156346 (dma_update_cpu_trans+0x9e/0xa8)
R:0 T:1 IO:0 EX:0 Key:0 M:1 W:0 P:0 AS:3 CC:0 PM:0 EA:3
Krnl GPRS: 00000000324e7bcd 0000000000c3c34a 0000000027628298 000000003215b400
0000000000000400 0000000000001fff 0000000000000400 0000000116853000
07000000324e7b1e 0000000000000001 0000000000000001 0000000000000001
0000000000001000 0000000116854000 0000000000156402 00000000324e7a38
Krnl Code: 000000000015633a: 95001000 cli 0(%r1),0
000000000015633e: a774ffc3 brc 7,1562c4
#0000000000156342: a7f40001 brc 15,156344
>0000000000156346: 92011000 mvi 0(%r1),1
000000000015634a: a7f4ffbd brc 15,1562c4
000000000015634e: 0707 bcr 0,%r7
0000000000156350: c00400000000 brcl 0,156350
0000000000156356: eb7ff0500024 stmg %r7,%r15,80(%r15)
Call Trace:
([<00000000001563e0>] dma_update_trans+0x90/0x228)
[<00000000001565dc>] s390_dma_unmap_pages+0x64/0x160
[<00000000001567c2>] s390_dma_free+0x62/0x98
[<000003ff801310ce>] __genwqe_free_consistent+0x56/0x70 [genwqe_card]
[<000003ff801316d0>] genwqe_free_sync_sgl+0xf8/0x160 [genwqe_card]
[<000003ff8012bd6e>] ddcb_cmd_cleanup+0x86/0xa8 [genwqe_card]
[<000003ff8012c1c0>] do_execute_ddcb+0x110/0x348 [genwqe_card]
[<000003ff8012c914>] genwqe_ioctl+0x51c/0xc20 [genwqe_card]
[<000000000032513a>] do_vfs_ioctl+0x3b2/0x518
[<0000000000325344>] SyS_ioctl+0xa4/0xb8
[<00000000007b86c6>] system_call+0xd6/0x264
[<000003ff9e8e520a>] 0x3ff9e8e520a
Last Breaking-Event-Address:
[<0000000000156342>] dma_update_cpu_trans+0x9a/0xa8
---[ end trace 35996336235145c8 ]---
BUG: Bad page state in process jbd2/dasdb1-8 pfn:3215b
page:000003d100c856c0 count:-1 mapcount:0 mapping: (null) index:0x0
flags: 0x3fffc0000000000()
page dumped because: nonzero _count--- drivers/misc/genwqe/card_utils.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/misc/genwqe/card_utils.c +11 -1
@@ -352,17 +352,27 @@ int genwqe_alloc_sync_sgl(struct genwqe_if (copy_from_user (sgl->lpage, user_addr + user_size - sgl->lpage_size, sgl->lpage_size)) { rc = -EFAULT ; - goto err_out1; + goto err_out2; } }return 0 ; + err_out2: +__genwqe_free_consistent (cd,PAGE_SIZE , sgl->lpage, + sgl->lpage_dma_addr); + sgl->lpage =NULL ; + sgl->lpage_dma_addr =0 ; err_out1:__genwqe_free_consistent (cd,PAGE_SIZE , sgl->fpage, sgl->fpage_dma_addr); + sgl->fpage =NULL ; + sgl->fpage_dma_addr =0 ; err_out:__genwqe_free_consistent (cd, sgl->sgl_size, sgl->sgl, sgl->sgl_dma_addr); + sgl->sgl =NULL ; + sgl->sgl_dma_addr =0 ; + sgl->sgl_size =0 ;return -ENOMEM ; }
Greg Kroah-Hartman
maintainerPATCH 27/69 Fix potential infoleak in older kernels
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Torvalds <[email protected]>
Not upstream as it is not needed there.
So a patch something like this might be a safe way to fix the potential infoleak in older kernels.
THIS IS UNTESTED. It's a very obvious patch, though, so if it compiles it probably works. It just initializes the output variable with 0 in the inline asm description, instead of doing it in the exception handler.
It will generate slightly worse code (a few unnecessary ALU operations), but it doesn't have any interactions with the exception handler implementation.
--- arch/x86/include/asm/uaccess.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/x86/include/asm/uaccess.h +5 -5
@@ -332,7 +332,7 @@ do { \#define __get_user_asm_u64 (x, ptr, retval, errret) \ __get_user_asm(x, ptr, retval, "q", "", "=r", errret)#define __get_user_asm_ex_u64 (x, ptr) \ - __get_user_asm_ex(x, ptr, "q", "", "=r") + __get_user_asm_ex(x, ptr, "q", "", "=&r")#endif #define __get_user_size (x, ptr, size, retval, errret) \
@@ -375,13 +375,13 @@ do { \__chk_user_ptr (ptr); \switch (size) { \case 1 : \ -__get_user_asm_ex (x, ptr,"b" ,"b" ,"=q" ); \ +__get_user_asm_ex (x, ptr,"b" ,"b" ,"=&q" ); \break ; \case 2 : \ -__get_user_asm_ex (x, ptr,"w" ,"w" ,"=r" ); \ +__get_user_asm_ex (x, ptr,"w" ,"w" ,"=&r" ); \break ; \case 4 : \ -__get_user_asm_ex (x, ptr,"l" ,"k" ,"=r" ); \ +__get_user_asm_ex (x, ptr,"l" ,"k" ,"=&r" ); \break ; \case 8 : \__get_user_asm_ex_u64 (x, ptr); \
@@ -395,7 +395,7 @@ do { \ asm volatile("1: mov"itype" %1,%"rtype"0\n" \ "2:\n" \ _ASM_EXTABLE_EX(1b, 2b) \ - : ltype(x) : "m" (__m(addr))) + : ltype(x) : "m" (__m(addr)), "0" (0))#define __put_user_nocheck (x, ptr, size) \ ({ \
Greg Kroah-Hartman
maintainerPATCH 28/69 vt: clear selection before resizing
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Scot Doyle <[email protected]>
commit 009e39ae44f4191188aeb6dfbf661b771dbbe515 upstream.
When resizing a vt its selection may exceed the new size, resulting in an invalid memory access [1]. Clear the selection before resizing.
[1] http://lkml.kernel.org/r/CACT4Y+acDTwy4umEvf5ROBGiRJNrxHN4Cn5szCXE5Jw-d1B=Xw@mail.gmail.com
--- drivers/tty/vt/vt.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/tty/vt/vt.c +3 -0
@@ -876,6 +876,9 @@ static int vc_do_resize(struct tty_strucif (!newscreen)return -ENOMEM ; +if (vc == sel_cons) +clear_selection (); + old_rows = vc->vc_rows; old_row_size = vc->vc_size_row;
Greg Kroah-Hartman
maintainerPATCH 29/69 hv: do not lose pending heartbeat vmbus packets
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Long Li <[email protected]>
commit 407a3aee6ee2d2cb46d9ba3fc380bc29f35d020c upstream.
The host keeps sending heartbeat packets independent of the
guest responding to them. Even though we respond to the heartbeat messages at interrupt level, we can have situations where there maybe multiple heartbeat messages pending that have not been responded to. For instance this occurs when the VM is paused and the host continues to send the heartbeat messages. Address this issue by draining and responding to all
the heartbeat messages that maybe pending.
--- drivers/hv/hv_util.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/hv/hv_util.c +7 -3
@@ -283,10 +283,14 @@ static void heartbeat_onchannelcallback(u8 *hbeat_txf_buf = util_heartbeat.recv_buffer;struct icmsg_negotiate *negop =NULL ; -vmbus_recvpacket (channel, hbeat_txf_buf, -PAGE_SIZE , &recvlen, &requestid); +while (1 ) { + +vmbus_recvpacket (channel, hbeat_txf_buf, +PAGE_SIZE , &recvlen, &requestid); + +if (!recvlen) +break ; -if (recvlen >0 ) { icmsghdrp = (struct icmsg_hdr *)&hbeat_txf_buf[sizeof (struct vmbuspipe_hdr )];
Greg Kroah-Hartman
maintainerPATCH 30/69 xhci: add restart quirk for Intel Wildcatpoint PCH
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit 4c39135aa412d2f1381e43802523da110ca7855c upstream.
xHC in Wildcatpoint-LP PCH is similar to LynxPoint-LP and need the same quirks to prevent machines from spurious restart while shutting them down.
--- drivers/usb/host/xhci-pci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-pci.c +3 -1
@@ -45,6 +45,7 @@#define PCI_DEVICE_ID_INTEL_LYNXPOINT_XHCI 0x8c31#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI 0x9c31 +#define PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_XHCI 0x9cb1#define PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI 0x22b5#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_XHCI 0xa12f#define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI 0x9d2f
@@ -154,7 +155,8 @@ static void xhci_pci_quirks(struct devic xhci->quirks |=XHCI_SPURIOUS_REBOOT ; }if (pdev->vendor ==PCI_VENDOR_ID_INTEL && - pdev->device ==PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI ) { + (pdev->device ==PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_XHCI || + pdev->device ==PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_XHCI )) { xhci->quirks |=XHCI_SPURIOUS_REBOOT ; xhci->quirks |=XHCI_SPURIOUS_WAKEUP ; }
Greg Kroah-Hartman
maintainerPATCH 31/69 tty: limit terminal size to 4M chars
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Vyukov <[email protected]>
commit 32b2921e6a7461fe63b71217067a6cf4bddb132f upstream.
Size of kmalloc() in vc_do_resize() is controlled by user. Too large kmalloc() size triggers WARNING message on console. Put a reasonable upper bound on terminal size to prevent WARNINGs.
--- drivers/tty/vt/vt.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/vt/vt.c +2 -0
@@ -872,6 +872,8 @@ static int vc_do_resize(struct tty_strucif (new_cols == vc->vc_cols && new_rows == vc->vc_rows)return 0 ; +if (new_screen_size > (4 <<20 )) +return -EINVAL ; newscreen =kmalloc (new_screen_size,GFP_USER );if (!newscreen)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 32/69 USB: serial: cp210x: fix tiocmget error handling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit de24e0a108bc48062e1c7acaa97014bce32a919f upstream.
The current tiocmget implementation would fail to report errors up the stack and instead leaked a few bits from the stack as a mask of modem-status flags.
--- drivers/usb/serial/cp210x.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/serial/cp210x.c +3 -1
@@ -845,7 +845,9 @@ static int cp210x_tiocmget(struct tty_stunsigned int control;int result; -cp210x_get_config (port,CP210X_GET_MDMSTS , &control,1 ); + result =cp210x_get_config (port,CP210X_GET_MDMSTS , &control,1 ); +if (result) +return result; result = ((control &CONTROL_DTR ) ?TIOCM_DTR :0 ) |((control &CONTROL_RTS ) ?TIOCM_RTS :0 )
Greg Kroah-Hartman
maintainerPATCH 33/69 dm: free io_barrier after blk_cleanup_queue call
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tahsin Erdogan <[email protected]>
commit d09960b0032174eb493c4c13be5b9c9ef36dc9a7 upstream.
dm_old_request_fn() has paths that access md->io_barrier. The party destroying io_barrier should ensure that no future execution of dm_old_request_fn() is possible. Move io_barrier destruction to below blk_cleanup_queue() to ensure this and avoid a NULL pointer crash during request-based DM device shutdown.
--- drivers/md/dm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/md/dm.c +2 -2
@@ -2260,8 +2260,6 @@ static void cleanup_mapped_device(structif (md->bs)bioset_free (md->bs); -cleanup_srcu_struct (&md->io_barrier); -if (md->disk) {spin_lock (&_minor_lock); md->disk->private_data =NULL ;
@@ -2273,6 +2271,8 @@ static void cleanup_mapped_device(structif (md->queue)blk_cleanup_queue (md->queue); +cleanup_srcu_struct (&md->io_barrier); +if (md->bdev) {bdput (md->bdev); md->bdev =NULL ;
Greg Kroah-Hartman
maintainerPATCH 35/69 KVM: MIPS: Make ERET handle ERL before EXL
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit ede5f3e7b54a4347be4d8525269eae50902bd7cd upstream.
The ERET instruction to return from exception is used for returning from exception level (Status.EXL) and error level (Status.ERL). If both bits are set however we should be returning from ERL first, as ERL can interrupt EXL, for example when an NMI is taken. KVM however checks EXL first.
Fix the order of the checks to match the pseudocode in the instruction set manual.
--- arch/mips/kvm/emulate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/mips/kvm/emulate.c +4 -4
@@ -752,15 +752,15 @@ enum emulation_result kvm_mips_emul_eretstruct mips_coproc *cop0 = vcpu->arch.cop0;enum emulation_result er =EMULATE_DONE ; -if (kvm_read_c0_guest_status (cop0) &ST0_EXL ) { +if (kvm_read_c0_guest_status (cop0) &ST0_ERL ) { +kvm_clear_c0_guest_status (cop0,ST0_ERL ); + vcpu->arch.pc =kvm_read_c0_guest_errorepc (cop0); + }else if (kvm_read_c0_guest_status (cop0) &ST0_EXL ) {kvm_debug ("[%#lx] ERET to %#lx\n" , vcpu->arch.pc,kvm_read_c0_guest_epc (cop0));kvm_clear_c0_guest_status (cop0,ST0_EXL ); vcpu->arch.pc =kvm_read_c0_guest_epc (cop0); - }else if (kvm_read_c0_guest_status (cop0) &ST0_ERL ) { -kvm_clear_c0_guest_status (cop0,ST0_ERL ); - vcpu->arch.pc =kvm_read_c0_guest_errorepc (cop0); }else {kvm_err ("[%#lx] ERET when MIPS_SR_EXL|MIPS_SR_ERL == 0\n" , vcpu->arch.pc);
Greg Kroah-Hartman
maintainerPATCH 36/69 ovl: fsync after copy-up
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit 641089c1549d8d3df0b047b5de7e9a111362cdce upstream.
Make sure the copied up file hits the disk before renaming to the final destination. If this is not done then the copy-up may corrupt the data in the file in case of a crash.
--- fs/overlayfs/copy_up.c | 2 ++ 1 file changed, 2 insertions(+)
fs/overlayfs/copy_up.c +2 -0
@@ -139,6 +139,8 @@ static int ovl_copy_up_data(struct path len -= bytes; } +if (!error) + error =vfs_fsync (new_file,0 );fput (new_file); out_fput:fput (old_file);
Greg Kroah-Hartman
maintainerPATCH 37/69 parisc: Ensure consistent state when switching to kernel stack at syscall entry
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
commit 6ed518328d0189e0fdf1bb7c73290d546143ea66 upstream.
We have one critical section in the syscall entry path in which we switch from the userspace stack to kernel stack. In the event of an external interrupt, the interrupt code distinguishes between those two states by analyzing the value of sr7. If sr7 is zero, it uses the kernel stack. Therefore it's important, that the value of sr7 is in sync with the currently enabled stack.
This patch now disables interrupts while executing the critical section. This prevents the interrupt handler to possibly see an inconsistent state which in the worst case can lead to crashes.
Interestingly, in the syscall exit path interrupts were already disabled in the critical section which switches back to the userspace stack.
--- arch/parisc/kernel/syscall.S | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
arch/parisc/kernel/syscall.S +9 -2
@@ -106,8 +106,6 @@ linux_gateway_entry: mtsp %r0,%sr4 /* get kernel space into sr4 */ mtsp %r0,%sr5 /* get kernel space into sr5 */ mtsp %r0,%sr6 /* get kernel space into sr6 */ - mfsp %sr7,%r1 /* save user sr7 */ - mtsp %r1,%sr3 /* and store it in sr3 */ #ifdef CONFIG_64BIT /* for now we can *always* set the W bit on entry to the syscall
@@ -133,6 +131,14 @@ linux_gateway_entry: depdi 0, 31, 32, %r21 1: #endif + + /* We use a rsm/ssm pair to prevent sr3 from being clobbered + * by external interrupts. + */ + mfsp %sr7,%r1 /* save user sr7 */ + rsm PSW_SM_I, %r0 /* disable interrupts */ + mtsp %r1,%sr3 /* and store it in sr3 */ + mfctl %cr30,%r1 xor %r1,%r30,%r30 /* ye olde xor trick */ xor %r1,%r30,%r1
@@ -147,6 +153,7 @@ linux_gateway_entry: */ mtsp %r0,%sr7 /* get kernel space into sr7 */ + ssm PSW_SM_I, %r0 /* enable interrupts */ STREGM %r1,FRAME_SIZE(%r30) /* save r1 (usp) here for now */ mfctl %cr30,%r1 /* get task ptr in %r1 */ LDREG TI_TASK(%r1),%r1
Greg Kroah-Hartman
maintainerPATCH 38/69 virtio_ring: Make interrupt suppression spec compliant
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ladi Prosek <[email protected]>
commit 0ea1e4a6d9b62cf29e210d2b4ba9fd43917522e3 upstream.
According to the spec, if the VIRTIO_RING_F_EVENT_IDX feature bit is negotiated the driver MUST set flags to 0. Not dirtying the available ring in virtqueue_disable_cb also has a minor positive performance impact, improving L1 dcache load missed by ~0.5% in vring_bench.
Writes to the used event field (vring_used_event) are still unconditional.
--- drivers/virtio/virtio_ring.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/virtio/virtio_ring.c +9 -5
@@ -548,7 +548,8 @@ void virtqueue_disable_cb(struct virtqueif (!(vq->avail_flags_shadow &VRING_AVAIL_F_NO_INTERRUPT )) { vq->avail_flags_shadow |=VRING_AVAIL_F_NO_INTERRUPT ; - vq->vring.avail->flags =cpu_to_virtio16 (_vq->vdev, vq->avail_flags_shadow); +if (!vq->event) + vq->vring.avail->flags =cpu_to_virtio16 (_vq->vdev, vq->avail_flags_shadow); } }
@@ -580,7 +581,8 @@ unsigned virtqueue_enable_cb_prepare(str* entry. Always do both to keep code simple. */ if (vq->avail_flags_shadow &VRING_AVAIL_F_NO_INTERRUPT ) { vq->avail_flags_shadow &= ~VRING_AVAIL_F_NO_INTERRUPT ; - vq->vring.avail->flags =cpu_to_virtio16 (_vq->vdev, vq->avail_flags_shadow); +if (!vq->event) + vq->vring.avail->flags =cpu_to_virtio16 (_vq->vdev, vq->avail_flags_shadow); }vring_used_event (&vq->vring) =cpu_to_virtio16 (_vq->vdev, last_used_idx = vq->last_used_idx);END_USE (vq);
@@ -648,10 +650,11 @@ bool virtqueue_enable_cb_delayed(struct* more to do. */ /* Depending on the VIRTIO_RING_F_USED_EVENT_IDX feature, we need to * either clear the flags bit or point the event index at the next -* entry. Always do both to keep code simple. */ +* entry. Always update the event index to keep code simple. */ if (vq->avail_flags_shadow &VRING_AVAIL_F_NO_INTERRUPT ) { vq->avail_flags_shadow &= ~VRING_AVAIL_F_NO_INTERRUPT ; - vq->vring.avail->flags =cpu_to_virtio16 (_vq->vdev, vq->avail_flags_shadow); +if (!vq->event) + vq->vring.avail->flags =cpu_to_virtio16 (_vq->vdev, vq->avail_flags_shadow); }/* TODO: tune this threshold */ bufs = (u16)(vq->avail_idx_shadow - vq->last_used_idx) *3 /4 ;
@@ -770,7 +773,8 @@ struct virtqueue *vring_new_virtqueue(un/* No callback? Tell other side not to bother us. */ if (!callback) { vq->avail_flags_shadow |=VRING_AVAIL_F_NO_INTERRUPT ; - vq->vring.avail->flags =cpu_to_virtio16 (vdev, vq->avail_flags_shadow); +if (!vq->event) + vq->vring.avail->flags =cpu_to_virtio16 (vdev, vq->avail_flags_shadow); }/* Put everything in free lists. */
Greg Kroah-Hartman
maintainerPATCH 39/69 virtio: console: Unlock vqs while freeing buffers
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit 34563769e438d2881f62cf4d9badc4e589ac0ec0 upstream.
Commit c6017e793b93 ("virtio: console: add locks around buffer removal in port unplug path") added locking around the freeing of buffers in the vq. However, when free_buf() is called with can_sleep = true and rproc is enabled, it calls dma_free_coherent() directly, requiring interrupts to be enabled. Currently a WARNING is triggered due to the spin locking around free_buf, with a call stack like this:
WARNING: CPU: 3 PID: 121 at ./include/linux/dma-mapping.h:433 free_buf+0x1a8/0x288 Call Trace: [<8040c538>] show_stack+0x74/0xc0 [<80757240>] dump_stack+0xd0/0x110 [<80430d98>] __warn+0xfc/0x130 [<80430ee0>] warn_slowpath_null+0x2c/0x3c [<807e7c6c>] free_buf+0x1a8/0x288 [<807ea590>] remove_port_data+0x50/0xac [<807ea6a0>] unplug_port+0xb4/0x1bc [<807ea858>] virtcons_remove+0xb0/0xfc [<807b6734>] virtio_dev_remove+0x58/0xc0 [<807f918c>] __device_release_driver+0xac/0x134 [<807f924c>] device_release_driver+0x38/0x50 [<807f7edc>] bus_remove_device+0xfc/0x130 [<807f4b74>] device_del+0x17c/0x21c [<807f4c38>] device_unregister+0x24/0x38 [<807b6b50>] unregister_virtio_device+0x28/0x44
Fix this by restructuring the loops to allow the locks to only be taken where it is necessary to protect the vqs, and release it while the buffer is being freed.
--- drivers/char/virtio_console.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
drivers/char/virtio_console.c +16 -6
@@ -1533,19 +1533,29 @@ static void remove_port_data(struct portspin_lock_irq (&port->inbuf_lock);/* Remove unused data this port might have received. */ discard_port_data (port); +spin_unlock_irq (&port->inbuf_lock);/* Remove buffers we queued up for the Host to send us data in. */ -while ((buf =virtqueue_detach_unused_buf (port->in_vq))) -free_buf (buf, true); -spin_unlock_irq (&port->inbuf_lock); +do { +spin_lock_irq (&port->inbuf_lock); + buf =virtqueue_detach_unused_buf (port->in_vq); +spin_unlock_irq (&port->inbuf_lock); +if (buf) +free_buf (buf, true); + }while (buf);spin_lock_irq (&port->outvq_lock);reclaim_consumed_buffers (port); +spin_unlock_irq (&port->outvq_lock);/* Free pending buffers from the out-queue. */ -while ((buf =virtqueue_detach_unused_buf (port->out_vq))) -free_buf (buf, true); -spin_unlock_irq (&port->outvq_lock); +do { +spin_lock_irq (&port->outvq_lock); + buf =virtqueue_detach_unused_buf (port->out_vq); +spin_unlock_irq (&port->outvq_lock); +if (buf) +free_buf (buf, true); + }while (buf); }/*
Greg Kroah-Hartman
maintainerPATCH 40/69 dm mirror: fix read error on recovery after default leg failure
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heinz Mauelshagen <[email protected]>
commit dcb2ff56417362c31f6b430c3c531a84581e8721 upstream.
If a default leg has failed, any read will cause a new operational default leg to be selected and the read is resubmitted. But until now the read will return failure even though it was successful due to resubmission. The reason for this is bio->bi_error was not being cleared before resubmitting the bio.
Fix by clearing bio->bi_error before resubmission.
--- drivers/md/dm-raid1.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-raid1.c +1 -0
@@ -1288,6 +1288,7 @@ static int mirror_end_io(struct dm_targedm_bio_restore (bd, bio); bio_record->details.bi_bdev =NULL ; + bio->bi_error =0 ;queue_bio (ms, bio, rw);return DM_ENDIO_INCOMPLETE ;
Greg Kroah-Hartman
maintainerPATCH 41/69 Input: i8042 - add XMG C504 to keyboard reset table
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Patrick Scheuring <[email protected]>
commit da25311c7ca8b0254a686fc0d597075b9aa3b683 upstream.
The Schenker XMG C504 is a rebranded Gigabyte P35 v2 laptop. Therefore it also needs a keyboard reset to detect the Elantech touchpad. Otherwise the touchpad appears to be dead.
With this patch the touchpad is detected:
$ dmesg | grep -E "(i8042|Elantech|elantech)"
[ 2.675399] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12 [ 2.680372] i8042: Attempting to reset device connected to KBD port [ 2.789037] serio: i8042 KBD port at 0x60,0x64 irq 1 [ 2.791586] serio: i8042 AUX port at 0x60,0x64 irq 12 [ 2.813840] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input4 [ 3.811431] psmouse serio1: elantech: assuming hardware version 4 (with firmware version 0x361f0e) [ 3.825424] psmouse serio1: elantech: Synaptics capabilities query result 0x00, 0x15, 0x0f. [ 3.839424] psmouse serio1: elantech: Elan sample query result 03, 58, 74 [ 3.911349] input: ETPS/2 Elantech Touchpad as /devices/platform/i8042/serio1/input/input6
--- drivers/input/serio/i8042-x86ia64io.h | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/input/serio/i8042-x86ia64io.h +7 -0
@@ -877,6 +877,13 @@ static const struct dmi_system_id __init DMI_MATCH(DMI_PRODUCT_NAME, "P34"), }, }, + { + /* Schenker XMG C504 - Elantech touchpad */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "XMG"), + DMI_MATCH(DMI_PRODUCT_NAME, "C504"), + }, + }, { } };
Greg Kroah-Hartman
maintainerPATCH 42/69 firewire: net: guard against rx buffer overflows
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Richter <[email protected]>
commit 667121ace9dbafb368618dbabcf07901c962ddac upstream.
The IP-over-1394 driver firewire-net lacked input validation when handling incoming fragmented datagrams. A maliciously formed fragment with a respectively large datagram_offset would cause a memcpy past the datagram buffer.
So, drop any packets carrying a fragment with offset + length larger than datagram_size.
In addition, ensure that
- GASP header, unfragmented encapsulation header, or fragment encapsulation header actually exists before we access it,
- the encapsulated datagram or fragment is of nonzero size.
--- drivers/firewire/net.c | 51 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-)
drivers/firewire/net.c +35 -16
@@ -578,6 +578,9 @@ static int fwnet_incoming_packet(structint retval;u16 ether_type; +if (len <=RFC2374_UNFRAG_HDR_SIZE ) +return 0 ; + hdr.w0 =be32_to_cpu (buf[0 ]); lf =fwnet_get_hdr_lf (&hdr);if (lf ==RFC2374_HDR_UNFRAG ) {
@@ -602,7 +605,12 @@ static int fwnet_incoming_packet(structreturn fwnet_finish_incoming_packet (net, skb, source_node_id, is_broadcast, ether_type); } +/* A datagram fragment has been received, now the fun begins. */ + +if (len <=RFC2374_FRAG_HDR_SIZE ) +return 0 ; + hdr.w1 =ntohl (buf[1 ]); buf +=2 ; len -=RFC2374_FRAG_HDR_SIZE ;
@@ -616,6 +624,9 @@ static int fwnet_incoming_packet(struct datagram_label =fwnet_get_hdr_dgl (&hdr); dg_size =fwnet_get_hdr_dg_size (&hdr);/* ??? + 1 */ +if (fg_off + len > dg_size) +return 0 ; +spin_lock_irqsave (&dev->lock, flags); peer =fwnet_peer_find_by_node_id (dev, source_node_id, generation);
@@ -722,6 +733,22 @@ static void fwnet_receive_packet(structfw_send_response (card, r, rcode); } +static int gasp_source_id (__be32 *p) +{ +return be32_to_cpu (p[0 ]) >>16 ; +} + +static u32 gasp_specifier_id (__be32 *p) +{ +return (be32_to_cpu (p[0 ]) &0xffff ) <<8 | + (be32_to_cpu (p[1 ]) &0xff000000 ) >>24 ; +} + +static u32 gasp_version (__be32 *p) +{ +return be32_to_cpu (p[1 ]) &0xffffff ; +} +static void fwnet_receive_broadcast (struct fw_iso_context *context,u32 cycle,size_t header_length,void *header,void *data) {
@@ -731,9 +758,6 @@ static void fwnet_receive_broadcast(stru__be32 *buf_ptr;int retval;u32 length; -u16 source_node_id; -u32 specifier_id; -u32 ver;unsigned long offset;unsigned long flags;
@@ -750,22 +774,17 @@ static void fwnet_receive_broadcast(struspin_unlock_irqrestore (&dev->lock, flags); - specifier_id = (be32_to_cpu (buf_ptr[0 ]) &0xffff ) <<8 - | (be32_to_cpu (buf_ptr[1 ]) &0xff000000 ) >>24 ; - ver =be32_to_cpu (buf_ptr[1 ]) &0xffffff ; - source_node_id =be32_to_cpu (buf_ptr[0 ]) >>16 ; - -if (specifier_id ==IANA_SPECIFIER_ID && - (ver == RFC2734_SW_VERSION +if (length >IEEE1394_GASP_HDR_SIZE && +gasp_specifier_id (buf_ptr) ==IANA_SPECIFIER_ID && + (gasp_version(buf_ptr) == RFC2734_SW_VERSION #if IS_ENABLED(CONFIG_IPV6) - || ver ==RFC3146_SW_VERSION + ||gasp_version (buf_ptr) ==RFC3146_SW_VERSION #endif - )) { - buf_ptr +=2 ; - length -=IEEE1394_GASP_HDR_SIZE ; -fwnet_incoming_packet (dev, buf_ptr, length, source_node_id, + )) +fwnet_incoming_packet (dev, buf_ptr +2 , + length -IEEE1394_GASP_HDR_SIZE , +gasp_source_id (buf_ptr), context->card->generation, true); - } packet.payload_length = dev->rcv_buffer_size; packet.interrupt =1 ;
Greg Kroah-Hartman
maintainerPATCH 43/69 firewire: net: fix fragmented datagram_size off-by-one
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Richter <[email protected]>
commit e9300a4b7bbae83af1f7703938c94cf6dc6d308f upstream.
RFC 2734 defines the datagram_size field in fragment encapsulation headers thus:
datagram_size: The encoded size of the entire IP datagram. The value of datagram_size [...] SHALL be one less than the value of Total Length in the datagram's IP header (see STD 5, RFC 791).
Accordingly, the eth1394 driver of Linux 2.6.36 and older set and got this field with a -/+1 offset:
ether1394_tx() /* transmit */
ether1394_encapsulate_prep()
hdr->ff.dg_size = dg_size - 1;
ether1394_data_handler() /* receive */
if (hdr->common.lf == ETH1394_HDR_LF_FF)
dg_size = hdr->ff.dg_size + 1;
else
dg_size = hdr->sf.dg_size + 1;Likewise, I observe OS X 10.4 and Windows XP Pro SP3 to transmit 1500 byte sized datagrams in fragments with datagram_size=1499 if link fragmentation is required.
Only firewire-net sets and gets datagram_size without this offset. The result is lacking interoperability of firewire-net with OS X, Windows XP, and presumably Linux' eth1394. (I did not test with the latter.) For example, FTP data transfers to a Linux firewire-net box with max_rec smaller than the 1500 bytes MTU
- from OS X fail entirely,
- from Win XP start out with a bunch of fragmented datagrams which time out, then continue with unfragmented datagrams because Win XP temporarily reduces the MTU to 576 bytes.
So let's fix firewire-net's datagram_size accessors.
Note that firewire-net thereby loses interoperability with unpatched firewire-net, but only if link fragmentation is employed. (This happens with large broadcast datagrams, and with large datagrams on several FireWire CardBus cards with smaller max_rec than equivalent PCI cards, and it can be worked around by setting a small enough MTU.)
--- drivers/firewire/net.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/firewire/net.c +4 -4
@@ -73,13 +73,13 @@ struct rfc2734_header {#define fwnet_get_hdr_lf (h) (((h)->w0 & 0xc0000000) >> 30)#define fwnet_get_hdr_ether_type (h) (((h)->w0 & 0x0000ffff)) -#define fwnet_get_hdr_dg_size (h) (((h)->w0 & 0x0fff0000) >> 16) +#define fwnet_get_hdr_dg_size (h) ((((h)->w0 & 0x0fff0000) >> 16) + 1)#define fwnet_get_hdr_fg_off (h) (((h)->w0 & 0x00000fff))#define fwnet_get_hdr_dgl (h) (((h)->w1 & 0xffff0000) >> 16) -#define fwnet_set_hdr_lf (lf) ((lf) << 30) +#define fwnet_set_hdr_lf (lf) ((lf) << 30)#define fwnet_set_hdr_ether_type (et) (et) -#define fwnet_set_hdr_dg_size (dgs) ((dgs) << 16) +#define fwnet_set_hdr_dg_size (dgs) (((dgs) - 1) << 16)#define fwnet_set_hdr_fg_off (fgo) (fgo)#define fwnet_set_hdr_dgl (dgl) ((dgl) << 16)
@@ -622,7 +622,7 @@ static int fwnet_incoming_packet(struct fg_off =fwnet_get_hdr_fg_off (&hdr); } datagram_label =fwnet_get_hdr_dgl (&hdr); - dg_size =fwnet_get_hdr_dg_size (&hdr);/* ??? + 1 */ + dg_size =fwnet_get_hdr_dg_size (&hdr);if (fg_off + len > dg_size)return 0 ;
Greg Kroah-Hartman
maintainerPATCH 44/69 mac80211: discard multicast and 4-addr A-MSDUs
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit ea720935cf6686f72def9d322298bf7e9bd53377 upstream.
In mac80211, multicast A-MSDUs are accepted in many cases that they shouldn't be accepted in:
* drop A-MSDUs with a multicast A1 (RA), as required by the spec in 9.11 (802.11-2012 version)
* drop A-MSDUs with a 4-addr header, since the fourth address can't actually be useful for them; unless 4-address frame format is actually requested, even though the fourth address is still not useful in this case, but ignored
Accepting the first case, in particular, is very problematic since it allows anyone else with possession of a GTK to send unicast frames encapsulated in a multicast A-MSDU, even when the AP has client isolation enabled.
--- net/mac80211/rx.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-)
net/mac80211/rx.c +15 -9
@@ -2203,16 +2203,22 @@ ieee80211_rx_h_amsdu(struct ieee80211_rxif (!(status->rx_flags &IEEE80211_RX_AMSDU ))return RX_CONTINUE ; -if (ieee80211_has_a4 (hdr->frame_control) && - rx->sdata->vif.type ==NL80211_IFTYPE_AP_VLAN && - !rx->sdata->u.vlan.sta) -return RX_DROP_UNUSABLE ; +if (unlikely (ieee80211_has_a4 (hdr->frame_control))) { +switch (rx->sdata->vif.type) { +case NL80211_IFTYPE_AP_VLAN : +if (!rx->sdata->u.vlan.sta) +return RX_DROP_UNUSABLE ; +break ; +case NL80211_IFTYPE_STATION : +if (!rx->sdata->u.mgd.use_4addr) +return RX_DROP_UNUSABLE ; +break ; +default : +return RX_DROP_UNUSABLE ; + } + } -if (is_multicast_ether_addr (hdr->addr1) && - ((rx->sdata->vif.type ==NL80211_IFTYPE_AP_VLAN && - rx->sdata->u.vlan.sta) || - (rx->sdata->vif.type ==NL80211_IFTYPE_STATION && - rx->sdata->u.mgd.use_4addr))) +if (is_multicast_ether_addr (hdr->addr1))return RX_DROP_UNUSABLE ; skb->dev = dev;
Greg Kroah-Hartman
maintainerPATCH 45/69 scsi: megaraid_sas: Fix data integrity failure for JBOD (passthrough) devices
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kashyap Desai <[email protected]>
commit 1e793f6fc0db920400574211c48f9157a37e3945 upstream.
Commit 02b01e010afe ("megaraid_sas: return sync cache call with success") modified the driver to successfully complete SYNCHRONIZE_CACHE commands without passing them to the controller. Disk drive caches are only explicitly managed by controller firmware when operating in RAID mode. So this commit effectively disabled writeback cache flushing for any drives used in JBOD mode, leading to data integrity failures.
[mkp: clarified patch description]
--- drivers/scsi/megaraid/megaraid_sas_base.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
drivers/scsi/megaraid/megaraid_sas_base.c +5 -8
@@ -1688,16 +1688,13 @@ megasas_queue_command(struct Scsi_Host * goto out_done; } -switch (scmd->cmnd[0 ]) { -case SYNCHRONIZE_CACHE : -/* -* FW takes care of flush cache on its own -* No need to send it down -*/ +/* +* FW takes care of flush cache on its own for Virtual Disk. +* No need to send it down for VD. For JBOD send SYNCHRONIZE_CACHE to FW. +*/ +if ((scmd->cmnd[0 ] ==SYNCHRONIZE_CACHE ) &&MEGASAS_IS_LOGICAL (scmd)) { scmd->result =DID_OK <<16 ; goto out_done; -default : -break ; }if (instance->instancet->build_and_issue_cmd (instance, scmd)) {
Greg Kroah-Hartman
maintainerPATCH 46/69 scsi: scsi_debug: Fix memory leak if LBP enabled and module is unloaded
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ewan D. Milne <[email protected]>
commit 4d2b496f19f3c2cfaca1e8fa0710688b5ff3811d upstream.
map_storep was not being vfree()'d in the module_exit call.
--- drivers/scsi/scsi_debug.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/scsi_debug.c +1 -0
@@ -4981,6 +4981,7 @@ static void __exit scsi_debug_exit(void)bus_unregister (&pseudo_lld_bus);root_device_unregister (pseudo_primary); +vfree (map_storep);vfree (dif_storep);vfree (fake_storep); }
Greg Kroah-Hartman
maintainerPATCH 47/69 scsi: arcmsr: Send SYNCHRONIZE_CACHE command to firmware
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ching Huang <[email protected]>
commit 2bf7dc8443e113844d078fd6541b7f4aa544f92f upstream.
The arcmsr driver failed to pass SYNCHRONIZE CACHE to controller firmware. Depending on how drive caches are handled internally by controller firmware this could potentially lead to data integrity problems.
Ensure that cache flushes are passed to the controller.
[mkp: applied by hand and removed unused vars]
--- drivers/scsi/arcmsr/arcmsr_hba.c | 9 --------- 1 file changed, 9 deletions(-)
drivers/scsi/arcmsr/arcmsr_hba.c +0 -9
@@ -2545,18 +2545,9 @@ static int arcmsr_queue_command_lck(strustruct AdapterControlBlock *acb = (struct AdapterControlBlock *) host->hostdata;struct CommandControlBlock *ccb;int target = cmd->device->id; -int lun = cmd->device->lun; -uint8_t scsicmd = cmd->cmnd[0 ]; cmd->scsi_done = done; cmd->host_scribble =NULL ; cmd->result =0 ; -if ((scsicmd ==SYNCHRONIZE_CACHE ) ||(scsicmd ==SEND_DIAGNOSTIC )){ -if (acb->devstate[target][lun] ==ARECA_RAID_GONE ) { - cmd->result = (DID_NO_CONNECT <<16 ); - } - cmd->scsi_done (cmd); -return 0 ; - }if (target ==16 ) {/* virtual device for iop message transfer */ arcmsr_handle_virtual_command (acb, cmd);
Greg Kroah-Hartman
maintainerPATCH 48/69 mmc: dw_mmc-pltfm: fix the potential NULL pointer dereference
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaehoon Chung <[email protected]>
commit 45c7a4908a307a023e237a64a3eadcafc4836493 upstream.
platform_get_resource can be returned the NULL pointer. Then regs->start should be referred to NULL Pointer. devm_ioremap_resource() checks whether res is NULL or not.
--- drivers/mmc/host/dw_mmc-pltfm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/mmc/host/dw_mmc-pltfm.c +3 -2
@@ -59,12 +59,13 @@ int dw_mci_pltfm_register(struct platfor host->pdata = pdev->dev.platform_data; regs =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); -/* Get registers' physical base address */ - host->phy_regs = regs->start; host->regs =devm_ioremap_resource (&pdev->dev, regs);if (IS_ERR (host->regs))return PTR_ERR (host->regs); +/* Get registers' physical base address */ + host->phy_regs = regs->start; +platform_set_drvdata (pdev, host);return dw_mci_probe (host); }
Greg Kroah-Hartman
maintainerPATCH 50/69 drm/radeon/si_dpm: Limit clocks on HD86xx part
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom St Denis <[email protected]>
commit fb9a5b0c1c9893db2e0d18544fd49e19d784a87d upstream.
Limit clocks on a specific HD86xx part to avoid crashes (while awaiting an appropriate PP fix).
--- drivers/gpu/drm/radeon/si_dpm.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/radeon/si_dpm.c +6 -0
@@ -3021,6 +3021,12 @@ static void si_apply_state_adjust_rules( max_sclk =75000 ; max_mclk =80000 ; } +/* limit clocks on HD8600 series */ +if (rdev->pdev->device ==0x6660 && + rdev->pdev->revision ==0x83 ) { + max_sclk =75000 ; + max_mclk =80000 ; + }if (rps->vce_active) { rps->evclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].evclk;
Greg Kroah-Hartman
maintainerPATCH 51/69 drm/radeon/si_dpm: workaround for SI kickers
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 7dc86ef5ac91642dfc3eb93ee0f0458e702a343e upstream.
Consolidate existing quirks. Fixes stability issues on some kickers.
--- drivers/gpu/drm/radeon/si_dpm.c | 59 +++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 16 deletions(-)
drivers/gpu/drm/radeon/si_dpm.c +43 -16
@@ -2999,6 +2999,49 @@ static void si_apply_state_adjust_rules(int i;struct si_dpm_quirk *p = si_dpm_quirk_list; +/* limit all SI kickers */ +if (rdev->family ==CHIP_PITCAIRN ) { +if ((rdev->pdev->revision ==0x81 ) || + (rdev->pdev->device ==0x6810 ) || + (rdev->pdev->device ==0x6811 ) || + (rdev->pdev->device ==0x6816 ) || + (rdev->pdev->device ==0x6817 ) || + (rdev->pdev->device ==0x6806 )) + max_mclk =120000 ; + }else if (rdev->family ==CHIP_VERDE ) { +if ((rdev->pdev->revision ==0x81 ) || + (rdev->pdev->revision ==0x83 ) || + (rdev->pdev->revision ==0x87 ) || + (rdev->pdev->device ==0x6820 ) || + (rdev->pdev->device ==0x6821 ) || + (rdev->pdev->device ==0x6822 ) || + (rdev->pdev->device ==0x6823 ) || + (rdev->pdev->device ==0x682A ) || + (rdev->pdev->device ==0x682B )) { + max_sclk =75000 ; + max_mclk =80000 ; + } + }else if (rdev->family ==CHIP_OLAND ) { +if ((rdev->pdev->revision ==0xC7 ) || + (rdev->pdev->revision ==0x80 ) || + (rdev->pdev->revision ==0x81 ) || + (rdev->pdev->revision ==0x83 ) || + (rdev->pdev->device ==0x6604 ) || + (rdev->pdev->device ==0x6605 )) { + max_sclk =75000 ; + max_mclk =80000 ; + } + }else if (rdev->family ==CHIP_HAINAN ) { +if ((rdev->pdev->revision ==0x81 ) || + (rdev->pdev->revision ==0x83 ) || + (rdev->pdev->revision ==0xC3 ) || + (rdev->pdev->device ==0x6664 ) || + (rdev->pdev->device ==0x6665 ) || + (rdev->pdev->device ==0x6667 )) { + max_sclk =75000 ; + max_mclk =80000 ; + } + }/* Apply dpm quirks */ while (p && p->chip_device !=0 ) { if (rdev->pdev->vendor == p->chip_vendor &&
@@ -3011,22 +3054,6 @@ static void si_apply_state_adjust_rules( } ++p; } -/* limit mclk on all R7 370 parts for stability */ -if (rdev->pdev->device ==0x6811 && - rdev->pdev->revision ==0x81 ) - max_mclk =120000 ; -/* limit sclk/mclk on Jet parts for stability */ -if (rdev->pdev->device ==0x6665 && - rdev->pdev->revision ==0xc3 ) { - max_sclk =75000 ; - max_mclk =80000 ; - } -/* limit clocks on HD8600 series */ -if (rdev->pdev->device ==0x6660 && - rdev->pdev->revision ==0x83 ) { - max_sclk =75000 ; - max_mclk =80000 ; - }if (rps->vce_active) { rps->evclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].evclk;
Greg Kroah-Hartman
maintainerPATCH 54/69 perf build: Fix traceevent plugins build race
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
commit 67befc652845c8ffbefc8d173a6e6ced14d472f1 upstream.
Ingo reported following build failure:
$ make clean install
...
CC plugin_kmem.o
fixdep: error opening depfile: ./.plugin_hrtimer.o.d: No such file or directory
/home/mingo/tip/tools/build/Makefile.build:77: recipe for target
'plugin_hrtimer.o' failed
make[3]: *** [plugin_hrtimer.o] Error 2
Makefile:189: recipe for target 'plugin_hrtimer-in.o' failed
make[2]: *** [plugin_hrtimer-in.o] Error 2
Makefile.perf:414: recipe for target 'libtraceevent_plugins' failed
make[1]: *** [libtraceevent_plugins] Error 2
make[1]: *** Waiting for unfinished jobs....Currently we have the install-traceevent-plugins target being dependent on $(LIBTRACEEVENT), which will actualy not build any plugin. So the install-traceevent-plugins target itself will try to build plugins, but..
Plugins built is also triggered by perf build itself via libtraceevent_plugins target.
This might cause a race having one make thread removing temp files from another and result in above error. Fixing this by having proper plugins build dependency before installing plugins.
--- tools/perf/Makefile.perf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/Makefile.perf +1 -1
@@ -420,7 +420,7 @@ $(LIBTRACEEVENT)-clean: $(call QUIET_CLEAN, libtraceevent) $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) O=$(OUTPUT) clean >/dev/null -install-traceevent-plugins: $(LIBTRACEEVENT) +install-traceevent-plugins: libtraceevent_plugins $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) install_plugins $(LIBAPI): fixdep FORCE
Greg Kroah-Hartman
maintainerPATCH 55/69 x86/xen: fix upper bound of pmd loop in xen_cleanhighmap()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juergen Gross <[email protected]>
commit 1cf38741308c64d08553602b3374fb39224eeb5a upstream.
xen_cleanhighmap() is operating on level2_kernel_pgt only. The upper bound of the loop setting non-kernel-image entries to zero should not exceed the size of level2_kernel_pgt.
--- arch/x86/xen/mmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/xen/mmu.c +1 -1
@@ -1113,7 +1113,7 @@ static void __init xen_cleanhighmap(unsi/* NOTE: The loop is more greedy than the cleanup_highmap variant. * We include the PMD passed in on _both_ boundaries. */ -for (; vaddr <= vaddr_end && (pmd < (level2_kernel_pgt +PAGE_SIZE )); +for (; vaddr <= vaddr_end && (pmd < (level2_kernel_pgt +PTRS_PER_PMD )); pmd++, vaddr +=PMD_SIZE ) {if (pmd_none (*pmd))continue ;
Greg Kroah-Hartman
maintainerPATCH 56/69 powerpc/ptrace: Fix out of bounds array access warning
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Khem Raj <[email protected]>
commit 1e407ee3b21f981140491d5b8a36422979ca246f upstream.
gcc-6 correctly warns about a out of bounds access
arch/powerpc/kernel/ptrace.c:407:24: warning: index 32 denotes an offset greater than size of 'u64[32][1] {aka long long unsigned int[32][1]}' [-Warray-bounds]
offsetof(struct thread_fp_state, fpr[32][0]));
^check the end of array instead of beginning of next element to fix this
--- arch/powerpc/kernel/ptrace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kernel/ptrace.c +2 -2
@@ -376,7 +376,7 @@ static int fpr_get(struct task_struct *t#else BUILD_BUG_ON (offsetof(struct thread_fp_state , fpscr) != - offsetof(struct thread_fp_state, fpr[32][0])); + offsetof(struct thread_fp_state, fpr[32]));return user_regset_copyout (&pos, &count, &kbuf, &ubuf, &target->thread.fp_state,0 ,-1 );
@@ -404,7 +404,7 @@ static int fpr_set(struct task_struct *treturn 0 ;#else BUILD_BUG_ON (offsetof(struct thread_fp_state , fpscr) != - offsetof(struct thread_fp_state, fpr[32][0])); + offsetof(struct thread_fp_state, fpr[32]));return user_regset_copyin (&pos, &count, &kbuf, &ubuf, &target->thread.fp_state,0 ,-1 );
Greg Kroah-Hartman
maintainerPATCH 57/69 ARM: 8584/1: floppy: avoid gcc-6 warning
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit dd665be0e243873343a28e18f9f345927b658daf upstream.
gcc-6.0 warns about comparisons between two identical expressions, which is what we get in the floppy driver when writing to the FD_DOR register:
drivers/block/floppy.c: In function 'set_dor':drivers/block/floppy.c:810:44: error: self-comparison always evaluates to true [-Werror=tautological-compare]
fd_outb(newdor, FD_DOR);
It would be nice to use a static inline function instead of the macro, to avoid the warning, but we cannot do that because the FD_DOR definition is incomplete at this point.
Adding a cast to (u32) is a harmless way to shut up the warning, just not very nice.
--- arch/arm/include/asm/floppy.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/include/asm/floppy.h +1 -1
@@ -17,7 +17,7 @@#define fd_outb (val,port) \ do { \ - if ((port) == FD_DOR) \ + if ((port) == (u32)FD_DOR) \ fd_setdor((val)); \ else \ outb((val),(port)); \
Greg Kroah-Hartman
maintainerPATCH 58/69 mm/cma: silence warnings due to max() usage
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Rothwell <[email protected]>
commit badbda53e505089062e194c614e6f23450bc98b2 upstream.
pageblock_order can be (at least) an unsigned int or an unsigned long depending on the kernel config and architecture, so use max_t(unsigned long, ...) when comparing it.
fixes these warnings:
In file included from include/asm-generic/bug.h:13:0,
from arch/powerpc/include/asm/bug.h:127,
from include/linux/bug.h:4,
from include/linux/mmdebug.h:4,
from include/linux/mm.h:8,
from include/linux/memblock.h:18,
from mm/cma.c:28:mm/cma.c: In function 'cma_init_reserved_mem':include/linux/kernel.h:748:17: warning: comparison of distinct pointer types lacks a cast
(void) (&_max1 == &_max2); ^mm/cma.c:186:27: note: in expansion of macro 'max'
alignment = PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order);
^mm/cma.c: In function 'cma_declare_contiguous':include/linux/kernel.h:748:17: warning: comparison of distinct pointer types lacks a cast
(void) (&_max1 == &_max2); ^include/linux/kernel.h:747:9: note: in definition of macro 'max'
typeof(y) _max2 = (y); ^mm/cma.c:270:29: note: in expansion of macro 'max'
(phys_addr_t)PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order));
^include/linux/kernel.h:748:17: warning: comparison of distinct pointer types lacks a cast
(void) (&_max1 == &_max2); ^include/linux/kernel.h:747:21: note: in definition of macro 'max'
typeof(y) _max2 = (y); ^mm/cma.c:270:29: note: in expansion of macro 'max'
(phys_addr_t)PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order));
^--- mm/cma.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
mm/cma.c +4 -3
@@ -183,7 +183,8 @@ int __init cma_init_reserved_mem(phys_adreturn -EINVAL ;/* ensure minimal alignment required by mm core */ - alignment =PAGE_SIZE <<max (MAX_ORDER -1 , pageblock_order); + alignment =PAGE_SIZE << + max_t(unsigned long, MAX_ORDER - 1, pageblock_order);/* alignment should be aligned with order_per_bit */ if (!IS_ALIGNED (alignment >>PAGE_SHIFT ,1 << order_per_bit))
@@ -266,8 +267,8 @@ int __init cma_declare_contiguous(phys_a* migratetype page by page allocator's buddy algorithm. In the case, * you couldn't get a contiguous memory, which is not what we want. */ - alignment =max (alignment, - (phys_addr_t )PAGE_SIZE <<max (MAX_ORDER -1 , pageblock_order)); + alignment =max (alignment, (phys_addr_t )PAGE_SIZE << + max_t(unsigned long, MAX_ORDER - 1, pageblock_order)); base =ALIGN (base, alignment); size =ALIGN (size, alignment); limit &= ~(alignment -1 );
Greg Kroah-Hartman
maintainerPATCH 59/69 drm/exynos: fix error handling in exynos_drm_subdrv_open
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 55c4b906aa2aec3fa66310ec03c6842e34a04b2a upstream.
gcc-6 warns about a pointless loop in exynos_drm_subdrv_open:
drivers/gpu/drm/exynos/exynos_drm_core.c: In function 'exynos_drm_subdrv_open':drivers/gpu/drm/exynos/exynos_drm_core.c:104:199: error: self-comparison always evaluates to false [-Werror=tautological-compare]
list_for_each_entry_reverse(subdrv, &subdrv->list, list) {
Here, the list_for_each_entry_reverse immediately terminates because the subdrv pointer is compared to itself as the loop end condition.
If we were to take the current subdrv pointer as the start of the list (as we would do if list_for_each_entry_reverse() was not a macro), we would iterate backwards over the &exynos_drm_subdrv_list anchor, which would be even worse.
Instead, we need to use list_for_each_entry_continue_reverse() to go back over each subdrv that was successfully opened until the first entry.
--- drivers/gpu/drm/exynos/exynos_drm_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/exynos/exynos_drm_core.c +1 -1
@@ -101,7 +101,7 @@ int exynos_drm_subdrv_open(struct drm_dereturn 0 ; err: -list_for_each_entry_reverse (subdrv, &subdrv->list, list) { +list_for_each_entry_continue_reverse (subdrv, &exynos_drm_subdrv_list, list) {if (subdrv->close) subdrv->close (dev, subdrv->dev, file); }
Greg Kroah-Hartman
maintainerPATCH 60/69 cgroup: avoid false positive gcc-6 warning
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit cfe02a8a973e7e5f66926b8ae38dfce404b19e29 upstream.
When all subsystems are disabled, gcc notices that cgroup_subsys_enabled_key is a zero-length array and that any access to it must be out of bounds:
In file included from ../include/linux/cgroup.h:19:0,
from ../kernel/cgroup.c:31:
../kernel/cgroup.c: In function 'cgroup_add_cftypes':
../kernel/cgroup.c:261:53: error: array subscript is above array bounds [-Werror=array-bounds]
return static_key_enabled(cgroup_subsys_enabled_key[ssid]);
~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
../include/linux/jump_label.h:271:40: note: in definition of macro 'static_key_enabled'
static_key_count((struct static_key *)x) > 0; \
^We should never call the function in this particular case, so this is not a bug. In order to silence the warning, this adds an explicit check for the CGROUP_SUBSYS_COUNT==0 case.
--- kernel/cgroup.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/cgroup.c +3 -0
@@ -236,6 +236,9 @@ static int cgroup_addrm_files(struct cgr*/ static bool cgroup_ssid_enabled (int ssid) { +if (CGROUP_SUBSYS_COUNT ==0 ) +return false; +return static_key_enabled (cgroup_subsys_enabled_key[ssid]); }
Greg Kroah-Hartman
maintainerPATCH 61/69 smc91x: avoid self-comparison warning
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit e3ebd894f084255fde19116955ba7054858ff5d6 upstream.
The smc91x driver defines a macro that compares its argument to itself, apparently to get a true result while using its argument to avoid a warning about unused local variables.
Unfortunately, this triggers a warning with gcc-6, as the comparison is obviously useless:
drivers/net/ethernet/smsc/smc91x.c: In function 'smc_hardware_send_pkt':drivers/net/ethernet/smsc/smc91x.c:563:14: error: self-comparison always evaluates to true [-Werror=tautological-compare]
if (!smc_special_trylock(&lp->lock, flags)) {
This replaces the macro with another one that behaves similarly, with a cast to (void) to ensure the argument is used, and using a literal 'true' as its value.
--- drivers/net/ethernet/smsc/smc91x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/smsc/smc91x.c +1 -1
@@ -540,7 +540,7 @@ static inline void smc_rcv(struct net_d#define smc_special_lock (lock, flags) spin_lock_irqsave(lock, flags)#define smc_special_unlock (lock, flags) spin_unlock_irqrestore(lock, flags)#else -#define smc_special_trylock (lock, flags) (flags == flags) +#define smc_special_trylock (lock, flags) ((void)flags, true)#define smc_special_lock (lock, flags) do { flags = 0; } while (0)#define smc_special_unlock (lock, flags) do { flags = 0; } while (0)#endif
Greg Kroah-Hartman
maintainerPATCH 63/69 UBI: fastmap: scrub PEB when bitflips are detected in a free PEB EC header
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit ecbfa8eabae9cd73522d1d3d15869703c263d859 upstream.
scan_pool() does not mark the PEB for scrubing when bitflips are detected in the EC header of a free PEB (VID header region left to 0xff).
Make sure we scrub the PEB in this case.
--- drivers/mtd/ubi/fastmap.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/mtd/ubi/fastmap.c +4 -3
@@ -513,10 +513,11 @@ static int scan_pool(struct ubi_device *unsigned long long ec =be64_to_cpu (ech->ec);unmap_peb (ai, pnum);dbg_bld ("Adding PEB to free: %i" , pnum); +if (err ==UBI_IO_FF_BITFLIPS ) -add_aeb (ai, free, pnum, ec,1 ); -else -add_aeb (ai, free, pnum, ec,0 ); + scrub =1 ; + +add_aeb (ai, free, pnum, ec, scrub);continue ; }else if (err ==0 || err ==UBI_IO_BITFLIPS ) {dbg_bld ("Found non empty PEB:%i in pool" , pnum);
Greg Kroah-Hartman
maintainerPATCH 64/69 pwm: Unexport children before chip removal
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Hsu <[email protected]>
commit 0733424c9ba9f42242409d1ece780777272f7ea1 upstream.
Exported pwm channels aren't removed before the pwmchip and are leaked. This results in invalid sysfs files. This fix removes all exported pwm channels before chip removal.
--- drivers/pwm/core.c | 2 ++ drivers/pwm/sysfs.c | 18 ++++++++++++++++++ include/linux/pwm.h | 5 +++++ 3 files changed, 25 insertions(+)
drivers/pwm/core.c +2 -0
@@ -321,6 +321,8 @@ int pwmchip_remove(struct pwm_chip *chipunsigned int i;int ret =0 ; +pwmchip_sysfs_unexport_children (chip); +mutex_lock (&pwm_lock);for (i =0 ; i < chip->npwm; i++) {
drivers/pwm/sysfs.c +18 -0
@@ -350,6 +350,24 @@ void pwmchip_sysfs_unexport(struct pwm_c } } +void pwmchip_sysfs_unexport_children (struct pwm_chip *chip) +{ +struct device *parent; +unsigned int i; + + parent =class_find_device (&pwm_class,NULL , chip, + pwmchip_sysfs_match); +if (!parent) +return ; + +for (i =0 ; i < chip->npwm; i++) { +struct pwm_device *pwm = &chip->pwms[i]; + +if (test_bit (PWMF_EXPORTED , &pwm->flags)) +pwm_unexport_child (parent, pwm); + } +} +static int __init pwm_sysfs_init (void ) {return class_register (&pwm_class);
include/linux/pwm.h +5 -0
@@ -331,6 +331,7 @@ static inline void pwm_remove_table(stru#ifdef CONFIG_PWM_SYSFS void pwmchip_sysfs_export (struct pwm_chip *chip);void pwmchip_sysfs_unexport (struct pwm_chip *chip); +void pwmchip_sysfs_unexport_children (struct pwm_chip *chip);#else static inline void pwmchip_sysfs_export (struct pwm_chip *chip) {
@@ -339,6 +340,10 @@ static inline void pwmchip_sysfs_export(static inline void pwmchip_sysfs_unexport (struct pwm_chip *chip) { } + +static inline void pwmchip_sysfs_unexport_children (struct pwm_chip *chip) +{ +}#endif /* CONFIG_PWM_SYSFS */ #endif /* __LINUX_PWM_H */
Greg Kroah-Hartman
maintainerPATCH 65/69 usb: dwc3: Fix size used in dma_free_coherent()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
commit 51fbc7c06c8900370c6da5fc4a4685add8fa4fb0 upstream.
In commit 2abd9d5fa60f9 ("usb: dwc3: ep0: Add chained TRB support"), the size of the memory allocated with 'dma_alloc_coherent()' has been modified but the corresponding calls to 'dma_free_coherent()' have not been updated accordingly.
This has been spotted with coccinelle, using the following script:
////////////////////
@r@
expression x0, x1, y0, y1, z0, z1, t0, t1, ret;
@@
* ret = dma_alloc_coherent(x0, y0, z0, t0);
...* dma_free_coherent(x1, y1, ret, t1);
@script:python@
y0 << r.y0;
y1 << r.y1;
@@
if y1.find(y0) == -1:
print "WARNING: sizes look different: '%s' vs '%s'" % (y0, y1)
////////////////////
--- drivers/usb/dwc3/gadget.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/dwc3/gadget.c +2 -2
@@ -2845,7 +2845,7 @@ err3:kfree (dwc->setup_buf); err2: -dma_free_coherent (dwc->dev,sizeof (*dwc->ep0_trb), +dma_free_coherent (dwc->dev,sizeof (*dwc->ep0_trb) *2 , dwc->ep0_trb, dwc->ep0_trb_addr); err1:
@@ -2869,7 +2869,7 @@ void dwc3_gadget_exit(struct dwc3 *dwc)kfree (dwc->setup_buf); -dma_free_coherent (dwc->dev,sizeof (*dwc->ep0_trb), +dma_free_coherent (dwc->dev,sizeof (*dwc->ep0_trb) *2 , dwc->ep0_trb, dwc->ep0_trb_addr); dma_free_coherent(dwc->dev, sizeof(*dwc->ctrl_req),
Greg Kroah-Hartman
maintainerPATCH 67/69 kvm: x86: Check memopp before dereference (CVE-2016-8630)
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Owen Hofmann <[email protected]>
commit d9092f52d7e61dd1557f2db2400ddb430e85937e upstream.
Commit 41061cdb98 ("KVM: emulate: do not initialize memopp") removes a check for non-NULL under incorrect assumptions. An undefined instruction with a ModR/M byte with Mod=0 and R/M-5 (e.g. 0xc7 0x15) will attempt to dereference a null pointer here.
Message-Id: <[email protected]>
--- arch/x86/kvm/emulate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/emulate.c +1 -1
@@ -5033,7 +5033,7 @@ done_prefixes:/* Decode and fetch the destination operand: register or memory. */ rc =decode_operand (ctxt, &ctxt->dst, (ctxt->d >> DstShift) & OpMask); -if (ctxt->rip_relative) +if (ctxt->rip_relative &&likely (ctxt->memopp)) ctxt->memopp->addr.mem.ea =address_mask (ctxt, ctxt->memopp->addr.mem.ea + ctxt->_eip);
Greg Kroah-Hartman
maintainerPATCH 68/69 ubi: fastmap: Fix add_vol() return value test in ubi_attach_fastmap()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 40b6e61ac72e99672e47cdb99c8d7d226004169b upstream.
Commit e96a8a3bb671 ("UBI: Fastmap: Do not add vol if it already exists") introduced a bug by changing the possible error codes returned by add_vol():
- this function no longer returns NULL in case of allocation failure but return ERR_PTR(-ENOMEM)
- when a duplicate entry in the volume RB tree is found it returns ERR_PTR(-EEXIST) instead of ERR_PTR(-EINVAL)
Fix the tests done on add_vol() return val to match this new behavior.
--- drivers/mtd/ubi/fastmap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/mtd/ubi/fastmap.c +5 -5
@@ -749,11 +749,11 @@ static int ubi_attach_fastmap(struct ubi fmvhdr->vol_type, be32_to_cpu(fmvhdr->last_eb_bytes)); -if (!av) - goto fail_bad; -if (PTR_ERR (av) == -EINVAL ) { -ubi_err (ubi,"volume (ID %i) already exists" , - fmvhdr->vol_id); +if (IS_ERR (av)) { +if (PTR_ERR (av) == -EEXIST ) +ubi_err (ubi,"volume (ID %i) already exists" , + fmvhdr->vol_id); + goto fail_bad; }
Greg Kroah-Hartman
maintainerPATCH 69/69 HID: usbhid: add ATEN CS962 to list of quirky devices
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit cf0ea4da4c7df11f7a508b2f37518e0f117f3791 upstream.
Like many similar devices it needs a quirk to work. Issuing the request gets the device into an irrecoverable state.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -168,6 +168,7 @@#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208#define USB_DEVICE_ID_ATEN_CS682 0x2213 +#define USB_DEVICE_ID_ATEN_CS692 0x8021#define USB_VENDOR_ID_ATMEL 0x03eb#define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -61,6 +61,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS682, HID_QUIRK_NOGET }, + { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS692, HID_QUIRK_NOGET }, { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FIGHTERSTICK, HID_QUIRK_NOGET }, { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET }, { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE, HID_QUIRK_NOGET },
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.31 release. There are 69 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri Nov 11 10:28:46 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.31-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America(Silicon Valley) [email protected]
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.31 release. There are 69 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Fri Nov 11 10:28:46 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 107 pass: 107 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter