4.4.139-stable review
Subsystems (8)
Greg Kroah-Hartman
maintainercover 4.4.139-stable review
This is the start of the stable review cycle for the 4.4.139 release. There are 105 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 Tue Jul 3 15:31:30 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.139-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.139-rc1
Szymon Janc <[email protected]>
Bluetooth: Fix connection if directed advertising and privacy is used
Bjørn Mork <[email protected]>
cdc_ncm: avoid padding beyond end of skb
Mike Snitzer <[email protected]>
dm thin: handle running out of data space vs concurrent discard
Keith Busch <[email protected]>
block: Fix transfer when chunk sectors exceeds max
Maxime Chevallier <[email protected]>
spi: Fix scatterlist elements size in spi_map_buf
Liu Bo <[email protected]>
Btrfs: fix unexpected cow in run_delalloc_nocow
Takashi Iwai <[email protected]>
ALSA: hda/realtek - Add a quirk for FSC ESPRIMO U9210
??? <[email protected]>
Input: elantech - fix V4 report decoding for module with middle key
Aaron Ma <[email protected]>
Input: elantech - enable middle button of touchpads on ThinkPad P52
Ben Hutchings <[email protected]>
Input: elan_i2c_smbus - fix more potential stack buffer overflows
Jan Kara <[email protected]>
udf: Detect incorrect directory size
Boris Ostrovsky <[email protected]>
xen: Remove unnecessary BUG_ON from __unbind_from_irq()
Alexandr Savca <[email protected]>
Input: elan_i2c - add ELAN0618 (Lenovo v330 15IKB) ACPI ID
Kees Cook <[email protected]>
video: uvesafb: Fix integer overflow in allocation
Dave Wysochanski <[email protected]>
NFSv4: Fix possible 1-byte stack overflow in nfs_idmap_read_and_verify_message
Scott Mayhew <[email protected]>
nfsd: restrict rd_maxcount to svc_max_payload in nfsd_encode_readdir
Mauro Carvalho Chehab <[email protected]>
media: dvb_frontend: fix locking issues at dvb_frontend_get_event()
Kai-Heng Feng <[email protected]>
media: cx231xx: Add support for AverMedia DVD EZMaker 7
Mauro Carvalho Chehab <[email protected]>
media: v4l2-compat-ioctl32: prevent go past max size
Adrian Hunter <[email protected]>
perf intel-pt: Fix packet decoding of CYC packets
Adrian Hunter <[email protected]>
perf intel-pt: Fix "Unexpected indirect branch" error
Adrian Hunter <[email protected]>
perf intel-pt: Fix MTC timing after overflow
Adrian Hunter <[email protected]>
perf intel-pt: Fix decoding to accept CBR between FUP and corresponding TIP
Adrian Hunter <[email protected]>
perf intel-pt: Fix sync_switch INTEL_PT_SS_NOT_TRACING
Adrian Hunter <[email protected]>
perf tools: Fix symbol and object code resolution for vdso32 and vdsox32
Andy Shevchenko <[email protected]>
mfd: intel-lpss: Program REMAP register in PIO mode
Johan Hovold <[email protected]>
backlight: tps65217_bl: Fix Device Tree node lookup
Johan Hovold <[email protected]>
backlight: max8925_bl: Fix Device Tree node lookup
Johan Hovold <[email protected]>
backlight: as3711_bl: Fix Device Tree node lookup
Florian Westphal <[email protected]>
xfrm: skip policies marked as dead while rehashing
Tobias Brunner <[email protected]>
xfrm: Ignore socket policies when rebuilding hash tables
Silvio Cesare <[email protected]>
UBIFS: Fix potential integer overflow in allocation
Richard Weinberger <[email protected]>
ubi: fastmap: Cancel work upon detach
NeilBrown <[email protected]>
md: fix two problems with setting the "re-add" device state.
Robert Elliott <[email protected]>
linvdimm, pmem: Preserve read-only setting for pmem devices
Steffen Maier <[email protected]>
scsi: zfcp: fix missing REC trigger trace on enqueue without ERP thread
Steffen Maier <[email protected]>
scsi: zfcp: fix missing REC trigger trace for all objects in ERP_FAILED
Steffen Maier <[email protected]>
scsi: zfcp: fix missing REC trigger trace on terminate_rport_io for ERP_FAILED
Steffen Maier <[email protected]>
scsi: zfcp: fix missing REC trigger trace on terminate_rport_io early return
Steffen Maier <[email protected]>
scsi: zfcp: fix misleading REC trigger trace where erp_action setup failed
Steffen Maier <[email protected]>
scsi: zfcp: fix missing SCSI trace for retry of abort / scsi_eh TMF
Steffen Maier <[email protected]>
scsi: zfcp: fix missing SCSI trace for result of eh_host_reset_handler
Himanshu Madhani <[email protected]>
scsi: qla2xxx: Fix setting lower transfer speed if GPSC fails
Martin Kelly <[email protected]>
iio:buffer: make length types match kfifo types
Omar Sandoval <[email protected]>
Btrfs: fix clone vs chattr NODATASUM race
Geert Uytterhoeven <[email protected]>
time: Make sure jiffies_to_msecs() preserves non-zero time periods
Huacai Chen <[email protected]>
MIPS: io: Add barrier after register read in inX()
Mika Westerberg <[email protected]>
PCI: pciehp: Clear Presence Detect and Data Link Layer Status Changed on resume
Tokunori Ikegami <[email protected]>
MIPS: BCM47XX: Enable 74K Core ExternalSync for PCIe erratum
Joakim Tjernlund <[email protected]>
mtd: cfi_cmdset_0002: Avoid walking all chips when unlocking.
Joakim Tjernlund <[email protected]>
mtd: cfi_cmdset_0002: Fix unlocking requests crossing a chip boudary
Joakim Tjernlund <[email protected]>
mtd: cfi_cmdset_0002: fix SEGV unlocking multiple chips
Joakim Tjernlund <[email protected]>
mtd: cfi_cmdset_0002: Use right chip in do_ppb_xxlock()
Tokunori Ikegami <[email protected]>
mtd: cfi_cmdset_0002: Change write buffer to check correct value
Leon Romanovsky <[email protected]>
RDMA/mlx4: Discard unknown SQP work requests
Mike Marciniszyn <[email protected]>
IB/qib: Fix DMA api warning with debug kernel
Stefan M Schaeckeler <[email protected]>
of: unittest: for strings, account for trailing \0 in property length field
David Rivshin <[email protected]>
ARM: 8764/1: kgdb: fix NUMREGBYTES so that gdb_regs[] is the correct size
Mahesh Salgaonkar <[email protected]>
powerpc/fadump: Unregister fadump on kexec down path.
Gautham R. Shenoy <[email protected]>
cpuidle: powernv: Fix promotion from snooze if next state disabled
Michael Neuling <[email protected]>
powerpc/ptrace: Fix enforcement of DAWR constraints
Michael Neuling <[email protected]>
powerpc/ptrace: Fix setting 512B aligned breakpoints with PTRACE_SET_DEBUGREG
Aneesh Kumar K.V <[email protected]>
powerpc/mm/hash: Add missing isync prior to kernel stack SLB switch
Miklos Szeredi <[email protected]>
fuse: fix control dir setup and teardown
Tetsuo Handa <[email protected]>
fuse: don't keep dead fuse_conn at fuse_fill_super().
Miklos Szeredi <[email protected]>
fuse: atomic_o_trunc should truncate pagecache
Amit Pundir <[email protected]>
Bluetooth: hci_qca: Avoid missing rampatch failure with userspace fw loader
Corey Minyard <[email protected]>
ipmi:bt: Set the timeout before doing a capabilities check
Mikulas Patocka <[email protected]>
branch-check: fix long->int truncation when profiling branches
Matthias Schiffer <[email protected]>
mips: ftrace: fix static function graph tracing
Geert Uytterhoeven <[email protected]>
lib/vsprintf: Remove atomic-unsafe support for %pCr
Alexander Sverdlin <[email protected]>
ASoC: cirrus: i2s: Fix {TX|RX}LinCtrlData setup
Alexander Sverdlin <[email protected]>
ASoC: cirrus: i2s: Fix LRCLK configuration
Srinivas Kandagatla <[email protected]>
ASoC: dapm: delete dapm_kcontrol_data paths list before freeing it
Ingo Flaschberger <[email protected]>
1wire: family module autoload fails because of upper/lower case mismatch.
Maxim Moseychuk <[email protected]>
usb: do not reset if a low-speed or full-speed device timed out
Eric W. Biederman <[email protected]>
signal/xtensa: Consistenly use SIGBUS in do_unaligned_user
Daniel Wagner <[email protected]>
serial: sh-sci: Use spin_{try}lock_irqsave instead of open coding version
Michael Schmitz <[email protected]>
m68k/mm: Adjust VM area to be unmapped by gap size for __iounmap()
Dan Williams <[email protected]>
x86/spectre_v1: Disable compiler optimizations over array_index_mask_nospec()
Thadeu Lima de Souza Cascardo <[email protected]>
fs/binfmt_misc.c: do not allow offset overflow
Stefan Potyra <[email protected]>
w1: mxc_w1: Enable clock before calling clk_get_rate() on it
Hans de Goede <[email protected]>
libata: Drop SanDisk SD7UB3Q*G1001 NOLPM quirk
Dan Carpenter <[email protected]>
libata: zpodd: small read overflow in eject_tray()
Colin Ian King <[email protected]>
libata: zpodd: make arrays cdb static, reduces object code size
Tao Wang <[email protected]>
cpufreq: Fix new policy initialization during limits updates via sysfs
Dennis Wassenberg <[email protected]>
ALSA: hda: add dock and led support for HP ProBook 640 G4
Dennis Wassenberg <[email protected]>
ALSA: hda: add dock and led support for HP EliteBook 830 G5
Bo Chen <[email protected]>
ALSA: hda - Handle kzalloc() failure in snd_hda_attach_pcm_stream()
Qu Wenruo <[email protected]>
btrfs: scrub: Don't use inode pages for device replace
Tetsuo Handa <[email protected]>
driver core: Don't ignore class_dir_create_and_add() failure.
Jan Kara <[email protected]>
ext4: fix fencepost error in check for inode count overflow during resize
Lukas Czerner <[email protected]>
ext4: update mtime in ext4_punch_hole even if no blocks are released
Frank van der Linden <[email protected]>
tcp: verify the checksum of the first data segment in a new connection
Xiangning Yu <[email protected]>
bonding: re-evaluate force_primary when the primary slave name changes
Daniel Glöckner <[email protected]>
usb: musb: fix remote wakeup racing with suspend
Liu Bo <[email protected]>
Btrfs: make raid6 rebuild retry more
Eric Dumazet <[email protected]>
tcp: do not overshoot window_clamp in tcp_rcv_space_adjust()
Sasha Levin <[email protected]>
Revert "Btrfs: fix scrub to repair raid6 corruption"
Finn Thain <[email protected]>
net/sonic: Use dma_mapping_error()
Josh Hill <[email protected]>
net: qmi_wwan: Add Netgear Aircard 779S
Ivan Bornyakov <[email protected]>
atm: zatm: fix memcmp casting
Julian Anastasov <[email protected]>
ipvs: fix buffer overflow with sync daemon and service
Paolo Abeni <[email protected]>
netfilter: ebtables: handle string from userspace with care
Eric Dumazet <[email protected]>
xfrm6: avoid potential infinite loop in _decode_session6()
-------------
Diffstat:
Documentation/printk-formats.txt | 3 +- Makefile | 4 +- arch/arm/include/asm/kgdb.h | 2 +- arch/m68k/mm/kmap.c | 3 +- arch/mips/bcm47xx/setup.c | 6 + arch/mips/include/asm/io.h | 2 + arch/mips/include/asm/mipsregs.h | 3 + arch/mips/kernel/mcount.S | 27 ++--- arch/powerpc/kernel/entry_64.S | 1 + arch/powerpc/kernel/fadump.c | 3 + arch/powerpc/kernel/hw_breakpoint.c | 4 +- arch/powerpc/kernel/ptrace.c | 1 + arch/x86/include/asm/barrier.h | 2 +- arch/xtensa/kernel/traps.c | 2 +- drivers/ata/libata-core.c | 3 - drivers/ata/libata-zpodd.c | 4 +- drivers/atm/zatm.c | 4 +- drivers/base/core.c | 14 ++- drivers/bluetooth/hci_qca.c | 6 + drivers/char/ipmi/ipmi_bt_sm.c | 3 +- drivers/cpufreq/cpufreq.c | 2 + drivers/cpuidle/cpuidle-powernv.c | 32 +++++- drivers/iio/buffer/kfifo_buf.c | 4 +- drivers/infiniband/hw/mlx4/mad.c | 1 - drivers/infiniband/hw/qib/qib.h | 3 +- drivers/infiniband/hw/qib/qib_file_ops.c | 10 +- drivers/infiniband/hw/qib/qib_user_pages.c | 20 ++-- drivers/input/mouse/elan_i2c.h | 2 + drivers/input/mouse/elan_i2c_core.c | 3 +- drivers/input/mouse/elan_i2c_smbus.c | 10 +- drivers/input/mouse/elantech.c | 11 +- drivers/md/dm-thin.c | 11 +- drivers/md/md.c | 4 +- drivers/media/dvb-core/dvb_frontend.c | 23 ++-- drivers/media/usb/cx231xx/cx231xx-cards.c | 3 + drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 2 +- drivers/mfd/intel-lpss.c | 4 +- drivers/mtd/chips/cfi_cmdset_0002.c | 21 ++-- drivers/mtd/ubi/build.c | 3 + drivers/mtd/ubi/wl.c | 4 +- drivers/net/bonding/bond_options.c | 1 + drivers/net/ethernet/natsemi/sonic.c | 2 +- drivers/net/usb/cdc_ncm.c | 4 +- drivers/net/usb/qmi_wwan.c | 1 + drivers/nvdimm/bus.c | 14 ++- drivers/of/unittest.c | 8 +- drivers/pci/hotplug/pciehp.h | 2 +- drivers/pci/hotplug/pciehp_core.c | 2 +- drivers/pci/hotplug/pciehp_hpc.c | 13 ++- drivers/s390/scsi/zfcp_dbf.c | 40 +++++++ drivers/s390/scsi/zfcp_erp.c | 123 ++++++++++++++++----- drivers/s390/scsi/zfcp_ext.h | 5 + drivers/s390/scsi/zfcp_scsi.c | 18 ++- drivers/scsi/qla2xxx/qla_init.c | 3 +- drivers/spi/spi.c | 10 +- drivers/tty/serial/sh-sci.c | 8 +- drivers/usb/core/hub.c | 4 +- drivers/usb/musb/musb_host.c | 5 +- drivers/usb/musb/musb_host.h | 7 +- drivers/usb/musb/musb_virthub.c | 25 +++-- drivers/video/backlight/as3711_bl.c | 33 ++++-- drivers/video/backlight/max8925_bl.c | 4 +- drivers/video/backlight/tps65217_bl.c | 4 +- drivers/video/fbdev/uvesafb.c | 3 +- drivers/w1/masters/mxc_w1.c | 20 ++-- drivers/w1/w1.c | 2 +- drivers/xen/events/events_base.c | 2 - fs/binfmt_misc.c | 12 +- fs/btrfs/inode.c | 33 +++++- fs/btrfs/ioctl.c | 12 +- fs/btrfs/scrub.c | 2 +- fs/ext4/inode.c | 36 +++--- fs/ext4/resize.c | 2 +- fs/fuse/control.c | 13 ++- fs/fuse/dir.c | 13 ++- fs/fuse/inode.c | 1 + fs/nfs/nfs4idmap.c | 5 +- fs/nfsd/nfs4xdr.c | 5 +- fs/ubifs/journal.c | 2 +- fs/udf/directory.c | 3 + include/linux/blkdev.h | 4 +- include/linux/compiler.h | 2 +- include/linux/iio/buffer.h | 6 +- include/net/bluetooth/hci_core.h | 2 +- kernel/time/time.c | 6 +- lib/vsprintf.c | 3 - net/bluetooth/hci_conn.c | 27 +++-- net/bluetooth/hci_event.c | 15 ++- net/bridge/netfilter/ebtables.c | 3 +- net/ipv4/tcp_input.c | 2 +- net/ipv4/tcp_ipv4.c | 4 + net/ipv6/tcp_ipv6.c | 4 + net/ipv6/xfrm6_policy.c | 2 +- net/netfilter/ipvs/ip_vs_ctl.c | 21 +++- net/xfrm/xfrm_policy.c | 5 + sound/pci/hda/hda_controller.c | 4 +- sound/pci/hda/patch_conexant.c | 2 + sound/pci/hda/patch_realtek.c | 1 + sound/soc/cirrus/edb93xx.c | 2 +- sound/soc/cirrus/ep93xx-i2s.c | 26 +++-- sound/soc/cirrus/snappercl15.c | 2 +- sound/soc/soc-dapm.c | 2 + tools/perf/util/dso.c | 2 + .../perf/util/intel-pt-decoder/intel-pt-decoder.c | 23 +++- .../perf/util/intel-pt-decoder/intel-pt-decoder.h | 9 ++ .../util/intel-pt-decoder/intel-pt-pkt-decoder.c | 2 +- tools/perf/util/intel-pt.c | 5 + 107 files changed, 685 insertions(+), 273 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 2/105 netfilter: ebtables: handle string from userspace with care
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit 94c752f99954797da583a84c4907ff19e92550a4 ]
strlcpy() can't be safely used on a user-space provided string, as it can try to read beyond the buffer's end, if the latter is not NULL terminated.
Leveraging the above, syzbot has been able to trigger the following splat:
BUG: KASAN: stack-out-of-bounds in strlcpy include/linux/string.h:300 [inline] BUG: KASAN: stack-out-of-bounds in compat_mtw_from_user net/bridge/netfilter/ebtables.c:1957 [inline] BUG: KASAN: stack-out-of-bounds in ebt_size_mwt net/bridge/netfilter/ebtables.c:2059 [inline] BUG: KASAN: stack-out-of-bounds in size_entry_mwt net/bridge/netfilter/ebtables.c:2155 [inline] BUG: KASAN: stack-out-of-bounds in compat_copy_entries+0x96c/0x14a0 net/bridge/netfilter/ebtables.c:2194 Write of size 33 at addr ffff8801b0abf888 by task syz-executor0/4504 CPU: 0 PID: 4504 Comm: syz-executor0 Not tainted 4.17.0-rc2+ #40 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x1b9/0x294 lib/dump_stack.c:113 print_address_description+0x6c/0x20b mm/kasan/report.c:256 kasan_report_error mm/kasan/report.c:354 [inline] kasan_report.cold.7+0x242/0x2fe mm/kasan/report.c:412 check_memory_region_inline mm/kasan/kasan.c:260 [inline] check_memory_region+0x13e/0x1b0 mm/kasan/kasan.c:267 memcpy+0x37/0x50 mm/kasan/kasan.c:303 strlcpy include/linux/string.h:300 [inline] compat_mtw_from_user net/bridge/netfilter/ebtables.c:1957 [inline] ebt_size_mwt net/bridge/netfilter/ebtables.c:2059 [inline] size_entry_mwt net/bridge/netfilter/ebtables.c:2155 [inline] compat_copy_entries+0x96c/0x14a0 net/bridge/netfilter/ebtables.c:2194 compat_do_replace+0x483/0x900 net/bridge/netfilter/ebtables.c:2285 compat_do_ebt_set_ctl+0x2ac/0x324 net/bridge/netfilter/ebtables.c:2367 compat_nf_sockopt net/netfilter/nf_sockopt.c:144 [inline] compat_nf_setsockopt+0x9b/0x140 net/netfilter/nf_sockopt.c:156 compat_ip_setsockopt+0xff/0x140 net/ipv4/ip_sockglue.c:1279 inet_csk_compat_setsockopt+0x97/0x120 net/ipv4/inet_connection_sock.c:1041 compat_tcp_setsockopt+0x49/0x80 net/ipv4/tcp.c:2901 compat_sock_common_setsockopt+0xb4/0x150 net/core/sock.c:3050 __compat_sys_setsockopt+0x1ab/0x7c0 net/compat.c:403 __do_compat_sys_setsockopt net/compat.c:416 [inline] __se_compat_sys_setsockopt net/compat.c:413 [inline] __ia32_compat_sys_setsockopt+0xbd/0x150 net/compat.c:413 do_syscall_32_irqs_on arch/x86/entry/common.c:323 [inline] do_fast_syscall_32+0x345/0xf9b arch/x86/entry/common.c:394 entry_SYSENTER_compat+0x70/0x7f arch/x86/entry/entry_64_compat.S:139 RIP: 0023:0xf7fb3cb9 RSP: 002b:00000000fff0c26c EFLAGS: 00000282 ORIG_RAX: 000000000000016e RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 0000000000000000 RDX: 0000000000000080 RSI: 0000000020000300 RDI: 00000000000005f4 RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000 The buggy address belongs to the page: page:ffffea0006c2afc0 count:0 mapcount:0 mapping:0000000000000000 index:0x0 flags: 0x2fffc0000000000() raw: 02fffc0000000000 0000000000000000 0000000000000000 00000000ffffffff raw: 0000000000000000 ffffea0006c20101 0000000000000000 0000000000000000 page dumped because: kasan: bad access detected
Fix the issue replacing the unsafe function with strscpy() and taking care of possible errors.
--- net/bridge/netfilter/ebtables.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/bridge/netfilter/ebtables.c +2 -1
@@ -1912,7 +1912,8 @@ static int compat_mtw_from_user(struct cint off, pad =0 ;unsigned int size_kern, match_size = mwt->match_size; -strlcpy (name, mwt->u.name,sizeof (name)); +if (strscpy (name, mwt->u.name,sizeof (name)) <0 ) +return -EINVAL ;if (state->buf_kern_start) dst = state->buf_kern_start + state->buf_kern_offset;
Greg Kroah-Hartman
maintainerPATCH 3/105 ipvs: fix buffer overflow with sync daemon and service
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julian Anastasov <[email protected]>
[ Upstream commit 52f96757905bbf0edef47f3ee6c7c784e7f8ff8a ]
syzkaller reports for buffer overflow for interface name when starting sync daemons [1]
What we do is that we copy user structure into larger stack buffer but later we search NUL past the stack buffer. The same happens for sched_name when adding/editing virtual server.
We are restricted by IP_VS_SCHEDNAME_MAXLEN and IP_VS_IFNAME_MAXLEN being used as size in include/uapi/linux/ip_vs.h, so they include the space for NUL.
As using strlcpy is wrong for unsafe source, replace it with strscpy and add checks to return EINVAL if source string is not NUL-terminated. The incomplete strlcpy fix comes from 2.6.13.
For the netlink interface reduce the len parameter for IPVS_DAEMON_ATTR_MCAST_IFN and IPVS_SVC_ATTR_SCHED_NAME, so that we get proper EINVAL.
[1]
kernel BUG at lib/string.c:1052!
invalid opcode: 0000 [#1] SMP KASAN
Dumping ftrace buffer:
(ftrace buffer empty)
Modules linked in: CPU: 1 PID: 373 Comm: syz-executor936 Not tainted 4.17.0-rc4+ #45 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:fortify_panic+0x13/0x20 lib/string.c:1051 RSP: 0018:ffff8801c976f800 EFLAGS: 00010282 RAX: 0000000000000022 RBX: 0000000000000040 RCX: 0000000000000000 RDX: 0000000000000022 RSI: ffffffff8160f6f1 RDI: ffffed00392edef6 RBP: ffff8801c976f800 R08: ffff8801cf4c62c0 R09: ffffed003b5e4fb0 R10: ffffed003b5e4fb0 R11: ffff8801daf27d87 R12: ffff8801c976fa20 R13: ffff8801c976fae4 R14: ffff8801c976fae0 R15: 000000000000048b FS: 00007fd99f75e700(0000) GS:ffff8801daf00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000200001c0 CR3: 00000001d6843000 CR4: 00000000001406e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: strlen include/linux/string.h:270 [inline] strlcpy include/linux/string.h:293 [inline] do_ip_vs_set_ctl+0x31c/0x1d00 net/netfilter/ipvs/ip_vs_ctl.c:2388 nf_sockopt net/netfilter/nf_sockopt.c:106 [inline] nf_setsockopt+0x7d/0xd0 net/netfilter/nf_sockopt.c:115 ip_setsockopt+0xd8/0xf0 net/ipv4/ip_sockglue.c:1253 udp_setsockopt+0x62/0xa0 net/ipv4/udp.c:2487 ipv6_setsockopt+0x149/0x170 net/ipv6/ipv6_sockglue.c:917 tcp_setsockopt+0x93/0xe0 net/ipv4/tcp.c:3057 sock_common_setsockopt+0x9a/0xe0 net/core/sock.c:3046 __sys_setsockopt+0x1bd/0x390 net/socket.c:1903 __do_sys_setsockopt net/socket.c:1914 [inline] __se_sys_setsockopt net/socket.c:1911 [inline] __x64_sys_setsockopt+0xbe/0x150 net/socket.c:1911 do_syscall_64+0x1b1/0x800 arch/x86/entry/common.c:287 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x447369 RSP: 002b:00007fd99f75dda8 EFLAGS: 00000246 ORIG_RAX: 0000000000000036 RAX: ffffffffffffffda RBX: 00000000006e39e4 RCX: 0000000000447369 RDX: 000000000000048b RSI: 0000000000000000 RDI: 0000000000000003 RBP: 0000000000000000 R08: 0000000000000018 R09: 0000000000000000 R10: 00000000200001c0 R11: 0000000000000246 R12: 00000000006e39e0 R13: 75a1ff93f0896195 R14: 6f745f3168746576 R15: 0000000000000001 Code: 08 5b 41 5c 41 5d 41 5e 41 5f 5d c3 0f 0b 48 89 df e8 d2 8f 48 fa eb de 55 48 89 fe 48 c7 c7 60 65 64 88 48 89 e5 e8 91 dd f3 f9 <0f> 0b 90 90 90 90 90 90 90 90 90 90 90 55 48 89 e5 41 57 41 56 RIP: fortify_panic+0x13/0x20 lib/string.c:1051 RSP: ffff8801c976f800
--- net/netfilter/ipvs/ip_vs_ctl.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
net/netfilter/ipvs/ip_vs_ctl.c +15 -6
@@ -2349,8 +2349,10 @@ do_ip_vs_set_ctl(struct sock *sk, int cmstruct ipvs_sync_daemon_cfg cfg;memset (&cfg,0 ,sizeof (cfg)); -strlcpy (cfg.mcast_ifn, dm->mcast_ifn, -sizeof (cfg.mcast_ifn)); + ret = -EINVAL ; +if (strscpy (cfg.mcast_ifn, dm->mcast_ifn, +sizeof (cfg.mcast_ifn)) <=0 ) + goto out_dec; cfg.syncid = dm->syncid; ret =start_sync_thread (ipvs, &cfg, dm->state); }else {
@@ -2388,12 +2390,19 @@ do_ip_vs_set_ctl(struct sock *sk, int cm } } +if ((cmd ==IP_VS_SO_SET_ADD || cmd ==IP_VS_SO_SET_EDIT ) && +strnlen (usvc.sched_name,IP_VS_SCHEDNAME_MAXLEN ) == +IP_VS_SCHEDNAME_MAXLEN ) { + ret = -EINVAL ; + goto out_unlock; + } +/* Check for valid protocol: TCP or UDP or SCTP, even for fwmark!=0 */ if (usvc.protocol !=IPPROTO_TCP && usvc.protocol !=IPPROTO_UDP && usvc.protocol !=IPPROTO_SCTP ) { -pr_err ("set_ctl: invalid protocol: %d %pI4:%d %s\n" , +pr_err ("set_ctl: invalid protocol: %d %pI4:%d\n" , usvc.protocol, &usvc.addr.ip, -ntohs (usvc.port), usvc.sched_name); +ntohs (usvc.port)); ret = -EFAULT ; goto out_unlock; }
@@ -2822,7 +2831,7 @@ static const struct nla_policy ip_vs_cmdstatic const struct nla_policy ip_vs_daemon_policy[IPVS_DAEMON_ATTR_MAX +1 ] = { [IPVS_DAEMON_ATTR_STATE ] = { .type =NLA_U32 }, [IPVS_DAEMON_ATTR_MCAST_IFN ] = { .type =NLA_NUL_STRING , - .len =IP_VS_IFNAME_MAXLEN }, + .len =IP_VS_IFNAME_MAXLEN -1 }, [IPVS_DAEMON_ATTR_SYNC_ID ] = { .type =NLA_U32 }, [IPVS_DAEMON_ATTR_SYNC_MAXLEN ] = { .type =NLA_U16 }, [IPVS_DAEMON_ATTR_MCAST_GROUP ] = { .type =NLA_U32 },
@@ -2840,7 +2849,7 @@ static const struct nla_policy ip_vs_svc [IPVS_SVC_ATTR_PORT] = { .type = NLA_U16 }, [IPVS_SVC_ATTR_FWMARK] = { .type = NLA_U32 }, [IPVS_SVC_ATTR_SCHED_NAME] = { .type = NLA_NUL_STRING, - .len = IP_VS_SCHEDNAME_MAXLEN }, + .len = IP_VS_SCHEDNAME_MAXLEN - 1 }, [IPVS_SVC_ATTR_PE_NAME] = { .type = NLA_NUL_STRING, .len = IP_VS_PENAME_MAXLEN }, [IPVS_SVC_ATTR_FLAGS] = { .type = NLA_BINARY,
Greg Kroah-Hartman
maintainerPATCH 4/105 atm: zatm: fix memcmp casting
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Bornyakov <[email protected]>
[ Upstream commit f9c6442a8f0b1dde9e755eb4ff6fa22bcce4eabc ]
memcmp() returns int, but eprom_try_esi() cast it to unsigned char. One can lose significant bits and get 0 from non-0 value returned by the memcmp().
--- drivers/atm/zatm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/atm/zatm.c +2 -2
@@ -1149,8 +1149,8 @@ static void eprom_get_byte(struct zatm_d } -static unsigned char eprom_try_esi (struct atm_dev *dev,unsigned short cmd, -int offset,int swap) +static int eprom_try_esi (struct atm_dev *dev,unsigned short cmd,int offset, +int swap) {unsigned char buf[ZEPROM_SIZE ];struct zatm_dev *zatm_dev;
Greg Kroah-Hartman
maintainerPATCH 6/105 net/sonic: Use dma_mapping_error()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Finn Thain <[email protected]>
[ Upstream commit 26de0b76d9ba3200f09c6cb9d9618bda338be5f7 ]
With CONFIG_DMA_API_DEBUG=y, calling sonic_open() produces the message, "DMA-API: device driver failed to check map error". Add the missing dma_mapping_error() call.
--- drivers/net/ethernet/natsemi/sonic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/natsemi/sonic.c +1 -1
@@ -71,7 +71,7 @@ static int sonic_open(struct net_devicefor (i =0 ; i <SONIC_NUM_RRS ; i++) {dma_addr_t laddr =dma_map_single (lp->device,skb_put (lp->rx_skb[i],SONIC_RBSIZE ),SONIC_RBSIZE ,DMA_FROM_DEVICE ); -if (!laddr) { +if (dma_mapping_error (lp->device, laddr)) {while (i >0 ) {/* free any that were mapped successfully */ i--;dma_unmap_single (lp->device, lp->rx_laddr[i],SONIC_RBSIZE ,DMA_FROM_DEVICE );
Greg Kroah-Hartman
maintainerPATCH 7/105 Revert "Btrfs: fix scrub to repair raid6 corruption"
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sasha Levin <[email protected]>
This reverts commit 95b286daf7ba784191023ad110122703eb2ebabc.
This commit used an incorrect log message.
--- fs/btrfs/raid56.c | 18 ++++-------------- fs/btrfs/volumes.c | 9 +-------- 2 files changed, 5 insertions(+), 22 deletions(-)
fs/btrfs/raid56.c +4 -14
@@ -2160,21 +2160,11 @@ int raid56_parity_recover(struct btrfs_r }/* -* Loop retry: -* for 'mirror == 2', reconstruct from all other stripes. -* for 'mirror_num > 2', select a stripe to fail on every retry. +* reconstruct from the q stripe if they are +* asking for mirror 3 */ -if (mirror_num >2 ) { -/* -* 'mirror == 3' is to fail the p stripe and -* reconstruct from the q stripe. 'mirror > 3' is to -* fail a data stripe and reconstruct from p+q stripe. -*/ - rbio->failb = rbio->real_stripes - (mirror_num -1 ); -ASSERT (rbio->failb >0 ); -if (rbio->failb <= rbio->faila) - rbio->failb--; - } +if (mirror_num ==3 ) + rbio->failb = rbio->real_stripes -2 ; ret =lock_stripe_add (rbio);
fs/btrfs/volumes.c +1 -8
@@ -5056,14 +5056,7 @@ int btrfs_num_copies(struct btrfs_fs_infelse if (map->type &BTRFS_BLOCK_GROUP_RAID5 ) ret =2 ;else if (map->type &BTRFS_BLOCK_GROUP_RAID6 ) -/* -* There could be two corrupted data stripes, we need -* to loop retry in order to rebuild the correct data. -* -* Fail a stripe at a time on every retry except the -* stripe under reconstruction. -*/ - ret = map->num_stripes; + ret =3 ;else ret =1 ;free_extent_map (em);
Greg Kroah-Hartman
maintainerPATCH 8/105 tcp: do not overshoot window_clamp in tcp_rcv_space_adjust()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
commit 02db55718d53f9d426cee504c27fb768e9ed4ffe upstream.
While rcvbuf is properly clamped by tcp_rmem[2], rcvwin is left to a potentially too big value.
It has no serious effect, since :
1) tcp_grow_window() has very strict checks.
2) window_clamp can be mangled by user space to any value anyway.
tcp_init_buffer_space() and companions use tcp_full_space(), we use tcp_win_from_space() to avoid reloading sk->sk_rcvbuf
--- net/ipv4/tcp_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_input.c +1 -1
@@ -612,7 +612,7 @@ void tcp_rcv_space_adjust(struct sock *s sk->sk_rcvbuf = rcvbuf;/* Make the window clamp follow along. */ - tp->window_clamp = rcvwin; + tp->window_clamp =tcp_win_from_space (rcvbuf); } } tp->rcvq_space.space = copied;
Greg Kroah-Hartman
maintainerPATCH 9/105 Btrfs: make raid6 rebuild retry more
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Bo <[email protected]>
[ Upstream commit 8810f7517a3bc4ca2d41d022446d3f5fd6b77c09 ]
There is a scenario that can end up with rebuild process failing to return good content, i.e.
suppose that all disks can be read without problems and if the content that was read out doesn't match its checksum, currently for raid6 btrfs at most retries twice,
- the 1st retry is to rebuild with all other stripes, it'll eventually be a raid5 xor rebuild,
- if the 1st fails, the 2nd retry will deliberately fail parity p so that it will do raid6 style rebuild,
however, the chances are that another non-parity stripe content also has something corrupted, so that the above retries are not able to return correct content, and users will think of this as data loss. More seriouly, if the loss happens on some important internal btree roots, it could refuse to mount.
This extends btrfs to do more retries and each retry fails only one stripe. Since raid6 can tolerate 2 disk failures, if there is one more failure besides the failure on which we're recovering, this can always work.
The worst case is to retry as many times as the number of raid6 disks, but given the fact that such a scenario is really rare in practice, it's still acceptable.
--- fs/btrfs/raid56.c | 18 ++++++++++++++---- fs/btrfs/volumes.c | 9 ++++++++- 2 files changed, 22 insertions(+), 5 deletions(-)
fs/btrfs/raid56.c +14 -4
@@ -2160,11 +2160,21 @@ int raid56_parity_recover(struct btrfs_r }/* -* reconstruct from the q stripe if they are -* asking for mirror 3 +* Loop retry: +* for 'mirror == 2', reconstruct from all other stripes. +* for 'mirror_num > 2', select a stripe to fail on every retry. */ -if (mirror_num ==3 ) - rbio->failb = rbio->real_stripes -2 ; +if (mirror_num >2 ) { +/* +* 'mirror == 3' is to fail the p stripe and +* reconstruct from the q stripe. 'mirror > 3' is to +* fail a data stripe and reconstruct from p+q stripe. +*/ + rbio->failb = rbio->real_stripes - (mirror_num -1 ); +ASSERT (rbio->failb >0 ); +if (rbio->failb <= rbio->faila) + rbio->failb--; + } ret =lock_stripe_add (rbio);
fs/btrfs/volumes.c +8 -1
@@ -5056,7 +5056,14 @@ int btrfs_num_copies(struct btrfs_fs_infelse if (map->type &BTRFS_BLOCK_GROUP_RAID5 ) ret =2 ;else if (map->type &BTRFS_BLOCK_GROUP_RAID6 ) - ret =3 ; +/* +* There could be two corrupted data stripes, we need +* to loop retry in order to rebuild the correct data. +* +* Fail a stripe at a time on every retry except the +* stripe under reconstruction. +*/ + ret = map->num_stripes;else ret =1 ;free_extent_map (em);
Greg Kroah-Hartman
maintainerPATCH 11/105 bonding: re-evaluate force_primary when the primary slave name changes
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiangning Yu <[email protected]>
[ Upstream commit eb55bbf865d9979098c6a7a17cbdb41237ece951 ]
There is a timing issue under active-standy mode, when bond_enslave() is called, bond->params.primary might not be initialized yet.
Any time the primary slave string changes, bond->force_primary should be set to true to make sure the primary becomes the active slave.
--- drivers/net/bonding/bond_options.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/bonding/bond_options.c +1 -0
@@ -1115,6 +1115,7 @@ static int bond_option_primary_set(struc slave->dev->name);rcu_assign_pointer (bond->primary_slave, slave);strcpy (bond->params.primary, slave->dev->name); + bond->force_primary = true;bond_select_active_slave (bond); goto out; }
Greg Kroah-Hartman
maintainerPATCH 12/105 tcp: verify the checksum of the first data segment in a new connection
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frank van der Linden <[email protected]>
[ Upstream commit 4fd44a98ffe0d048246efef67ed640fdf2098a62 ]
commit 079096f103fa ("tcp/dccp: install syn_recv requests into ehash table") introduced an optimization for the handling of child sockets created for a new TCP connection.
But this optimization passes any data associated with the last ACK of the connection handshake up the stack without verifying its checksum, because it calls tcp_child_process(), which in turn calls tcp_rcv_state_process() directly. These lower-level processing functions do not do any checksum verification.
Insert a tcp_checksum_complete call in the TCP_NEW_SYN_RECEIVE path to fix this.
--- net/ipv4/tcp_ipv4.c | 4 ++++ net/ipv6/tcp_ipv6.c | 4 ++++ 2 files changed, 8 insertions(+)
net/ipv4/tcp_ipv4.c +4 -0
@@ -1627,6 +1627,10 @@ process:reqsk_put (req); goto discard_it; } +if (tcp_checksum_complete (skb)) { +reqsk_put (req); + goto csum_error; + }if (unlikely (sk->sk_state !=TCP_LISTEN )) {inet_csk_reqsk_queue_drop_and_put (sk, req); goto lookup;
net/ipv6/tcp_ipv6.c +4 -0
@@ -1415,6 +1415,10 @@ process:reqsk_put (req); goto discard_it; } +if (tcp_checksum_complete (skb)) { +reqsk_put (req); + goto csum_error; + }if (unlikely (sk->sk_state !=TCP_LISTEN )) {inet_csk_reqsk_queue_drop_and_put (sk, req); goto lookup;
Greg Kroah-Hartman
maintainerPATCH 13/105 ext4: update mtime in ext4_punch_hole even if no blocks are released
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukas Czerner <[email protected]>
commit eee597ac931305eff3d3fd1d61d6aae553bc0984 upstream.
Currently in ext4_punch_hole we're going to skip the mtime update if there are no actual blocks to release. However we've actually modified the file by zeroing the partial block so the mtime should be updated.
Moreover the sync and datasync handling is skipped as well, which is also wrong. Fix it.
--- fs/ext4/inode.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
fs/ext4/inode.c +20 -20
@@ -3787,28 +3787,28 @@ int ext4_punch_hole(struct inode *inode,EXT4_BLOCK_SIZE_BITS (sb); stop_block = (offset + length) >>EXT4_BLOCK_SIZE_BITS (sb); -/* If there are no blocks to remove, return now */ -if (first_block >= stop_block) - goto out_stop; - -down_write (&EXT4_I (inode)->i_data_sem); -ext4_discard_preallocations (inode); - - ret =ext4_es_remove_extent (inode, first_block, - stop_block - first_block); -if (ret) { -up_write (&EXT4_I (inode)->i_data_sem); - goto out_stop; - } +/* If there are blocks to remove, do it */ +if (stop_block > first_block) { + +down_write (&EXT4_I (inode)->i_data_sem); +ext4_discard_preallocations (inode); -if (ext4_test_inode_flag (inode,EXT4_INODE_EXTENTS )) - ret =ext4_ext_remove_space (inode, first_block, - stop_block -1 ); -else - ret =ext4_ind_remove_space (handle, inode, first_block, - stop_block); + ret =ext4_es_remove_extent (inode, first_block, + stop_block - first_block); +if (ret) { +up_write (&EXT4_I (inode)->i_data_sem); + goto out_stop; + } + +if (ext4_test_inode_flag (inode,EXT4_INODE_EXTENTS )) + ret =ext4_ext_remove_space (inode, first_block, + stop_block -1 ); +else + ret =ext4_ind_remove_space (handle, inode, first_block, + stop_block); -up_write (&EXT4_I (inode)->i_data_sem); +up_write (&EXT4_I (inode)->i_data_sem); + }if (IS_SYNC (inode))ext4_handle_sync (handle);
Greg Kroah-Hartman
maintainerPATCH 14/105 ext4: fix fencepost error in check for inode count overflow during resize
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit 4f2f76f751433908364ccff82f437a57d0e6e9b7 upstream.
ext4_resize_fs() has an off-by-one bug when checking whether growing of a filesystem will not overflow inode count. As a result it allows a filesystem with 8192 inodes per group to grow to 64TB which overflows inode count to 0 and makes filesystem unusable. Fix it.
--- fs/ext4/resize.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ext4/resize.c +1 -1
@@ -1903,7 +1903,7 @@ retry:return 0 ; n_group =ext4_get_group_number (sb, n_blocks_count -1 ); -if (n_group > (0xFFFFFFFFUL /EXT4_INODES_PER_GROUP (sb))) { +if (n_group >= (0xFFFFFFFFUL /EXT4_INODES_PER_GROUP (sb))) {ext4_warning (sb,"resize would cause inodes_count overflow" );return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 15/105 driver core: Dont ignore class_dir_create_and_add() failure.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit 84d0c27d6233a9ba0578b20f5a09701eb66cee42 upstream.
syzbot is hitting WARN() at kernfs_add_one() [1].
This is because kernfs_create_link() is confused by previous device_add() call which continued without setting dev->kobj.parent field when get_device_parent() failed by memory allocation fault injection. Fix this by propagating the error from class_dir_create_and_add() to the calllers of get_device_parent().
[1] https://syzkaller.appspot.com/bug?id=fae0fb607989ea744526d1c082a5b8de6529116f
--- drivers/base/core.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/base/core.c +12 -2
@@ -759,7 +759,7 @@ class_dir_create_and_add(struct class *c dir =kzalloc (sizeof (*dir),GFP_KERNEL );if (!dir) -return NULL ; +return ERR_PTR (-ENOMEM ); dir->class = class;kobject_init (&dir->kobj, &class_dir_ktype);
@@ -769,7 +769,7 @@ class_dir_create_and_add(struct class *c retval =kobject_add (&dir->kobj, parent_kobj,"%s" , class->name);if (retval <0 ) {kobject_put (&dir->kobj); -return NULL ; +return ERR_PTR (retval); }return &dir->kobj; }
@@ -1076,6 +1076,10 @@ int device_add(struct device *dev) parent =get_device (dev->parent); kobj =get_device_parent (dev, parent); +if (IS_ERR (kobj)) { + error =PTR_ERR (kobj); + goto parent_error; + }if (kobj) dev->kobj.parent = kobj;
@@ -1174,6 +1178,7 @@ done:kobject_del (&dev->kobj); Error:cleanup_glue_dir (dev, glue_dir); +parent_error:put_device (parent); name_error:kfree (dev->p);
@@ -1990,6 +1995,11 @@ int device_move(struct device *dev, strudevice_pm_lock (); new_parent =get_device (new_parent); new_parent_kobj =get_device_parent (dev, new_parent); +if (IS_ERR (new_parent_kobj)) { + error =PTR_ERR (new_parent_kobj); +put_device (new_parent); + goto out; + }pr_debug ("device: '%s': %s: moving to '%s'\n" ,dev_name (dev), __func__, new_parent ?dev_name (new_parent) :"<NULL>" );
Greg Kroah-Hartman
maintainerPATCH 16/105 btrfs: scrub: Dont use inode pages for device replace
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qu Wenruo <[email protected]>
commit ac0b4145d662a3b9e34085dea460fb06ede9b69b upstream.
[BUG]
Btrfs can create compressed extent without checksum (even though it shouldn't), and if we then try to replace device containing such extent, the result device will contain all the uncompressed data instead of the compressed one.
Test case already submitted to fstests:
https://patchwork.kernel.org/patch/10442353/
[CAUSE]
When handling compressed extent without checksum, device replace will goe into copy_nocow_pages() function.
In that function, btrfs will get all inodes referring to this data extents and then use find_or_create_page() to get pages direct from that inode.
The problem here is, pages directly from inode are always uncompressed. And for compressed data extent, they mismatch with on-disk data. Thus this leads to corrupted compressed data extent written to replace device.
[FIX]
In this attempt, we could just remove the "optimization" branch, and let unified scrub_pages() to handle it.
Although scrub_pages() won't bother reusing page cache, it will be a little slower, but it does the correct csum checking and won't cause such data corruption caused by "optimization".
Note about the fix: this is the minimal fix that can be backported to older stable trees without conflicts. The whole callchain from copy_nocow_pages() can be deleted, and will be in followup patches.
--- fs/btrfs/scrub.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/btrfs/scrub.c +1 -1
@@ -2513,7 +2513,7 @@ static int scrub_extent(struct scrub_ctx have_csum =scrub_find_csum (sctx, logical, csum);if (have_csum ==0 ) ++sctx->stat.no_csum; -if (sctx->is_dev_replace && !have_csum) { +if (0 && sctx->is_dev_replace && !have_csum) { ret =copy_nocow_pages (sctx, logical, l, mirror_num, physical_for_dev_replace);
Greg Kroah-Hartman
maintainerPATCH 17/105 ALSA: hda - Handle kzalloc() failure in snd_hda_attach_pcm_stream()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bo Chen <[email protected]>
commit a3aa60d511746bd6c0d0366d4eb90a7998bcde8b upstream.
When 'kzalloc()' fails in 'snd_hda_attach_pcm_stream()', a new pcm instance is created without setting its operators via 'snd_pcm_set_ops()'. Following operations on the new pcm instance can trigger kernel null pointer dereferences and cause kernel oops.
This bug was found with my work on building a gray-box fault-injection tool for linux-kernel-module binaries. A kernel null pointer dereference was confirmed from line 'substream->ops->open()' in function 'snd_pcm_open_substream()' in file 'sound/core/pcm_native.c'.
This patch fixes the bug by calling 'snd_device_free()' in the error handling path of 'kzalloc()', which removes the new pcm instance from the snd card before returns with an error code.
--- sound/pci/hda/hda_controller.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
sound/pci/hda/hda_controller.c +3 -1
@@ -547,8 +547,10 @@ int snd_hda_attach_pcm_stream(struct hdareturn err;strlcpy (pcm->name, cpcm->name,sizeof (pcm->name)); apcm =kzalloc (sizeof (*apcm),GFP_KERNEL ); -if (apcm ==NULL ) +if (apcm ==NULL ) { +snd_device_free (chip->card, pcm);return -ENOMEM ; + } apcm->chip = chip; apcm->pcm = pcm; apcm->codec = codec;
Greg Kroah-Hartman
maintainerPATCH 18/105 ALSA: hda: add dock and led support for HP EliteBook 830 G5
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Wassenberg <[email protected]>
commit 2861751f67b91e1d24e68010ced96614fb3140f4 upstream.
This patch adds missing initialisation for HP 2013 UltraSlim Dock Line-In/Out PINs and activates keyboard mute/micmute leds for HP EliteBook 830 G5
--- sound/pci/hda/patch_conexant.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_conexant.c +1 -0
@@ -851,6 +851,7 @@ static const struct snd_pci_quirk cxt506SND_PCI_QUIRK (0x103c ,0x8079 ,"HP EliteBook 840 G3" ,CXT_FIXUP_HP_DOCK ),SND_PCI_QUIRK (0x103c ,0x807C ,"HP EliteBook 820 G3" ,CXT_FIXUP_HP_DOCK ),SND_PCI_QUIRK (0x103c ,0x80FD ,"HP ProBook 640 G2" ,CXT_FIXUP_HP_DOCK ), +SND_PCI_QUIRK (0x103c ,0x83b3 ,"HP EliteBook 830 G5" ,CXT_FIXUP_HP_DOCK ),SND_PCI_QUIRK (0x103c ,0x8174 ,"HP Spectre x360" ,CXT_FIXUP_HP_SPECTRE ),SND_PCI_QUIRK (0x103c ,0x8115 ,"HP Z1 Gen3" ,CXT_FIXUP_HP_GATE_MIC ), SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
Greg Kroah-Hartman
maintainerPATCH 19/105 ALSA: hda: add dock and led support for HP ProBook 640 G4
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dennis Wassenberg <[email protected]>
commit 7eef32c1ef895a3a96463f9cbd04203007cd5555 upstream.
This patch adds missing initialisation for HP 2013 UltraSlim Dock Line-In/Out PINs and activates keyboard mute/micmute leds for HP ProBook 640 G4
--- sound/pci/hda/patch_conexant.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_conexant.c +1 -0
@@ -852,6 +852,7 @@ static const struct snd_pci_quirk cxt506SND_PCI_QUIRK (0x103c ,0x807C ,"HP EliteBook 820 G3" ,CXT_FIXUP_HP_DOCK ),SND_PCI_QUIRK (0x103c ,0x80FD ,"HP ProBook 640 G2" ,CXT_FIXUP_HP_DOCK ),SND_PCI_QUIRK (0x103c ,0x83b3 ,"HP EliteBook 830 G5" ,CXT_FIXUP_HP_DOCK ), +SND_PCI_QUIRK (0x103c ,0x83d3 ,"HP ProBook 640 G4" ,CXT_FIXUP_HP_DOCK ),SND_PCI_QUIRK (0x103c ,0x8174 ,"HP Spectre x360" ,CXT_FIXUP_HP_SPECTRE ),SND_PCI_QUIRK (0x103c ,0x8115 ,"HP Z1 Gen3" ,CXT_FIXUP_HP_GATE_MIC ), SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
Greg Kroah-Hartman
maintainerPATCH 20/105 cpufreq: Fix new policy initialization during limits updates via sysfs
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tao Wang <[email protected]>
commit c7d1f119c48f64bebf0fa1e326af577c6152fe30 upstream.
If the policy limits are updated via cpufreq_update_policy() and subsequently via sysfs, the limits stored in user_policy may be set incorrectly.
For example, if both min and max are set via sysfs to the maximum available frequency, user_policy.min and user_policy.max will also be the maximum. If a policy notifier triggered by cpufreq_update_policy() lowers both the min and the max at this point, that change is not reflected by the user_policy limits, so if the max is updated again via sysfs to the same lower value, then user_policy.max will be lower than user_policy.min which shouldn't happen. In particular, if one of the policy CPUs is then taken offline and back online, cpufreq_set_policy() will fail for it due to a failing limits check.
To prevent that from happening, initialize the min and max fields of the new_policy object to the ones stored in user_policy that were previously set via sysfs.
--- drivers/cpufreq/cpufreq.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/cpufreq/cpufreq.c +2 -0
@@ -603,6 +603,8 @@ static ssize_t store_##file_name \struct cpufreq_policy new_policy; \ \memcpy (&new_policy, policy,sizeof (*policy)); \ + new_policy.min = policy->user_policy.min; \ + new_policy.max = policy->user_policy.max; \ \ ret =sscanf (buf,"%u" , &new_policy.object); \if (ret !=1 ) \
Greg Kroah-Hartman
maintainerPATCH 21/105 libata: zpodd: make arrays cdb static, reduces object code size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
commit 795ef788145ed2fa023efdf11e8d5d7bedc21462 upstream.
Don't populate the arrays cdb on the stack, instead make them static. Makes the object code smaller by 230 bytes:
Before:
text data bss dec hex filename
3797 240 0 4037 fc5 drivers/ata/libata-zpodd.o
After:
text data bss dec hex filename
3407 400 0 3807 edf drivers/ata/libata-zpodd.o
--- drivers/ata/libata-zpodd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/ata/libata-zpodd.c +2 -2
@@ -34,7 +34,7 @@ struct zpodd {static int eject_tray (struct ata_device *dev) {struct ata_taskfile tf; -const char cdb[] = {GPCMD_START_STOP_UNIT , +static const char cdb[] = {GPCMD_START_STOP_UNIT ,0 ,0 ,0 ,0x02 ,/* LoEj */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,
@@ -55,7 +55,7 @@ static enum odd_mech_type zpodd_get_mechunsigned int ret;struct rm_feature_desc *desc = (void *)(buf +8 );struct ata_taskfile tf; -char cdb[] = {GPCMD_GET_CONFIGURATION , +static const char cdb[] = {GPCMD_GET_CONFIGURATION ,2 ,/* only 1 feature descriptor requested */ 0 ,3 ,/* 3, removable medium feature */ 0 ,0 ,0 ,/* reserved */
Greg Kroah-Hartman
maintainerPATCH 22/105 libata: zpodd: small read overflow in eject_tray()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 18c9a99bce2a57dfd7e881658703b5d7469cc7b9 upstream.
We read from the cdb[] buffer in ata_exec_internal_sg(). It has to be ATAPI_CDB_LEN (16) bytes long, but this buffer is only 12 bytes.
--- drivers/ata/libata-zpodd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ata/libata-zpodd.c +1 -1
@@ -34,7 +34,7 @@ struct zpodd {static int eject_tray (struct ata_device *dev) {struct ata_taskfile tf; -static const char cdb[] = {GPCMD_START_STOP_UNIT , +static const char cdb[ATAPI_CDB_LEN ] = {GPCMD_START_STOP_UNIT ,0 ,0 ,0 ,0x02 ,/* LoEj */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,
Re: [PATCH 4.4 022/105] libata: zpodd: small read overflow in eject_tray()
Quoted 10 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit
18c9a99bce2a57dfd7e881658703b5d7469cc7b9upstream.We read from the cdb[] buffer in ata_exec_internal_sg(). It has to be
ATAPI_CDB_LEN(16) bytes long, but this buffer is only 12 bytes.
zpodd_get_mech_type() appears to have the same problem.
Ben.
Quoted 5 lines
Fixes 213342053db5 ("libata: handle power transition of ODD")Signed-off-by Dan Carpenter <[email protected]>Signed-off-by Tejun Heo <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
[...]
Signature · 3 lines
Ben Hutchings, Software Developer Codethink Ltd
https://www.codethink.co.uk/ Dale House, 35 Dale Street
Manchester, M1 2HF, United KingdomGreg Kroah-Hartman
maintainerPATCH 23/105 libata: Drop SanDisk SD7UB3Q*G1001 NOLPM quirk
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
commit 2cfce3a86b64b53f0a70e92a6a659c720c319b45 upstream.
Commit 184add2ca23c ("libata: Apply NOLPM quirk for SanDisk SD7UB3Q*G1001 SSDs") disabled LPM for SanDisk SD7UB3Q*G1001 SSDs.
This has lead to several reports of users of that SSD where LPM was working fine and who know have a significantly increased idle power consumption on their laptops.
Likely there is another problem on the T450s from the original reporter which gets exposed by the uncore reaching deeper sleep states (higher PC-states) due to LPM being enabled. The problem as reported, a hardfreeze about once a day, already did not sound like it would be caused by LPM and the reports of the SSD working fine confirm this. The original reporter is ok with dropping the quirk.
A X250 user has reported the same hard freeze problem and for him the problem went away after unrelated updates, I suspect some GPU driver stack changes fixed things.
TL;DR: The original reporters problem were triggered by LPM but not an LPM issue, so drop the quirk for the SSD in question.
--- drivers/ata/libata-core.c | 3 --- 1 file changed, 3 deletions(-)
drivers/ata/libata-core.c +0 -3
@@ -4247,9 +4247,6 @@ static const struct ata_blacklist_entry ATA_HORKAGE_ZERO_AFTER_TRIM | ATA_HORKAGE_NOLPM, }, -/* Sandisk devices which are known to not handle LPM well */ - { "SanDisk SD7UB3Q*G1001", NULL, ATA_HORKAGE_NOLPM, }, -/* devices that don't properly handle queued TRIM commands */ {"Micron_M500IT_*" ,"MU01" ,ATA_HORKAGE_NO_NCQ_TRIM | ATA_HORKAGE_ZERO_AFTER_TRIM, },
Greg Kroah-Hartman
maintainerPATCH 24/105 w1: mxc_w1: Enable clock before calling clk_get_rate() on it
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan Potyra <[email protected]>
commit 955bc61328dc0a297fb3baccd84e9d3aee501ed8 upstream.
According to the API, you may only call clk_get_rate() after actually enabling it.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/w1/masters/mxc_w1.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
drivers/w1/masters/mxc_w1.c +13 -7
@@ -113,6 +113,10 @@ static int mxc_w1_probe(struct platform_if (IS_ERR (mdev->clk))return PTR_ERR (mdev->clk); + err =clk_prepare_enable (mdev->clk); +if (err) +return err; + clkrate =clk_get_rate (mdev->clk);if (clkrate <10000000 ) dev_warn(&pdev->dev,
@@ -126,12 +130,10 @@ static int mxc_w1_probe(struct platform_ res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); mdev->regs =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (mdev->regs)) -return PTR_ERR (mdev->regs); - - err =clk_prepare_enable (mdev->clk); -if (err) -return err; +if (IS_ERR (mdev->regs)) { + err =PTR_ERR (mdev->regs); + goto out_disable_clk; + }/* Software reset 1-Wire module */ writeb (MXC_W1_RESET_RST , mdev->regs +MXC_W1_RESET );
@@ -147,8 +149,12 @@ static int mxc_w1_probe(struct platform_ err =w1_add_master_device (&mdev->bus_master);if (err) -clk_disable_unprepare (mdev->clk); + goto out_disable_clk; + +return 0 ; +out_disable_clk: +clk_disable_unprepare (mdev->clk);return err; }
Greg Kroah-Hartman
maintainerPATCH 25/105 fs/binfmt_misc.c: do not allow offset overflow
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thadeu Lima de Souza Cascardo <[email protected]>
commit 5cc41e099504b77014358b58567c5ea6293dd220 upstream.
WHen registering a new binfmt_misc handler, it is possible to overflow the offset to get a negative value, which might crash the system, or possibly leak kernel data.
Here is a crash log when 2500000000 was used as an offset:
BUG: unable to handle kernel paging request at ffff989cfd6edca0
IP: load_misc_binary+0x22b/0x470 [binfmt_misc]
PGD 1ef3e067 P4D 1ef3e067 PUD 0
Oops: 0000 [#1] SMP NOPTI
Modules linked in: binfmt_misc kvm_intel ppdev kvm irqbypass joydev input_leds serio_raw mac_hid parport_pc qemu_fw_cfg parpy
CPU: 0 PID: 2499 Comm: bash Not tainted 4.15.0-22-generic #24-Ubuntu
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.1-1 04/01/2014
RIP: 0010:load_misc_binary+0x22b/0x470 [binfmt_misc]
Call Trace:
search_binary_handler+0x97/0x1d0
do_execveat_common.isra.34+0x667/0x810
SyS_execve+0x31/0x40
do_syscall_64+0x73/0x130
entry_SYSCALL_64_after_hwframe+0x3d/0xa2Use kstrtoint instead of simple_strtoul. It will work as the code already set the delimiter byte to '\0' and we only do it when the field is not empty.
Tested with offsets -1, 2500000000, UINT_MAX and INT_MAX. Also tested with examples documented at Documentation/admin-guide/binfmt-misc.rst and other registrations from packages on Ubuntu.
--- fs/binfmt_misc.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
fs/binfmt_misc.c +9 -3
@@ -369,8 +369,13 @@ static Node *create_entry(const char __u s =strchr (p, del);if (!s) goto einval; - *s++ ='\0' ; - e->offset =simple_strtoul (p, &p,10 ); + *s ='\0' ; +if (p != s) { +int r =kstrtoint (p,10 , &e->offset); +if (r !=0 || e->offset <0 ) + goto einval; + } + p = s;if (*p++) goto einval;pr_debug ("register: offset: %#x\n" , e->offset);
@@ -410,7 +415,8 @@ static Node *create_entry(const char __uif (e->mask &&string_unescape_inplace (e->mask,UNESCAPE_HEX ) != e->size) goto einval; -if (e->size + e->offset >BINPRM_BUF_SIZE ) +if (e->size >BINPRM_BUF_SIZE || +BINPRM_BUF_SIZE - e->size < e->offset) goto einval;pr_debug ("register: magic/mask length: %i\n" , e->size);if (USE_DEBUG ) {
Greg Kroah-Hartman
maintainerPATCH 26/105 x86/spectre_v1: Disable compiler optimizations over array_index_mask_nospec()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit eab6870fee877258122a042bfd99ee7908c40280 upstream.
Mark Rutland noticed that GCC optimization passes have the potential to elide necessary invocations of the array_index_mask_nospec() instruction sequence, so mark the asm() volatile.
Mark explains:
"The volatile will inhibit *some* cases where the compiler could lift the
array_index_nospec() call out of a branch, e.g. where there are multiple invocations of array_index_nospec() with the same arguments:
if (idx < foo) {
idx1 = array_idx_nospec(idx, foo)
do_something(idx1);
}
< some other code >
if (idx < foo) {
idx2 = array_idx_nospec(idx, foo);
do_something_else(idx2);
}... since the compiler can determine that the two invocations yield the same result, and reuse the first result (likely the same register as idx was in originally) for the second branch, effectively re-writing the above as:
if (idx < foo) {
idx = array_idx_nospec(idx, foo);
do_something(idx);
}
< some other code >
if (idx < foo) {
do_something_else(idx);
}... if we don't take the first branch, then speculatively take the second, we lose the nospec protection.
There's more info on volatile asm in the GCC docs:
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Volatile
"
--- arch/x86/include/asm/barrier.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/barrier.h +1 -1
@@ -38,7 +38,7 @@ static inline unsigned long array_index_ {unsigned long mask; - asm ("cmp %1,%2; sbb %0,%0;" + asmvolatile ("cmp %1,%2; sbb %0,%0;" :"=r" (mask) :"r" (size),"r" (index) :"cc" );
Greg Kroah-Hartman
maintainerPATCH 27/105 m68k/mm: Adjust VM area to be unmapped by gap size for __iounmap()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Schmitz <[email protected]>
commit 3f90f9ef2dda316d64e420d5d51ba369587ccc55 upstream.
If 020/030 support is enabled, get_io_area() leaves an IO_SIZE gap between mappings which is added to the vm_struct representing the mapping. __ioremap() uses the actual requested size (after alignment), while __iounmap() is passed the size from the vm_struct.
On 020/030, early termination descriptors are used to set up mappings of extent 'size', which are validated on unmapping. The unmapped gap of size IO_SIZE defeats the sanity check of the pmd tables, causing __iounmap() to loop forever on 030.
On 040/060, unmapping of page table entries does not check for a valid mapping, so the umapping loop always completes there.
Adjust size to be unmapped by the gap that had been added in the vm_struct prior.
This fixes the hang in atari_platform_init() reported a long time ago, and a similar one reported by Finn recently (addressed by removing ioremap() use from the SWIM driver.
Tested on my Falcon in 030 mode - untested but should work the same on 040/060 (the extra page tables cleared there would never have been set up anyway).
--- arch/m68k/mm/kmap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/m68k/mm/kmap.c +2 -1
@@ -88,7 +88,8 @@ static inline void free_io_area(void *adfor (p = &iolist ; (tmp = *p) ; p = &tmp->next) {if (tmp->addr == addr) { *p = tmp->next; -__iounmap (tmp->addr, tmp->size); +/* remove gap added in get_io_area() */ +__iounmap (tmp->addr, tmp->size -IO_SIZE );kfree (tmp);return ; }
Greg Kroah-Hartman
maintainerPATCH 28/105 serial: sh-sci: Use spin_{try}lock_irqsave instead of open coding version
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Wagner <[email protected]>
commit 8afb1d2c12163f77777f84616a8e9444d0050ebe upstream.
Commit 40f70c03e33a ("serial: sh-sci: add locking to console write function to avoid SMP lockup") copied the strategy to avoid locking problems in conjuncture with the console from the UART8250 driver. Instead using directly spin_{try}lock_irqsave(), local_irq_save() followed by spin_{try}lock() was used. While this is correct on mainline, for -rt it is a problem. spin_{try}lock() will check if it is running in a valid context. Since the local_irq_save() has already been executed, the context has changed and spin_{try}lock() will complain. The reason why spin_{try}lock() complains is that on -rt the spin locks are turned into mutexes and therefore can sleep. Sleeping with interrupts disabled is not valid.
BUG: sleeping function called from invalid context at /home/wagi/work/rt/v4.4-cip-rt/kernel/locking/rtmutex.c:995 in_atomic(): 0, irqs_disabled(): 128, pid: 778, name: irq/76-eth0 CPU: 0 PID: 778 Comm: irq/76-eth0 Not tainted 4.4.126-test-cip22-rt14-00403-gcd03665c8318 #12 Hardware name: Generic RZ/G1 (Flattened Device Tree) Backtrace: [<c00140a0>] (dump_backtrace) from [<c001424c>] (show_stack+0x18/0x1c) r7:c06b01f0 r6:60010193 r5:00000000 r4:c06b01f0 [<c0014234>] (show_stack) from [<c01d3c94>] (dump_stack+0x78/0x94) [<c01d3c1c>] (dump_stack) from [<c004c134>] (___might_sleep+0x134/0x194) r7:60010113 r6:c06d3559 r5:00000000 r4:ffffe000 [<c004c000>] (___might_sleep) from [<c04ded60>] (rt_spin_lock+0x20/0x74) r5:c06f4d60 r4:c06f4d60 [<c04ded40>] (rt_spin_lock) from [<c02577e4>] (serial_console_write+0x100/0x118) r5:c06f4d60 r4:c06f4d60 [<c02576e4>] (serial_console_write) from [<c0061060>] (call_console_drivers.constprop.15+0x10c/0x124) r10:c06d2894 r9:c04e18b0 r8:00000028 r7:00000000 r6:c06d3559 r5:c06d2798 r4:c06b9914 r3:c02576e4 [<c0060f54>] (call_console_drivers.constprop.15) from [<c0062984>] (console_unlock+0x32c/0x430) r10:c06d30d8 r9:00000028 r8:c06dd518 r7:00000005 r6:00000000 r5:c06d2798 r4:c06d2798 r3:00000028 [<c0062658>] (console_unlock) from [<c0062e1c>] (vprintk_emit+0x394/0x4f0) r10:c06d2798 r9:c06d30ee r8:00000006 r7:00000005 r6:c06a78fc r5:00000027 r4:00000003 [<c0062a88>] (vprintk_emit) from [<c0062fa0>] (vprintk+0x28/0x30) r10:c060bd46 r9:00001000 r8:c06b9a90 r7:c06b9a90 r6:c06b994c r5:c06b9a3c r4:c0062fa8 [<c0062f78>] (vprintk) from [<c0062fb8>] (vprintk_default+0x10/0x14) [<c0062fa8>] (vprintk_default) from [<c009cd30>] (printk+0x78/0x84) [<c009ccbc>] (printk) from [<c025afdc>] (credit_entropy_bits+0x17c/0x2cc) r3:00000001 r2:decade60 r1:c061a5ee r0:c061a523 r4:00000006 [<c025ae60>] (credit_entropy_bits) from [<c025bf74>] (add_interrupt_randomness+0x160/0x178) r10:466e7196 r9:1f536000 r8:fffeef74 r7:00000000 r6:c06b9a60 r5:c06b9a3c r4:dfbcf680 [<c025be14>] (add_interrupt_randomness) from [<c006536c>] (irq_thread+0x1e8/0x248) r10:c006537c r9:c06cdf21 r8:c0064fcc r7:df791c24 r6:df791c00 r5:ffffe000 r4:df525180 [<c0065184>] (irq_thread) from [<c003fba4>] (kthread+0x108/0x11c) r10:00000000 r9:00000000 r8:c0065184 r7:df791c00 r6:00000000 r5:df791d00 r4:decac000 [<c003fa9c>] (kthread) from [<c00101b8>] (ret_from_fork+0x14/0x3c) r8:00000000 r7:00000000 r6:00000000 r5:c003fa9c r4:df791d00
--- drivers/tty/serial/sh-sci.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/tty/serial/sh-sci.c +3 -5
@@ -2419,13 +2419,12 @@ static void serial_console_write(structunsigned long flags;int locked =1 ; -local_irq_save (flags);if (port->sysrq) locked =0 ;else if (oops_in_progress) - locked =spin_trylock (&port->lock); + locked =spin_trylock_irqsave (&port->lock, flags);else -spin_lock (&port->lock); +spin_lock_irqsave (&port->lock, flags);/* first save the SCSCR then disable the interrupts */ ctrl =serial_port_in (port,SCSCR );
@@ -2442,8 +2441,7 @@ static void serial_console_write(structserial_port_out (port,SCSCR , ctrl);if (locked) -spin_unlock (&port->lock); -local_irq_restore (flags); +spin_unlock_irqrestore (&port->lock, flags); }static int serial_console_setup (struct console *co,char *options)
Greg Kroah-Hartman
maintainerPATCH 29/105 signal/xtensa: Consistenly use SIGBUS in do_unaligned_user
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric W. Biederman <[email protected]>
commit 7de712ccc096b81d23cc0a941cd9b8cb3956605d upstream.
While working on changing this code to use force_sig_fault I discovered that do_unaliged_user is sets si_signo to SIGBUS and passes SIGSEGV to force_sig_info. Which is just b0rked.
The code is reporting a SIGBUS error so replace the SIGSEGV with SIGBUS.
--- arch/xtensa/kernel/traps.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/xtensa/kernel/traps.c +1 -1
@@ -309,7 +309,7 @@ do_unaligned_user (struct pt_regs *regs) info.si_errno =0 ; info.si_code =BUS_ADRALN ; info.si_addr = (void *) regs->excvaddr; - force_sig_info(SIGSEGV, &info, current); + force_sig_info(SIGBUS, &info, current); }#endif
Greg Kroah-Hartman
maintainerPATCH 30/105 usb: do not reset if a low-speed or full-speed device timed out
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxim Moseychuk <[email protected]>
commit 6e01827ed93947895680fbdad68c072a0f4e2450 upstream.
Some low-speed and full-speed devices (for example, bluetooth) do not have time to initialize. For them, ETIMEDOUT is a valid error. We need to give them another try. Otherwise, they will never be initialized correctly and in dmesg will be messages "Bluetooth: hci0 command 0x1002 tx timeout" or similars.
--- drivers/usb/core/hub.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/core/hub.c +3 -1
@@ -4442,7 +4442,9 @@ hub_port_init(struct usb_hub *hub, struc* reset. But only on the first attempt, * lest we get into a time out/reset loop */ -if (r ==0 || (r == -ETIMEDOUT && retries ==0 )) +if (r ==0 || (r == -ETIMEDOUT && + retries ==0 && + udev->speed >USB_SPEED_FULL ))break ; } udev->descriptor.bMaxPacketSize0 =
Greg Kroah-Hartman
maintainerPATCH 32/105 ASoC: dapm: delete dapm_kcontrol_data paths list before freeing it
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
commit ff2faf1289c1f81b5b26b9451dd1c2006aac8db8 upstream.
dapm_kcontrol_data is freed as part of dapm_kcontrol_free(), leaving the paths pointer dangling in the list.
This leads to system crash when we try to unload and reload sound card. I hit this bug during ADSP crash/reboot test case on Dragon board DB410c.
Without this patch, on SLAB Poisoning enabled build, kernel crashes with
"BUG kmalloc-128 (Tainted: G W ): Poison overwritten"
--- sound/soc/soc-dapm.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/soc-dapm.c +2 -0
@@ -425,6 +425,8 @@ err_data:static void dapm_kcontrol_free (struct snd_kcontrol *kctl) {struct dapm_kcontrol_data *data =snd_kcontrol_chip (kctl); + +list_del (&data->paths);kfree (data->wlist);kfree (data); }
Greg Kroah-Hartman
maintainerPATCH 33/105 ASoC: cirrus: i2s: Fix LRCLK configuration
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Sverdlin <[email protected]>
commit 2d534113be9a2aa532a1ae127a57e83558aed358 upstream.
The bit responsible for LRCLK polarity is i2s_tlrs (0), not i2s_trel (2) (refer to "EP93xx User's Guide").
Previously card drivers which specified SND_SOC_DAIFMT_NB_IF actually got SND_SOC_DAIFMT_NB_NF, an adaptation is necessary to retain the old behavior.
--- sound/soc/cirrus/edb93xx.c | 2 +- sound/soc/cirrus/ep93xx-i2s.c | 8 ++++---- sound/soc/cirrus/snappercl15.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-)
sound/soc/cirrus/edb93xx.c +1 -1
@@ -67,7 +67,7 @@ static struct snd_soc_dai_link edb93xx_d .cpu_dai_name = "ep93xx-i2s", .codec_name = "spi0.0", .codec_dai_name = "cs4271-hifi", - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_IF | + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS, .ops = &edb93xx_ops, };
sound/soc/cirrus/ep93xx-i2s.c +4 -4
@@ -213,24 +213,24 @@ static int ep93xx_i2s_set_dai_fmt(structswitch (fmt &SND_SOC_DAIFMT_INV_MASK ) {case SND_SOC_DAIFMT_NB_NF :/* Negative bit clock, lrclk low on left word */ - clk_cfg &= ~(EP93XX_I2S_CLKCFG_CKP |EP93XX_I2S_CLKCFG_REL ); + clk_cfg &= ~(EP93XX_I2S_CLKCFG_CKP |EP93XX_I2S_CLKCFG_LRS );break ;case SND_SOC_DAIFMT_NB_IF :/* Negative bit clock, lrclk low on right word */ clk_cfg &= ~EP93XX_I2S_CLKCFG_CKP ; - clk_cfg |=EP93XX_I2S_CLKCFG_REL ; + clk_cfg |=EP93XX_I2S_CLKCFG_LRS ;break ;case SND_SOC_DAIFMT_IB_NF :/* Positive bit clock, lrclk low on left word */ clk_cfg |=EP93XX_I2S_CLKCFG_CKP ; - clk_cfg &= ~EP93XX_I2S_CLKCFG_REL ; + clk_cfg &= ~EP93XX_I2S_CLKCFG_LRS ;break ;case SND_SOC_DAIFMT_IB_IF :/* Positive bit clock, lrclk low on right word */ - clk_cfg |=EP93XX_I2S_CLKCFG_CKP |EP93XX_I2S_CLKCFG_REL ; + clk_cfg |=EP93XX_I2S_CLKCFG_CKP |EP93XX_I2S_CLKCFG_LRS ;break ; }
sound/soc/cirrus/snappercl15.c +1 -1
@@ -72,7 +72,7 @@ static struct snd_soc_dai_link snappercl .codec_dai_name = "tlv320aic23-hifi", .codec_name = "tlv320aic23-codec.0-001a", .platform_name = "ep93xx-i2s", - .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_IF | + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS, .ops = &snappercl15_ops, };
Greg Kroah-Hartman
maintainerPATCH 35/105 lib/vsprintf: Remove atomic-unsafe support for %pCr
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 666902e42fd8344b923c02dc5b0f37948ff4f225 upstream.
"%pCr" formats the current rate of a clock, and calls clk_get_rate(). The latter obtains a mutex, hence it must not be called from atomic context.
Remove support for this rarely-used format, as vsprintf() (and e.g. printk()) must be callable from any context.
Any remaining out-of-tree users will start seeing the clock's name printed instead of its rate.
To: Jia-Ju Bai <[email protected]>
To: Jonathan Corbet <[email protected]>
To: Michael Turquette <[email protected]>
To: Stephen Boyd <[email protected]>
To: Zhang Rui <[email protected]>
To: Eduardo Valentin <[email protected]>
To: Eric Anholt <[email protected]>
To: Stefan Wahren <[email protected]>
To: Greg Kroah-Hartman <[email protected]>
--- Documentation/printk-formats.txt | 3 +-- lib/vsprintf.c | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-)
Documentation/printk-formats.txt +1 -2
@@ -273,11 +273,10 @@ struct clk: %pC pll1 %pCn pll1 - %pCr 1560000000 For printing struct clk structures. '%pC' and '%pCn' print the name (Common Clock Framework) or address (legacy clock framework) of the - structure; '%pCr' prints the current clock rate. + structure. Passed by reference.
lib/vsprintf.c +0 -3
@@ -1345,9 +1345,6 @@ char *clock(char *buf, char *end, structreturn string (buf, end,NULL , spec);switch (fmt[1 ]) { -case 'r' : -return number (buf, end,clk_get_rate (clk), spec); -case 'n' :default :#ifdef CONFIG_COMMON_CLK
Greg Kroah-Hartman
maintainerPATCH 36/105 mips: ftrace: fix static function graph tracing
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias Schiffer <[email protected]>
commit 6fb8656646f996d1eef42e6d56203c4915cb9e08 upstream.
ftrace_graph_caller was never run after calling ftrace_trace_function, breaking the function graph tracer. Fix this, bringing it in line with the x86 implementation.
While we're at it, also streamline the control flow of _mcount a bit to reduce the number of branches.
This issue was reported before:
https://www.linux-mips.org/archives/linux-mips/2014-11/msg00295.html
Patchwork: https://patchwork.linux-mips.org/patch/18929/
--- arch/mips/kernel/mcount.S | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-)
arch/mips/kernel/mcount.S +12 -15
@@ -116,10 +116,20 @@ ftrace_stub: NESTED(_mcount, PT_SIZE, ra) PTR_LA t1, ftrace_stub PTR_L t2, ftrace_trace_function /* Prepare t2 for (1) */ - bne t1, t2, static_trace + beq t1, t2, fgraph_trace nop + MCOUNT_SAVE_REGS + + move a0, ra /* arg1: self return address */ + jalr t2 /* (1) call *ftrace_trace_function */ + move a1, AT /* arg2: parent's return address */ + + MCOUNT_RESTORE_REGS + +fgraph_trace: #ifdef CONFIG_FUNCTION_GRAPH_TRACER + PTR_LA t1, ftrace_stub PTR_L t3, ftrace_graph_return bne t1, t3, ftrace_graph_caller nop
@@ -128,24 +138,11 @@ NESTED(_mcount, PT_SIZE, ra) bne t1, t3, ftrace_graph_caller nop #endif - b ftrace_stub -#ifdef CONFIG_32BIT - addiu sp, sp, 8 -#else - nop -#endif - -static_trace: - MCOUNT_SAVE_REGS - - move a0, ra /* arg1: self return address */ - jalr t2 /* (1) call *ftrace_trace_function */ - move a1, AT /* arg2: parent's return address */ - MCOUNT_RESTORE_REGS #ifdef CONFIG_32BIT addiu sp, sp, 8 #endif + .globl ftrace_stub ftrace_stub: RETURN_BACK
Greg Kroah-Hartman
maintainerPATCH 37/105 branch-check: fix long->int truncation when profiling branches
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 2026d35741f2c3ece73c11eb7e4a15d7c2df9ebe upstream.
The function __builtin_expect returns long type (see the gcc documentation), and so do macros likely and unlikely. Unfortunatelly, when CONFIG_PROFILE_ANNOTATED_BRANCHES is selected, the macros likely and unlikely expand to __branch_check__ and __branch_check__ truncates the long type to int. This unintended truncation may cause bugs in various kernel code (we found a bug in dm-writecache because of it), so it's better to fix __branch_check__ to return long.
--- include/linux/compiler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/compiler.h +1 -1
@@ -111,7 +111,7 @@ void ftrace_likely_update(struct ftrace_#define unlikely_notrace (x) __builtin_expect(!!(x), 0)#define __branch_check__ (x, expect) ({ \ - int ______r; \ + long ______r; \ static struct ftrace_branch_data \ __attribute__((__aligned__(4))) \ __attribute__((section("_ftrace_annotated_branch"))) \
Greg Kroah-Hartman
maintainerPATCH 38/105 ipmi:bt: Set the timeout before doing a capabilities check
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corey Minyard <[email protected]>
commit fe50a7d0393a552e4539da2d31261a59d6415950 upstream.
There was one place where the timeout value for an operation was not being set, if a capabilities request was done from idle. Move the timeout value setting to before where that change might be requested.
IMHO the cause here is the invisible returns in the macros. Maybe that's a job for later, though.
--- drivers/char/ipmi/ipmi_bt_sm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/char/ipmi/ipmi_bt_sm.c +2 -1
@@ -522,11 +522,12 @@ static enum si_sm_result bt_event(structif (status &BT_H_BUSY )/* clear a leftover H_BUSY */ BT_CONTROL (BT_H_BUSY ); + bt->timeout = bt->BT_CAP_req2rsp; +/* Read BT capabilities if it hasn't been done yet */ if (!bt->BT_CAP_outreqs)BT_STATE_CHANGE (BT_STATE_CAPABILITIES_BEGIN ,SI_SM_CALL_WITHOUT_DELAY ); - bt->timeout = bt->BT_CAP_req2rsp;BT_SI_SM_RETURN (SI_SM_IDLE );case BT_STATE_XACTION_START :
Greg Kroah-Hartman
maintainerPATCH 39/105 Bluetooth: hci_qca: Avoid missing rampatch failure with userspace fw loader
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amit Pundir <[email protected]>
commit 7dc5fe0814c35ec4e7d2e8fa30abab72e0e6a172 upstream.
AOSP use userspace firmware loader to load firmwares, which will return -EAGAIN in case qca/rampatch_00440302.bin is not found. Since there is no rampatch for dragonboard820c QCA controller revision, just make it work as is.
--- drivers/bluetooth/hci_qca.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/bluetooth/hci_qca.c +6 -0
@@ -939,6 +939,12 @@ static int qca_setup(struct hci_uart *hu }else if (ret == -ENOENT ) {/* No patch/nvm-config found, run with original fw/config */ ret =0 ; + }else if (ret == -EAGAIN ) { +/* +* Userspace firmware loader will return -EAGAIN in case no +* patch/nvm-config is found, so run with original fw/config. +*/ + ret =0 ; }/* Setup bdaddr */
Greg Kroah-Hartman
maintainerPATCH 40/105 fuse: atomic_o_trunc should truncate pagecache
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 df0e91d488276086bc07da2e389986cae0048c37 upstream.
Fuse has an "atomic_o_trunc" mode, where userspace filesystem uses the O_TRUNC flag in the OPEN request to truncate the file atomically with the open.
In this mode there's no need to send a SETATTR request to userspace after the open, so fuse_do_setattr() checks this mode and returns. But this misses the important step of truncating the pagecache.
Add the missing parts of truncation to the ATTR_OPEN branch.
--- fs/fuse/dir.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
fs/fuse/dir.c +12 -1
@@ -1609,8 +1609,19 @@ int fuse_do_setattr(struct inode *inode,return err;if (attr->ia_valid &ATTR_OPEN ) { -if (fc->atomic_o_trunc) +/* This is coming from open(..., ... | O_TRUNC); */ +WARN_ON (!(attr->ia_valid &ATTR_SIZE )); +WARN_ON (attr->ia_size !=0 ); +if (fc->atomic_o_trunc) { +/* +* No need to send request to userspace, since actual +* truncation has already been done by OPEN. But still +* need to truncate page cache. +*/ +i_size_write (inode,0 ); +truncate_pagecache (inode,0 );return 0 ; + } file =NULL ; }
Greg Kroah-Hartman
maintainerPATCH 41/105 fuse: dont keep dead fuse_conn at fuse_fill_super().
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit 543b8f8662fe6d21f19958b666ab0051af9db21a upstream.
syzbot is reporting use-after-free at fuse_kill_sb_blk() [1]. Since sb->s_fs_info field is not cleared after fc was released by fuse_conn_put() when initialization failed, fuse_kill_sb_blk() finds already released fc and tries to hold the lock. Fix this by clearing sb->s_fs_info field after calling fuse_conn_put().
[1] https://syzkaller.appspot.com/bug?id=a07a680ed0a9290585ca424546860464dd9658db
--- fs/fuse/inode.c | 1 + 1 file changed, 1 insertion(+)
fs/fuse/inode.c +1 -0
@@ -1158,6 +1158,7 @@ static int fuse_fill_super(struct super_ err_put_conn:fuse_bdi_destroy (fc);fuse_conn_put (fc); + sb->s_fs_info =NULL ; err_fput:fput (file); err:
Greg Kroah-Hartman
maintainerPATCH 42/105 fuse: fix control dir setup and teardown
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 6becdb601bae2a043d7fb9762c4d48699528ea6e upstream.
syzbot is reporting NULL pointer dereference at fuse_ctl_remove_conn() [1]. Since fc->ctl_ndents is incremented by fuse_ctl_add_conn() when new_inode() failed, fuse_ctl_remove_conn() reaches an inode-less dentry and tries to clear d_inode(dentry)->i_private field.
Fix by only adding the dentry to the array after being fully set up.
When tearing down the control directory, do d_invalidate() on it to get rid of any mounts that might have been added.
[1] https://syzkaller.appspot.com/bug?id=f396d863067238959c91c0b7cfc10b163638cac6
--- fs/fuse/control.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
fs/fuse/control.c +10 -3
@@ -211,10 +211,11 @@ static struct dentry *fuse_ctl_add_dentrif (!dentry)return NULL ; - fc->ctl_dentry[fc->ctl_ndents++] = dentry; inode =new_inode (fuse_control_sb); -if (!inode) +if (!inode) { +dput (dentry);return NULL ; + } inode->i_ino =get_next_ino (); inode->i_mode = mode;
@@ -228,6 +229,9 @@ static struct dentry *fuse_ctl_add_dentrset_nlink (inode, nlink); inode->i_private = fc;d_add (dentry, inode); + + fc->ctl_dentry[fc->ctl_ndents++] = dentry; +return dentry; }
@@ -284,7 +288,10 @@ void fuse_ctl_remove_conn(struct fuse_cofor (i = fc->ctl_ndents -1 ; i >=0 ; i--) {struct dentry *dentry = fc->ctl_dentry[i];d_inode (dentry)->i_private =NULL ; -d_drop (dentry); +if (!i) { +/* Get rid of submounts: */ +d_invalidate (dentry); + }dput (dentry); }drop_nlink (d_inode (fuse_control_sb->s_root));
Greg Kroah-Hartman
maintainerPATCH 43/105 powerpc/mm/hash: Add missing isync prior to kernel stack SLB switch
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aneesh Kumar K.V <[email protected]>
commit 91d06971881f71d945910de128658038513d1b24 upstream.
Currently we do not have an isync, or any other context synchronizing instruction prior to the slbie/slbmte in _switch() that updates the SLB entry for the kernel stack.
However that is not correct as outlined in the ISA.
Quoted 1 line
Quoted 1 line
From Power ISA Version 3.0B, Book III, Chapter 11, page 1133:
"Changing the contents of ... the contents of SLB entries ... can
have the side effect of altering the context in which data addresses and instruction addresses are interpreted, and in which instructions are executed and data accesses are performed.
...
These side effects need not occur in program order, and therefore may require explicit synchronization by software.
...
The synchronizing instruction before the context-altering instruction ensures that all instructions up to and including that synchronizing instruction are fetched and executed in the context that existed before the alteration."
And page 1136:
"For data accesses, the context synchronizing instruction before the
slbie, slbieg, slbia, slbmte, tlbie, or tlbiel instruction ensures that all preceding instructions that access data storage have completed to a point at which they have reported all exceptions they will cause."
We're not aware of any bugs caused by this, but it should be fixed regardless.
Add the missing isync when updating kernel stack SLB entry.
--- arch/powerpc/kernel/entry_64.S | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/kernel/entry_64.S +1 -0
@@ -574,6 +574,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEG * actually hit this code path. */ + isync slbie r6 slbie r6 /* Workaround POWER5 < DD2.1 issue */ slbmte r7,r0
Greg Kroah-Hartman
maintainerPATCH 44/105 powerpc/ptrace: Fix setting 512B aligned breakpoints with PTRACE_SET_DEBUGREG
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit 4f7c06e26ec9cf7fe9f0c54dc90079b6a4f4b2c3 upstream.
In commit e2a800beaca1 ("powerpc/hw_brk: Fix off by one error when validating DAWR region end") we fixed setting the DAWR end point to its max value via PPC_PTRACE_SETHWDEBUG. Unfortunately we broke PTRACE_SET_DEBUGREG when setting a 512 byte aligned breakpoint.
PTRACE_SET_DEBUGREG currently sets the length of the breakpoint to zero (memset() in hw_breakpoint_init()). This worked with arch_validate_hwbkpt_settings() before the above patch was applied but is now broken if the breakpoint is 512byte aligned.
This sets the length of the breakpoint to 8 bytes when using PTRACE_SET_DEBUGREG.
--- arch/powerpc/kernel/ptrace.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/kernel/ptrace.c +1 -0
@@ -1004,6 +1004,7 @@ static int ptrace_set_debugreg(struct ta/* Create a new breakpoint request if one doesn't exist already */ hw_breakpoint_init (&attr); attr.bp_addr = hw_brk.address; + attr.bp_len =8 ;arch_bp_generic_fields (hw_brk.type, &attr.bp_type);
Greg Kroah-Hartman
maintainerPATCH 45/105 powerpc/ptrace: Fix enforcement of DAWR constraints
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Neuling <[email protected]>
commit cd6ef7eebf171bfcba7dc2df719c2a4958775040 upstream.
Back when we first introduced the DAWR, in commit 4ae7ebe9522a ("powerpc: Change hardware breakpoint to allow longer ranges"), we screwed up the constraint making it a 1024 byte boundary rather than a
512. This makes the check overly permissive. Fortunately GDB is the only real user and it always did they right thing, so we never noticed.
This fixes the constraint to 512 bytes.
--- arch/powerpc/kernel/hw_breakpoint.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kernel/hw_breakpoint.c +2 -2
@@ -174,8 +174,8 @@ int arch_validate_hwbkpt_settings(structif (cpu_has_feature (CPU_FTR_DAWR )) { length_max =512 ;/* 64 doublewords */ /* DAWR region can't cross 512 boundary */ -if ((bp->attr.bp_addr >>10 ) != - ((bp->attr.bp_addr + bp->attr.bp_len -1 ) >>10 )) +if ((bp->attr.bp_addr >>9 ) != + ((bp->attr.bp_addr + bp->attr.bp_len -1 ) >>9 ))return -EINVAL ; } if (info->len >
Greg Kroah-Hartman
maintainerPATCH 46/105 cpuidle: powernv: Fix promotion from snooze if next state disabled
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gautham R. Shenoy <[email protected]>
commit 0a4ec6aa035a52c422eceb2ed51ed88392a3d6c2 upstream.
The commit 78eaa10f027c ("cpuidle: powernv/pseries: Auto-promotion of snooze to deeper idle state") introduced a timeout for the snooze idle state so that it could be eventually be promoted to a deeper idle state. The snooze timeout value is static and set to the target residency of the next idle state, which would train the cpuidle governor to pick the next idle state eventually.
The unfortunate side-effect of this is that if the next idle state(s) is disabled, the CPU will forever remain in snooze, despite the fact that the system is completely idle, and other deeper idle states are available.
This patch fixes the issue by dynamically setting the snooze timeout to the target residency of the next enabled state on the device.
Before Patch:
POWER8 : Only nap disabled.
$ cpupower monitor sleep 30
sleep took 30.01297 seconds and exited with status 0
|Idle_Stats
PKG |CORE|CPU | snoo | Nap | Fast
0| 8| 0| 96.41| 0.00| 0.00
0| 8| 1| 96.43| 0.00| 0.00
0| 8| 2| 96.47| 0.00| 0.00
0| 8| 3| 96.35| 0.00| 0.00
0| 8| 4| 96.37| 0.00| 0.00
0| 8| 5| 96.37| 0.00| 0.00
0| 8| 6| 96.47| 0.00| 0.00
0| 8| 7| 96.47| 0.00| 0.00POWER9: Shallow states (stop0lite, stop1lite, stop2lite, stop0, stop1, stop2) disabled:
$ cpupower monitor sleep 30
sleep took 30.05033 seconds and exited with status 0
|Idle_Stats
PKG |CORE|CPU | snoo | stop | stop | stop | stop | stop | stop | stop | stop
0| 16| 0| 89.79| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00
0| 16| 1| 90.12| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00
0| 16| 2| 90.21| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00
0| 16| 3| 90.29| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00After Patch:
POWER8 : Only nap disabled.
$ cpupower monitor sleep 30
sleep took 30.01200 seconds and exited with status 0
|Idle_Stats
PKG |CORE|CPU | snoo | Nap | Fast
0| 8| 0| 16.58| 0.00| 77.21
0| 8| 1| 18.42| 0.00| 75.38
0| 8| 2| 4.70| 0.00| 94.09
0| 8| 3| 17.06| 0.00| 81.73
0| 8| 4| 3.06| 0.00| 95.73
0| 8| 5| 7.00| 0.00| 96.80
0| 8| 6| 1.00| 0.00| 98.79
0| 8| 7| 5.62| 0.00| 94.17POWER9: Shallow states (stop0lite, stop1lite, stop2lite, stop0, stop1, stop2) disabled:
$ cpupower monitor sleep 30
sleep took 30.02110 seconds and exited with status 0
|Idle_Stats
PKG |CORE|CPU | snoo | stop | stop | stop | stop | stop | stop | stop | stop
0| 0| 0| 0.69| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 9.39| 89.70
0| 0| 1| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.05| 93.21
0| 0| 2| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 89.93
0| 0| 3| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 0.00| 93.26--- drivers/cpuidle/cpuidle-powernv.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-)
drivers/cpuidle/cpuidle-powernv.c +26 -6
@@ -29,9 +29,31 @@ struct cpuidle_driver powernv_idle_drivestatic int max_idle_state;static struct cpuidle_state *cpuidle_state_table; -static u64 snooze_timeout; +static u64 default_snooze_timeout;static bool snooze_timeout_en; +static u64 get_snooze_timeout (struct cpuidle_device *dev, +struct cpuidle_driver *drv, +int index) +{ +int i; + +if (unlikely (!snooze_timeout_en)) +return default_snooze_timeout; + +for (i = index +1 ; i < drv->state_count; i++) { +struct cpuidle_state *s = &drv->states[i]; +struct cpuidle_state_usage *su = &dev->states_usage[i]; + +if (s->disabled || su->disable) +continue ; + +return s->target_residency * tb_ticks_per_usec; + } + +return default_snooze_timeout; +} +static int snooze_loop (struct cpuidle_device *dev,struct cpuidle_driver *drv,int index)
@@ -41,7 +63,7 @@ static int snooze_loop(struct cpuidle_delocal_irq_enable ();set_thread_flag (TIF_POLLING_NRFLAG ); - snooze_exit_time =get_tb () + snooze_timeout; + snooze_exit_time =get_tb () +get_snooze_timeout (dev, drv, index);ppc64_runlatch_off ();while (!need_resched ()) {HMT_low ();
@@ -286,11 +308,9 @@ static int powernv_idle_probe(void) cpuidle_state_table = powernv_states;/* Device tree can indicate more idle states */ max_idle_state =powernv_add_idle_states (); -if (max_idle_state >1 ) { + default_snooze_timeout =TICK_USEC * tb_ticks_per_usec; +if (max_idle_state >1 ) snooze_timeout_en = true; - snooze_timeout = powernv_states[1 ].target_residency * - tb_ticks_per_usec; - } }else return -ENODEV ;
Greg Kroah-Hartman
maintainerPATCH 47/105 powerpc/fadump: Unregister fadump on kexec down path.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mahesh Salgaonkar <[email protected]>
commit 722cde76d68e8cc4f3de42e71c82fd40dea4f7b9 upstream.
Unregister fadump on kexec down path otherwise the fadump registration in new kexec-ed kernel complains that fadump is already registered. This makes new kernel to continue using fadump registered by previous kernel which may lead to invalid vmcore generation. Hence this patch fixes this issue by un-registering fadump in fadump_cleanup() which is called during kexec path so that new kernel can register fadump with new valid values.
--- arch/powerpc/kernel/fadump.c | 3 +++ 1 file changed, 3 insertions(+)
arch/powerpc/kernel/fadump.c +3 -0
@@ -1025,6 +1025,9 @@ void fadump_cleanup(void)init_fadump_mem_struct (&fdm,be64_to_cpu (fdm_active->cpu_state_data.destination_address));fadump_invalidate_dump (&fdm); + }else if (fw_dump.dump_registered) { +/* Un-register Firmware-assisted dump if it was registered. */ +fadump_unregister_dump (&fdm); } }
Greg Kroah-Hartman
maintainerPATCH 48/105 ARM: 8764/1: kgdb: fix NUMREGBYTES so that gdb_regs[] is the correct size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Rivshin <[email protected]>
commit 76ed0b803a2ab793a1b27d1dfe0de7955282cd34 upstream.
NUMREGBYTES (which is used as the size for gdb_regs[]) is incorrectly based on DBG_MAX_REG_NUM instead of GDB_MAX_REGS. DBG_MAX_REG_NUM is the number of total registers, while GDB_MAX_REGS is the number of 'unsigned longs' it takes to serialize those registers. Since FP registers require 3 'unsigned longs' each, DBG_MAX_REG_NUM is smaller than GDB_MAX_REGS.
This causes GDB 8.0 give the following error on connect:
"Truncated register 19 in remote 'g' packet"
This also causes the register serialization/deserialization logic to overflow gdb_regs[], overwriting whatever follows.
--- arch/arm/include/asm/kgdb.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/include/asm/kgdb.h +1 -1
@@ -76,7 +76,7 @@ extern int kgdb_fault_expected;#define KGDB_MAX_NO_CPUS 1#define BUFMAX 400 -#define NUMREGBYTES (DBG_MAX_REG_NUM << 2) +#define NUMREGBYTES (GDB_MAX_REGS << 2)#define NUMCRITREGBYTES (32 << 2)#define _R0 0
Greg Kroah-Hartman
maintainerPATCH 49/105 of: unittest: for strings, account for trailing \0 in property length field
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stefan M Schaeckeler <[email protected]>
commit 3b9cf7905fe3ab35ab437b5072c883e609d3498d upstream.
For strings, account for trailing \0 in property length field:
This is consistent with how dtc builds string properties.
Function __of_prop_dup() would misbehave on such properties as it duplicates properties based on the property length field creating new string values without trailing \0s.
--- drivers/of/unittest.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/of/unittest.c +4 -4
@@ -156,20 +156,20 @@ static void __init of_unittest_dynamic(v/* Add a new property - should pass*/ prop->name ="new-property" ; prop->value ="new-property-data" ; - prop->length =strlen (prop->value); + prop->length =strlen (prop->value) +1 ;unittest (of_add_property (np, prop) ==0 ,"Adding a new property failed\n" );/* Try to add an existing property - should fail */ prop++; prop->name ="new-property" ; prop->value ="new-property-data-should-fail" ; - prop->length =strlen (prop->value); + prop->length =strlen (prop->value) +1 ;unittest (of_add_property (np, prop) !=0 ,"Adding an existing property should have failed\n" );/* Try to modify an existing property - should pass */ prop->value ="modify-property-data-should-pass" ; - prop->length =strlen (prop->value); + prop->length =strlen (prop->value) +1 ;unittest (of_update_property (np, prop) ==0 ,"Updating an existing property should have passed\n" );
@@ -177,7 +177,7 @@ static void __init of_unittest_dynamic(v prop++; prop->name ="modify-property" ; prop->value ="modify-missing-property-data-should-pass" ; - prop->length =strlen (prop->value); + prop->length =strlen (prop->value) +1 ;unittest (of_update_property (np, prop) ==0 ,"Updating a missing property should have passed\n" );
Greg Kroah-Hartman
maintainerPATCH 50/105 IB/qib: Fix DMA api warning with debug kernel
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Marciniszyn <[email protected]>
commit 0252f73334f9ef68868e4684200bea3565a4fcee upstream.
The following error occurs in a debug build when running MPI PSM:
[ 307.415911] WARNING: CPU: 4 PID: 23867 at lib/dma-debug.c:1158 check_unmap+0x4ee/0xa20 [ 307.455661] ib_qib 0000:05:00.0: DMA-API: device driver failed to check map error[device address=0x00000000df82b000] [size=4096 bytes] [mapped as page] [ 307.517494] Modules linked in: [ 307.531584] ib_isert iscsi_target_mod ib_srpt target_core_mod rpcrdma
sunrpc ib_srp scsi_transport_srp scsi_tgt ib_iser libiscsi ib_ipoib scsi_transport_iscsi rdma_ucm ib_ucm ib_uverbs ib_umad rdma_cm ib_cm iw_cm ib_qib intel_powerclamp coretemp rdmavt intel_rapl iosf_mbi kvm_intel kvm irqbypass crc32_pclmul ghash_clmulni_intel ipmi_ssif ib_core aesni_intel sg ipmi_si lrw gf128mul dca glue_helper ipmi_devintf iTCO_wdt gpio_ich hpwdt iTCO_vendor_support ablk_helper hpilo acpi_power_meter cryptd ipmi_msghandler ie31200_edac shpchp pcc_cpufreq lpc_ich pcspkr ip_tables xfs libcrc32c sd_mod crc_t10dif crct10dif_generic mgag200 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm ahci crct10dif_pclmul crct10dif_common drm crc32c_intel libahci tg3 libata serio_raw ptp i2c_core
[ 307.846113] pps_core dm_mirror dm_region_hash dm_log dm_mod [ 307.866505] CPU: 4 PID: 23867 Comm: mpitests-IMB-MP Kdump: loaded Not tainted 3.10.0-862.el7.x86_64.debug #1 [ 307.911178] Hardware name: HP ProLiant DL320e Gen8, BIOS J05 11/09/2013 [ 307.944206] Call Trace: [ 307.956973] [<ffffffffbd9e915b>] dump_stack+0x19/0x1b [ 307.982201] [<ffffffffbd2a2f58>] __warn+0xd8/0x100 [ 308.005999] [<ffffffffbd2a2fdf>] warn_slowpath_fmt+0x5f/0x80 [ 308.034260] [<ffffffffbd5f667e>] check_unmap+0x4ee/0xa20 [ 308.060801] [<ffffffffbd41acaa>] ? page_add_file_rmap+0x2a/0x1d0 [ 308.090689] [<ffffffffbd5f6c4d>] debug_dma_unmap_page+0x9d/0xb0 [ 308.120155] [<ffffffffbd4082e0>] ? might_fault+0xa0/0xb0 [ 308.146656] [<ffffffffc07761a5>] qib_tid_free.isra.14+0x215/0x2a0 [ib_qib] [ 308.180739] [<ffffffffc0776bf4>] qib_write+0x894/0x1280 [ib_qib] [ 308.210733] [<ffffffffbd540b00>] ? __inode_security_revalidate+0x70/0x80 [ 308.244837] [<ffffffffbd53c2b7>] ? security_file_permission+0x27/0xb0 [ 308.266025] qib_ib0.8006: multicast join failed for ff12:401b:8006:0000:0000:0000:ffff:ffff, status -22 [ 308.323421] [<ffffffffbd46f5d3>] vfs_write+0xc3/0x1f0 [ 308.347077] [<ffffffffbd492a5c>] ? fget_light+0xfc/0x510 [ 308.372533] [<ffffffffbd47045a>] SyS_write+0x8a/0x100 [ 308.396456] [<ffffffffbd9ff355>] system_call_fastpath+0x1c/0x21
The code calls a qib_map_page() which has never correctly tested for a mapping error.
Fix by testing for pci_dma_mapping_error() in all cases and properly handling the failure in the caller.
Additionally, streamline qib_map_page() arguments to satisfy just the single caller.
--- drivers/infiniband/hw/qib/qib.h | 3 +-- drivers/infiniband/hw/qib/qib_file_ops.c | 10 +++++++--- drivers/infiniband/hw/qib/qib_user_pages.c | 20 ++++++++++++-------- 3 files changed, 20 insertions(+), 13 deletions(-)
drivers/infiniband/hw/qib/qib.h +1 -2
@@ -1451,8 +1451,7 @@ u64 qib_sps_ints(void);/* * dma_addr wrappers - all 0's invalid for hw */ -dma_addr_t qib_map_page (struct pci_dev *,struct page *,unsigned long , -size_t ,int ); +int qib_map_page (struct pci_dev *d,struct page *p,dma_addr_t *daddr);const char *qib_get_unit_name (int unit);/*
drivers/infiniband/hw/qib/qib_file_ops.c +7 -3
@@ -364,6 +364,8 @@ static int qib_tid_update(struct qib_ctx goto done; }for (i =0 ; i < cnt; i++, vaddr +=PAGE_SIZE ) { +dma_addr_t daddr; +for (; ntids--; tid++) {if (tid == tidcnt) tid =0 ;
@@ -380,12 +382,14 @@ static int qib_tid_update(struct qib_ctx ret = -ENOMEM ;break ; } + ret =qib_map_page (dd->pcidev, pagep[i], &daddr); +if (ret) +break ; + tidlist[i] = tid + tidoff;/* we "know" system pages and TID pages are same size */ dd->pageshadow[ctxttid + tid] = pagep[i]; - dd->physshadow[ctxttid + tid] = -qib_map_page (dd->pcidev, pagep[i],0 ,PAGE_SIZE , -PCI_DMA_FROMDEVICE ); + dd->physshadow[ctxttid + tid] = daddr;/* * don't need atomic or it's overhead */
drivers/infiniband/hw/qib/qib_user_pages.c +12 -8
@@ -98,23 +98,27 @@ bail:* * I'm sure we won't be so lucky with other iommu's, so FIXME. */ -dma_addr_t qib_map_page (struct pci_dev *hwdev,struct page *page, -unsigned long offset,size_t size,int direction) +int qib_map_page (struct pci_dev *hwdev,struct page *page,dma_addr_t *daddr) {dma_addr_t phys; - phys =pci_map_page (hwdev, page, offset, size, direction); + phys =pci_map_page (hwdev, page,0 ,PAGE_SIZE ,PCI_DMA_FROMDEVICE ); +if (pci_dma_mapping_error (hwdev, phys)) +return -ENOMEM ; -if (phys ==0 ) { -pci_unmap_page (hwdev, phys, size, direction); - phys =pci_map_page (hwdev, page, offset, size, direction); +if (!phys) { +pci_unmap_page (hwdev, phys,PAGE_SIZE ,PCI_DMA_FROMDEVICE ); + phys =pci_map_page (hwdev, page,0 ,PAGE_SIZE , +PCI_DMA_FROMDEVICE ); +if (pci_dma_mapping_error (hwdev, phys)) +return -ENOMEM ;/* * FIXME: If we get 0 again, we should keep this page, * map another, then free the 0 page. */ } - -return phys; + *daddr = phys; +return 0 ; }/**
Greg Kroah-Hartman
maintainerPATCH 51/105 RDMA/mlx4: Discard unknown SQP work requests
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
commit 6b1ca7ece15e94251d1d0d919f813943e4a58059 upstream.
There is no need to crash the machine if unknown work request was received in SQP MAD.
--- drivers/infiniband/hw/mlx4/mad.c | 1 - 1 file changed, 1 deletion(-)
drivers/infiniband/hw/mlx4/mad.c +0 -1
@@ -1780,7 +1780,6 @@ static void mlx4_ib_sqp_comp_worker(stru "buf:%lld\n", wc.wr_id);break ;default : -BUG_ON (1 );break ; } }else {
Greg Kroah-Hartman
maintainerPATCH 52/105 mtd: cfi_cmdset_0002: Change write buffer to check correct value
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tokunori Ikegami <[email protected]>
commit dfeae1073583dc35c33b32150e18b7048bbb37e6 upstream.
For the word write it is checked if the chip has the correct value. But it is not checked for the write buffer as only checked if ready. To make sure for the write buffer change to check the value.
It is enough as this patch is only checking the last written word. Since it is described by data sheets to check the operation status.
--- drivers/mtd/chips/cfi_cmdset_0002.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/chips/cfi_cmdset_0002.c +1 -1
@@ -1878,7 +1878,7 @@ static int __xipram do_write_buffer(struif (time_after (jiffies, timeo) && !chip_ready (map, adr))break ; -if (chip_ready (map, adr)) { +if (chip_good (map, adr, datum)) {xip_enable (map, chip, adr); goto op_done; }
Greg Kroah-Hartman
maintainerPATCH 53/105 mtd: cfi_cmdset_0002: Use right chip in do_ppb_xxlock()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joakim Tjernlund <[email protected]>
commit f93aa8c4de307069c270b2d81741961162bead6c upstream.
do_ppb_xxlock() fails to add chip->start when querying for lock status (and chip_ready test), which caused false status reports. Fix that by adding adr += chip->start and adjust call sites accordingly.
--- drivers/mtd/chips/cfi_cmdset_0002.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/mtd/chips/cfi_cmdset_0002.c +5 -4
@@ -2551,8 +2551,9 @@ static int __maybe_unused do_ppb_xxlock(unsigned long timeo;int ret; + adr += chip->start;mutex_lock (&chip->mutex); - ret =get_chip (map, chip, adr + chip->start,FL_LOCKING ); + ret =get_chip (map, chip, adr,FL_LOCKING );if (ret) {mutex_unlock (&chip->mutex);return ret;
@@ -2570,8 +2571,8 @@ static int __maybe_unused do_ppb_xxlock(if (thunk ==DO_XXLOCK_ONEBLOCK_LOCK ) { chip->state =FL_LOCKING ; -map_write (map,CMD (0xA0 ), chip->start + adr); -map_write (map,CMD (0x00 ), chip->start + adr); +map_write (map,CMD (0xA0 ), adr); +map_write (map,CMD (0x00 ), adr); }else if (thunk ==DO_XXLOCK_ONEBLOCK_UNLOCK ) {/* * Unlocking of one specific sector is not supported, so we
@@ -2609,7 +2610,7 @@ static int __maybe_unused do_ppb_xxlock(map_write (map,CMD (0x00 ), chip->start); chip->state =FL_READY ; -put_chip (map, chip, adr + chip->start); +put_chip (map, chip, adr);mutex_unlock (&chip->mutex);return ret;
Greg Kroah-Hartman
maintainerPATCH 54/105 mtd: cfi_cmdset_0002: fix SEGV unlocking multiple chips
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joakim Tjernlund <[email protected]>
commit 5fdfc3dbad099281bf027a353d5786c09408a8e5 upstream.
cfi_ppb_unlock() tries to relock all sectors that were locked before unlocking the whole chip.
This locking used the chip start address + the FULL offset from the first flash chip, thereby forming an illegal address. Fix that by using the chip offset(adr).
--- drivers/mtd/chips/cfi_cmdset_0002.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/mtd/chips/cfi_cmdset_0002.c +3 -3
@@ -2533,7 +2533,7 @@ static int cfi_atmel_unlock(struct mtd_istruct ppb_lock {struct flchip *chip; -loff_t offset; +unsigned long adr;int locked; };
@@ -2669,7 +2669,7 @@ static int __maybe_unused cfi_ppb_unlock*/ if ((adr < ofs) || (adr >= (ofs + len))) { sect[sectors].chip = &cfi->chips[chipnum]; - sect[sectors].offset = offset; + sect[sectors].adr = adr; sect[sectors].locked =do_ppb_xxlock ( map, &cfi->chips[chipnum], adr,0 ,DO_XXLOCK_ONEBLOCK_GETLOCK );
@@ -2713,7 +2713,7 @@ static int __maybe_unused cfi_ppb_unlock*/ for (i =0 ; i < sectors; i++) {if (sect[i].locked) -do_ppb_xxlock (map, sect[i].chip, sect[i].offset,0 , +do_ppb_xxlock (map, sect[i].chip, sect[i].adr,0 ,DO_XXLOCK_ONEBLOCK_LOCK ); }
Greg Kroah-Hartman
maintainerPATCH 55/105 mtd: cfi_cmdset_0002: Fix unlocking requests crossing a chip boudary
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joakim Tjernlund <[email protected]>
commit 0cd8116f172eed018907303dbff5c112690eeb91 upstream.
The "sector is in requested range" test used to determine whether sectors should be re-locked or not is done on a variable that is reset everytime we cross a chip boundary, which can lead to some blocks being re-locked while the caller expect them to be unlocked.
Fix the check to make sure this cannot happen.
--- drivers/mtd/chips/cfi_cmdset_0002.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/chips/cfi_cmdset_0002.c +1 -1
@@ -2667,7 +2667,7 @@ static int __maybe_unused cfi_ppb_unlock* sectors shall be unlocked, so lets keep their locking * status at "unlocked" (locked=0) for the final re-locking. */ -if ((adr < ofs) || (adr >= (ofs + len))) { +if ((offset < ofs) || (offset >= (ofs + len))) { sect[sectors].chip = &cfi->chips[chipnum]; sect[sectors].adr = adr; sect[sectors].locked = do_ppb_xxlock(
Greg Kroah-Hartman
maintainerPATCH 56/105 mtd: cfi_cmdset_0002: Avoid walking all chips when unlocking.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joakim Tjernlund <[email protected]>
commit f1ce87f6080b1dda7e7b1eda3da332add19d87b9 upstream.
cfi_ppb_unlock() walks all flash chips when unlocking sectors, avoid walking chips unaffected by the unlock operation.
--- drivers/mtd/chips/cfi_cmdset_0002.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mtd/chips/cfi_cmdset_0002.c +2 -0
@@ -2683,6 +2683,8 @@ static int __maybe_unused cfi_ppb_unlock i++;if (adr >> cfi->chipshift) { +if (offset >= (ofs + len)) +break ; adr =0 ; chipnum++;
Greg Kroah-Hartman
maintainerPATCH 57/105 MIPS: BCM47XX: Enable 74K Core ExternalSync for PCIe erratum
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tokunori Ikegami <[email protected]>
commit 2a027b47dba6b77ab8c8e47b589ae9bbc5ac6175 upstream.
The erratum and workaround are described by BCM5300X-ES300-RDS.pdf as below.
R10: PCIe Transactions Periodically Fail
Description: The BCM5300X PCIe does not maintain transaction ordering.
This may cause PCIe transaction failure.
Fix Comment: Add a dummy PCIe configuration read after a PCIe
configuration write to ensure PCIe configuration access ordering. Set ES bit of CP0 configu7 register to enable sync function so that the sync instruction is functional.
Resolution: hndpci.c: extpci_write_config()
hndmips.c: si_mips_init()
mipsinc.h CONF7_ES
This is fixed by the CFE MIPS bcmsi chipset driver also for BCM47XX. Also the dummy PCIe configuration read is already implemented in the Linux BCMA driver.
Enable ExternalSync in Config7 when CONFIG_BCMA_DRIVER_PCI_HOSTMODE=y too so that the sync instruction is externalised.
Patchwork: https://patchwork.linux-mips.org/patch/19461/
--- arch/mips/bcm47xx/setup.c | 6 ++++++ arch/mips/include/asm/mipsregs.h | 3 +++ 2 files changed, 9 insertions(+)
arch/mips/bcm47xx/setup.c +6 -0
@@ -249,6 +249,12 @@ static int __init bcm47xx_cpu_fixes(void*/ if (bcm47xx_bus.bcma.bus.chipinfo.id ==BCMA_CHIP_ID_BCM4706 ) cpu_wait =NULL ; + +/* +* BCM47XX Erratum "R10: PCIe Transactions Periodically Fail" +* Enable ExternalSync for sync instruction to take effect +*/ +set_c0_config7 (MIPS_CONF7_ES );break ;#endif }
arch/mips/include/asm/mipsregs.h +3 -0
@@ -605,6 +605,8 @@#define MIPS_CONF7_WII (_ULCAST_(1) << 31)#define MIPS_CONF7_RPS (_ULCAST_(1) << 2) +/* ExternalSync */ +#define MIPS_CONF7_ES (_ULCAST_(1) << 8)#define MIPS_CONF7_IAR (_ULCAST_(1) << 10)#define MIPS_CONF7_AR (_ULCAST_(1) << 16)
@@ -2012,6 +2014,7 @@ __BUILD_SET_C0(status) __BUILD_SET_C0(cause) __BUILD_SET_C0(config) __BUILD_SET_C0(config5) +__BUILD_SET_C0(config7) __BUILD_SET_C0(intcontrol) __BUILD_SET_C0(intctl) __BUILD_SET_C0(srsmap)
Greg Kroah-Hartman
maintainerPATCH 58/105 PCI: pciehp: Clear Presence Detect and Data Link Layer Status Changed on resume
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mika Westerberg <[email protected]>
commit 13c65840feab8109194f9490c9870587173cb29d upstream.
After a suspend/resume cycle the Presence Detect or Data Link Layer Status Changed bits might be set. If we don't clear them those events will not fire anymore and nothing happens for instance when a device is now hot-unplugged.
Fix this by clearing those bits in a newly introduced function pcie_reenable_notification(). This should be fine because immediately after, we check if the adapter is still present by reading directly from the status register.
--- drivers/pci/hotplug/pciehp.h | 2 +- drivers/pci/hotplug/pciehp_core.c | 2 +- drivers/pci/hotplug/pciehp_hpc.c | 13 ++++++++++++- 3 files changed, 14 insertions(+), 3 deletions(-)
drivers/pci/hotplug/pciehp.h +1 -1
@@ -134,7 +134,7 @@ struct controller *pcie_init(struct pcieint pcie_init_notification (struct controller *ctrl);int pciehp_enable_slot (struct slot *p_slot);int pciehp_disable_slot (struct slot *p_slot); -void pcie_enable_notification (struct controller *ctrl); +void pcie_reenable_notification (struct controller *ctrl);int pciehp_power_on_slot (struct slot *slot);void pciehp_power_off_slot (struct slot *slot);void pciehp_get_power_status (struct slot *slot,u8 *status);
drivers/pci/hotplug/pciehp_core.c +1 -1
@@ -295,7 +295,7 @@ static int pciehp_resume(struct pcie_dev ctrl =get_service_data (dev);/* reinitialize the chipset's event detection logic */ -pcie_enable_notification (ctrl); +pcie_reenable_notification (ctrl); slot = ctrl->slot;
drivers/pci/hotplug/pciehp_hpc.c +12 -1
@@ -628,7 +628,7 @@ static irqreturn_t pcie_isr(int irq, voireturn IRQ_HANDLED ; } -void pcie_enable_notification (struct controller *ctrl) +static void pcie_enable_notification (struct controller *ctrl) {u16 cmd, mask;
@@ -666,6 +666,17 @@ void pcie_enable_notification(struct con pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, cmd); } +void pcie_reenable_notification (struct controller *ctrl) +{ +/* +* Clear both Presence and Data Link Layer Changed to make sure +* those events still fire after we have re-enabled them. +*/ +pcie_capability_write_word (ctrl->pcie->port,PCI_EXP_SLTSTA , +PCI_EXP_SLTSTA_PDC |PCI_EXP_SLTSTA_DLLSC ); +pcie_enable_notification (ctrl); +} +static void pcie_disable_notification (struct controller *ctrl) {u16 mask;
Greg Kroah-Hartman
maintainerPATCH 59/105 MIPS: io: Add barrier after register read in inX()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit 18f3e95b90b28318ef35910d21c39908de672331 upstream.
While a barrier is present in the outX() functions before the register write, a similar barrier is missing in the inX() functions after the register read. This could allow memory accesses following inX() to observe stale data.
This patch is very similar to commit a1cc7034e33d12dc1 ("MIPS: io: Add barrier after register read in readX()"). Because war_io_reorder_wmb() is both used by writeX() and outX(), if readX() need a barrier then so does inX().
Patchwork: https://patchwork.linux-mips.org/patch/19516/
--- arch/mips/include/asm/io.h | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/include/asm/io.h +2 -0
@@ -411,6 +411,8 @@ static inline type pfx##in##bwlq##p(unsi __val = *__addr; \ slow; \ \ +/* prevent prefetching of coherent DMA data prematurely */ \ +rmb (); \ return pfx##ioswab##bwlq(__addr, __val); \ }
Greg Kroah-Hartman
maintainerPATCH 60/105 time: Make sure jiffies_to_msecs() preserves non-zero time periods
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit abcbcb80cd09cd40f2089d912764e315459b71f7 upstream.
For the common cases where 1000 is a multiple of HZ, or HZ is a multiple of 1000, jiffies_to_msecs() never returns zero when passed a non-zero time period.
However, if HZ > 1000 and not an integer multiple of 1000 (e.g. 1024 or 1200, as used on alpha and DECstation), jiffies_to_msecs() may return zero for small non-zero time periods. This may break code that relies on receiving back a non-zero value.
jiffies_to_usecs() does not need such a fix: one jiffy can only be less than one µs if HZ > 1000000, and such large values of HZ are already rejected at build time, twice:
- include/linux/jiffies.h does #error if HZ >= 12288,
- kernel/time/time.c has BUILD_BUG_ON(HZ > USEC_PER_SEC).
Broken since forever.
--- kernel/time/time.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/time/time.c +4 -2
@@ -28,6 +28,7 @@*/ #include <linux/export.h> +#include <linux/kernel.h> #include <linux/timex.h> #include <linux/capability.h> #include <linux/timekeeper_internal.h>
@@ -258,9 +259,10 @@ unsigned int jiffies_to_msecs(const unsireturn (j + (HZ /MSEC_PER_SEC ) -1 )/(HZ /MSEC_PER_SEC );#else # if BITS_PER_LONG ==32 -return (HZ_TO_MSEC_MUL32 * j) >>HZ_TO_MSEC_SHR32 ; +return (HZ_TO_MSEC_MUL32 * j + (1ULL <<HZ_TO_MSEC_SHR32 ) -1 ) >> +HZ_TO_MSEC_SHR32 ;# else -return (j *HZ_TO_MSEC_NUM ) /HZ_TO_MSEC_DEN ; +return DIV_ROUND_UP (j *HZ_TO_MSEC_NUM ,HZ_TO_MSEC_DEN );# endif #endif }
Greg Kroah-Hartman
maintainerPATCH 61/105 Btrfs: fix clone vs chattr NODATASUM race
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Omar Sandoval <[email protected]>
commit b5c40d598f5408bd0ca22dfffa82f03cd9433f23 upstream.
In btrfs_clone_files(), we must check the NODATASUM flag while the inodes are locked. Otherwise, it's possible that btrfs_ioctl_setflags() will change the flags after we check and we can end up with a party checksummed file.
The race window is only a few instructions in size, between the if and the locks which is:
3834 if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode))
3835 return -EISDIR;
where the setflags must be run and toggle the NODATASUM flag (provided the file size is 0). The clone will block on the inode lock, segflags takes the inode lock, changes flags, releases log and clone continues.
Not impossible but still needs a lot of bad luck to hit unintentionally.
--- fs/btrfs/ioctl.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/btrfs/ioctl.c +7 -5
@@ -3923,11 +3923,6 @@ static noinline long btrfs_ioctl_clone(sif (!(src_file.file->f_mode &FMODE_READ )) goto out_fput; -/* don't make the dst file partly checksummed */ -if ((BTRFS_I (src)->flags &BTRFS_INODE_NODATASUM ) != - (BTRFS_I (inode)->flags &BTRFS_INODE_NODATASUM )) - goto out_fput; - ret = -EISDIR ;if (S_ISDIR (src->i_mode) ||S_ISDIR (inode->i_mode)) goto out_fput;
@@ -3942,6 +3937,13 @@ static noinline long btrfs_ioctl_clone(smutex_lock (&src->i_mutex); } +/* don't make the dst file partly checksummed */ +if ((BTRFS_I (src)->flags &BTRFS_INODE_NODATASUM ) != + (BTRFS_I (inode)->flags &BTRFS_INODE_NODATASUM )) { + ret = -EINVAL ; + goto out_unlock; + } +/* determine range to clone */ ret = -EINVAL ;if (off + len > src->i_size || off + len < off)
Greg Kroah-Hartman
maintainerPATCH 62/105 iio:buffer: make length types match kfifo types
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martin Kelly <[email protected]>
commit c043ec1ca5baae63726aae32abbe003192bc6eec upstream.
Currently, we use int for buffer length and bytes_per_datum. However, kfifo uses unsigned int for length and size_t for element size. We need to make sure these matches or we will have bugs related to overflow (in the range between INT_MAX and UINT_MAX for length, for example).
In addition, set_bytes_per_datum uses size_t while bytes_per_datum is an int, which would cause bugs for large values of bytes_per_datum.
Change buffer length to use unsigned int and bytes_per_datum to use size_t.
[bwh: Backported to 4.4:
- Drop change to iio_dma_buffer_set_length()
- Adjust filename, context]
--- drivers/iio/buffer/kfifo_buf.c | 4 ++-- include/linux/iio/buffer.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/iio/buffer/kfifo_buf.c +2 -2
@@ -19,7 +19,7 @@ struct iio_kfifo {#define iio_to_kfifo (r) container_of(r, struct iio_kfifo, buffer)static inline int __iio_allocate_kfifo (struct iio_kfifo *buf, -int bytes_per_datum,int length) +size_t bytes_per_datum,unsigned int length) {if ((length ==0 ) || (bytes_per_datum ==0 ))return -EINVAL ;
@@ -71,7 +71,7 @@ static int iio_set_bytes_per_datum_kfiforeturn 0 ; } -static int iio_set_length_kfifo (struct iio_buffer *r,int length) +static int iio_set_length_kfifo (struct iio_buffer *r,unsigned int length) {/* Avoid an invalid state */ if (length <2 )
include/linux/iio/buffer.h +3 -3
@@ -49,7 +49,7 @@ struct iio_buffer_access_funcs {int (*request_update)(struct iio_buffer *buffer);int (*set_bytes_per_datum)(struct iio_buffer *buffer,size_t bpd); -int (*set_length)(struct iio_buffer *buffer,int length); +int (*set_length)(struct iio_buffer *buffer,unsigned int length);void (*release)(struct iio_buffer *buffer);
@@ -78,8 +78,8 @@ struct iio_buffer_access_funcs {* @watermark: [INTERN] number of datums to wait for poll/read. */ struct iio_buffer { -int length; -int bytes_per_datum; +unsigned int length; +size_t bytes_per_datum;struct attribute_group *scan_el_attrs;long *scan_mask;bool scan_timestamp;
Greg Kroah-Hartman
maintainerPATCH 63/105 scsi: qla2xxx: Fix setting lower transfer speed if GPSC fails
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Himanshu Madhani <[email protected]>
commit 413c2f33489b134e3cc65d9c3ff7861e8fdfe899 upstream.
This patch prevents driver from setting lower default speed of 1 GB/sec, if the switch does not support Get Port Speed Capabilities (GPSC) command. Setting this default speed results into much lower write performance for large sequential WRITE. This patch modifies driver to check for gpsc_supported flags and prevents driver from issuing MBC_SET_PORT_PARAM (001Ah) to set default speed of 1 GB/sec. If driver does not send this mailbox command, firmware assumes maximum supported link speed and will operate at the max speed.
--- drivers/scsi/qla2xxx/qla_init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/qla2xxx/qla_init.c +2 -1
@@ -3261,7 +3261,8 @@ qla2x00_iidma_fcport(scsi_qla_host_t *vhreturn ;if (fcport->fp_speed ==PORT_SPEED_UNKNOWN || - fcport->fp_speed > ha->link_data_rate) + fcport->fp_speed > ha->link_data_rate || + !ha->flags.gpsc_supported)return ; rval = qla2x00_set_idma_speed(vha, fcport->loop_id, fcport->fp_speed,
Greg Kroah-Hartman
maintainerPATCH 64/105 scsi: zfcp: fix missing SCSI trace for result of eh_host_reset_handler
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit df30781699f53e4fd4c494c6f7dd16e3d5c21d30 upstream.
For problem determination we need to see whether and why we were successful or not. This allows deduction of scsi_eh escalation.
Example trace record formatted with zfcpdbf from s390-tools:
Timestamp : ...
Area : SCSI
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1
Tag : schrh_r SCSI host reset handler result
Request ID : 0x0000000000000000 none (invalid)
SCSI ID : 0xffffffff none (invalid)
SCSI LUN : 0xffffffff none (invalid)
SCSI LUN high : 0xffffffff none (invalid)
SCSI result : 0x00002002 field re-used for midlayer value: SUCCESS
or in other cases: 0x2009 == FAST_IO_FAIL
SCSI retries : 0xff none (invalid)
SCSI allowed : 0xff none (invalid)
SCSI scribble : 0xffffffffffffffff none (invalid)
SCSI opcode : ffffffff ffffffff ffffffff ffffffff none (invalid)
FCP rsp inf cod: 0xff none (invalid)
FCP rsp IU : 00000000 00000000 00000000 00000000 none (invalid)
00000000 00000000
v2.6.35 commit a1dbfddd02d2 ("[SCSI] zfcp: Pass return code from fc_block_scsi_eh to scsi eh") introduced the first return with something other than the previously hardcoded single SUCCESS return path.
--- drivers/s390/scsi/zfcp_dbf.c | 40 ++++++++++++++++++++++++++++++++++++++++ drivers/s390/scsi/zfcp_ext.h | 2 ++ drivers/s390/scsi/zfcp_scsi.c | 11 ++++++----- 3 files changed, 48 insertions(+), 5 deletions(-)
drivers/s390/scsi/zfcp_dbf.c +40 -0
@@ -625,6 +625,46 @@ void zfcp_dbf_scsi(char *tag, int level,spin_unlock_irqrestore (&dbf->scsi_lock, flags); } +/** +* zfcp_dbf_scsi_eh() - Trace event for special cases of scsi_eh callbacks. +* @tag: Identifier for event. +* @adapter: Pointer to zfcp adapter as context for this event. +* @scsi_id: SCSI ID/target to indicate scope of task management function (TMF). +* @ret: Return value of calling function. +* +* This SCSI trace variant does not depend on any of: +* scsi_cmnd, zfcp_fsf_req, scsi_device. +*/ +void zfcp_dbf_scsi_eh (char *tag,struct zfcp_adapter *adapter, +unsigned int scsi_id,int ret) +{ +struct zfcp_dbf *dbf = adapter->dbf; +struct zfcp_dbf_scsi *rec = &dbf->scsi_buf; +unsigned long flags; +static int const level =1 ; + +if (unlikely (!debug_level_enabled (adapter->dbf->scsi, level))) +return ; + +spin_lock_irqsave (&dbf->scsi_lock, flags); +memset (rec,0 ,sizeof (*rec)); + +memcpy (rec->tag, tag,ZFCP_DBF_TAG_LEN ); + rec->id =ZFCP_DBF_SCSI_CMND ; + rec->scsi_result = ret;/* re-use field, int is 4 bytes and fits */ + rec->scsi_retries = ~0 ; + rec->scsi_allowed = ~0 ; + rec->fcp_rsp_info = ~0 ; + rec->scsi_id = scsi_id; + rec->scsi_lun = (u32 )ZFCP_DBF_INVALID_LUN ; + rec->scsi_lun_64_hi = (u32)(ZFCP_DBF_INVALID_LUN >>32 ); + rec->host_scribble = ~0 ; +memset (rec->scsi_opcode,0xff ,ZFCP_DBF_SCSI_OPCODE ); + +debug_event (dbf->scsi, level, rec,sizeof (*rec)); +spin_unlock_irqrestore (&dbf->scsi_lock, flags); +} +static debug_info_t *zfcp_dbf_reg (const char *name,int size,int rec_size) {struct debug_info *d;
drivers/s390/scsi/zfcp_ext.h +2 -0
@@ -52,6 +52,8 @@ extern void zfcp_dbf_san_res(char *, strextern void zfcp_dbf_san_in_els (char *,struct zfcp_fsf_req *);extern void zfcp_dbf_scsi (char *,int ,struct scsi_cmnd *,struct zfcp_fsf_req *); +extern void zfcp_dbf_scsi_eh (char *tag,struct zfcp_adapter *adapter, +unsigned int scsi_id,int ret);/* zfcp_erp.c */ extern void zfcp_erp_set_adapter_status (struct zfcp_adapter *,u32 );
drivers/s390/scsi/zfcp_scsi.c +6 -5
@@ -322,15 +322,16 @@ static int zfcp_scsi_eh_host_reset_handl {struct zfcp_scsi_dev *zfcp_sdev =sdev_to_zfcp (scpnt->device);struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; -int ret; +int ret =SUCCESS , fc_ret;zfcp_erp_adapter_reopen (adapter,0 ,"schrh_1" );zfcp_erp_wait (adapter); - ret =fc_block_scsi_eh (scpnt); -if (ret) -return ret; + fc_ret =fc_block_scsi_eh (scpnt); +if (fc_ret) + ret = fc_ret; -return SUCCESS ; +zfcp_dbf_scsi_eh ("schrh_r" , adapter, ~0 , ret); +return ret; }struct scsi_transport_template *zfcp_scsi_transport_template;
Greg Kroah-Hartman
maintainerPATCH 65/105 scsi: zfcp: fix missing SCSI trace for retry of abort / scsi_eh TMF
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit 81979ae63e872ef650a7197f6ce6590059d37172 upstream.
We already have a SCSI trace for the end of abort and scsi_eh TMF. Due to zfcp_erp_wait() and fc_block_scsi_eh() time can pass between the start of our eh callback and an actual send/recv of an abort / TMF request. In order to see the temporal sequence including any abort / TMF send retries, add a trace before the above two blocking functions. This supports problem determination with scsi_eh and parallel zfcp ERP.
No need to explicitly trace the beginning of our eh callback, since we typically can send an abort / TMF and see its HBA response (in the worst case, it's a pseudo response on dismiss all of adapter recovery, e.g. due to an FSF request timeout [fsrth_1] of the abort / TMF). If we cannot send, we now get a trace record for the first "abrt_wt" or "[lt]r_wait" which denotes almost the beginning of the callback.
No need to explicitly trace the wakeup after the above two blocking functions because the next retry loop causes another trace in any case and that is sufficient.
Example trace records formatted with zfcpdbf from s390-tools:
Timestamp : ...
Area : SCSI
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1
Tag : abrt_wt abort, before zfcp_erp_wait()
Request ID : 0x0000000000000000 none (invalid)
SCSI ID : 0x<scsi_id>
SCSI LUN : 0x<scsi_lun>
SCSI LUN high : 0x<scsi_lun_high>
SCSI result : 0x<scsi_result_of_cmd_to_be_aborted>
SCSI retries : 0x<retries_of_cmd_to_be_aborted>
SCSI allowed : 0x<allowed_retries_of_cmd_to_be_aborted>
SCSI scribble : 0x<req_id_of_cmd_to_be_aborted>
SCSI opcode : <CDB_of_cmd_to_be_aborted>
FCP rsp inf cod: 0x.. none (invalid)
FCP rsp IU : ... none (invalid)
Timestamp : ...
Area : SCSI
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1
Tag : lr_wait LUN reset, before zfcp_erp_wait()
Request ID : 0x0000000000000000 none (invalid)
SCSI ID : 0x<scsi_id>
SCSI LUN : 0x<scsi_lun>
SCSI LUN high : 0x<scsi_lun_high>
SCSI result : 0x... unrelated
SCSI retries : 0x.. unrelated
SCSI allowed : 0x.. unrelated
SCSI scribble : 0x... unrelated
SCSI opcode : ... unrelated
FCP rsp inf cod: 0x.. none (invalid)
FCP rsp IU : ... none (invalid)
--- drivers/s390/scsi/zfcp_scsi.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/s390/scsi/zfcp_scsi.c +2 -0
@@ -180,6 +180,7 @@ static int zfcp_scsi_eh_abort_handler(stif (abrt_req)break ; +zfcp_dbf_scsi_abort ("abrt_wt" , scpnt,NULL );zfcp_erp_wait (adapter); ret =fc_block_scsi_eh (scpnt);if (ret) {
@@ -276,6 +277,7 @@ static int zfcp_task_mgmt_function(strucif (fsf_req)break ; +zfcp_dbf_scsi_devreset ("wait" , scpnt, tm_flags,NULL );zfcp_erp_wait (adapter); ret =fc_block_scsi_eh (scpnt);if (ret) {
Greg Kroah-Hartman
maintainerPATCH 66/105 scsi: zfcp: fix misleading REC trigger trace where erp_action setup failed
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit 512857a795cbbda5980efa4cdb3c0b6602330408 upstream.
If a SCSI device is deleted during scsi_eh host reset, we cannot get a reference to the SCSI device anymore since scsi_device_get returns !=0 by design. Assuming the recovery of adapter and port(s) was successful, zfcp_erp_strategy_followup_success() attempts to trigger a LUN reset for the half-gone SCSI device. Unfortunately, it causes the following confusing trace record which states that zfcp will do a LUN recovery as "ERP need" is ZFCP_ERP_ACTION_REOPEN_LUN == 1 and equals "ERP want".
Old example trace record formatted with zfcpdbf from s390-tools:
Tag: : ersfs_3 ERP, trigger, unit reopen, port reopen succeeded
LUN : 0x<FCP_LUN>
WWPN : 0x<WWPN>D_ID : 0x<N_Port-ID>
Adapter status : 0x5400050b
Port status : 0x54000001
LUN status : 0x40000000 ZFCP_STATUS_COMMON_RUNNING
but not ZFCP_STATUS_COMMON_UNBLOCKED as it was closed on close part of adapter reopen
ERP want : 0x01
ERP need : 0x01 misleading
However, zfcp_erp_setup_act() returns NULL as it cannot get the reference. Hence, zfcp_erp_action_enqueue() takes an early goto out and _NO_ recovery actually happens.
We always do want the recovery trigger trace record even if no erp_action could be enqueued as in this case. For other cases where we did not enqueue an erp_action, 'need' has always been zero to indicate this. In order to indicate above goto out, introduce an eyecatcher "flag" to mark the "ERP need" as 'not needed' but still keep the information which erp_action type, that zfcp_erp_required_act() had decided upon, is needed. 0xc_ is chosen to be visibly different from 0x0_ in "ERP want".
New example trace record formatted with zfcpdbf from s390-tools:
Tag: : ersfs_3 ERP, trigger, unit reopen, port reopen succeeded
LUN : 0x<FCP_LUN>
WWPN : 0x<WWPN>D_ID : 0x<N_Port-ID>
Adapter status : 0x5400050b
Port status : 0x54000001
LUN status : 0x40000000
ERP want : 0x01
ERP need : 0xc1 would need LUN ERP, but no action set up
^
Before v2.6.38 commit ae0904f60fab ("[SCSI] zfcp: Redesign of the debug tracing for recovery actions.") we could detect this case because the "erp_action" field in the trace was NULL. The rework removed erp_action as argument and field from the trace.
This patch here is for tracing. A fix to allow LUN recovery in the case at hand is a topic for a separate patch.
See also commit fdbd1c5e27da ("[SCSI] zfcp: Allow running unit/LUN shutdown without acquiring reference") for a similar case and background info.
--- drivers/s390/scsi/zfcp_erp.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
drivers/s390/scsi/zfcp_erp.c +15 -1
@@ -34,11 +34,23 @@ enum zfcp_erp_steps { ZFCP_ERP_STEP_LUN_OPENING = 0x2000, }; +/** +* enum zfcp_erp_act_type - Type of ERP action object. +* @ZFCP_ERP_ACTION_REOPEN_LUN: LUN recovery. +* @ZFCP_ERP_ACTION_REOPEN_PORT: Port recovery. +* @ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: Forced port recovery. +* @ZFCP_ERP_ACTION_REOPEN_ADAPTER: Adapter recovery. +* @ZFCP_ERP_ACTION_NONE: Eyecatcher pseudo flag to bitwise or-combine with +* either of the other enum values. +* Used to indicate that an ERP action could not be +* set up despite a detected need for some recovery. +*/ enum zfcp_erp_act_type {ZFCP_ERP_ACTION_REOPEN_LUN =1 ,ZFCP_ERP_ACTION_REOPEN_PORT =2 ,ZFCP_ERP_ACTION_REOPEN_PORT_FORCED =3 ,ZFCP_ERP_ACTION_REOPEN_ADAPTER =4 , +ZFCP_ERP_ACTION_NONE =0xc0 , };enum zfcp_erp_act_state {
@@ -256,8 +268,10 @@ static int zfcp_erp_action_enqueue(int w goto out; act =zfcp_erp_setup_act (need, act_status, adapter, port, sdev); -if (!act) +if (!act) { + need |=ZFCP_ERP_ACTION_NONE ;/* marker for trace */ goto out; + }atomic_or (ZFCP_STATUS_ADAPTER_ERP_PENDING , &adapter->status); ++adapter->erp_total_count;list_add_tail (&act->list, &adapter->erp_ready_head);
Greg Kroah-Hartman
maintainerPATCH 67/105 scsi: zfcp: fix missing REC trigger trace on terminate_rport_io early return
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit 96d9270499471545048ed8a6d7f425a49762283d upstream.
get_device() and its internally used kobject_get() only return NULL if they get passed NULL as argument. zfcp_get_port_by_wwpn() loops over adapter->port_list so the iteration variable port is always non-NULL. Struct device is embedded in struct zfcp_port so &port->dev is always non-NULL. This is the argument to get_device(). However, if we get an fc_rport in terminate_rport_io() for which we cannot find a match within zfcp_get_port_by_wwpn(), the latter can return NULL. v2.6.30 commit 70932935b61e ("[SCSI] zfcp: Fix oops when port disappears") introduced an early return without adding a trace record for this case. Even if we don't need recovery in this case, for debugging we should still see that our callback was invoked originally by scsi_transport_fc.
Example trace record formatted with zfcpdbf from s390-tools:
Timestamp : ...
Area : REC
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1
Tag : sctrpin SCSI terminate rport I/O, no zfcp port
LUN : 0xffffffffffffffff none (invalid)
WWPN : 0x<wwpn> WWPND_ID : 0x<n_port_id> N_Port-ID
Adapter status : 0x...
Port status : 0xffffffff unknown (-1)
LUN status : 0x00000000 none (invalid)
Ready count : 0x...
Running count : 0x...
ERP want : 0x03 ZFCP_ERP_ACTION_REOPEN_PORT_FORCED
ERP need : 0xc0 ZFCP_ERP_ACTION_NONE
--- drivers/s390/scsi/zfcp_erp.c | 20 ++++++++++++++++++++ drivers/s390/scsi/zfcp_ext.h | 3 +++ drivers/s390/scsi/zfcp_scsi.c | 5 +++++ 3 files changed, 28 insertions(+)
drivers/s390/scsi/zfcp_erp.c +20 -0
@@ -282,6 +282,26 @@ static int zfcp_erp_action_enqueue(int wreturn retval; } +void zfcp_erp_port_forced_no_port_dbf (char *id,struct zfcp_adapter *adapter, +u64 port_name,u32 port_id) +{ +unsigned long flags; +static /* don't waste stack */ struct zfcp_port tmpport; + +write_lock_irqsave (&adapter->erp_lock, flags); +/* Stand-in zfcp port with fields just good enough for +* zfcp_dbf_rec_trig() and zfcp_dbf_set_common(). +* Under lock because tmpport is static. +*/ +atomic_set (&tmpport.status,-1 );/* unknown */ + tmpport.wwpn = port_name; + tmpport.d_id = port_id; +zfcp_dbf_rec_trig (id, adapter, &tmpport,NULL , +ZFCP_ERP_ACTION_REOPEN_PORT_FORCED , +ZFCP_ERP_ACTION_NONE ); +write_unlock_irqrestore (&adapter->erp_lock, flags); +} +static int _zfcp_erp_adapter_reopen (struct zfcp_adapter *adapter,int clear_mask,char *id) {
drivers/s390/scsi/zfcp_ext.h +3 -0
@@ -58,6 +58,9 @@ extern void zfcp_dbf_scsi_eh(char *tag,/* zfcp_erp.c */ extern void zfcp_erp_set_adapter_status (struct zfcp_adapter *,u32 );extern void zfcp_erp_clear_adapter_status (struct zfcp_adapter *,u32 ); +extern void zfcp_erp_port_forced_no_port_dbf (char *id, +struct zfcp_adapter *adapter, +u64 port_name,u32 port_id);extern void zfcp_erp_adapter_reopen (struct zfcp_adapter *,int ,char *);extern void zfcp_erp_adapter_shutdown (struct zfcp_adapter *,int ,char *);extern void zfcp_erp_set_port_status (struct zfcp_port *,u32 );
drivers/s390/scsi/zfcp_scsi.c +5 -0
@@ -603,6 +603,11 @@ static void zfcp_scsi_terminate_rport_ioif (port) {zfcp_erp_port_forced_reopen (port,0 ,"sctrpi1" );put_device (&port->dev); + }else { +zfcp_erp_port_forced_no_port_dbf ( +"sctrpin" , adapter, + rport->port_name/* zfcp_scsi_rport_register */ , + rport->port_id/* zfcp_scsi_rport_register */ ); } }
Greg Kroah-Hartman
maintainerPATCH 68/105 scsi: zfcp: fix missing REC trigger trace on terminate_rport_io for ERP_FAILED
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit d70aab55924b44f213fec2b900b095430b33eec6 upstream.
For problem determination we always want to see when we were invoked on the terminate_rport_io callback whether we perform something or not.
Temporal event sequence of interest with a long fast_io_fail_tmo of 27 sec:
loose remote port
t workqueue
[s] zfcp_q_<dev> IRQ zfcperp<dev>
=== ================== =================== ============================
0 recv RSCN
q p.test_link_work
block rport
start fast_io_fail_tmo
send ADISC ELS
4 recv ADISC fail
block zfcp_port
port forced reopen send open port
12 recv open port fail
q p.gid_pn_work zfcp_erp_wakeup (zfcp_erp_wait would return)
GID_PN fail
Before this point, we got a SCSI trace with tag "sctrpi1" on fast_io_fail, e.g. with the typical 5 sec setting.
port.status |= ERP_FAILED
If fast_io_fail_tmo triggers after this point, we missed a SCSI trace.
workqueue
fc_dl_<host>
================== 27 fc_timeout_fail_rport_io
fc_terminate_rport_io
zfcp_scsi_terminate_rport_io
zfcp_erp_port_forced_reopen
_zfcp_erp_port_forced_reopen
if (port.status & ERP_FAILED)
return;
Therefore, write a trace before above early return.
Example trace record formatted with zfcpdbf from s390-tools:
Timestamp : ...
Area : REC
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1 ZFCP_DBF_REC_TRIG
Tag : sctrpi1 SCSI terminate rport I/O
LUN : 0xffffffffffffffff none (invalid)
WWPN : 0x<wwpn>D_ID : 0x<n_port_id>
Adapter status : 0x...
Port status : 0x...
LUN status : 0x00000000 none (invalid)
Ready count : 0x...
Running count : 0x...
ERP want : 0x03 ZFCP_ERP_ACTION_REOPEN_PORT_FORCED
ERP need : 0xe0 ZFCP_ERP_ACTION_FAILED
--- drivers/s390/scsi/zfcp_erp.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/s390/scsi/zfcp_erp.c +11 -2
@@ -41,9 +41,13 @@ enum zfcp_erp_steps {* @ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: Forced port recovery. * @ZFCP_ERP_ACTION_REOPEN_ADAPTER: Adapter recovery. * @ZFCP_ERP_ACTION_NONE: Eyecatcher pseudo flag to bitwise or-combine with -* either of the other enum values. +* either of the first four enum values. * Used to indicate that an ERP action could not be * set up despite a detected need for some recovery. +* @ZFCP_ERP_ACTION_FAILED: Eyecatcher pseudo flag to bitwise or-combine with +* either of the first four enum values. +* Used to indicate that ERP not needed because +* the object has ZFCP_STATUS_COMMON_ERP_FAILED. */ enum zfcp_erp_act_type {ZFCP_ERP_ACTION_REOPEN_LUN =1 ,
@@ -51,6 +55,7 @@ enum zfcp_erp_act_type {ZFCP_ERP_ACTION_REOPEN_PORT_FORCED =3 ,ZFCP_ERP_ACTION_REOPEN_ADAPTER =4 ,ZFCP_ERP_ACTION_NONE =0xc0 , + ZFCP_ERP_ACTION_FAILED = 0xe0, }; enum zfcp_erp_act_state {
@@ -378,8 +383,12 @@ static void _zfcp_erp_port_forced_reopenzfcp_erp_port_block (port, clear);zfcp_scsi_schedule_rport_block (port); -if (atomic_read (&port->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) +if (atomic_read (&port->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) { +zfcp_dbf_rec_trig (id, port->adapter, port,NULL , +ZFCP_ERP_ACTION_REOPEN_PORT_FORCED , +ZFCP_ERP_ACTION_FAILED );return ; + }zfcp_erp_action_enqueue (ZFCP_ERP_ACTION_REOPEN_PORT_FORCED , port->adapter, port,NULL , id,0 );
Greg Kroah-Hartman
maintainerPATCH 69/105 scsi: zfcp: fix missing REC trigger trace for all objects in ERP_FAILED
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit 8c3d20aada70042a39c6a6625be037c1472ca610 upstream.
That other commit introduced an inconsistency because it would trace on ERP_FAILED for all callers of port forced reopen triggers (not just terminate_rport_io), but it would not trace on ERP_FAILED for all callers of other ERP triggers such as adapter, port regular, LUN.
Therefore, generalize that other commit. zfcp_erp_action_enqueue() already had two early outs which re-used the one zfcp_dbf_rec_trig() call. All ERP trigger functions finally run through zfcp_erp_action_enqueue(). So move the special handling for ZFCP_STATUS_COMMON_ERP_FAILED into zfcp_erp_action_enqueue() and add another early out with new trace marker for pseudo ERP need in this case. This removes all early returns from all ERP trigger functions so we always end up at zfcp_dbf_rec_trig().
Example trace record formatted with zfcpdbf from s390-tools:
Timestamp : ...
Area : REC
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1 ZFCP_DBF_REC_TRIG
Tag : .......
LUN : 0x...
WWPN : 0x...D_ID : 0x...
Adapter status : 0x...
Port status : 0x...
LUN status : 0x...
Ready count : 0x...
Running count : 0x...
ERP want : 0x0. ZFCP_ERP_ACTION_REOPEN_...
ERP need : 0xe0 ZFCP_ERP_ACTION_FAILED
--- drivers/s390/scsi/zfcp_erp.c | 79 +++++++++++++++++++++++++++---------------- 1 file changed, 51 insertions(+), 28 deletions(-)
drivers/s390/scsi/zfcp_erp.c +51 -28
@@ -142,6 +142,49 @@ static void zfcp_erp_action_dismiss_adap } } +static int zfcp_erp_handle_failed (int want,struct zfcp_adapter *adapter, +struct zfcp_port *port, +struct scsi_device *sdev) +{ +int need = want; +struct zfcp_scsi_dev *zsdev; + +switch (want) { +case ZFCP_ERP_ACTION_REOPEN_LUN : + zsdev =sdev_to_zfcp (sdev); +if (atomic_read (&zsdev->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) + need =0 ; +break ; +case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED : +if (atomic_read (&port->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) + need =0 ; +break ; +case ZFCP_ERP_ACTION_REOPEN_PORT : +if (atomic_read (&port->status) & +ZFCP_STATUS_COMMON_ERP_FAILED ) { + need =0 ; +/* ensure propagation of failed status to new devices */ +zfcp_erp_set_port_status ( + port,ZFCP_STATUS_COMMON_ERP_FAILED ); + } +break ; +case ZFCP_ERP_ACTION_REOPEN_ADAPTER : +if (atomic_read (&adapter->status) & +ZFCP_STATUS_COMMON_ERP_FAILED ) { + need =0 ; +/* ensure propagation of failed status to new devices */ +zfcp_erp_set_adapter_status ( + adapter,ZFCP_STATUS_COMMON_ERP_FAILED ); + } +break ; +default : + need =0 ; +break ; + } + +return need; +} +static int zfcp_erp_required_act (int want,struct zfcp_adapter *adapter,struct zfcp_port *port,struct scsi_device *sdev)
@@ -265,6 +308,12 @@ static int zfcp_erp_action_enqueue(int wint retval =1 , need;struct zfcp_erp_action *act; + need =zfcp_erp_handle_failed (want, adapter, port, sdev); +if (!need) { + need =ZFCP_ERP_ACTION_FAILED ;/* marker for trace */ + goto out; + } +if (!adapter->erp_thread)return -EIO ;
@@ -313,12 +362,6 @@ static int _zfcp_erp_adapter_reopen(struzfcp_erp_adapter_block (adapter, clear_mask);zfcp_scsi_schedule_rports_block (adapter); -/* ensure propagation of failed status to new devices */ -if (atomic_read (&adapter->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) { -zfcp_erp_set_adapter_status (adapter, -ZFCP_STATUS_COMMON_ERP_FAILED ); -return -EIO ; - }return zfcp_erp_action_enqueue (ZFCP_ERP_ACTION_REOPEN_ADAPTER , adapter,NULL ,NULL , id,0 ); }
@@ -337,12 +380,8 @@ void zfcp_erp_adapter_reopen(struct zfcpzfcp_scsi_schedule_rports_block (adapter);write_lock_irqsave (&adapter->erp_lock, flags); -if (atomic_read (&adapter->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) -zfcp_erp_set_adapter_status (adapter, -ZFCP_STATUS_COMMON_ERP_FAILED ); -else -zfcp_erp_action_enqueue (ZFCP_ERP_ACTION_REOPEN_ADAPTER , adapter, -NULL ,NULL , id,0 ); +zfcp_erp_action_enqueue (ZFCP_ERP_ACTION_REOPEN_ADAPTER , adapter, +NULL ,NULL , id,0 );write_unlock_irqrestore (&adapter->erp_lock, flags); }
@@ -383,13 +422,6 @@ static void _zfcp_erp_port_forced_reopenzfcp_erp_port_block (port, clear);zfcp_scsi_schedule_rport_block (port); -if (atomic_read (&port->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) { -zfcp_dbf_rec_trig (id, port->adapter, port,NULL , -ZFCP_ERP_ACTION_REOPEN_PORT_FORCED , -ZFCP_ERP_ACTION_FAILED ); -return ; - } -zfcp_erp_action_enqueue (ZFCP_ERP_ACTION_REOPEN_PORT_FORCED , port->adapter, port,NULL , id,0 ); }
@@ -415,12 +447,6 @@ static int _zfcp_erp_port_reopen(structzfcp_erp_port_block (port, clear);zfcp_scsi_schedule_rport_block (port); -if (atomic_read (&port->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) { -/* ensure propagation of failed status to new devices */ -zfcp_erp_set_port_status (port,ZFCP_STATUS_COMMON_ERP_FAILED ); -return -EIO ; - } -return zfcp_erp_action_enqueue (ZFCP_ERP_ACTION_REOPEN_PORT , port->adapter, port,NULL , id,0 ); }
@@ -460,9 +486,6 @@ static void _zfcp_erp_lun_reopen(structzfcp_erp_lun_block (sdev, clear); -if (atomic_read (&zfcp_sdev->status) &ZFCP_STATUS_COMMON_ERP_FAILED ) -return ; -zfcp_erp_action_enqueue (ZFCP_ERP_ACTION_REOPEN_LUN , adapter, zfcp_sdev->port, sdev, id, act_status); }
Greg Kroah-Hartman
maintainerPATCH 70/105 scsi: zfcp: fix missing REC trigger trace on enqueue without ERP thread
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit 6a76550841d412330bd86aed3238d1888ba70f0e upstream.
Example trace record formatted with zfcpdbf from s390-tools:
Timestamp : ...
Area : REC
Subarea : 00
Level : 1
Exception : -
CPU ID : ..
Caller : 0x...
Record ID : 1 ZFCP_DBF_REC_TRIG
Tag : .......
LUN : 0x...
WWPN : 0x...D_ID : 0x...
Adapter status : 0x...
Port status : 0x...
LUN status : 0x...
Ready count : 0x...
Running count : 0x...
ERP want : 0x0. ZFCP_ERP_ACTION_REOPEN_...
ERP need : 0xc0 ZFCP_ERP_ACTION_NONE
--- drivers/s390/scsi/zfcp_erp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/s390/scsi/zfcp_erp.c +5 -2
@@ -314,8 +314,11 @@ static int zfcp_erp_action_enqueue(int w goto out; } -if (!adapter->erp_thread) -return -EIO ; +if (!adapter->erp_thread) { + need =ZFCP_ERP_ACTION_NONE ;/* marker for trace */ + retval = -EIO ; + goto out; + } need =zfcp_erp_required_act (want, adapter, port, sdev);if (!need)
Greg Kroah-Hartman
maintainerPATCH 71/105 linvdimm, pmem: Preserve read-only setting for pmem devices
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Elliott <[email protected]>
commit 254a4cd50b9fe2291a12b8902e08e56dcc4e9b10 upstream.
The pmem driver does not honor a forced read-only setting for very long:
$ blockdev --setro /dev/pmem0 $ blockdev --getro /dev/pmem0 1
followed by various commands like these:
$ blockdev --rereadpt /dev/pmem0 or $ mkfs.ext4 /dev/pmem0
results in this in the kernel serial log:
nd_pmem namespace0.0: region0 read-write, marking pmem0 read-write
with the read-only setting lost:
$ blockdev --getro /dev/pmem0 0
That's from bus.c nvdimm_revalidate_disk(), which always applies the setting from nd_region (which is initially based on the ACPI NFIT NVDIMM state flags not_armed bit).
In contrast, commit 20bd1d026aac ("scsi: sd: Keep disk read-only when re-reading partition") fixed this issue for SCSI devices to preserve the previous setting if it was set to read-only.
This patch modifies bus.c to preserve any previous read-only setting. It also eliminates the kernel serial log print except for cases where read-write is changed to read-only, so it doesn't print read-only to read-only non-changes.
--- drivers/nvdimm/bus.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/nvdimm/bus.c +9 -5
@@ -237,14 +237,18 @@ int nvdimm_revalidate_disk(struct gendis {struct device *dev = disk->driverfs_dev;struct nd_region *nd_region =to_nd_region (dev->parent); -const char *pol = nd_region->ro ?"only" :"write" ; +int disk_ro =get_disk_ro (disk); -if (nd_region->ro ==get_disk_ro (disk)) +/* +* Upgrade to read-only if the region is read-only preserve as +* read-only if the disk is already read-only. +*/ +if (disk_ro || nd_region->ro == disk_ro)return 0 ; -dev_info (dev,"%s read-%s, marking %s read-%s\n" , -dev_name (&nd_region->dev), pol, disk->disk_name, pol); -set_disk_ro (disk, nd_region->ro); +dev_info (dev,"%s read-only, marking %s read-only\n" , +dev_name (&nd_region->dev), disk->disk_name); +set_disk_ro (disk,1 );return 0 ;
Greg Kroah-Hartman
maintainerPATCH 72/105 md: fix two problems with setting the "re-add" device state.
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: NeilBrown <[email protected]>
commit 011abdc9df559ec75779bb7c53a744c69b2a94c6 upstream.
If "re-add" is written to the "state" file for a device which is faulty, this has an effect similar to removing and re-adding the device. It should take up the same slot in the array that it previously had, and an accelerated (e.g. bitmap-based) rebuild should happen.
The slot that "it previously had" is determined by rdev->saved_raid_disk.
However this is not set when a device fails (only when a device is added), and it is cleared when resync completes.
This means that "re-add" will normally work once, but may not work a second time.
This patch includes two fixes.
1/ when a device fails, record the ->raid_disk value in
->saved_raid_disk before clearing ->raid_disk
2/ when "re-add" is written to a device for which
->saved_raid_disk is not set, fail.I think this is suitable for stable as it can cause re-adding a device to be forced to do a full resync which takes a lot longer and so puts data at more risk.
--- drivers/md/md.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/md/md.c +3 -1
@@ -2690,7 +2690,8 @@ state_store(struct md_rdev *rdev, const err =0 ; } }else if (cmd_match (buf,"re-add" )) { -if (test_bit (Faulty, &rdev->flags) && (rdev->raid_disk ==-1 )) { +if (test_bit (Faulty, &rdev->flags) && (rdev->raid_disk ==-1 ) && + rdev->saved_raid_disk >=0 ) {/* clear_bit is performed _after_ all the devices * have their local Faulty bit cleared. If any writes * happen in the meantime in the local node, they
@@ -8153,6 +8154,7 @@ static int remove_and_add_spares(structif (mddev->pers->hot_remove_disk ( mddev, rdev) ==0 ) {sysfs_unlink_rdev (mddev, rdev); + rdev->saved_raid_disk = rdev->raid_disk; rdev->raid_disk =-1 ; removed++; }
Greg Kroah-Hartman
maintainerPATCH 73/105 ubi: fastmap: Cancel work upon detach
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 6e7d80161066c99d12580d1b985cb1408bb58cf1 upstream.
Ben Hutchings pointed out that 29b7a6fa1ec0 ("ubi: fastmap: Don't flush fastmap work on detach") does not really fix the problem, it just reduces the risk to hit the race window where fastmap work races against free()'ing ubi->volumes[].
The correct approach is making sure that no more fastmap work is in progress before we free ubi data structures.
So we cancel fastmap work right after the ubi background thread is stopped.
By setting ubi->thread_enabled to zero we make sure that no further work tries to wake the thread.
--- drivers/mtd/ubi/build.c | 3 +++ drivers/mtd/ubi/wl.c | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/mtd/ubi/build.c +3 -0
@@ -1132,6 +1132,9 @@ int ubi_detach_mtd_dev(int ubi_num, int*/ get_device (&ubi->dev); +#ifdef CONFIG_MTD_UBI_FASTMAP +cancel_work_sync (&ubi->fm_work); +#endif ubi_debugfs_exit_dev (ubi);uif_close (ubi);
drivers/mtd/ubi/wl.c +1 -3
@@ -1479,6 +1479,7 @@ int ubi_thread(void *u) }dbg_wl ("background thread \"%s\" is killed" , ubi->bgt_name); + ubi->thread_enabled =0 ;return 0 ; }
@@ -1488,9 +1489,6 @@ int ubi_thread(void *u)*/ static void shutdown_work (struct ubi_device *ubi) { -#ifdef CONFIG_MTD_UBI_FASTMAP -flush_work (&ubi->fm_work); -#endif while (!list_empty (&ubi->works)) {struct ubi_work *wrk;
Greg Kroah-Hartman
maintainerPATCH 74/105 UBIFS: Fix potential integer overflow in allocation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Silvio Cesare <[email protected]>
commit 353748a359f1821ee934afc579cf04572406b420 upstream.
There is potential for the size and len fields in ubifs_data_node to be too large causing either a negative value for the length fields or an integer overflow leading to an incorrect memory allocation. Likewise, when the len field is small, an integer underflow may occur.
--- fs/ubifs/journal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ubifs/journal.c +1 -1
@@ -1107,7 +1107,7 @@ static int recomp_data_node(const structint err, len, compr_type, out_len; out_len =le32_to_cpu (dn->size); - buf =kmalloc (out_len *WORST_COMPR_FACTOR ,GFP_NOFS ); + buf =kmalloc_array (out_len,WORST_COMPR_FACTOR ,GFP_NOFS );if (!buf)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 75/105 xfrm: Ignore socket policies when rebuilding hash tables
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tobias Brunner <[email protected]>
commit 6916fb3b10b3cbe3b1f9f5b680675f53e4e299eb upstream.
Whenever thresholds are changed the hash tables are rebuilt. This is done by enumerating all policies and hashing and inserting them into the right table according to the thresholds and direction.
Because socket policies are also contained in net->xfrm.policy_all but no hash tables are defined for their direction (dir + XFRM_POLICY_MAX) this causes a NULL or invalid pointer dereference after returning from policy_hash_bysel() if the rebuild is done while any socket policies are installed.
Since the rebuild after changing thresholds is scheduled this crash could even occur if the userland sets thresholds seemingly before installing any socket policies.
--- net/xfrm/xfrm_policy.c | 4 ++++ 1 file changed, 4 insertions(+)
net/xfrm/xfrm_policy.c +4 -0
@@ -626,6 +626,10 @@ static void xfrm_hash_rebuild(struct wor/* re-insert all policies by order of creation */ list_for_each_entry_reverse (policy, &net->xfrm.policy_all, walk.all) { +if (xfrm_policy_id2dir (policy->index) >=XFRM_POLICY_MAX ) { +/* skip socket policies */ +continue ; + } newpos =NULL ; chain = policy_hash_bysel(net, &policy->selector, policy->family,
Greg Kroah-Hartman
maintainerPATCH 76/105 xfrm: skip policies marked as dead while rehashing
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
commit 862591bf4f519d1b8d859af720fafeaebdd0162a upstream.
syzkaller triggered following KASAN splat:
BUG: KASAN: slab-out-of-bounds in xfrm_hash_rebuild+0xdbe/0xf00 net/xfrm/xfrm_policy.c:618 read of size 2 at addr ffff8801c8e92fe4 by task kworker/1:1/23 [..] Workqueue: events xfrm_hash_rebuild [..] __asan_report_load2_noabort+0x14/0x20 mm/kasan/report.c:428 xfrm_hash_rebuild+0xdbe/0xf00 net/xfrm/xfrm_policy.c:618 process_one_work+0xbbf/0x1b10 kernel/workqueue.c:2112 worker_thread+0x223/0x1990 kernel/workqueue.c:2246 [..]
The reproducer triggers:
1016 if (error) {
1017 list_move_tail(&walk->walk.all, &x->all);
1018 goto out;
1019 }
in xfrm_policy_walk() via pfkey (it sets tiny rcv space, dump callback returns -ENOBUFS).
In this case, *walk is located the pfkey socket struct, so this socket becomes visible in the global policy list.
It looks like this is intentional -- phony walker has walk.dead set to 1 and all other places skip such "policies".
Ccing original authors of the two commits that seem to expose this issue (first patch missed ->dead check, second patch adds pfkey sockets to policies dumper list).
--- net/xfrm/xfrm_policy.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/xfrm/xfrm_policy.c +2 -1
@@ -626,7 +626,8 @@ static void xfrm_hash_rebuild(struct wor/* re-insert all policies by order of creation */ list_for_each_entry_reverse (policy, &net->xfrm.policy_all, walk.all) { -if (xfrm_policy_id2dir (policy->index) >=XFRM_POLICY_MAX ) { +if (policy->walk.dead || +xfrm_policy_id2dir (policy->index) >=XFRM_POLICY_MAX ) {/* skip socket policies */ continue ; }
Greg Kroah-Hartman
maintainerPATCH 77/105 backlight: as3711_bl: Fix Device Tree node lookup
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 4a9c8bb2aca5b5a2a15744333729745dd9903562 upstream.
Fix child-node lookup during probe, which ended up searching the whole device tree depth-first starting at the parent rather than just matching on its children.
To make things worse, the parent mfd node was also prematurely freed.
--- drivers/video/backlight/as3711_bl.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
drivers/video/backlight/as3711_bl.c +23 -10
@@ -262,10 +262,10 @@ static int as3711_bl_register(struct plastatic int as3711_backlight_parse_dt (struct device *dev) {struct as3711_bl_pdata *pdata =dev_get_platdata (dev); -struct device_node *bl = -of_find_node_by_name (dev->parent->of_node,"backlight" ), *fb; +struct device_node *bl, *fb;int ret; + bl =of_get_child_by_name (dev->parent->of_node,"backlight" );if (!bl) {dev_dbg (dev,"backlight node not found\n" );return -ENODEV ;
@@ -279,7 +279,7 @@ static int as3711_backlight_parse_dt(strif (pdata->su1_max_uA <=0 ) ret = -EINVAL ;if (ret <0 ) -return ret; + goto err_put_bl; } fb =of_parse_phandle (bl,"su2-dev" ,0 );
@@ -292,7 +292,7 @@ static int as3711_backlight_parse_dt(strif (pdata->su2_max_uA <=0 ) ret = -EINVAL ;if (ret <0 ) -return ret; + goto err_put_bl;if (of_find_property (bl,"su2-feedback-voltage" ,NULL )) { pdata->su2_feedback =AS3711_SU2_VOLTAGE ;
@@ -314,8 +314,10 @@ static int as3711_backlight_parse_dt(str pdata->su2_feedback =AS3711_SU2_CURR_AUTO ; count++; } -if (count !=1 ) -return -EINVAL ; +if (count !=1 ) { + ret = -EINVAL ; + goto err_put_bl; + } count =0 ;if (of_find_property (bl,"su2-fbprot-lx-sd4" ,NULL )) {
@@ -334,8 +336,10 @@ static int as3711_backlight_parse_dt(str pdata->su2_fbprot =AS3711_SU2_GPIO4 ; count++; } -if (count !=1 ) -return -EINVAL ; +if (count !=1 ) { + ret = -EINVAL ; + goto err_put_bl; + } count =0 ;if (of_find_property (bl,"su2-auto-curr1" ,NULL )) {
@@ -355,11 +359,20 @@ static int as3711_backlight_parse_dt(str* At least one su2-auto-curr* must be specified iff * AS3711_SU2_CURR_AUTO is used */ -if (!count ^ (pdata->su2_feedback !=AS3711_SU2_CURR_AUTO )) -return -EINVAL ; +if (!count ^ (pdata->su2_feedback !=AS3711_SU2_CURR_AUTO )) { + ret = -EINVAL ; + goto err_put_bl; + } } +of_node_put (bl); +return 0 ; + +err_put_bl: +of_node_put (bl); + +return ret; }static int as3711_backlight_probe (struct platform_device *pdev)
Greg Kroah-Hartman
maintainerPATCH 78/105 backlight: max8925_bl: Fix Device Tree node lookup
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 d1cc0ec3da23e44c23712579515494b374f111c9 upstream.
Fix child-node lookup during probe, which ended up searching the whole device tree depth-first starting at the parent rather than just matching on its children.
To make things worse, the parent mfd node was also prematurely freed, while the child backlight node was leaked.
--- drivers/video/backlight/max8925_bl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/video/backlight/max8925_bl.c +3 -1
@@ -116,7 +116,7 @@ static void max8925_backlight_dt_init(stif (!pdata)return ; - np =of_find_node_by_name (nproot,"backlight" ); + np =of_get_child_by_name (nproot,"backlight" );if (!np) {dev_err (&pdev->dev,"failed to find backlight node\n" );return ;
@@ -125,6 +125,8 @@ static void max8925_backlight_dt_init(stif (!of_property_read_u32 (np,"maxim,max8925-dual-string" , &val)) pdata->dual_string = val; +of_node_put (np); + pdev->dev.platform_data = pdata; }
Greg Kroah-Hartman
maintainerPATCH 79/105 backlight: tps65217_bl: Fix Device Tree node lookup
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 2b12dfa124dbadf391cb9a616aaa6b056823bf75 upstream.
Fix child-node lookup during probe, which ended up searching the whole device tree depth-first starting at the parent rather than just matching on its children.
This would only cause trouble if the child node is missing while there is an unrelated node named "backlight" elsewhere in the tree.
--- drivers/video/backlight/tps65217_bl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/backlight/tps65217_bl.c +2 -2
@@ -184,11 +184,11 @@ static struct tps65217_bl_pdata * tps65217_bl_parse_dt(struct platform_device *pdev) {struct tps65217 *tps =dev_get_drvdata (pdev->dev.parent); -struct device_node *node =of_node_get (tps->dev->of_node); +struct device_node *node;struct tps65217_bl_pdata *pdata, *err;u32 val; - node =of_find_node_by_name (node,"backlight" ); + node =of_get_child_by_name (tps->dev->of_node,"backlight" );if (!node)return ERR_PTR (-ENODEV );
Greg Kroah-Hartman
maintainerPATCH 80/105 mfd: intel-lpss: Program REMAP register in PIO mode
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit d28b62520830b2d0bffa2d98e81afc9f5e537e8b upstream.
According to documentation REMAP register has to be programmed in either DMA or PIO mode of the slice.
Move the DMA capability check below to let REMAP register be programmed in PIO mode.
--- drivers/mfd/intel-lpss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mfd/intel-lpss.c +2 -2
@@ -269,11 +269,11 @@ static void intel_lpss_init_dev(const stintel_lpss_deassert_reset (lpss); +intel_lpss_set_remap_addr (lpss); +if (!intel_lpss_has_idma (lpss))return ; -intel_lpss_set_remap_addr (lpss); -/* Make sure that SPI multiblock DMA transfers are re-enabled */ if (lpss->type ==LPSS_DEV_SPI )writel (value, lpss->priv +LPSS_PRIV_SSP_REG );
Greg Kroah-Hartman
maintainerPATCH 81/105 perf tools: Fix symbol and object code resolution for vdso32 and vdsox32
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit aef4feace285f27c8ed35830a5d575bec7f3e90a upstream.
Fix __kmod_path__parse() so that perf tools does not treat vdso32 and vdsox32 as kernel modules and fail to find the object.
--- tools/perf/util/dso.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/dso.c +2 -0
@@ -249,6 +249,8 @@ int __kmod_path__parse(struct kmod_pathif ((strncmp (name,"[kernel.kallsyms]" ,17 ) ==0 ) || (strncmp (name,"[guest.kernel.kallsyms" ,22 ) ==0 ) || (strncmp (name,"[vdso]" ,6 ) ==0 ) || + (strncmp (name,"[vdso32]" ,8 ) ==0 ) || + (strncmp (name,"[vdsox32]" ,9 ) ==0 ) || (strncmp (name,"[vsyscall]" ,10 ) ==0 )) { m->kmod = false;
Greg Kroah-Hartman
maintainerPATCH 82/105 perf intel-pt: Fix sync_switch INTEL_PT_SS_NOT_TRACING
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit dbcb82b93f3e8322891e47472c89e63058b81e99 upstream.
sync_switch is a facility to synchronize decoding more closely with the point in the kernel when the context actually switched.
In one case, INTEL_PT_SS_NOT_TRACING state was not correctly transitioning to INTEL_PT_SS_TRACING state due to a missing case clause. Add it.
--- tools/perf/util/intel-pt.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/intel-pt.c +1 -0
@@ -1246,6 +1246,7 @@ static int intel_pt_sample(struct intel_if (intel_pt_is_switch_ip (ptq, state->to_ip)) {switch (ptq->switch_state) { +case INTEL_PT_SS_NOT_TRACING :case INTEL_PT_SS_UNKNOWN :case INTEL_PT_SS_EXPECTING_SWITCH_IP : err =intel_pt_next_tid (pt, ptq);
Greg Kroah-Hartman
maintainerPATCH 83/105 perf intel-pt: Fix decoding to accept CBR between FUP and corresponding TIP
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit bd2e49ec48feb1855f7624198849eea4610e2286 upstream.
It is possible to have a CBR packet between a FUP packet and corresponding TIP packet. Stop treating it as an error.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +4 -1
@@ -1487,7 +1487,6 @@ static int intel_pt_walk_fup_tip(structcase INTEL_PT_PSB :case INTEL_PT_TSC :case INTEL_PT_TMA : -case INTEL_PT_CBR :case INTEL_PT_MODE_TSX :case INTEL_PT_BAD :case INTEL_PT_PSBEND :
@@ -1496,6 +1495,10 @@ static int intel_pt_walk_fup_tip(struct decoder->pkt_step =0 ;return -ENOENT ; +case INTEL_PT_CBR : +intel_pt_calc_cbr (decoder); +break ; +case INTEL_PT_OVF :return intel_pt_overflow (decoder);
Greg Kroah-Hartman
maintainerPATCH 84/105 perf intel-pt: Fix MTC timing after overflow
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit dd27b87ab5fcf3ea1c060b5e3ab5d31cc78e9f4c upstream.
On some platforms, overflows will clear before MTC wraparound, and there is no following TSC/TMA packet. In that case the previous TMA is valid. Since there will be a valid TMA either way, stop setting 'have_tma' to false upon overflow.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 1 - 1 file changed, 1 deletion(-)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +0 -1
@@ -1268,7 +1268,6 @@ static int intel_pt_overflow(struct inte {intel_pt_log ("ERROR: Buffer overflow\n" );intel_pt_clear_tx_flags (decoder); - decoder->have_tma = false; decoder->cbr =0 ; decoder->timestamp_insn_cnt =0 ; decoder->pkt_state =INTEL_PT_STATE_ERR_RESYNC ;
Greg Kroah-Hartman
maintainerPATCH 85/105 perf intel-pt: Fix "Unexpected indirect branch" error
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit 9fb523363f6e3984457fee95bb7019395384ffa7 upstream.
Some Atom CPUs can produce FUP packets that contain NLIP (next linear instruction pointer) instead of CLIP (current linear instruction pointer). That will result in "Unexpected indirect branch" errors. Fix by comparing IP to NLIP in that case.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 17 +++++++++++++++-- tools/perf/util/intel-pt-decoder/intel-pt-decoder.h | 9 +++++++++ tools/perf/util/intel-pt.c | 4 ++++ 3 files changed, 28 insertions(+), 2 deletions(-)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +15 -2
@@ -111,6 +111,7 @@ struct intel_pt_decoder {bool have_cyc;bool fixup_last_mtc;bool have_last_ip; +enum intel_pt_param_flags flags;uint64_t pos;uint64_t last_ip;uint64_t ip;
@@ -213,6 +214,8 @@ struct intel_pt_decoder *intel_pt_decode decoder->data = params->data; decoder->return_compression = params->return_compression; + decoder->flags = params->flags; + decoder->period = params->period; decoder->period_type = params->period_type;
@@ -1010,6 +1013,15 @@ out_no_progress:return err; } +static inline bool intel_pt_fup_with_nlip (struct intel_pt_decoder *decoder, +struct intel_pt_insn *intel_pt_insn, +uint64_t ip,int err) +{ +return decoder->flags &INTEL_PT_FUP_WITH_NLIP && !err && + intel_pt_insn->branch ==INTEL_PT_BR_INDIRECT && + ip == decoder->ip + intel_pt_insn->length; +} +static int intel_pt_walk_fup (struct intel_pt_decoder *decoder) {struct intel_pt_insn intel_pt_insn;
@@ -1022,7 +1034,8 @@ static int intel_pt_walk_fup(struct inte err =intel_pt_walk_insn (decoder, &intel_pt_insn, ip);if (err ==INTEL_PT_RETURN )return 0 ; -if (err == -EAGAIN ) { +if (err == -EAGAIN || +intel_pt_fup_with_nlip (decoder, &intel_pt_insn, ip, err)) {if (decoder->set_fup_tx_flags) { decoder->set_fup_tx_flags = false; decoder->tx_flags = decoder->fup_tx_flags;
@@ -1032,7 +1045,7 @@ static int intel_pt_walk_fup(struct inte decoder->state.flags = decoder->fup_tx_flags;return 0 ; } -return err; +return -EAGAIN ; } decoder->set_fup_tx_flags = false;if (err)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.h +9 -0
@@ -53,6 +53,14 @@ enum { INTEL_PT_ERR_MAX, }; +enum intel_pt_param_flags { +/* +* FUP packet can contain next linear instruction pointer instead of +* current linear instruction pointer. +*/ +INTEL_PT_FUP_WITH_NLIP =1 <<0 , +}; +struct intel_pt_state {enum intel_pt_sample_type type;int err;
@@ -91,6 +99,7 @@ struct intel_pt_params {unsigned int mtc_period;uint32_t tsc_ctc_ratio_n;uint32_t tsc_ctc_ratio_d; +enum intel_pt_param_flags flags; };struct intel_pt_decoder ;
tools/perf/util/intel-pt.c +4 -0
@@ -676,6 +676,7 @@ static struct intel_pt_queue *intel_pt_a unsigned int queue_nr) {struct intel_pt_params params = { .get_trace =0 , }; +struct perf_env *env = pt->machine->env;struct intel_pt_queue *ptq; ptq =zalloc (sizeof (struct intel_pt_queue ));
@@ -753,6 +754,9 @@ static struct intel_pt_queue *intel_pt_a } } +if (env->cpuid && !strncmp (env->cpuid,"GenuineIntel,6,92," ,18 )) + params.flags |=INTEL_PT_FUP_WITH_NLIP ; + ptq->decoder =intel_pt_decoder_new (¶ms);if (!ptq->decoder) goto out_free;
Greg Kroah-Hartman
maintainerPATCH 86/105 perf intel-pt: Fix packet decoding of CYC packets
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
commit 621a5a327c1e36ffd7bb567f44a559f64f76358f upstream.
Use a 64-bit type so that the cycle count is not limited to 32-bits.
--- tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/intel-pt-decoder/intel-pt-pkt-decoder.c +1 -1
@@ -281,7 +281,7 @@ static int intel_pt_get_cyc(unsigned intif (len < offs)return INTEL_PT_NEED_MORE_BYTES ; byte = buf[offs++]; - payload |= (byte >>1 ) << shift; + payload |= ((uint64_t )byte >>1 ) << shift; } packet->type =INTEL_PT_CYC ;
Greg Kroah-Hartman
maintainerPATCH 87/105 media: v4l2-compat-ioctl32: prevent go past max size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
commit ea72fbf588ac9c017224dcdaa2019ff52ca56fee upstream.
As warned by smatch:
drivers/media/v4l2-core/v4l2-compat-ioctl32.c:879 put_v4l2_ext_controls32() warn: check for integer overflow 'count'
The access_ok() logic should check for too big arrays too.
--- drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/v4l2-core/v4l2-compat-ioctl32.c +1 -1
@@ -864,7 +864,7 @@ static int put_v4l2_ext_controls32(struc get_user(kcontrols, &kp->controls))return -EFAULT ; -if (!count) +if (!count || count > (U32_MAX /sizeof (*ucontrols)))return 0 ;if (get_user (p, &up->controls))return -EFAULT ;
Greg Kroah-Hartman
maintainerPATCH 88/105 media: cx231xx: Add support for AverMedia DVD EZMaker 7
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kai-Heng Feng <[email protected]>
commit 29e61d6ef061b012d320327af7dbb3990e75be45 upstream.
User reports AverMedia DVD EZMaker 7 can be driven by VIDEO_GRABBER. Add the device to the id_table to make it work.
--- drivers/media/usb/cx231xx/cx231xx-cards.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/media/usb/cx231xx/cx231xx-cards.c +3 -0
@@ -864,6 +864,9 @@ struct usb_device_id cx231xx_id_table[] .driver_info = CX231XX_BOARD_CNXT_RDE_250}, {USB_DEVICE(0x0572, 0x58A0), .driver_info = CX231XX_BOARD_CNXT_RDU_250}, + /* AverMedia DVD EZMaker 7 */ + {USB_DEVICE(0x07ca, 0xc039), + .driver_info = CX231XX_BOARD_CNXT_VIDEO_GRABBER}, {USB_DEVICE(0x2040, 0xb110), .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL}, {USB_DEVICE(0x2040, 0xb111),
Greg Kroah-Hartman
maintainerPATCH 89/105 media: dvb_frontend: fix locking issues at dvb_frontend_get_event()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
commit 76d81243a487c09619822ef8e7201a756e58a87d upstream.
As warned by smatch:
drivers/media/dvb-core/dvb_frontend.c:314 dvb_frontend_get_event() warn: inconsistent returns 'sem:&fepriv->sem'. Locked on: line 288 line 295 line 306 line 314 Unlocked on: line 303
The lock implementation for get event is wrong, as, if an interrupt occurs, down_interruptible() will fail, and the routine will call up() twice when userspace calls the ioctl again.
The bad code is there since when Linux migrated to git, in 2005.
--- drivers/media/dvb-core/dvb_frontend.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-)
drivers/media/dvb-core/dvb_frontend.c +15 -8
@@ -230,8 +230,20 @@ static void dvb_frontend_add_event(strucwake_up_interruptible (&events->wait_queue); } +static int dvb_frontend_test_event (struct dvb_frontend_private *fepriv, +struct dvb_fe_events *events) +{ +int ret; + +up (&fepriv->sem); + ret = events->eventw != events->eventr; +down (&fepriv->sem); + +return ret; +} +static int dvb_frontend_get_event (struct dvb_frontend *fe, -struct dvb_frontend_event *event,int flags) +struct dvb_frontend_event *event,int flags) {struct dvb_frontend_private *fepriv = fe->frontend_priv;struct dvb_fe_events *events = &fepriv->events;
@@ -249,13 +261,8 @@ static int dvb_frontend_get_event(structif (flags &O_NONBLOCK )return -EWOULDBLOCK ; -up (&fepriv->sem); - - ret =wait_event_interruptible (events->wait_queue, - events->eventw != events->eventr); - -if (down_interruptible (&fepriv->sem)) -return -ERESTARTSYS ; + ret =wait_event_interruptible (events->wait_queue, +dvb_frontend_test_event (fepriv, events));if (ret <0 )return ret;
Re: [PATCH 4.4 089/105] media: dvb_frontend: fix locking issues at dvb_frontend_get_event()
Quoted 23 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
commit
76d81243a487c09619822ef8e7201a756e58a87dupstream.As warned by smatch:
drivers/media/dvb-core/dvb_frontend.c:314 dvb_frontend_get_event() warn: inconsistent returns 'sem:&fepriv->sem'. Locked on: line 288 line 295 line 306 line 314 Unlocked on: line 303The lock implementation for get event is wrong, as, if an interrupt occurs,
down_interruptible()will fail, and the routine will callup()twice when userspace calls the ioctl again.The bad code is there since when Linux migrated to git, in 2005.
[...]
Quoted 2 lines
drivers/media/dvb-core/dvb_frontend.c +0
-0
[...]
drivers/media/dvb-core/dvb_frontend.c static void dvb_frontend_add_event(struc · line 243
Quoted 11 lines
drivers/media/dvb-core/dvb_frontend.c +11
-0+static int dvb_frontend_test_event (struct dvb_frontend_private *fepriv, + struct dvb_fe_events *events) +{ +int ret; + +up (&fepriv->sem); + ret = events->eventw != events->eventr; +down (&fepriv->sem); + +return ret; +}
This is broken. You must not wait inside a wait condition. (It would be nice if this rule was explicitly documented.)
Why not leave the condition as it was and only change the down_interruptible() to down()?
Ben.
Quoted 25 lines
static int dvb_frontend_get_event(struct
dvb_frontend*fe,drivers/media/dvb-core/dvb_frontend.c +1
-1- struct dvb_frontend_event *event, int flags) + struct dvb_frontend_event *event, int flags){
structdvb_frontend_private*fepriv =fe->frontend_priv; structdvb_fe_events*events =&fepriv->events;drivers/media/dvb-core/dvb_frontend.c +0
-0@@ -249,13 +261,8 @@ static int dvb_frontend_get_event(struct if (flags & O_NONBLOCK) return -EWOULDBLOCK;drivers/media/dvb-core/dvb_frontend.c +2
-7-up (&fepriv->sem); - - ret =wait_event_interruptible (events->wait_queue, - events->eventw != events->eventr); - -if (down_interruptible (&fepriv->sem)) -return -ERESTARTSYS ; + ret =wait_event_interruptible (events->wait_queue, + dvb_frontend_test_event(fepriv, events));
if (ret < 0)
return ret;
Signature · 3 lines
Ben Hutchings, Software Developer Codethink Ltd
https://www.codethink.co.uk/ Dale House, 35 Dale Street
Manchester, M1 2HF, United KingdomGreg Kroah-Hartman
maintainerPATCH 90/105 nfsd: restrict rd_maxcount to svc_max_payload in nfsd_encode_readdir
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Scott Mayhew <[email protected]>
commit 9c2ece6ef67e9d376f32823086169b489c422ed0 upstream.
nfsd4_readdir_rsize restricts rd_maxcount to svc_max_payload when estimating the size of the readdir reply, but nfsd_encode_readdir restricts it to INT_MAX when encoding the reply. This can result in log messages like "kernel: RPC request reserved 32896 but used 1049444".
Restrict rd_dircount similarly (no reason it should be larger than svc_max_payload).
--- fs/nfsd/nfs4xdr.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfsd/nfs4xdr.c +3 -2
@@ -3595,7 +3595,8 @@ nfsd4_encode_readdir(struct nfsd4_compou nfserr = nfserr_resource; goto err_no_verf; } - maxcount =min_t (u32, readdir->rd_maxcount,INT_MAX ); + maxcount =svc_max_payload (resp->rqstp); + maxcount =min_t (u32, readdir->rd_maxcount, maxcount);/* * Note the rfc defines rd_maxcount as the size of the * READDIR4resok structure, which includes the verifier above
@@ -3609,7 +3610,7 @@ nfsd4_encode_readdir(struct nfsd4_compou/* RFC 3530 14.2.24 allows us to ignore dircount when it's 0: */ if (!readdir->rd_dircount) - readdir->rd_dircount =INT_MAX ; + readdir->rd_dircount =svc_max_payload (resp->rqstp); readdir->xdr = xdr; readdir->rd_maxcount = maxcount;
Greg Kroah-Hartman
maintainerPATCH 91/105 NFSv4: Fix possible 1-byte stack overflow in nfs_idmap_read_and_verify_message
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Wysochanski <[email protected]>
commit d68894800ec5712d7ddf042356f11e36f87d7f78 upstream.
In nfs_idmap_read_and_verify_message there is an incorrect sprintf '%d' that converts the __u32 'im_id' from struct idmap_msg to 'id_str', which is a stack char array variable of length NFS_UINT_MAXLEN == 11. If a uid or gid value is > 2147483647 = 0x7fffffff, the conversion overflows into a negative value, for example:
crash> p (unsigned) (0x80000000)
$1 = 2147483648
crash> p (signed) (0x80000000)
$2 = -2147483648
The '-' sign is written to the buffer and this causes a 1 byte overflow when the NULL byte is written, which corrupts kernel stack memory. If CONFIG_CC_STACKPROTECTOR_STRONG is set we see a stack-protector panic:
[11558053.616565] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: ffffffffa05b8a8c [11558053.639063] CPU: 6 PID: 9423 Comm: rpc.idmapd Tainted: G W ------------ T 3.10.0-514.el7.x86_64 #1 [11558053.641990] Hardware name: Red Hat OpenStack Compute, BIOS 1.10.2-3.el7_4.1 04/01/2014 [11558053.644462] ffffffff818c7bc0 00000000b1f3aec1 ffff880de0f9bd48 ffffffff81685eac [11558053.646430] ffff880de0f9bdc8 ffffffff8167f2b3 ffffffff00000010 ffff880de0f9bdd8 [11558053.648313] ffff880de0f9bd78 00000000b1f3aec1 ffffffff811dcb03 ffffffffa05b8a8c [11558053.650107] Call Trace: [11558053.651347] [<ffffffff81685eac>] dump_stack+0x19/0x1b [11558053.653013] [<ffffffff8167f2b3>] panic+0xe3/0x1f2 [11558053.666240] [<ffffffff811dcb03>] ? kfree+0x103/0x140 [11558053.682589] [<ffffffffa05b8a8c>] ? idmap_pipe_downcall+0x1cc/0x1e0 [nfsv4] [11558053.689710] [<ffffffff810855db>] __stack_chk_fail+0x1b/0x30 [11558053.691619] [<ffffffffa05b8a8c>] idmap_pipe_downcall+0x1cc/0x1e0 [nfsv4] [11558053.693867] [<ffffffffa00209d6>] rpc_pipe_write+0x56/0x70 [sunrpc] [11558053.695763] [<ffffffff811fe12d>] vfs_write+0xbd/0x1e0 [11558053.702236] [<ffffffff810acccc>] ? task_work_run+0xac/0xe0 [11558053.704215] [<ffffffff811fec4f>] SyS_write+0x7f/0xe0 [11558053.709674] [<ffffffff816964c9>] system_call_fastpath+0x16/0x1b
Fix this by calling the internally defined nfs_map_numeric_to_string() function which properly uses '%u' to convert this __u32. For consistency, also replace the one other place where snprintf is called.
--- fs/nfs/nfs4idmap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfs/nfs4idmap.c +3 -2
@@ -343,7 +343,7 @@ static ssize_t nfs_idmap_lookup_name(__uint id_len;ssize_t ret; - id_len =snprintf (id_str,sizeof (id_str),"%u" , id); + id_len =nfs_map_numeric_to_string (id, id_str,sizeof (id_str)); ret =nfs_idmap_get_key (id_str, id_len, type, buf, buflen, idmap);if (ret <0 )return -EINVAL ;
@@ -626,7 +626,8 @@ static int nfs_idmap_read_and_verify_mesif (strcmp (upcall->im_name, im->im_name) !=0 )break ;/* Note: here we store the NUL terminator too */ - len =sprintf (id_str,"%d" , im->im_id) +1 ; + len =1 +nfs_map_numeric_to_string (im->im_id, id_str, +sizeof (id_str)); ret =nfs_idmap_instantiate (key, authkey, id_str, len);break ;case IDMAP_CONV_IDTONAME :
Greg Kroah-Hartman
maintainerPATCH 92/105 video: uvesafb: Fix integer overflow in allocation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
commit 9f645bcc566a1e9f921bdae7528a01ced5bc3713 upstream.
cmap->len can get close to INT_MAX/2, allowing for an integer overflow in allocation. This uses kmalloc_array() instead to catch the condition.
--- drivers/video/fbdev/uvesafb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/fbdev/uvesafb.c +2 -1
@@ -1059,7 +1059,8 @@ static int uvesafb_setcmap(struct fb_cma info->cmap.len || cmap->start < info->cmap.start)return -EINVAL ; - entries =kmalloc (sizeof (*entries) * cmap->len,GFP_KERNEL ); + entries =kmalloc_array (cmap->len,sizeof (*entries), +GFP_KERNEL );if (!entries)return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 93/105 Input: elan_i2c - add ELAN0618 (Lenovo v330 15IKB) ACPI ID
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandr Savca <[email protected]>
commit 8938fc7b8fe9ccfa11751ead502a8d385b607967 upstream.
Add ELAN0618 to the list of supported touchpads; this ID is used in Lenovo v330 15IKB devices.
--- drivers/input/mouse/elan_i2c_core.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/mouse/elan_i2c_core.c +1 -0
@@ -1250,6 +1250,7 @@ static const struct acpi_device_id elan_ { "ELAN060C", 0 }, { "ELAN0611", 0 }, { "ELAN0612", 0 }, + { "ELAN0618", 0 }, { "ELAN1000", 0 }, { } };
Greg Kroah-Hartman
maintainerPATCH 94/105 xen: Remove unnecessary BUG_ON from __unbind_from_irq()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Ostrovsky <[email protected]>
commit eef04c7b3786ff0c9cb1019278b6c6c2ea0ad4ff upstream.
Commit 910f8befdf5b ("xen/pirq: fix error path cleanup when binding MSIs") fixed a couple of errors in error cleanup path of xen_bind_pirq_msi_to_irq(). This cleanup allowed a call to __unbind_from_irq() with an unbound irq, which would result in triggering the BUG_ON there.
Since there is really no reason for the BUG_ON (xen_free_irq() can operate on unbound irqs) we can remove it.
--- drivers/xen/events/events_base.c | 2 -- 1 file changed, 2 deletions(-)
drivers/xen/events/events_base.c +0 -2
@@ -637,8 +637,6 @@ static void __unbind_from_irq(unsigned ixen_irq_info_cleanup (info); } -BUG_ON (info_for_irq (irq)->type ==IRQT_UNBOUND ); -xen_free_irq (irq); }
Greg Kroah-Hartman
maintainerPATCH 95/105 udf: Detect incorrect directory size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit fa65653e575fbd958bdf5fb9c4a71a324e39510d upstream.
Detect when a directory entry is (possibly partially) beyond directory size and return EIO in that case since it means the filesystem is corrupted. Otherwise directory operations can further corrupt the directory and possibly also oops the kernel.
--- fs/udf/directory.c | 3 +++ 1 file changed, 3 insertions(+)
fs/udf/directory.c +3 -0
@@ -150,6 +150,9 @@ struct fileIdentDesc *udf_fileident_read sizeof(struct fileIdentDesc)); } } +/* Got last entry outside of dir size - fs is corrupted! */ +if (*nf_pos > dir->i_size) +return NULL ;return fi; }
Re: [PATCH 4.4 095/105] udf: Detect incorrect directory size
Quoted 12 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit
fa65653e575fbd958bdf5fb9c4a71a324e39510dupstream.Detect when a directory entry is (possibly partially) beyond directory size and return EIO in that case since it means the filesystem is corrupted. Otherwise directory operations can further corrupt the directory and possibly also oops the kernel.
[...]
Quoted 11 lines
fs/udf/directory.c +3
-0@@ -150,6 +150,9 @@ struct fileIdentDesc *udf_fileident_read sizeof(struct fileIdentDesc)); } } +/* Got last entry outside of dir size - fs is corrupted! */ +if (*nf_pos > dir->i_size) +return NULL ; return fi; }
Quoted 1 line
Is the same check needed when iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB?
Ben.
Signature · 3 lines
Ben Hutchings, Software Developer Codethink Ltd
https://www.codethink.co.uk/ Dale House, 35 Dale Street
Manchester, M1 2HF, United KingdomGreg Kroah-Hartman
maintainerPATCH 96/105 Input: elan_i2c_smbus - fix more potential stack buffer overflows
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 50fc7b61959af4b95fafce7fe5dd565199e0b61a upstream.
Commit 40f7090bb1b4 ("Input: elan_i2c_smbus - fix corrupted stack") fixed most of the functions using i2c_smbus_read_block_data() to allocate a buffer with the maximum block size. However three functions were left unchanged:
* In elan_smbus_initialize(), increase the buffer size in the same way.
* In elan_smbus_calibrate_result(), the buffer is provided by the caller (calibrate_store()), so introduce a bounce buffer. Also name the result buffer size.
* In elan_smbus_get_report(), the buffer is provided by the caller but happens to be the right length. Add a compile-time assertion to ensure this remains the case.
--- drivers/input/mouse/elan_i2c.h | 2 ++ drivers/input/mouse/elan_i2c_core.c | 2 +- drivers/input/mouse/elan_i2c_smbus.c | 10 ++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-)
drivers/input/mouse/elan_i2c.h +2 -0
@@ -27,6 +27,8 @@#define ETP_DISABLE_POWER 0x0001#define ETP_PRESSURE_OFFSET 25 +#define ETP_CALIBRATE_MAX_LEN 3 +/* IAP Firmware handling */ #define ETP_PRODUCT_ID_FORMAT_STRING "%d.0"#define ETP_FW_NAME "elan_i2c_" ETP_PRODUCT_ID_FORMAT_STRING ".bin"
drivers/input/mouse/elan_i2c_core.c +1 -1
@@ -595,7 +595,7 @@ static ssize_t calibrate_store(struct deint tries =20 ;int retval;int error; -u8 val[3 ]; +u8 val[ETP_CALIBRATE_MAX_LEN ]; retval =mutex_lock_interruptible (&data->sysfs_mutex);if (retval)
drivers/input/mouse/elan_i2c_smbus.c +8 -2
@@ -56,7 +56,7 @@static int elan_smbus_initialize (struct i2c_client *client) {u8 check[ETP_SMBUS_HELLOPACKET_LEN ] = {0x55 ,0x55 ,0x55 ,0x55 ,0x55 }; -u8 values[ETP_SMBUS_HELLOPACKET_LEN ] = {0 ,0 ,0 ,0 ,0 }; +u8 values[I2C_SMBUS_BLOCK_MAX ] = {0 };int len, error;/* Get hello packet */
@@ -117,12 +117,16 @@ static int elan_smbus_calibrate(struct istatic int elan_smbus_calibrate_result (struct i2c_client *client,u8 *val) {int error; +u8 buf[I2C_SMBUS_BLOCK_MAX ] = {0 }; + +BUILD_BUG_ON (ETP_CALIBRATE_MAX_LEN >sizeof (buf)); error =i2c_smbus_read_block_data (client, -ETP_SMBUS_CALIBRATE_QUERY , val); +ETP_SMBUS_CALIBRATE_QUERY , buf);if (error <0 )return error; +memcpy (val, buf,ETP_CALIBRATE_MAX_LEN );return 0 ; }
@@ -466,6 +470,8 @@ static int elan_smbus_get_report(struct {int len; +BUILD_BUG_ON (I2C_SMBUS_BLOCK_MAX >ETP_SMBUS_REPORT_LEN ); + len =i2c_smbus_read_block_data (client,ETP_SMBUS_PACKET_QUERY , &report[ETP_SMBUS_REPORT_OFFSET ]);
Greg Kroah-Hartman
maintainerPATCH 97/105 Input: elantech - enable middle button of touchpads on ThinkPad P52
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Ma <[email protected]>
commit 24bb555e6e46d96e2a954aa0295029a81cc9bbaa upstream.
PNPID is better way to identify the type of touchpads. Enable middle button support on 2 types of touchpads on Lenovo P52.
--- drivers/input/mouse/elantech.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/input/mouse/elantech.c +8 -1
@@ -1177,6 +1177,12 @@ static const struct dmi_system_id elante { } }; +static const char *const middle_button_pnp_ids[] = { +"LEN2131" ,/* ThinkPad P52 w/ NFC */ +"LEN2132" ,/* ThinkPad P52 */ +NULL +}; +/* * Set the appropriate event bits for the input subsystem */
@@ -1196,7 +1202,8 @@ static int elantech_set_input_params(str__clear_bit (EV_REL , dev->evbit);__set_bit (BTN_LEFT , dev->keybit); -if (dmi_check_system (elantech_dmi_has_middle_button)) +if (dmi_check_system (elantech_dmi_has_middle_button) || +psmouse_matches_pnp_id (psmouse, middle_button_pnp_ids))__set_bit (BTN_MIDDLE , dev->keybit);__set_bit (BTN_RIGHT , dev->keybit);
Greg Kroah-Hartman
maintainerPATCH 98/105 Input: elantech - fix V4 report decoding for module with middle key
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: ??? <[email protected]>
commit e0ae2519ca004a628fa55aeef969c37edce522d3 upstream.
Some touchpad has middle key and it will be indicated in bit 2 of packet[0]. We need to fix V4 formation's byte mask to prevent error decoding.
--- drivers/input/mouse/elantech.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/mouse/elantech.c +1 -1
@@ -804,7 +804,7 @@ static int elantech_packet_check_v4(struelse if (ic_version ==7 && etd->samples[1 ] ==0x2A ) sanity_check = ((packet[3 ] &0x1c ) ==0x10 );else - sanity_check = ((packet[0 ] &0x0c ) ==0x04 && + sanity_check = ((packet[0 ] &0x08 ) ==0x00 && (packet[3 ] &0x1c ) ==0x10 );if (!sanity_check)
Greg Kroah-Hartman
maintainerPATCH 99/105 ALSA: hda/realtek - Add a quirk for FSC ESPRIMO U9210
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 275ec0cb946cb75ac8977f662e608fce92f8b8a8 upstream.
Fujitsu Seimens ESPRIMO Mobile U9210 requires the same fixup as H270 for the correct pin configs.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=200107
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -2447,6 +2447,7 @@ static const struct snd_pci_quirk alc262SND_PCI_QUIRK (0x10cf ,0x1397 ,"Fujitsu Lifebook S7110" ,ALC262_FIXUP_FSC_S7110 ),SND_PCI_QUIRK (0x10cf ,0x142d ,"Fujitsu Lifebook E8410" ,ALC262_FIXUP_BENQ ),SND_PCI_QUIRK (0x10f1 ,0x2915 ,"Tyan Thunder n6650W" ,ALC262_FIXUP_TYAN ), +SND_PCI_QUIRK (0x1734 ,0x1141 ,"FSC ESPRIMO U9210" ,ALC262_FIXUP_FSC_H270 ),SND_PCI_QUIRK (0x1734 ,0x1147 ,"FSC Celsius H270" ,ALC262_FIXUP_FSC_H270 ),SND_PCI_QUIRK (0x17aa ,0x384e ,"Lenovo 3000" ,ALC262_FIXUP_LENOVO_3000 ), SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
Greg Kroah-Hartman
maintainerPATCH 100/105 Btrfs: fix unexpected cow in run_delalloc_nocow
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Bo <[email protected]>
commit 5811375325420052fcadd944792a416a43072b7f upstream.
Fstests generic/475 provides a way to fail metadata reads while checking if checksum exists for the inode inside run_delalloc_nocow(), and csum_exist_in_range() interprets error (-EIO) as inode having checksum and makes its caller enter the cow path.
In case of free space inode, this ends up with a warning in cow_file_range().
The same problem applies to btrfs_cross_ref_exist() since it may also read metadata in between.
With this, run_delalloc_nocow() bails out when errors occur at the two places.
--- fs/btrfs/inode.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-)
fs/btrfs/inode.c +30 -3
@@ -1202,6 +1202,8 @@ static noinline int csum_exist_in_range(list_del (&sums->list);kfree (sums); } +if (ret <0 ) +return ret;return 1 ; }
@@ -1351,10 +1353,23 @@ next_slot: goto out_check;if (btrfs_extent_readonly (root, disk_bytenr)) goto out_check; -if (btrfs_cross_ref_exist (trans, root, ino, + ret =btrfs_cross_ref_exist (trans, root, ino, found_key.offset - - extent_offset, disk_bytenr)) + extent_offset, disk_bytenr); +if (ret) { +/* +* ret could be -EIO if the above fails to read +* metadata. +*/ +if (ret <0 ) { +if (cow_start != (u64)-1 ) + cur_offset = cow_start; + goto error; + } + +WARN_ON_ONCE (nolock); goto out_check; + } disk_bytenr += extent_offset; disk_bytenr += cur_offset - found_key.offset; num_bytes =min (end +1 , extent_end) - cur_offset;
@@ -1372,8 +1387,20 @@ next_slot:* this ensure that csum for a given extent are * either valid or do not exist. */ -if (csum_exist_in_range (root, disk_bytenr, num_bytes)) + ret =csum_exist_in_range (root, disk_bytenr, num_bytes); +if (ret) { +/* +* ret could be -EIO if the above fails to read +* metadata. +*/ +if (ret <0 ) { +if (cow_start != (u64)-1 ) + cur_offset = cow_start; + goto error; + } +WARN_ON_ONCE (nolock); goto out_check; + } nocow =1 ; }else if (extent_type ==BTRFS_FILE_EXTENT_INLINE ) { extent_end = found_key.offset +
Greg Kroah-Hartman
maintainerPATCH 101/105 spi: Fix scatterlist elements size in spi_map_buf
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Chevallier <[email protected]>
commit ce99319a182fe766be67f96338386f3ec73e321c upstream.
When SPI transfers can be offloaded using DMA, the SPI core need to build a scatterlist to make sure that the buffer to be transferred is dma-able.
This patch fixes the scatterlist entry size computation in the case where the maximum acceptable scatterlist entry supported by the DMA controller is less than PAGE_SIZE, when the buffer is vmalloced.
For each entry, the actual size is given by the minimum between the desc_len (which is the max buffer size supported by the DMA controller) and the remaining buffer length until we cross a page boundary.
--- drivers/spi/spi.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/spi/spi.c +8 -2
@@ -707,8 +707,14 @@ static int spi_map_buf(struct spi_masterfor (i =0 ; i < sgs; i++) {if (vmalloced_buf) { - min =min_t (size_t, - len, desc_len -offset_in_page (buf)); +/* +* Next scatterlist entry size is the minimum between +* the desc_len and the remaining buffer length that +* fits in a page. +*/ + min =min_t (size_t, desc_len, +min_t (size_t, len, +PAGE_SIZE -offset_in_page (buf))); vm_page =vmalloc_to_page (buf);if (!vm_page) {sg_free_table (sgt);
Re: [PATCH 4.4 101/105] spi: Fix scatterlist elements size in spi_map_buf
Quoted 46 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maxime Chevallier <[email protected]>
commit
ce99319a182fe766be67f96338386f3ec73e321cupstream.When SPI transfers can be offloaded using DMA, the SPI core need to build a scatterlist to make sure that the buffer to be transferred is dma-able.
This patch fixes the scatterlist entry size computation in the case where the maximum acceptable scatterlist entry supported by the DMA controller is less than
PAGE_SIZE, when the buffer is vmalloced.For each entry, the actual size is given by the minimum between the
desc_len(which is the max buffer size supported by the DMA controller) and the remaining buffer length until we cross a page boundary.Fixes 65598c13fd66 ("spi: Fix per-page mapping of unaligned vmalloc-ed buffer")Signed-off-by Maxime Chevallier <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sudip Mukherjee <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>---
drivers/spi/spi.c | 10 ++++++++--1 file changed, 8 insertions(+), 2 deletions(-)drivers/spi/spi.c +0
-0@@ -707,8 +707,14 @@ static int spi_map_buf(struct spi_master for (i = 0; i < sgs; i++) {
if (vmalloced_buf) {drivers/spi/spi.c +8
-2- min =min_t (size_t, - len, desc_len - offset_in_page(buf)); +/* +* Next scatterlist entry size is the minimum between +* the desc_len and the remaining buffer length that +* fits in a page. +*/ + min =min_t (size_t, desc_len, + min_t(size_t, len, + PAGE_SIZE - offset_in_page(buf)));
Quoted 3 lines
vm_page=vmalloc_to_page(buf); if (!vm_page) {sg_free_table(sgt);
I think this makes sense upstream, but in 4.4 it seems to be a no-op since desc_len is always set to PAGE_SIZE when vmalloced_buf is true. This fix depends on (at least) commit df88e91bbfd1 "spi: respect the maximum segment size of DMA device" which went into 4.6.
Ben.
Signature · 3 lines
Ben Hutchings, Software Developer Codethink Ltd
https://www.codethink.co.uk/ Dale House, 35 Dale Street
Manchester, M1 2HF, United KingdomGreg Kroah-Hartman
maintainerRe: [PATCH 4.4 101/105] spi: Fix scatterlist elements size in spi_map_buf
Quoted 47 lines · Ben Hutchings
Quoted 46 lines · Greg Kroah-Hartman
4.4-stable review patch.��If anyone has any objections, please let me know.
------------------
From: Maxime Chevallier <[email protected]>
commit
ce99319a182fe766be67f96338386f3ec73e321cupstream.When SPI transfers can be offloaded using DMA, the SPI core need to build a scatterlist to make sure that the buffer to be transferred is dma-able.
This patch fixes the scatterlist entry size computation in the case where the maximum acceptable scatterlist entry supported by the DMA controller is less than
PAGE_SIZE, when the buffer is vmalloced.For each entry, the actual size is given by the minimum between the
desc_len(which is the max buffer size supported by the DMA controller) and the remaining buffer length until we cross a page boundary.Fixes 65598c13fd66 ("spi: Fix per-page mapping of unaligned vmalloc-ed buffer")Signed-off-by Maxime Chevallier <[email protected]>Signed-off-by Mark Brown <[email protected]>Signed-off-by Sudip Mukherjee <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>---
�drivers/spi/spi.c |���10 ++++++++-- �1 file changed, 8 insertions(+), 2 deletions(-)drivers/spi/spi.c +0
-0@@ -707,8 +707,14 @@ static int spi_map_buf(struct spi_master � for (i = 0; i < sgs; i++) {�
� if (vmalloced_buf) {drivers/spi/spi.c +8
-2- min =min_t (size_t, - ����len, desc_len - offset_in_page(buf)); +/* +�* Next scatterlist entry size is the minimum between +�* the desc_len and the remaining buffer length that +�* fits in a page. +�*/ + min =min_t (size_t, desc_len, + ����min_t(size_t, len, + ��PAGE_SIZE - offset_in_page(buf)));
Quoted 8 lines
Quoted 3 lines
�
vm_page=vmalloc_to_page(buf);
� if (!vm_page) {
�sg_free_table(sgt);I think this makes sense upstream, but in 4.4 it seems to be a no-op since
desc_lenis always set toPAGE_SIZEwhenvmalloced_bufis true. This fix depends on (at least) commitdf88e91bbfd1"spi: respect the maximum segment size of DMA device" which went into 4.6.
Good catch. I'll leave it as-is for now though.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 102/105 block: Fix transfer when chunk sectors exceeds max
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
commit 15bfd21fbc5d35834b9ea383dc458a1f0c9e3434 upstream.
A device may have boundary restrictions where the number of sectors between boundaries exceeds its max transfer size. In this case, we need to cap the max size to the smaller of the two limits.
--- include/linux/blkdev.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/blkdev.h +2 -2
@@ -882,8 +882,8 @@ static inline unsigned int blk_max_size_if (!q->limits.chunk_sectors)return q->limits.max_sectors; -return q->limits.chunk_sectors - - (offset & (q->limits.chunk_sectors -1 )); +return min (q->limits.max_sectors, (unsigned int )(q->limits.chunk_sectors - + (offset & (q->limits.chunk_sectors -1 )))); }static inline unsigned int blk_rq_get_max_sectors (struct request *rq)
Greg Kroah-Hartman
maintainerPATCH 103/105 dm thin: handle running out of data space vs concurrent discard
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit a685557fbbc3122ed11e8ad3fa63a11ebc5de8c3 upstream.
Discards issued to a DM thin device can complete to userspace (via fstrim) _before_ the metadata changes associated with the discards is reflected in the thinp superblock (e.g. free blocks). As such, if a user constructs a test that loops repeatedly over these steps, block allocation can fail due to discards not having completed yet:
1) fill thin device via filesystem file
2) remove file
3) fstrim
Quoted 1 line
Quoted 1 line
From initial report, here:
https://www.redhat.com/archives/dm-devel/2018-April/msg00022.html
"The root cause of this issue is that dm-thin will first remove mapping and increase corresponding blocks' reference count to prevent them from being reused before DISCARD bios get processed by the underlying layers. However. increasing blocks' reference count could also increase the nr_allocated_this_transaction in struct sm_disk which makes smd->old_ll.nr_allocated + smd->nr_allocated_this_transaction bigger than smd->old_ll.nr_blocks. In this case, alloc_data_block() will never commit metadata to reset the begin pointer of struct sm_disk, because sm_disk_get_nr_free() always return an underflow value."
While there is room for improvement to the space-map accounting that thinp is making use of: the reality is this test is inherently racey and will result in the previous iteration's fstrim's discard(s) completing vs concurrent block allocation, via dd, in the next iteration of the loop.
No amount of space map accounting improvements will be able to allow user's to use a block before a discard of that block has completed.
So the best we can really do is allow DM thinp to gracefully handle such aggressive use of all the pool's data by degrading the pool into out-of-data-space (OODS) mode. We _should_ get that behaviour already (if space map accounting didn't falsely cause alloc_data_block() to believe free space was available).. but short of that we handle the current reality that dm_pool_alloc_data_block() can return -ENOSPC.
--- drivers/md/dm-thin.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/md/dm-thin.c +9 -2
@@ -1299,6 +1299,8 @@ static void schedule_external_copy(strucstatic void set_pool_mode (struct pool *pool,enum pool_mode new_mode); +static void requeue_bios (struct pool *pool); +static void check_for_space (struct pool *pool) {int r;
@@ -1311,8 +1313,10 @@ static void check_for_space(struct poolif (r)return ; -if (nr_free) +if (nr_free) {set_pool_mode (pool,PM_WRITE ); +requeue_bios (pool); + } }/*
@@ -1389,7 +1393,10 @@ static int alloc_data_block(struct thin_ r =dm_pool_alloc_data_block (pool->pmd, result);if (r) { -metadata_operation_failed (pool,"dm_pool_alloc_data_block" , r); +if (r == -ENOSPC ) +set_pool_mode (pool,PM_OUT_OF_DATA_SPACE ); +else +metadata_operation_failed (pool,"dm_pool_alloc_data_block" , r);return r; }
Greg Kroah-Hartman
maintainerPATCH 105/105 Bluetooth: Fix connection if directed advertising and privacy is used
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Szymon Janc <[email protected]>
commit 082f2300cfa1a3d9d5221c38c5eba85d4ab98bd8 upstream.
Local random address needs to be updated before creating connection if RPA from LE Direct Advertising Report was resolved in host. Otherwise remote device might ignore connection request due to address mismatch.
This was affecting following qualification test cases:
GAP/CONN/SCEP/BV-03-C, GAP/CONN/GCEP/BV-05-C, GAP/CONN/DCEP/BV-05-C
Before patch:
< HCI Command: LE Set Random Address (0x08|0x0005) plen 6 #11350 [hci0] 84680.231216
Address: 56:BC:E8:24:11:68 (Resolvable)
Identity type: Random (0x01)
Identity: F2:F1:06:3D:9C:42 (Static)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #11351 [hci0] 84680.246022
LE Set Random Address (0x08|0x0005) ncmd 1
Status: Success (0x00)
< HCI Command: LE Set Scan Parameters (0x08|0x000b) plen 7 #11352 [hci0] 84680.246417
Type: Passive (0x00)
Interval: 60.000 msec (0x0060)
Window: 30.000 msec (0x0030)
Own address type: Random (0x01)
Filter policy: Accept all advertisement, inc. directed unresolved RPA (0x02)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #11353 [hci0] 84680.248854
LE Set Scan Parameters (0x08|0x000b) ncmd 1
Status: Success (0x00)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 #11354 [hci0] 84680.249466
Scanning: Enabled (0x01)
Filter duplicates: Enabled (0x01)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #11355 [hci0] 84680.253222
LE Set Scan Enable (0x08|0x000c) ncmd 1
Status: Success (0x00)Quoted 1 line
HCI Event: LE Meta Event (
0x3e) plen 18 #11356 [hci0] 84680.458387
LE Direct Advertising Report (0x0b)
Num reports: 1
Event type: Connectable directed - ADV_DIRECT_IND (0x01)
Address type: Random (0x01)
Address: 53:38:DA:46:8C:45 (Resolvable)
Identity type: Public (0x00)
Identity: 11:22:33:44:55:66 (OUI 11-22-33)
Direct address type: Random (0x01)
Direct address: 7C:D6:76:8C:DF:82 (Resolvable)
Identity type: Random (0x01)
Identity: F2:F1:06:3D:9C:42 (Static)
RSSI: -74 dBm (0xb6)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 #11357 [hci0] 84680.458737
Scanning: Disabled (0x00)
Filter duplicates: Disabled (0x00)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #11358 [hci0] 84680.469982
LE Set Scan Enable (0x08|0x000c) ncmd 1
Status: Success (0x00)
< HCI Command: LE Create Connection (0x08|0x000d) plen 25 #11359 [hci0] 84680.470444
Scan interval: 60.000 msec (0x0060)
Scan window: 60.000 msec (0x0060)
Filter policy: White list is not used (0x00)
Peer address type: Random (0x01)
Peer address: 53:38:DA:46:8C:45 (Resolvable)
Identity type: Public (0x00)
Identity: 11:22:33:44:55:66 (OUI 11-22-33)
Own address type: Random (0x01)
Min connection interval: 30.00 msec (0x0018)
Max connection interval: 50.00 msec (0x0028)
Connection latency: 0 (0x0000)
Supervision timeout: 420 msec (0x002a)
Min connection length: 0.000 msec (0x0000)
Max connection length: 0.000 msec (0x0000)Quoted 1 line
HCI Event: Command Status (
0x0f) plen 4 #11360 [hci0] 84680.474971
LE Create Connection (0x08|0x000d) ncmd 1
Status: Success (0x00)< HCI Command: LE Create Connection Cancel (0x08|0x000e) plen 0 #11361 [hci0] 84682.545385
Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #11362 [hci0] 84682.551014
LE Create Connection Cancel (0x08|0x000e) ncmd 1
Status: Success (0x00)Quoted 1 line
HCI Event: LE Meta Event (
0x3e) plen 19 #11363 [hci0] 84682.551074
LE Connection Complete (0x01)
Status: Unknown Connection Identifier (0x02)
Handle: 0
Role: Master (0x00)
Peer address type: Public (0x00)
Peer address: 00:00:00:00:00:00 (OUI 00-00-00)
Connection interval: 0.00 msec (0x0000)
Connection latency: 0 (0x0000)
Supervision timeout: 0 msec (0x0000)
Master clock accuracy: 0x00After patch:
< HCI Command: LE Set Scan Parameters (0x08|0x000b) plen 7 #210 [hci0] 667.152459
Type: Passive (0x00)
Interval: 60.000 msec (0x0060)
Window: 30.000 msec (0x0030)
Own address type: Random (0x01)
Filter policy: Accept all advertisement, inc. directed unresolved RPA (0x02)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #211 [hci0] 667.153613
LE Set Scan Parameters (0x08|0x000b) ncmd 1
Status: Success (0x00)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 #212 [hci0] 667.153704
Scanning: Enabled (0x01)
Filter duplicates: Enabled (0x01)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #213 [hci0] 667.154584
LE Set Scan Enable (0x08|0x000c) ncmd 1
Status: Success (0x00)Quoted 1 line
HCI Event: LE Meta Event (
0x3e) plen 18 #214 [hci0] 667.182619
LE Direct Advertising Report (0x0b)
Num reports: 1
Event type: Connectable directed - ADV_DIRECT_IND (0x01)
Address type: Random (0x01)
Address: 50:52:D9:A6:48:A0 (Resolvable)
Identity type: Public (0x00)
Identity: 11:22:33:44:55:66 (OUI 11-22-33)
Direct address type: Random (0x01)
Direct address: 7C:C1:57:A5:B7:A8 (Resolvable)
Identity type: Random (0x01)
Identity: F4:28:73:5D:38:B0 (Static)
RSSI: -70 dBm (0xba)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2 #215 [hci0] 667.182704
Scanning: Disabled (0x00)
Filter duplicates: Disabled (0x00)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #216 [hci0] 667.183599
LE Set Scan Enable (0x08|0x000c) ncmd 1
Status: Success (0x00)
< HCI Command: LE Set Random Address (0x08|0x0005) plen 6 #217 [hci0] 667.183645
Address: 7C:C1:57:A5:B7:A8 (Resolvable)
Identity type: Random (0x01)
Identity: F4:28:73:5D:38:B0 (Static)Quoted 1 line
HCI Event: Command Complete (
0x0e) plen 4 #218 [hci0] 667.184590
LE Set Random Address (0x08|0x0005) ncmd 1
Status: Success (0x00)
< HCI Command: LE Create Connection (0x08|0x000d) plen 25 #219 [hci0] 667.184613
Scan interval: 60.000 msec (0x0060)
Scan window: 60.000 msec (0x0060)
Filter policy: White list is not used (0x00)
Peer address type: Random (0x01)
Peer address: 50:52:D9:A6:48:A0 (Resolvable)
Identity type: Public (0x00)
Identity: 11:22:33:44:55:66 (OUI 11-22-33)
Own address type: Random (0x01)
Min connection interval: 30.00 msec (0x0018)
Max connection interval: 50.00 msec (0x0028)
Connection latency: 0 (0x0000)
Supervision timeout: 420 msec (0x002a)
Min connection length: 0.000 msec (0x0000)
Max connection length: 0.000 msec (0x0000)Quoted 1 line
HCI Event: Command Status (
0x0f) plen 4 #220 [hci0] 667.186558
LE Create Connection (0x08|0x000d) ncmd 1
Status: Success (0x00)Quoted 1 line
HCI Event: LE Meta Event (
0x3e) plen 19 #221 [hci0] 667.485824
LE Connection Complete (0x01)
Status: Success (0x00)
Handle: 0
Role: Master (0x00)
Peer address type: Random (0x01)
Peer address: 50:52:D9:A6:48:A0 (Resolvable)
Identity type: Public (0x00)
Identity: 11:22:33:44:55:66 (OUI 11-22-33)
Connection interval: 50.00 msec (0x0028)
Connection latency: 0 (0x0000)
Supervision timeout: 420 msec (0x002a)
Master clock accuracy: 0x07
@ MGMT Event: Device Connected (0x000b) plen 13 {0x0002} [hci0] 667.485996
LE Address: 11:22:33:44:55:66 (OUI 11-22-33)
Flags: 0x00000000
Data length: 0--- include/net/bluetooth/hci_core.h | 2 +- net/bluetooth/hci_conn.c | 27 ++++++++++++++++++++------- net/bluetooth/hci_event.c | 15 +++++++++++---- 3 files changed, 32 insertions(+), 12 deletions(-)
include/net/bluetooth/hci_core.h +1 -1
@@ -878,7 +878,7 @@ struct hci_conn *hci_connect_le_scan(str u16 conn_timeout, u8 role);struct hci_conn *hci_connect_le (struct hci_dev *hdev,bdaddr_t *dst,u8 dst_type,u8 sec_level,u16 conn_timeout, -u8 role); +u8 role,bdaddr_t *direct_rpa);struct hci_conn *hci_connect_acl (struct hci_dev *hdev,bdaddr_t *dst,u8 sec_level,u8 auth_type); struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
net/bluetooth/hci_conn.c +20 -7
@@ -708,7 +708,8 @@ done: }static void hci_req_add_le_create_conn (struct hci_request *req, -struct hci_conn *conn) +struct hci_conn *conn, +bdaddr_t *direct_rpa) {struct hci_cp_le_create_conn cp;struct hci_dev *hdev = conn->hdev;
@@ -716,11 +717,23 @@ static void hci_req_add_le_create_conn(smemset (&cp,0 ,sizeof (cp)); -/* Update random address, but set require_privacy to false so -* that we never connect with an non-resolvable address. +/* If direct address was provided we use it instead of current +* address. */ -if (hci_update_random_address (req, false, &own_addr_type)) -return ; +if (direct_rpa) { +if (bacmp (&req->hdev->random_addr, direct_rpa)) +hci_req_add (req,HCI_OP_LE_SET_RANDOM_ADDR ,6 , + direct_rpa); + +/* direct address is always RPA */ + own_addr_type =ADDR_LE_DEV_RANDOM ; + }else { +/* Update random address, but set require_privacy to false so +* that we never connect with an non-resolvable address. +*/ +if (hci_update_random_address (req, false, &own_addr_type)) +return ; + }/* Set window to be the same value as the interval to enable * continuous scanning.
@@ -782,7 +795,7 @@ static void hci_req_directed_advertisingstruct hci_conn *hci_connect_le (struct hci_dev *hdev,bdaddr_t *dst,u8 dst_type,u8 sec_level,u16 conn_timeout, -u8 role) +u8 role,bdaddr_t *direct_rpa) {struct hci_conn_params *params;struct hci_conn *conn, *conn_unfinished;
@@ -913,7 +926,7 @@ struct hci_conn *hci_connect_le(struct hhci_dev_set_flag (hdev,HCI_LE_SCAN_INTERRUPTED ); } -hci_req_add_le_create_conn (&req, conn); +hci_req_add_le_create_conn (&req, conn, direct_rpa); create_conn: err =hci_req_run (&req, create_le_conn_complete);
net/bluetooth/hci_event.c +11 -4
@@ -4632,7 +4632,8 @@ static void hci_le_conn_update_complete_/* This function requires the caller holds hdev->lock */ static struct hci_conn *check_pending_le_conn (struct hci_dev *hdev,bdaddr_t *addr, -u8 addr_type,u8 adv_type) +u8 addr_type,u8 adv_type, +bdaddr_t *direct_rpa) {struct hci_conn *conn;struct hci_conn_params *params;
@@ -4683,7 +4684,8 @@ static struct hci_conn *check_pending_le } conn =hci_connect_le (hdev, addr, addr_type,BT_SECURITY_LOW , -HCI_LE_AUTOCONN_TIMEOUT ,HCI_ROLE_MASTER ); +HCI_LE_AUTOCONN_TIMEOUT ,HCI_ROLE_MASTER , + direct_rpa);if (!IS_ERR (conn)) {/* If HCI_AUTO_CONN_EXPLICIT is set, conn is already owned * by higher layer that tried to connect, if no then
@@ -4780,8 +4782,13 @@ static void process_adv_report(struct hc bdaddr_type = irk->addr_type; } -/* Check if we have been requested to connect to this device */ - conn =check_pending_le_conn (hdev, bdaddr, bdaddr_type, type); +/* Check if we have been requested to connect to this device. +* +* direct_addr is set only for directed advertising reports (it is NULL +* for advertising reports) and is already verified to be RPA above. +*/ + conn =check_pending_le_conn (hdev, bdaddr, bdaddr_type, type, + direct_addr);if (conn && type ==LE_ADV_IND ) {/* Store report for later inclusion by * mgmt_device_connected
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.139 release. There are 105 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 Tue Jul 3 15:31:30 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.139-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
Merged, compiled with -Werror, and installed onto my Pixel 2 XL and OnePlus 5.
No initial issues noticed in dmesg or general usage.
Thanks,
Nathan
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.139 release. There are 105 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 Tue Jul 3 15:31:30 UTC 2018. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.139-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
Results from Linaro’s test farm.
No regressions on arm64, arm and x86_64.
Summary
------------------------------------------------------------------------
kernel: 4.4.139-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.4.y
git commit: a2f8445cb8b24e35e0f3d8ebdcd70236ebb6acec
git describe: v4.4.138-106-ga2f8445cb8b2
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.4-oe/build/v4.4.138-106-ga2f8445cb8b2
No regressions (compared to build v4.4.138-26-g2197a4466680)
Ran 7156 total tests in the following environments and test suites.
Environments
--------------
- juno-r2 - arm64
- qemu_arm
- qemu_x86_64
- x15 - arm
- x86_64
Test Suites
-----------
* boot
* kselftest
* libhugetlbfs
* ltp-cap_bounds-tests
* ltp-containers-tests
* ltp-cve-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-timers-tests
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
Summary
------------------------------------------------------------------------
kernel: 4.4.139-rc1
git repo: https://git.linaro.org/lkft/arm64-stable-rc.git
git branch: 4.4.139-rc1-hikey-20180701-226
git commit: afc4165cf23e88d709720057aceb8cf040f62ee3
git describe: 4.4.139-rc1-hikey-20180701-226
Test details: https://qa-reports.linaro.org/lkft/linaro-hikey-stable-rc-4.4-oe/build/4.4.139-rc1-hikey-20180701-226
No regressions (compared to build 4.4.139-rc1-hikey-20180624-224)
Ran 2587 total tests in the following environments and test suites.
Environments
--------------
- hi6220-hikey - arm64
- qemu_arm64
Test Suites
-----------
* boot
* kselftest
* libhugetlbfs
* ltp-cap_bounds-tests
* ltp-containers-tests
* ltp-cve-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-timers-tests
* ltp-fs-tests
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.139 release. There are 105 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 Tue Jul 3 15:31:30 UTC 2018. Anything received after that time might be too late.
Build results:
total: 148 pass: 148 fail: 0 Qemu test results: total: 138 pass: 138 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter