3.12.21-stable review
cover 3.12.21-stable review
This is the start of the stable review cycle for the 3.12.21 release. There are 103 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 Mon Jun 2 13:47:39 2014 Anything received after that time might be too late.
The whole patch series can be found in one patch at:
http://kernel.org/pub/linux/kernel/people/jirislaby/stable-review/patch-3.12.21-rc1.xz
and the diffstat can be found below.
thanks,
js
===============
AceLan Kao (3):
HID: usbhid: merge the sis quirk
HID: usbhid: quirk for Synaptics HD touchscreen
HID: usbhid: quirk for Synaptics Quad HD touchscreen
Al Viro (1):
don't bother with {get,put}_write_access() on non-regular files
Aleksander Morgado (1):
net: qmi_wwan: add support for Cinterion PXS8 and PHS8
Alex Deucher (2):
drm/radeon: call drm_edid_to_eld when we update the edid drm/radeon: fix typo in spectre_golden_registers
Andreas Schwab (1):
powerpc: Add vr save/restore functions
Andrew Lutomirski (1):
net: Fix ns_capable check in sock_diag_put_filterinfo
Andrey Vagin (1):
netfilter: nf_conntrack: reserve two bytes for nf_ct_ext->len
Andy King (1):
vsock: Make transport the proto owner
Antonio Quartulli (1):
batman-adv: increase orig refcount when storing ref in gw_node
Benjamin Tissoires (1):
HID: core: do not scan constant input report
Bjørn Mork (14):
usb: qcserial: add Sierra Wireless EM7355
usb: qcserial: add Sierra Wireless MC73xx
usb: qcserial: add Sierra Wireless MC7305/MC7355
usb: option: add Olivetti Olicard 500
usb: option: add Alcatel L800MA
usb: option: add and update a number of CMOTech devices
net: qmi_wwan: add Sierra Wireless EM7355
net: qmi_wwan: add Sierra Wireless MC73xx
net: qmi_wwan: add Sierra Wireless MC7305/MC7355
net: qmi_wwan: add Olivetti Olicard 500
net: qmi_wwan: add Alcatel L800MA
net: qmi_wwan: add a number of CMOTech devices
net: qmi_wwan: add a number of Dell devices
net: cdc_mbim: handle unaccelerated VLAN tagged frames
Chris Mason (1):
mlx4_en: don't use napi_synchronize inside mlx4_en_netpoll
Christopher Friedt (1):
drm/vmwgfx: correct fb_fix_screeninfo.line_length
Cong Wang (1):
rtnetlink: wait for unregistering devices in rtnl_link_unregister()
Dan Carpenter (1):
SCSI: megaraid: missing bounds check in mimd_to_kioc()
Daniel Borkmann (2):
net: sctp: wake up all assocs if sndbuf policy is per socket
net: sctp: test if association is dead in sctp_wake_up_waiters
Daniele Palmas (1):
usb: option driver, add support for Telit UE910v2
David Gibson (2):
rtnetlink: Warn when interface's information won't fit in our packet
rtnetlink: Only supply IFLA_VF_PORTS information when RTEXT_FILTER_VF
is set
Dmitry Petukhov (1):
l2tp: take PMTU from tunnel UDP socket
Emanuel Krenz (1):
HID: add support for SiS multitouch panel in the touch monitor LG
23ET83V
Eric Dumazet (2):
ipv6: Limit mtu to 65575 bytes
net-gro: reset skb->truesize in napi_reuse_skb()
Fabio Porcedda (1):
net: qmi_wwan: add Telit LE920 newer firmware support
Florian Westphal (3):
net: core: don't account for udp header size when computing seglen
net: ipv4: ip_forward: fix inverted local_df test
net: ipv6: send pkttoobig immediately if orig frag size > mtu
Hans de Goede (2):
xhci: For streams the css flag most be read from the stream-ctx on ep
stop
HID: add NO_INIT_REPORTS quirk for Synaptics Touch Pad V 103S
Ilya Dryomov (1):
rbd: fix error paths in rbd_img_request_fill()
Ivan Vecera (1):
tg3: update rx_jumbo_pending ring param only when jumbo frames are
enabled
James Bottomley (2):
scsi: fix our current target reap infrastructure
SCSI: dual scan thread bug fix
Jani Nikula (1):
drm/i915/tv: fix gen4 composite s-video tv-out
Johan Hovold (4):
USB: usb_wwan: fix handling of missing bulk endpoints Revert "USB: serial: add usbid for dell wwan card to sierra.c"
USB: serial: fix sysfs-attribute removal deadlock
USB: io_ti: fix firmware download on big-endian machines
Julian Anastasov (1):
ipv4: return valid RTA_IIF on ip route get
Konrad Rzeszutek Wilk (1):
xen/spinlock: Don't enable them unconditionally.
Kumar Sundararajan (1):
ipv6: fib: fix fib dump restart
Li RongQing (1):
ipv4: initialise the itag variable in __mkroute_input
Liu Yu (1):
tcp_cubic: fix the range of delayed_ack
Maarten Lankhorst (1):
drm/qxl: unset a pointer in sync_obj_unref
Marcelo Tosatti (1):
KVM: x86: remove WARN_ON from get_kernel_ns()
Mathias Krause (1):
filter: prevent nla extensions to peek beyond the end of the message
Mel Gorman (1):
mm: use paravirt friendly ops for NUMA hinting ptes
Michael Ulbricht (1):
USB: cdc-acm: Remove Motorola/Telit H24 serial interfaces from ACM
driver
Michele Baldessari (1):
USB: serial: ftdi_sio: add id for Brainboxes serial cards
Mikulas Patocka (1):
tgafb: fix mode setting with fbset
Mizuma, Masayoshi (1):
mm/hugetlb.c: add cond_resched_lock() in return_unused_surplus_pages()
NeilBrown (1):
md/raid1: r1buf_pool_alloc: free allocate pages when subsequent
allocation fails.
Nicolas Dichtel (3):
gre: don't allow to add the same tunnel twice
vti: don't allow to add the same tunnel twice
ip6_gre: don't allow to remove the fb_tunnel_dev
Nikolay Aleksandrov (1):
sfc: fix calling of free_irq with already free vector
Oleg Nesterov (1):
list: introduce list_next_entry() and list_prev_entry()
Oliver Hartkopp (1):
slip: fix spinlock variant
Peter Christensen (1):
macvlan: Don't propagate IFF_ALLMULTI changes on down interfaces.
Raymond Wanyoike (1):
net: qmi_wwan: add ZTE MF667
Richard Guy Briggs (4):
audit: restore order of tty and ses fields in log output
pid: get pid_t ppid of task in init_pid_ns
sched: declare pid_alive as inline
audit: convert PPIDs to the inital PID namespace.
Roman Pen (1):
blktrace: fix accounting of partially completed requests
Sachin Prabhu (1):
cifs: Wait for writebacks to complete before attempting write.
Sergey Popovich (1):
ipv4: fib_semantics: increment fib_info_cnt after fib_info allocation
Steffen Klassert (1):
ip_tunnel: Initialize the fallback device properly
Steven Rostedt (Red Hat) (1):
tracepoint: Do not waste memory on mods with no tracepoints
Susant Sahani (1):
ip6_tunnel: fix potential NULL pointer dereference
Thomas Bächler (1):
fs: Don't return 0 from get_anon_bdev
Thomas Graf (1):
netfilter: Can't fail and free after table replacement
Thomas Hellstrom (1):
drm/vmwgfx: Make sure user-space can't DMA across buffer object
boundaries v2
Thomas Richter (1):
bonding: Remove debug_fs files when module init fails
Toshiaki Makita (2):
bridge: Fix double free and memory leak around br_allowed_ingress
bridge: Handle IFLA_ADDRESS correctly when creating bridge device
Tristan Bruns (1):
USB: cp210x: Add 8281 (Nanotec Plug & Drive)
Viresh Kumar (1):
tick-common: Fix wrong check in tick_check_replacement()
Vlad Yasevich (3):
net: sctp: cache auth_enable per endpoint
mactap: Fix checksum errors for non-gso packets in bridge mode Revert "macvlan : fix checksums error when we are in bridge mode"
Wanlong Gao (1):
HID: usbhid: fix sis quirk
Xufeng Zhang (1):
sctp: reset flowi4_oif parameter on route lookup
Ying Cai (1):
ip_tunnel: Set network header properly for IP_ECN_decapsulate()
Yufeng Shen (1):
HID: usbhid: quirk for CY-TM75 75 inch Touch Overlay
dingtianhong (1):
vlan: Fix lockdep warning when vlan dev handle notification
arch/powerpc/lib/crtsavres.S | 186 +++++++++++++++++++++++++ arch/x86/kvm/x86.c | 1 - arch/x86/xen/spinlock.c | 5 +- block/blk-core.c | 2 +- drivers/block/rbd.c | 2 +- drivers/gpu/drm/i915/intel_tv.c | 9 +- drivers/gpu/drm/qxl/qxl_ttm.c | 1 + drivers/gpu/drm/radeon/cik.c | 2 +- drivers/gpu/drm/radeon/radeon_display.c | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 22 +++ drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 5 +- drivers/hid/hid-core.c | 8 +- drivers/hid/hid-ids.h | 10 +- drivers/hid/hid-multitouch.c | 7 +- drivers/hid/usbhid/hid-quirks.c | 11 +- drivers/md/raid1.c | 17 ++- drivers/net/bonding/bond_main.c | 1 + drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | 3 - drivers/net/ethernet/broadcom/tg3.c | 4 +- drivers/net/ethernet/mellanox/mlx4/en_cq.c | 1 - drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 +- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - drivers/net/ethernet/sfc/nic.c | 14 +- drivers/net/macvlan.c | 9 +- drivers/net/macvtap.c | 9 ++ drivers/net/slip/slip.c | 6 +- drivers/net/usb/cdc_mbim.c | 39 ++++-- drivers/net/usb/qmi_wwan.c | 31 +++++ drivers/scsi/megaraid/megaraid_mm.c | 2 + drivers/scsi/scsi_scan.c | 112 +++++++++------ drivers/scsi/scsi_sysfs.c | 20 ++- drivers/usb/class/cdc-acm.c | 28 +++- drivers/usb/host/xhci-ring.c | 14 +- drivers/usb/serial/cp210x.c | 1 + drivers/usb/serial/ftdi_sio.c | 33 +++++ drivers/usb/serial/ftdi_sio_ids.h | 37 +++++ drivers/usb/serial/io_ti.c | 50 ++++--- drivers/usb/serial/option.c | 83 ++++++++++- drivers/usb/serial/qcserial.c | 9 ++ drivers/usb/serial/sierra.c | 1 - drivers/usb/serial/usb-serial.c | 4 +- drivers/usb/serial/usb_wwan.c | 9 +- drivers/video/tgafb.c | 15 +- fs/cifs/cifsfs.c | 14 +- fs/cifs/cifsglob.h | 8 ++ fs/cifs/cifsproto.h | 3 + fs/cifs/file.c | 31 ++++- fs/cifs/misc.c | 74 +++++++++- fs/cifs/smb1ops.c | 11 ++ fs/cifs/smb2misc.c | 18 ++- fs/cifs/smb2ops.c | 14 ++ fs/file_table.c | 4 +- fs/open.c | 26 +--- fs/super.c | 5 +- include/asm-generic/pgtable.h | 31 +++-- include/linux/list.h | 16 +++ include/linux/rtnetlink.h | 5 + include/linux/sched.h | 20 ++- include/linux/sock_diag.h | 2 +- include/net/af_vsock.h | 6 +- include/net/ip6_route.h | 5 + include/net/netfilter/nf_conntrack_extend.h | 4 +- include/net/sctp/structs.h | 4 +- include/scsi/scsi_device.h | 3 +- include/trace/events/block.h | 33 ++++- kernel/audit.c | 8 +- kernel/auditsc.c | 2 +- kernel/events/core.c | 3 - kernel/time/tick-common.c | 2 +- kernel/trace/blktrace.c | 20 +-- kernel/tracepoint.c | 6 + mm/hugetlb.c | 1 + net/8021q/vlan_dev.c | 46 +++++- net/batman-adv/gateway_client.c | 11 +- net/bridge/br_input.c | 2 +- net/bridge/br_netlink.c | 15 ++ net/bridge/br_vlan.c | 7 +- net/bridge/netfilter/ebtables.c | 5 +- net/core/dev.c | 4 +- net/core/filter.c | 6 +- net/core/net_namespace.c | 2 +- net/core/rtnetlink.c | 66 +++++++-- net/core/skbuff.c | 12 +- net/core/sock_diag.c | 4 +- net/ipv4/fib_semantics.c | 2 +- net/ipv4/ip_forward.c | 4 +- net/ipv4/ip_gre.c | 2 +- net/ipv4/ip_tunnel.c | 3 + net/ipv4/ip_vti.c | 2 +- net/ipv4/netfilter/arp_tables.c | 6 +- net/ipv4/netfilter/ip_tables.c | 6 +- net/ipv4/route.c | 4 +- net/ipv4/tcp_cubic.c | 2 +- net/ipv6/ip6_fib.c | 3 +- net/ipv6/ip6_gre.c | 10 ++ net/ipv6/ip6_output.c | 6 +- net/ipv6/ip6_tunnel.c | 2 +- net/ipv6/netfilter/ip6_tables.c | 6 +- net/ipv6/route.c | 5 +- net/l2tp/l2tp_ppp.c | 4 +- net/packet/diag.c | 2 +- net/sctp/auth.c | 17 +-- net/sctp/endpointola.c | 3 +- net/sctp/protocol.c | 7 +- net/sctp/sm_make_chunk.c | 32 +++-- net/sctp/sm_statefuns.c | 6 +- net/sctp/socket.c | 96 +++++++++---- net/sctp/sysctl.c | 38 ++++- net/vmw_vsock/af_vsock.c | 47 +++---- scripts/mod/modpost.c | 8 +- 110 files changed, 1351 insertions(+), 362 deletions(-)
Signature · 1 line
1.9.3
PATCH 1/103 powerpc: Add vr save/restore functions
From: Andreas Schwab <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 8fe9c93e7453e67b8bd09f263ec1bb0783c733fc upstream.
GCC 4.8 now generates out-of-line vr save/restore functions when optimizing for size. They are needed for the raid6 altivec support.
--- arch/powerpc/lib/crtsavres.S | 186 +++++++++++++++++++++++++++++++++++++++++++ scripts/mod/modpost.c | 8 +- 2 files changed, 192 insertions(+), 2 deletions(-)
arch/powerpc/lib/crtsavres.S +186 -0
@@ -231,6 +231,87 @@ _GLOBAL(_rest32gpr_31_x) mr 1,11 blr +#ifdef CONFIG_ALTIVEC +/* Called with r0 pointing just beyond the end of the vector save area. */ + +_GLOBAL(_savevr_20) + li r11,-192 + stvx vr20,r11,r0 +_GLOBAL(_savevr_21) + li r11,-176 + stvx vr21,r11,r0 +_GLOBAL(_savevr_22) + li r11,-160 + stvx vr22,r11,r0 +_GLOBAL(_savevr_23) + li r11,-144 + stvx vr23,r11,r0 +_GLOBAL(_savevr_24) + li r11,-128 + stvx vr24,r11,r0 +_GLOBAL(_savevr_25) + li r11,-112 + stvx vr25,r11,r0 +_GLOBAL(_savevr_26) + li r11,-96 + stvx vr26,r11,r0 +_GLOBAL(_savevr_27) + li r11,-80 + stvx vr27,r11,r0 +_GLOBAL(_savevr_28) + li r11,-64 + stvx vr28,r11,r0 +_GLOBAL(_savevr_29) + li r11,-48 + stvx vr29,r11,r0 +_GLOBAL(_savevr_30) + li r11,-32 + stvx vr30,r11,r0 +_GLOBAL(_savevr_31) + li r11,-16 + stvx vr31,r11,r0 + blr + +_GLOBAL(_restvr_20) + li r11,-192 + lvx vr20,r11,r0 +_GLOBAL(_restvr_21) + li r11,-176 + lvx vr21,r11,r0 +_GLOBAL(_restvr_22) + li r11,-160 + lvx vr22,r11,r0 +_GLOBAL(_restvr_23) + li r11,-144 + lvx vr23,r11,r0 +_GLOBAL(_restvr_24) + li r11,-128 + lvx vr24,r11,r0 +_GLOBAL(_restvr_25) + li r11,-112 + lvx vr25,r11,r0 +_GLOBAL(_restvr_26) + li r11,-96 + lvx vr26,r11,r0 +_GLOBAL(_restvr_27) + li r11,-80 + lvx vr27,r11,r0 +_GLOBAL(_restvr_28) + li r11,-64 + lvx vr28,r11,r0 +_GLOBAL(_restvr_29) + li r11,-48 + lvx vr29,r11,r0 +_GLOBAL(_restvr_30) + li r11,-32 + lvx vr30,r11,r0 +_GLOBAL(_restvr_31) + li r11,-16 + lvx vr31,r11,r0 + blr + +#endif /* CONFIG_ALTIVEC */ + #else /* CONFIG_PPC64 */ .section ".text.save.restore","ax",@progbits
@@ -356,6 +437,111 @@ _restgpr0_31: mtlr r0 blr +#ifdef CONFIG_ALTIVEC +/* Called with r0 pointing just beyond the end of the vector save area. */ + +.globl _savevr_20 +_savevr_20: + li r12,-192 + stvx vr20,r12,r0 +.globl _savevr_21 +_savevr_21: + li r12,-176 + stvx vr21,r12,r0 +.globl _savevr_22 +_savevr_22: + li r12,-160 + stvx vr22,r12,r0 +.globl _savevr_23 +_savevr_23: + li r12,-144 + stvx vr23,r12,r0 +.globl _savevr_24 +_savevr_24: + li r12,-128 + stvx vr24,r12,r0 +.globl _savevr_25 +_savevr_25: + li r12,-112 + stvx vr25,r12,r0 +.globl _savevr_26 +_savevr_26: + li r12,-96 + stvx vr26,r12,r0 +.globl _savevr_27 +_savevr_27: + li r12,-80 + stvx vr27,r12,r0 +.globl _savevr_28 +_savevr_28: + li r12,-64 + stvx vr28,r12,r0 +.globl _savevr_29 +_savevr_29: + li r12,-48 + stvx vr29,r12,r0 +.globl _savevr_30 +_savevr_30: + li r12,-32 + stvx vr30,r12,r0 +.globl _savevr_31 +_savevr_31: + li r12,-16 + stvx vr31,r12,r0 + blr + +.globl _restvr_20 +_restvr_20: + li r12,-192 + lvx vr20,r12,r0 +.globl _restvr_21 +_restvr_21: + li r12,-176 + lvx vr21,r12,r0 +.globl _restvr_22 +_restvr_22: + li r12,-160 + lvx vr22,r12,r0 +.globl _restvr_23 +_restvr_23: + li r12,-144 + lvx vr23,r12,r0 +.globl _restvr_24 +_restvr_24: + li r12,-128 + lvx vr24,r12,r0 +.globl _restvr_25 +_restvr_25: + li r12,-112 + lvx vr25,r12,r0 +.globl _restvr_26 +_restvr_26: + li r12,-96 + lvx vr26,r12,r0 +.globl _restvr_27 +_restvr_27: + li r12,-80 + lvx vr27,r12,r0 +.globl _restvr_28 +_restvr_28: + li r12,-64 + lvx vr28,r12,r0 +.globl _restvr_29 +_restvr_29: + li r12,-48 + lvx vr29,r12,r0 +.globl _restvr_30 +_restvr_30: + li r12,-32 + lvx vr30,r12,r0 +.globl _restvr_31 +_restvr_31: + li r12,-16 + lvx vr31,r12,r0 + blr + +#endif /* CONFIG_ALTIVEC */ + #endif /* CONFIG_PPC64 */ #endif
scripts/mod/modpost.c +6 -2
@@ -573,12 +573,16 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)if (strncmp (symname,"_restgpr_" ,sizeof ("_restgpr_" ) -1 ) ==0 ||strncmp (symname,"_savegpr_" ,sizeof ("_savegpr_" ) -1 ) ==0 ||strncmp (symname,"_rest32gpr_" ,sizeof ("_rest32gpr_" ) -1 ) ==0 || -strncmp (symname,"_save32gpr_" ,sizeof ("_save32gpr_" ) -1 ) ==0 ) +strncmp (symname,"_save32gpr_" ,sizeof ("_save32gpr_" ) -1 ) ==0 || +strncmp (symname,"_restvr_" ,sizeof ("_restvr_" ) -1 ) ==0 || +strncmp (symname,"_savevr_" ,sizeof ("_savevr_" ) -1 ) ==0 )return 1 ;if (info->hdr->e_machine ==EM_PPC64 )/* Special register function linked on all modules during final link of .ko */ if (strncmp (symname,"_restgpr0_" ,sizeof ("_restgpr0_" ) -1 ) ==0 || -strncmp (symname,"_savegpr0_" ,sizeof ("_savegpr0_" ) -1 ) ==0 ) +strncmp (symname,"_savegpr0_" ,sizeof ("_savegpr0_" ) -1 ) ==0 || +strncmp (symname,"_restvr_" ,sizeof ("_restvr_" ) -1 ) ==0 || +strncmp (symname,"_savevr_" ,sizeof ("_savevr_" ) -1 ) ==0 )return 1 ;/* Do not ignore this symbol */ return 0 ;
Signature · 1 line
1.9.3
PATCH 2/103 audit: restore order of tty and ses fields in log output
From: Richard Guy Briggs <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 2f2ad1013322c8f6c40fc6dafdbd32442fa730ad upstream.
When being refactored from audit_log_start() to audit_log_task_info(), in commit e23eb920 the tty and ses fields in the log output got transposed. Restore to original order to avoid breaking search tools.
--- kernel/audit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/audit.c +2 -2
@@ -1615,7 +1615,7 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk) audit_log_format(ab, " ppid=%ld pid=%d auid=%u uid=%u gid=%u" " euid=%u suid=%u fsuid=%u" - " egid=%u sgid=%u fsgid=%u ses=%u tty=%s", + " egid=%u sgid=%u fsgid=%u tty=%s ses=%u", sys_getppid(), tsk->pid, from_kuid(&init_user_ns, audit_get_loginuid(tsk)),
@@ -1627,7 +1627,7 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)from_kgid (&init_user_ns, cred->egid),from_kgid (&init_user_ns, cred->sgid),from_kgid (&init_user_ns, cred->fsgid), - audit_get_sessionid(tsk), tty); + tty, audit_get_sessionid(tsk));get_task_comm (name, tsk);audit_log_format (ab," comm=" );
Signature · 1 line
1.9.3
PATCH 3/103 HID: usbhid: merge the sis quirk
In reply to Jiri SlabyFrom: AceLan Kao <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 765e5fbd3e04ba753b2585e9f852fdcd34b95d10 upstream.
USB_VENDOR_ID_SIS and USB_VENDOR_ID_SIS2_TOUCH are identical, so refine the code and merge the quirks.
--- drivers/hid/hid-ids.h | 5 ++--- drivers/hid/usbhid/hid-quirks.c | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-)
drivers/hid/hid-ids.h +2 -3
@@ -753,9 +753,10 @@#define USB_VENDOR_ID_SIGMATEL 0x066F#define USB_DEVICE_ID_SIGMATEL_STMP3780 0x3780 -#define USB_VENDOR_ID_SIS2_TOUCH 0x0457 +#define USB_VENDOR_ID_SIS_TOUCH 0x0457#define USB_DEVICE_ID_SIS9200_TOUCH 0x9200#define USB_DEVICE_ID_SIS817_TOUCH 0x0817 +#define USB_DEVICE_ID_SIS_TS 0x1013#define USB_VENDOR_ID_SKYCABLE 0x1223#define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07
@@ -937,7 +938,5 @@#define USB_VENDOR_ID_PRIMAX 0x0461#define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 -#define USB_VENDOR_ID_SIS 0x0457 -#define USB_DEVICE_ID_SIS_TS 0x1013#endif
drivers/hid/usbhid/hid-quirks.c +3 -3
@@ -84,8 +84,9 @@ static const struct hid_blacklist { { USB_VENDOR_ID_REALTEK, USB_DEVICE_ID_REALTEK_READER, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SIGMATEL, USB_DEVICE_ID_SIGMATEL_STMP3780, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH, HID_QUIRK_NOGET }, - { USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS817_TOUCH, HID_QUIRK_NOGET }, + { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH, HID_QUIRK_NOGET }, + { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS817_TOUCH, HID_QUIRK_NOGET }, + { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS_TS, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET },
@@ -114,7 +115,6 @@ static const struct hid_blacklist { { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS2, HID_QUIRK_NO_INIT_REPORTS }, - { USB_VENDOR_ID_SIS, USB_DEVICE_ID_SIS_TS, HID_QUIRK_NO_INIT_REPORTS }, { 0, 0 } };
Signature · 1 line
1.9.3
PATCH 4/103 HID: usbhid: fix sis quirk
In reply to Jiri SlabyFrom: Wanlong Gao <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 6d16e9c301290268b92ce3d48114f982e9c4b00a upstream.
Since commit 765e5fbd merged the sis quirk, then USB_VENDOR_ID_SIS2_TOUCH remains undefined.
--- drivers/hid/hid-core.c | 4 ++-- drivers/hid/hid-multitouch.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/hid/hid-core.c +2 -2
@@ -1822,8 +1822,8 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) }, { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) }, { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH) }, - { HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS817_TOUCH) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS817_TOUCH) }, { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
drivers/hid/hid-multitouch.c +2 -2
@@ -1301,10 +1301,10 @@ static const struct hid_device_id mt_devices[] = {/* SiS panels */ { .driver_data = MT_CLS_DEFAULT, -HID_USB_DEVICE (USB_VENDOR_ID_SIS2_TOUCH , +HID_USB_DEVICE (USB_VENDOR_ID_SIS_TOUCH , USB_DEVICE_ID_SIS9200_TOUCH) }, { .driver_data = MT_CLS_DEFAULT, -HID_USB_DEVICE (USB_VENDOR_ID_SIS2_TOUCH , +HID_USB_DEVICE (USB_VENDOR_ID_SIS_TOUCH , USB_DEVICE_ID_SIS817_TOUCH) },/* Stantum panels */
Signature · 1 line
1.9.3
PATCH 5/103 HID: usbhid: quirk for Synaptics HD touchscreen
In reply to Jiri SlabyFrom: AceLan Kao <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit d8e2e7581d2521910398c4c80d7a3b78e84da7d5 upstream.
Add Synaptics HD touchscreen(06cb:0ac3) to no init report quirk.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -808,6 +808,7 @@#define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013#define USB_DEVICE_ID_SYNAPTICS_LTS1 0x0af8#define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10 +#define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3#define USB_VENDOR_ID_THINGM 0x27b8#define USB_DEVICE_ID_BLINK1 0x01ed
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -115,6 +115,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS2, HID_QUIRK_NO_INIT_REPORTS }, + { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_HD, HID_QUIRK_NO_INIT_REPORTS }, { 0, 0 } };
Signature · 1 line
1.9.3
PATCH 6/103 HID: usbhid: quirk for Synaptics Quad HD touchscreen
In reply to Jiri SlabyFrom: AceLan Kao <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 12f508aede4bda5d20a2dd3ff3deb16ef47a97e9 upstream.
Add Synaptics HD touchscreen(06cb:1ac3) to no init report quirk
--- drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -809,6 +809,7 @@#define USB_DEVICE_ID_SYNAPTICS_LTS1 0x0af8#define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10#define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3 +#define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3#define USB_VENDOR_ID_THINGM 0x27b8#define USB_DEVICE_ID_BLINK1 0x01ed
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -116,6 +116,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS2, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_HD, HID_QUIRK_NO_INIT_REPORTS }, + { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_QUAD_HD, HID_QUIRK_NO_INIT_REPORTS }, { 0, 0 } };
Signature · 1 line
1.9.3
PATCH 7/103 HID: add support for SiS multitouch panel in the touch monitor LG 23ET83V
In reply to Jiri SlabyFrom: Emanuel Krenz <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 954bb3da814e794f546f55449c508299a127fef8 upstream.
--- drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-multitouch.c | 3 +++ drivers/hid/usbhid/hid-quirks.c | 1 + 4 files changed, 6 insertions(+)
drivers/hid/hid-core.c +1 -0
@@ -1824,6 +1824,7 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) }, { HID_USB_DEVICE(USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH) }, { HID_USB_DEVICE(USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS817_TOUCH) }, + { HID_USB_DEVICE(USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS1030_TOUCH) }, { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
drivers/hid/hid-ids.h +1 -0
@@ -757,6 +757,7 @@#define USB_DEVICE_ID_SIS9200_TOUCH 0x9200#define USB_DEVICE_ID_SIS817_TOUCH 0x0817#define USB_DEVICE_ID_SIS_TS 0x1013 +#define USB_DEVICE_ID_SIS1030_TOUCH 0x1030#define USB_VENDOR_ID_SKYCABLE 0x1223#define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07
drivers/hid/hid-multitouch.c +3 -0
@@ -1306,6 +1306,9 @@ static const struct hid_device_id mt_devices[] = { { .driver_data = MT_CLS_DEFAULT,HID_USB_DEVICE (USB_VENDOR_ID_SIS_TOUCH , USB_DEVICE_ID_SIS817_TOUCH) }, + { .driver_data = MT_CLS_DEFAULT, +HID_USB_DEVICE (USB_VENDOR_ID_SIS_TOUCH , + USB_DEVICE_ID_SIS1030_TOUCH) }, /* Stantum panels */ { .driver_data = MT_CLS_CONFIDENCE,
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -87,6 +87,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS817_TOUCH, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS_TS, HID_QUIRK_NO_INIT_REPORTS }, + { USB_VENDOR_ID_SIS_TOUCH, USB_DEVICE_ID_SIS1030_TOUCH, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET }, { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET },
Signature · 1 line
1.9.3
PATCH 8/103 HID: usbhid: quirk for CY-TM75 75 inch Touch Overlay
In reply to Jiri SlabyFrom: Yufeng Shen <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 29191039e21f66e204acffed63c486674a1918bd upstream.
There is timeout error during initialization:
kernel: [ 11.733104] hid-multitouch 0003:1870:0110.0001: usb_submit_urb(ctrl) failed: -1
kernel: [ 11.734093] hid-multitouch 0003:1870:0110.0001: timeout initializing reports
Adding quirk HID_QUIRK_NO_INIT_REPORTS can solve the problem.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -636,6 +636,7 @@#define USB_VENDOR_ID_NEXIO 0x1870#define USB_DEVICE_ID_NEXIO_MULTITOUCH_420 0x010d +#define USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750 0x0110#define USB_VENDOR_ID_NEXTWINDOW 0x1926#define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -74,6 +74,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, { USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GX680R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS }, + { USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS },
Signature · 1 line
1.9.3
PATCH 9/103 xhci: For streams the css flag most be read from the stream-ctx on ep stop
In reply to Jiri SlabyFrom: Hans de Goede <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c4bedb77ec4cb42f37cae4cbfddda8283161f7c8 upstream.
--- drivers/usb/host/xhci-ring.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/usb/host/xhci-ring.c +11 -3
@@ -552,9 +552,9 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, struct xhci_dequeue_state *state) {struct xhci_virt_device *dev = xhci->devs[slot_id]; +struct xhci_virt_ep *ep = &dev->eps[ep_index];struct xhci_ring *ep_ring;struct xhci_generic_trb *trb; -struct xhci_ep_ctx *ep_ctx;dma_addr_t addr;u64 hw_dequeue;
@@ -570,8 +570,16 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,/* Dig out the cycle state saved by the xHC during the stop ep cmd */ xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb,"Finding endpoint context" ); - ep_ctx =xhci_get_ep_ctx (xhci, dev->out_ctx, ep_index); - hw_dequeue =le64_to_cpu (ep_ctx->deq); +/* 4.6.9 the css flag is written to the stream context for streams */ +if (ep->ep_state &EP_HAS_STREAMS ) { +struct xhci_stream_ctx *ctx = + &ep->stream_info->stream_ctx_array[stream_id]; + hw_dequeue =le64_to_cpu (ctx->stream_ring); + }else { +struct xhci_ep_ctx *ep_ctx + =xhci_get_ep_ctx (xhci, dev->out_ctx, ep_index); + hw_dequeue =le64_to_cpu (ep_ctx->deq); + }/* Find virtual address and segment of hardware dequeue pointer */ state->new_deq_seg = ep_ring->deq_seg;
Signature · 1 line
1.9.3
PATCH 10/103 pid: get pid_t ppid of task in init_pid_ns
In reply to Jiri SlabyFrom: Richard Guy Briggs <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit ad36d28293936b03d6b7996e9d6aadfd73c0eb08 upstream.
Added the functions task_ppid_nr_ns() and task_ppid_nr() to abstract the lookup of the PPID (real_parent's pid_t) of a process, including rcu locking, in the arbitrary and init_pid_ns.
This provides an alternative to sys_getppid(), which is relative to the child process' pid namespace.
(informed by ebiederman's 6c621b7e)
--- include/linux/sched.h | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
include/linux/sched.h +19 -1
@@ -1501,6 +1501,24 @@ static inline pid_t task_tgid_vnr(struct task_struct *tsk) } +static int pid_alive (const struct task_struct *p); +static inline pid_t task_ppid_nr_ns (const struct task_struct *tsk,struct pid_namespace *ns) +{ +pid_t pid =0 ; + +rcu_read_lock (); +if (pid_alive (tsk)) + pid =task_tgid_nr_ns (rcu_dereference (tsk->real_parent), ns); +rcu_read_unlock (); + +return pid; +} + +static inline pid_t task_ppid_nr (const struct task_struct *tsk) +{ +return task_ppid_nr_ns (tsk, &init_pid_ns); +} +static inline pid_t task_pgrp_nr_ns (struct task_struct *tsk,struct pid_namespace *ns) {
@@ -1540,7 +1558,7 @@ static inline pid_t task_pgrp_nr(struct task_struct *tsk)* * Return: 1 if the process is alive. 0 otherwise. */ -static inline int pid_alive (struct task_struct *p) +static inline int pid_alive (const struct task_struct *p) {return p->pids[PIDTYPE_PID ].pid !=NULL ; }
Signature · 1 line
1.9.3
PATCH 11/103 sched: declare pid_alive as inline
In reply to Jiri SlabyFrom: Richard Guy Briggs <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 80e0b6e8a001361316a2d62b748fe677ec46b860 upstream.
We accidentally declared pid_alive without any extern/inline connotation. Some platforms were fine with this, some like ia64 and mips were very angry. If the function is inline, the prototype should be inline!
on ia64:include/linux/sched.h:1718: warning: 'pid_alive' declared inline after being called
--- include/linux/sched.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/sched.h +1 -1
@@ -1501,7 +1501,7 @@ static inline pid_t task_tgid_vnr(struct task_struct *tsk) } -static int pid_alive (const struct task_struct *p); +static inline int pid_alive (const struct task_struct *p);static inline pid_t task_ppid_nr_ns (const struct task_struct *tsk,struct pid_namespace *ns) {pid_t pid =0 ;
Signature · 1 line
1.9.3
PATCH 12/103 tgafb: fix mode setting with fbset
In reply to Jiri SlabyFrom: Mikulas Patocka <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 624966589041deb32a2626ee2e176e8274581101 upstream.
Mode setting in the TGA driver is broken for these reasons:
- info->fix.line_length is set just once in tgafb_init_fix function. If we change videomode, info->fix.line_length is not recalculated - so the video mode is changed but the screen is corrupted because of wrong info->fix.line_length.
- info->fix.smem_len is set in tgafb_init_fix to the size of the default video mode (640x480). If we set a higher resolution, info->fix.smem_len is smaller than the current screen size, preventing the userspace program from mapping the framebuffer.
This patch fixes it:
- info->fix.line_length initialization is moved to tgafb_set_par so that it is recalculated with each mode change.
- info->fix.smem_len is set to a fixed value representing the real amount of video ram (the values are taken from xfree86 driver).
- add a check to tgafb_check_var to prevent us from setting a videomode that doesn't fit into videoram.
- in tgafb_register, tgafb_init_fix is moved upwards, to be called before fb_find_mode (because fb_find_mode already needs the videoram size set in tgafb_init_fix).
--- drivers/video/tgafb.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
drivers/video/tgafb.c +12 -3
@@ -188,6 +188,8 @@ tgafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)return -EINVAL ; +if (var->xres * var->yres * (var->bits_per_pixel >>3 ) > info->fix.smem_len) +return -EINVAL ;if (var->nonstd)return -EINVAL ;if (1000000000 / var->pixclock >TGA_PLL_MAX_FREQ )
@@ -268,6 +270,7 @@ tgafb_set_par(struct fb_info *info) par->yres = info->var.yres; par->pll_freq = pll_freq =1000000000 / info->var.pixclock; par->bits_per_pixel = info->var.bits_per_pixel; + info->fix.line_length = par->xres * (par->bits_per_pixel >>3 ); tga_type = par->tga_type;
@@ -1314,6 +1317,7 @@ tgafb_init_fix(struct fb_info *info)int tga_bus_tc =TGA_BUS_TC (par->dev);u8 tga_type = par->tga_type;const char *tga_type_name =NULL ; +unsigned memory_size;switch (tga_type) {case TGA_TYPE_8PLANE :
@@ -1321,21 +1325,25 @@ tgafb_init_fix(struct fb_info *info) tga_type_name ="Digital ZLXp-E1" ;if (tga_bus_tc) tga_type_name ="Digital ZLX-E1" ; + memory_size =2097152 ;break ;case TGA_TYPE_24PLANE :if (tga_bus_pci) tga_type_name ="Digital ZLXp-E2" ;if (tga_bus_tc) tga_type_name ="Digital ZLX-E2" ; + memory_size =8388608 ;break ;case TGA_TYPE_24PLUSZ :if (tga_bus_pci) tga_type_name ="Digital ZLXp-E3" ;if (tga_bus_tc) tga_type_name ="Digital ZLX-E3" ; + memory_size =16777216 ;break ;default : tga_type_name ="Unknown" ; + memory_size =16777216 ;break ; }
@@ -1347,9 +1355,8 @@ tgafb_init_fix(struct fb_info *info) ? FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_DIRECTCOLOR); - info->fix.line_length = par->xres * (par->bits_per_pixel >>3 ); info->fix.smem_start = (size_t ) par->tga_fb_base; - info->fix.smem_len = info->fix.line_length * par->yres; + info->fix.smem_len = memory_size; info->fix.mmio_start = (size_t ) par->tga_regs_base; info->fix.mmio_len =512 ;
@@ -1473,6 +1480,9 @@ static int tgafb_register(struct device *dev) modedb_tga = &modedb_tc; modedbsize_tga =1 ; } + +tgafb_init_fix (info); + ret = fb_find_mode(&info->var, info, mode_option ? mode_option : mode_option_tga, modedb_tga, modedbsize_tga, NULL,
@@ -1490,7 +1500,6 @@ static int tgafb_register(struct device *dev) }tgafb_set_par (info); -tgafb_init_fix (info);if (register_framebuffer (info) <0 ) {printk (KERN_ERR "tgafb: Could not register framebuffer\n" );
Signature · 1 line
1.9.3
PATCH 13/103 net: qmi_wwan: add Telit LE920 newer firmware support
In reply to Jiri SlabyFrom: Fabio Porcedda <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 905468fa4d54c3e572ed3045cd47cce37780716e upstream.
Newer firmware use a new pid and a different interface.
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -715,6 +715,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ + {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x0b3c, 0xc005, 6)}, /* Olivetti Olicard 200 */ {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)}, /* Cinterion PLxx */
Signature · 1 line
1.9.3
PATCH 14/103 net: qmi_wwan: add ZTE MF667
In reply to Jiri SlabyFrom: Raymond Wanyoike <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7653aabfbdc73c1567e29a9790701f5898ba1420 upstream.
The driver description files give these descriptions to the vendor specific ports on this modem:
VID_19D2&PID_1270&MI_00: "ZTE MF667 Diagnostics Port" VID_19D2&PID_1270&MI_01: "ZTE MF667 AT Port" VID_19D2&PID_1270&MI_02: "ZTE MF667 ATExt2 Port" VID_19D2&PID_1270&MI_03: "ZTE MF667 ATExt Port" VID_19D2&PID_1270&MI_04: "ZTE MF667 USB Modem" VID_19D2&PID_1270&MI_05: "ZTE MF667 Network Adapter"
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -699,6 +699,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x19d2, 0x1255, 3)}, {QMI_FIXED_INTF(0x19d2, 0x1255, 4)}, {QMI_FIXED_INTF(0x19d2, 0x1256, 4)}, + {QMI_FIXED_INTF(0x19d2, 0x1270, 5)}, /* ZTE MF667 */ {QMI_FIXED_INTF(0x19d2, 0x1401, 2)}, {QMI_FIXED_INTF(0x19d2, 0x1402, 2)}, /* ZTE MF60 */ {QMI_FIXED_INTF(0x19d2, 0x1424, 2)},
Signature · 1 line
1.9.3
PATCH 15/103 net: qmi_wwan: add support for Cinterion PXS8 and PHS8
In reply to Jiri SlabyFrom: Aleksander Morgado <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 9b2b6a2d669c909dd0b125fc834da94bcfc0aee7 upstream.
When the PXS8 and PHS8 devices show up with PID 0x0053 they will expose both a QMI port and a WWAN interface.
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -719,6 +719,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x0b3c, 0xc005, 6)}, /* Olivetti Olicard 200 */ {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)}, /* Cinterion PLxx */ + {QMI_FIXED_INTF(0x1e2d, 0x0053, 4)}, /* Cinterion PHxx,PXxx *//* 4. Gobi 1000 devices */ {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
Signature · 1 line
1.9.3
PATCH 16/103 list: introduce list_next_entry() and list_prev_entry()
In reply to Jiri SlabyFrom: Oleg Nesterov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 008208c6b26f21c2648c250a09c55e737c02c5f8 upstream.
Add two trivial helpers list_next_entry() and list_prev_entry(), they can have a lot of users including list.h itself. In fact the 1st one is already defined in events/core.c and bnx2x_sp.c, so the patch simply moves the definition to list.h.
--- drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | 3 --- include/linux/list.h | 16 ++++++++++++++++ kernel/events/core.c | 3 --- 3 files changed, 16 insertions(+), 6 deletions(-)
drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +0 -3
@@ -1217,9 +1217,6 @@ static void bnx2x_set_one_vlan_mac_e1h(struct bnx2x *bp, ETH_VLAN_FILTER_CLASSIFY, config); } -#define list_next_entry (pos, member) \ - list_entry((pos)->member.next, typeof(*(pos)), member) -/** * bnx2x_vlan_mac_restore - reconfigure next MAC/VLAN/VLAN-MAC element *
include/linux/list.h +16 -0
@@ -373,6 +373,22 @@ static inline void list_splice_tail_init(struct list_head *list, (!list_empty (ptr) ?list_first_entry (ptr, type, member) :NULL )/** +* list_next_entry - get the next element in list +* @pos: the type * to cursor +* @member: the name of the list_struct within the struct. + */ +#define list_next_entry (pos, member) \ + list_entry((pos)->member.next, typeof(*(pos)), member) + +/** +* list_prev_entry - get the prev element in list +* @pos: the type * to cursor +* @member: the name of the list_struct within the struct. +*/ +#define list_prev_entry (pos, member) \ + list_entry((pos)->member.prev, typeof(*(pos)), member) + +/** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list.
kernel/events/core.c +0 -3
@@ -2210,9 +2210,6 @@ static void __perf_event_sync_stat(struct perf_event *event,perf_event_update_userpage (next_event); } -#define list_next_entry (pos, member) \ - list_entry(pos->member.next, typeof(*pos), member) -static void perf_event_sync_stat (struct perf_event_context *ctx,struct perf_event_context *next_ctx) {
Signature · 1 line
1.9.3
PATCH 17/103 scsi: fix our current target reap infrastructure
In reply to Jiri SlabyFrom: James Bottomley <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e63ed0d7a98014fdfc2cfeb3f6dada313dcabb59 upstream.
This patch eliminates the reap_ref and replaces it with a proper kref. On last put of this kref, the target is removed from visibility in sysfs. The final call to scsi_target_reap() for the device is done from __scsi_remove_device() and only if the device was made visible. This ensures that the target disappears as soon as the last device is gone rather than waiting until final release of the device (which is often too long).
--- drivers/scsi/scsi_scan.c | 99 ++++++++++++++++++++++++++++------------------ drivers/scsi/scsi_sysfs.c | 20 +++++++--- include/scsi/scsi_device.h | 3 +- 3 files changed, 75 insertions(+), 47 deletions(-)
drivers/scsi/scsi_scan.c +60 -39
@@ -371,6 +371,31 @@ static struct scsi_target *__scsi_find_target(struct device *parent, }/** +* scsi_target_reap_ref_release - remove target from visibility +* @kref: the reap_ref in the target being released +* +* Called on last put of reap_ref, which is the indication that no device +* under this target is visible anymore, so render the target invisible in +* sysfs. Note: we have to be in user context here because the target reaps +* should be done in places where the scsi device visibility is being removed. +*/ +static void scsi_target_reap_ref_release (struct kref *kref) +{ +struct scsi_target *starget + = container_of(kref, struct scsi_target, reap_ref); + +transport_remove_device (&starget->dev); +device_del (&starget->dev); + starget->state =STARGET_DEL ; +scsi_target_destroy (starget); +} + +static void scsi_target_reap_ref_put (struct scsi_target *starget) +{ +kref_put (&starget->reap_ref, scsi_target_reap_ref_release); +} + +/** * scsi_alloc_target - allocate a new or find an existing target * @parent: parent of the target (need not be a scsi host) * @channel: target channel number (zero if no channels)
@@ -392,7 +417,7 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, + shost->transportt->target_size;struct scsi_target *starget;struct scsi_target *found_target; -int error; +int error, ref_got; starget =kzalloc (size,GFP_KERNEL );if (!starget) {
@@ -401,7 +426,7 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, } dev = &starget->dev;device_initialize (dev); - starget->reap_ref =1 ; +kref_init (&starget->reap_ref); dev->parent =get_device (parent);dev_set_name (dev,"target%d:%d:%d" , shost->host_no, channel, id); dev->bus = &scsi_bus_type;
@@ -441,29 +466,36 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,return starget; found: - found_target->reap_ref++; +/* +* release routine already fired if kref is zero, so if we can still +* take the reference, the target must be alive. If we can't, it must +* be dying and we need to wait for a new target +*/ + ref_got =kref_get_unless_zero (&found_target->reap_ref); +spin_unlock_irqrestore (shost->host_lock, flags); -if (found_target->state !=STARGET_DEL ) { +if (ref_got) {put_device (dev);return found_target; } -/* Unfortunately, we found a dying target; need to -* wait until it's dead before we can get a new one */ +/* +* Unfortunately, we found a dying target; need to wait until it's +* dead before we can get a new one. There is an anomaly here. We +* *should* call scsi_target_reap() to balance the kref_get() of the +* reap_ref above. However, since the target being released, it's +* already invisible and the reap_ref is irrelevant. If we call +* scsi_target_reap() we might spuriously do another device_del() on +* an already invisible target. +*/ put_device (&found_target->dev); -flush_scheduled_work (); +/* +* length of time is irrelevant here, we just want to yield the CPU +* for a tick to avoid busy waiting for the target to die. +*/ +msleep (1 ); goto retry; } -static void scsi_target_reap_usercontext (struct work_struct *work) -{ -struct scsi_target *starget = - container_of(work, struct scsi_target, ew.work); - -transport_remove_device (&starget->dev); -device_del (&starget->dev); -scsi_target_destroy (starget); -} -/** * scsi_target_reap - check to see if target is in use and destroy if not * @starget: target to be checked
@@ -474,28 +506,11 @@ static void scsi_target_reap_usercontext(struct work_struct *work)*/ void scsi_target_reap (struct scsi_target *starget) { -struct Scsi_Host *shost =dev_to_shost (starget->dev.parent); -unsigned long flags; -enum scsi_target_state state; -int empty =0 ; - -spin_lock_irqsave (shost->host_lock, flags); - state = starget->state; -if (--starget->reap_ref ==0 &&list_empty (&starget->devices)) { - empty =1 ; - starget->state =STARGET_DEL ; - } -spin_unlock_irqrestore (shost->host_lock, flags); - -if (!empty) -return ; - -BUG_ON (state ==STARGET_DEL ); -if (state ==STARGET_CREATED ) +BUG_ON (starget->state ==STARGET_DEL ); +if (starget->state ==STARGET_CREATED )scsi_target_destroy (starget);else -execute_in_process_context (scsi_target_reap_usercontext, - &starget->ew); +scsi_target_reap_ref_put (starget); }/**
@@ -1532,6 +1547,10 @@ struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel, }mutex_unlock (&shost->scan_mutex);scsi_autopm_put_target (starget); +/* +* paired with scsi_alloc_target(). Target will be destroyed unless +* scsi_probe_and_add_lun made an underlying device visible +*/ scsi_target_reap (starget);put_device (&starget->dev);
@@ -1612,8 +1631,10 @@ static void __scsi_scan_target(struct device *parent, unsigned int channel, out_reap:scsi_autopm_put_target (starget); -/* now determine if the target has any children at all -* and if not, nuke it */ +/* +* paired with scsi_alloc_target(): determine if the target has +* any children at all and if not, nuke it +*/ scsi_target_reap (starget);put_device (&starget->dev);
drivers/scsi/scsi_sysfs.c +14 -6
@@ -332,17 +332,14 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) {struct scsi_device *sdev;struct device *parent; -struct scsi_target *starget;struct list_head *this, *tmp;unsigned long flags; sdev = container_of(work, struct scsi_device, ew.work); parent = sdev->sdev_gendev.parent; - starget =to_scsi_target (parent);spin_lock_irqsave (sdev->host->host_lock, flags); - starget->reap_ref++;list_del (&sdev->siblings);list_del (&sdev->same_target_siblings);list_del (&sdev->starved_entry);
@@ -362,8 +359,6 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work)/* NULL queue means the device can't be used */ sdev->request_queue =NULL ; -scsi_target_reap (scsi_target (sdev)); -kfree (sdev->inquiry);kfree (sdev);
@@ -1018,6 +1013,13 @@ void __scsi_remove_device(struct scsi_device *sdev) sdev->host->hostt->slave_destroy (sdev);transport_destroy_device (dev); +/* +* Paired with the kref_get() in scsi_sysfs_initialize(). We have +* remoed sysfs visibility from the device, so make the target +* invisible if this was the last device underneath it. +*/ +scsi_target_reap (scsi_target (sdev)); +put_device (dev); }
@@ -1080,7 +1082,7 @@ void scsi_remove_target(struct device *dev)continue ;if (starget->dev.parent == dev || &starget->dev == dev) {/* assuming new targets arrive at the end */ - starget->reap_ref++; +kref_get (&starget->reap_ref);spin_unlock_irqrestore (shost->host_lock, flags);if (last)scsi_target_reap (last);
@@ -1164,6 +1166,12 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)list_add_tail (&sdev->same_target_siblings, &starget->devices);list_add_tail (&sdev->siblings, &shost->__devices);spin_unlock_irqrestore (shost->host_lock, flags); +/* +* device can now only be removed via __scsi_remove_device() so hold +* the target. Target will be held in CREATED state until something +* beneath it becomes visible (in which case it moves to RUNNING) +*/ +kref_get (&starget->reap_ref); }int scsi_is_sdev_device (const struct device *dev)
include/scsi/scsi_device.h +1 -2
@@ -257,7 +257,7 @@ struct scsi_target {struct list_head siblings;struct list_head devices;struct device dev; -unsigned int reap_ref;/* protected by the host lock */ +struct kref reap_ref;/* last put renders target invisible */ unsigned int channel;unsigned int id;/* target id ... replace * scsi_device.id eventually */
@@ -284,7 +284,6 @@ struct scsi_target {#define SCSI_DEFAULT_TARGET_BLOCKED 3char scsi_level; -struct execute_work ew;enum scsi_target_state state;void *hostdata;/* available to low-level driver */ unsigned long starget_data[0 ];/* for the transport */
Signature · 1 line
1.9.3
PATCH 18/103 SCSI: dual scan thread bug fix
In reply to Jiri SlabyFrom: James Bottomley <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit f2495e228fce9f9cec84367547813cbb0d6db15a upstream.
In the highly unusual case where two threads are running concurrently through the scanning code scanning the same target, we run into the situation where one may allocate the target while the other is still using it. In this case, because the reap checks for STARGET_CREATED and kills the target without reference counting, the second thread will do the wrong thing on reap.
Fix this by reference counting even creates and doing the STARGET_CREATED check in the final put.
--- drivers/scsi/scsi_scan.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
drivers/scsi/scsi_scan.c +16 -7
@@ -320,6 +320,7 @@ static void scsi_target_destroy(struct scsi_target *starget)struct Scsi_Host *shost =dev_to_shost (dev->parent);unsigned long flags; + starget->state =STARGET_DEL ;transport_destroy_device (dev);spin_lock_irqsave (shost->host_lock, flags);if (shost->hostt->target_destroy)
@@ -384,9 +385,15 @@ static void scsi_target_reap_ref_release(struct kref *kref)struct scsi_target *starget = container_of(kref, struct scsi_target, reap_ref); -transport_remove_device (&starget->dev); -device_del (&starget->dev); - starget->state =STARGET_DEL ; +/* +* if we get here and the target is still in the CREATED state that +* means it was allocated but never made visible (because a scan +* turned up no LUNs), so don't call device_del() on it. +*/ +if (starget->state !=STARGET_CREATED ) { +transport_remove_device (&starget->dev); +device_del (&starget->dev); + }scsi_target_destroy (starget); }
@@ -506,11 +513,13 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,*/ void scsi_target_reap (struct scsi_target *starget) { +/* +* serious problem if this triggers: STARGET_DEL is only set in the if +* the reap_ref drops to zero, so we're trying to do another final put +* on an already released kref +*/ BUG_ON (starget->state ==STARGET_DEL ); -if (starget->state ==STARGET_CREATED ) -scsi_target_destroy (starget); -else -scsi_target_reap_ref_put (starget); +scsi_target_reap_ref_put (starget); }/**
Signature · 1 line
1.9.3
PATCH 19/103 SCSI: megaraid: missing bounds check in mimd_to_kioc()
In reply to Jiri SlabyFrom: Dan Carpenter <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 3de2260140417759c669d391613d583baf03b0cf upstream.
pthru32->dataxferlen comes from the user so we need to check that it's not too large so we don't overflow the buffer.
--- drivers/scsi/megaraid/megaraid_mm.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/megaraid/megaraid_mm.c +2 -0
@@ -486,6 +486,8 @@ mimd_to_kioc(mimd_t __user *umimd, mraid_mmadp_t *adp, uioc_t *kioc) pthru32->dataxferaddr = kioc->buf_paddr;if (kioc->data_dir &UIOC_WR ) { +if (pthru32->dataxferlen > kioc->xferlen) +return -EINVAL ;if (copy_from_user (kioc->buf_vaddr, kioc->user_data, pthru32->dataxferlen)) {return (-EFAULT );
Signature · 1 line
1.9.3
PATCH 20/103 KVM: x86: remove WARN_ON from get_kernel_ns()
In reply to Jiri SlabyFrom: Marcelo Tosatti <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit b351c39cc9e0151cee9b8d52a1e714928faabb38 upstream.
Function and callers can be preempted.
https://bugzilla.kernel.org/show_bug.cgi?id=73721
--- arch/x86/kvm/x86.c | 1 - 1 file changed, 1 deletion(-)
arch/x86/kvm/x86.c +0 -1
@@ -1073,7 +1073,6 @@ static inline u64 get_kernel_ns(void) {struct timespec ts; -WARN_ON (preemptible ());ktime_get_ts (&ts);monotonic_to_bootbased (&ts);return timespec_to_ns (&ts);
Signature · 1 line
1.9.3
PATCH 21/103 audit: convert PPIDs to the inital PID namespace.
In reply to Jiri SlabyFrom: Richard Guy Briggs <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c92cdeb45eea38515e82187f48c2e4f435fb4e25 upstream.
sys_getppid() returns the parent pid of the current process in its own pid namespace. Since audit filters are based in the init pid namespace, a process could avoid a filter or trigger an unintended one by being in an alternate pid namespace or log meaningless information.
Switch to task_ppid_nr() for PPIDs to anchor all audit filters in the init_pid_ns.
(informed by ebiederman's 6c621b7e)
--- kernel/audit.c | 4 ++-- kernel/auditsc.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
kernel/audit.c +2 -2
@@ -1613,10 +1613,10 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)spin_unlock_irq (&tsk->sighand->siglock); audit_log_format(ab, - " ppid=%ld pid=%d auid=%u uid=%u gid=%u" + " ppid=%d pid=%d auid=%u uid=%u gid=%u" " euid=%u suid=%u fsuid=%u" " egid=%u sgid=%u fsgid=%u tty=%s ses=%u", - sys_getppid(), + task_ppid_nr(tsk), tsk->pid, from_kuid(&init_user_ns, audit_get_loginuid(tsk)), from_kuid(&init_user_ns, cred->uid),
kernel/auditsc.c +1 -1
@@ -472,7 +472,7 @@ static int audit_filter_rules(struct task_struct *tsk,case AUDIT_PPID :if (ctx) {if (!ctx->ppid) - ctx->ppid =sys_getppid (); + ctx->ppid =task_ppid_nr (tsk); result =audit_comparator (ctx->ppid, f->op, f->val); }break ;
Signature · 1 line
1.9.3
PATCH 22/103 netfilter: nf_conntrack: reserve two bytes for nf_ct_ext->len
In reply to Jiri SlabyFrom: Andrey Vagin <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 223b02d923ecd7c84cf9780bb3686f455d279279 upstream.
"len" contains sizeof(nf_ct_ext) and size of extensions. In a worst case it can contain all extensions. Bellow you can find sizes for all types of extensions. Their sum is definitely bigger than 256.
nf_ct_ext_types[0]->len = 24
nf_ct_ext_types[1]->len = 32
nf_ct_ext_types[2]->len = 24
nf_ct_ext_types[3]->len = 32
nf_ct_ext_types[4]->len = 152
nf_ct_ext_types[5]->len = 2
nf_ct_ext_types[6]->len = 16
nf_ct_ext_types[7]->len = 8
I have seen "len" up to 280 and my host has crashes w/o this patch.
The right way to fix this problem is reducing the size of the ecache extension (4) and Florian is going to do this, but these changes will be quite large to be appropriate for a stable tree.
--- include/net/netfilter/nf_conntrack_extend.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/net/netfilter/nf_conntrack_extend.h +2 -2
@@ -47,8 +47,8 @@ enum nf_ct_ext_id {/* Extensions: optional stuff which isn't permanently in struct. */ struct nf_ct_ext {struct rcu_head rcu; -u8 offset[NF_CT_EXT_NUM ]; -u8 len; +u16 offset[NF_CT_EXT_NUM ]; +u16 len;char data[0 ]; };
Signature · 1 line
1.9.3
PATCH 23/103 blktrace: fix accounting of partially completed requests
In reply to Jiri SlabyFrom: Roman Pen <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit af5040da01ef980670b3741b3e10733ee3e33566 upstream.
trace_block_rq_complete does not take into account that request can be partially completed, so we can get the following incorrect output of blkparser:
C R 232 + 240 [0] C R 240 + 232 [0] C R 248 + 224 [0] C R 256 + 216 [0]
but should be:
C R 232 + 8 [0] C R 240 + 8 [0] C R 248 + 8 [0] C R 256 + 8 [0]
Also, the whole output summary statistics of completed requests and final throughput will be incorrect.
This patch takes into account real completion size of the request and fixes wrong completion accounting.
--- block/blk-core.c | 2 +- include/trace/events/block.h | 33 ++++++++++++++++++++++++++++++--- kernel/trace/blktrace.c | 20 +++++++++++--------- 3 files changed, 42 insertions(+), 13 deletions(-)
block/blk-core.c +1 -1
@@ -2297,7 +2297,7 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes)if (!req->bio)return false; -trace_block_rq_complete (req->q, req); +trace_block_rq_complete (req->q, req, nr_bytes);/* * For fs requests, rq is just carrier of independent bio's
include/trace/events/block.h +30 -3
@@ -132,6 +132,7 @@ DEFINE_EVENT(block_rq_with_error, block_rq_requeue,* block_rq_complete - block IO operation completed by device driver * @q: queue containing the block operation request * @rq: block operations request +* @nr_bytes: number of completed bytes * * The block_rq_complete tracepoint event indicates that some portion * of operation request has been completed by the device driver. If
@@ -139,11 +140,37 @@ DEFINE_EVENT(block_rq_with_error, block_rq_requeue,* do for the request. If @rq->bio is non-NULL then there is * additional work required to complete the request. */ -DEFINE_EVENT (block_rq_with_error, block_rq_complete, +TRACE_EVENT (block_rq_complete, - TP_PROTO(struct request_queue *q, struct request *rq), + TP_PROTO(struct request_queue *q, struct request *rq, + unsigned int nr_bytes), -TP_ARGS (q, rq) +TP_ARGS (q, rq, nr_bytes), + +TP_STRUCT__entry ( + __field( dev_t, dev ) + __field( sector_t, sector ) + __field( unsigned int, nr_sector ) + __field( int, errors ) + __array( char, rwbs, RWBS_LEN ) +__dynamic_array ( char, cmd,blk_cmd_buf_len (rq) ) + ), + +TP_fast_assign ( + __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; + __entry->sector = blk_rq_pos(rq); + __entry->nr_sector = nr_bytes >> 9; + __entry->errors = rq->errors; + + blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); + blk_dump_cmd(__get_str(cmd), rq); + ), + +TP_printk ("%d,%d %s (%s) %llu + %u [%d]" , +MAJOR (__entry->dev),MINOR (__entry->dev), + __entry->rwbs,__get_str (cmd), + (unsigned long long )__entry->sector, + __entry->nr_sector, __entry->errors) ); DECLARE_EVENT_CLASS(block_rq,
kernel/trace/blktrace.c +11 -9
@@ -703,6 +703,7 @@ void blk_trace_shutdown(struct request_queue *q)* blk_add_trace_rq - Add a trace for a request oriented action * @q: queue the io is for * @rq: the source request +* @nr_bytes: number of completed bytes * @what: the action * * Description:
@@ -710,7 +711,7 @@ void blk_trace_shutdown(struct request_queue *q)* **/ static void blk_add_trace_rq (struct request_queue *q,struct request *rq, -u32 what) +unsigned int nr_bytes,u32 what) {struct blk_trace *bt = q->blk_trace;
@@ -719,11 +720,11 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq,if (rq->cmd_type ==REQ_TYPE_BLOCK_PC ) { what |=BLK_TC_ACT (BLK_TC_PC ); -__blk_add_trace (bt,0 ,blk_rq_bytes (rq), rq->cmd_flags, +__blk_add_trace (bt,0 , nr_bytes, rq->cmd_flags, what, rq->errors, rq->cmd_len, rq->cmd); }else { what |=BLK_TC_ACT (BLK_TC_FS ); -__blk_add_trace (bt,blk_rq_pos (rq),blk_rq_bytes (rq), +__blk_add_trace (bt,blk_rq_pos (rq), nr_bytes, rq->cmd_flags, what, rq->errors,0 ,NULL ); } }
@@ -731,33 +732,34 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq,static void blk_add_trace_rq_abort (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_ABORT ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_ABORT ); }static void blk_add_trace_rq_insert (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_INSERT ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_INSERT ); }static void blk_add_trace_rq_issue (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_ISSUE ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_ISSUE ); }static void blk_add_trace_rq_requeue (void *ignore,struct request_queue *q,struct request *rq) { -blk_add_trace_rq (q, rq,BLK_TA_REQUEUE ); +blk_add_trace_rq (q, rq,blk_rq_bytes (rq),BLK_TA_REQUEUE ); }static void blk_add_trace_rq_complete (void *ignore,struct request_queue *q, -struct request *rq) +struct request *rq, +unsigned int nr_bytes) { -blk_add_trace_rq (q, rq,BLK_TA_COMPLETE ); +blk_add_trace_rq (q, rq, nr_bytes,BLK_TA_COMPLETE ); }/**
Signature · 1 line
1.9.3
PATCH 24/103 netfilter: Can't fail and free after table replacement
In reply to Jiri SlabyFrom: Thomas Graf <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c58dd2dd443c26d856a168db108a0cd11c285bf3 upstream.
All xtables variants suffer from the defect that the copy_to_user() to copy the counters to user memory may fail after the table has already been exchanged and thus exposed. Return an error at this point will result in freeing the already exposed table. Any subsequent packet processing will result in a kernel panic.
We can't copy the counters before exposing the new tables as we want provide the counter state after the old table has been unhooked. Therefore convert this into a silent error.
--- net/bridge/netfilter/ebtables.c | 5 ++--- net/ipv4/netfilter/arp_tables.c | 6 ++++-- net/ipv4/netfilter/ip_tables.c | 6 ++++-- net/ipv6/netfilter/ip6_tables.c | 6 ++++-- 4 files changed, 14 insertions(+), 9 deletions(-)
net/bridge/netfilter/ebtables.c +2 -3
@@ -1044,10 +1044,9 @@ static int do_replace_finish(struct net *net, struct ebt_replace *repl,if (repl->num_counters &©_to_user (repl->counters, counterstmp, repl->num_counters *sizeof (struct ebt_counter ))) { - ret = -EFAULT ; +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("ebtables: counters copy to user failed while replacing table\n" ); } -else - ret =0 ;/* decrease module count and free resources */ EBT_ENTRY_ITERATE(table->entries, table->entries_size,
net/ipv4/netfilter/arp_tables.c +4 -2
@@ -1039,8 +1039,10 @@ static int __do_replace(struct net *net, const char *name,xt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("arptables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
net/ipv4/netfilter/ip_tables.c +4 -2
@@ -1226,8 +1226,10 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,xt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("iptables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
net/ipv6/netfilter/ip6_tables.c +4 -2
@@ -1236,8 +1236,10 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,xt_free_table_info (oldinfo);if (copy_to_user (counters_ptr, counters, -sizeof (struct xt_counters ) * num_counters) !=0 ) - ret = -EFAULT ; +sizeof (struct xt_counters ) * num_counters) !=0 ) { +/* Silent error, can't fail, new table is already in place */ +net_warn_ratelimited ("ip6tables: counters copy to user failed while replacing table\n" ); + }vfree (counters);xt_table_unlock (t);return ret;
Signature · 1 line
1.9.3
PATCH 25/103 tracepoint: Do not waste memory on mods with no tracepoints
In reply to Jiri SlabyFrom: "Steven Rostedt (Red Hat)" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7dec935a3aa04412cba2cebe1524ae0d34a30c24 upstream.
No reason to allocate tp_module structures for modules that have no tracepoints. This just wastes memory.
--- kernel/tracepoint.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/tracepoint.c +6 -0
@@ -641,6 +641,9 @@ static int tracepoint_module_coming(struct module *mod)struct tp_module *tp_mod, *iter;int ret =0 ; +if (!mod->num_tracepoints) +return 0 ; +/* * We skip modules that taint the kernel, especially those with different * module headers (for forced load), to make sure we don't cause a crash.
@@ -684,6 +687,9 @@ static int tracepoint_module_going(struct module *mod) {struct tp_module *pos; +if (!mod->num_tracepoints) +return 0 ; +mutex_lock (&tracepoints_mutex);tracepoint_update_probe_range (mod->tracepoints_ptrs, mod->tracepoints_ptrs + mod->num_tracepoints);
Signature · 1 line
1.9.3
PATCH 26/103 rbd: fix error paths in rbd_img_request_fill()
In reply to Jiri SlabyFrom: Ilya Dryomov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 42dd037c08c7cd6e3e9af7824b0c1d063f838885 upstream.
Doing rbd_obj_request_put() in rbd_img_request_fill() error paths is not only insufficient, but also triggers an rbd_assert() in rbd_obj_request_destroy():
Assertion failure in rbd_obj_request_destroy() at line 1867:
rbd_assert(obj_request->img_request == NULL);
rbd_img_obj_request_add() adds obj_requests to the img_request, the opposite is rbd_img_obj_request_del(). Use it.
--- drivers/block/rbd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/block/rbd.c +1 -1
@@ -2272,7 +2272,7 @@ out_partial:rbd_obj_request_put (obj_request); out_unwind:for_each_obj_request_safe (img_request, obj_request, next_obj_request) -rbd_obj_request_put (obj_request); +rbd_img_obj_request_del (img_request, obj_request);return -ENOMEM ; }
Signature · 1 line
1.9.3
PATCH 27/103 tick-common: Fix wrong check in tick_check_replacement()
In reply to Jiri SlabyFrom: Viresh Kumar <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 521c42990e9d561ed5ed9f501f07639d0512b3c9 upstream.
tick_check_replacement() returns if a replacement of clock_event_device is possible or not. It does this as the first check:
if (tick_check_percpu(curdev, newdev, smp_processor_id())) return false;
Thats wrong. tick_check_percpu() returns true when the device is useable. Check for false instead.
[ tglx: Massaged changelog ]
--- kernel/time/tick-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/time/tick-common.c +1 -1
@@ -260,7 +260,7 @@ static bool tick_check_preferred(struct clock_event_device *curdev,bool tick_check_replacement (struct clock_event_device *curdev,struct clock_event_device *newdev) { -if (tick_check_percpu (curdev, newdev,smp_processor_id ())) +if (!tick_check_percpu (curdev, newdev,smp_processor_id ()))return false;return tick_check_preferred (curdev, newdev);
Signature · 1 line
1.9.3
PATCH 28/103 don't bother with {get,put}_write_access() on non-regular files
In reply to Jiri SlabyFrom: Al Viro <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit dd20908a8a06b22c171f6c3fcdbdbd65bed07505 upstream.
it's pointless and actually leads to wrong behaviour in at least one moderately convoluted case (pipe(), close one end, try to get to another via /proc/*/fd and run into ETXTBUSY).
--- fs/file_table.c | 4 ++-- fs/open.c | 26 +++++++------------------- 2 files changed, 9 insertions(+), 21 deletions(-)
fs/file_table.c +2 -2
@@ -211,10 +211,10 @@ static void drop_file_write_access(struct file *file)struct dentry *dentry = file->f_path.dentry;struct inode *inode = dentry->d_inode; -put_write_access (inode); -if (special_file (inode->i_mode))return ; + +put_write_access (inode);if (file_check_writeable (file) !=0 )return ;__mnt_drop_write (mnt);
fs/open.c +7 -19
@@ -627,23 +627,12 @@ out:static inline int __get_file_write_access (struct inode *inode,struct vfsmount *mnt) { -int error; - error =get_write_access (inode); +int error =get_write_access (inode);if (error)return error; -/* -* Do not take mount writer counts on -* special files since no writes to -* the mount itself will occur. -*/ -if (!special_file (inode->i_mode)) { -/* -* Balanced in __fput() -*/ - error =__mnt_want_write (mnt); -if (error) -put_write_access (inode); - } + error =__mnt_want_write (mnt); +if (error) +put_write_access (inode);return error; }
@@ -676,12 +665,11 @@ static int do_dentry_open(struct file *f,path_get (&f->f_path); inode = f->f_inode = f->f_path.dentry->d_inode; -if (f->f_mode &FMODE_WRITE ) { +if (f->f_mode &FMODE_WRITE && !special_file (inode->i_mode)) { error =__get_file_write_access (inode, f->f_path.mnt);if (error) goto cleanup_file; -if (!special_file (inode->i_mode)) -file_take_write (f); +file_take_write (f); } f->f_mapping = inode->i_mapping;
@@ -722,7 +710,6 @@ cleanup_all:fops_put (f->f_op);file_sb_list_del (f);if (f->f_mode &FMODE_WRITE ) { -put_write_access (inode);if (!special_file (inode->i_mode)) {/* * We don't consider this a real
@@ -730,6 +717,7 @@ cleanup_all:* because it all happenend right * here, so just reset the state. */ +put_write_access (inode);file_reset_write (f);__mnt_drop_write (f->f_path.mnt); }
Signature · 1 line
1.9.3
PATCH 29/103 cifs: Wait for writebacks to complete before attempting write.
In reply to Jiri SlabyFrom: Sachin Prabhu <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c11f1df5003d534fd067f0168bfad7befffb3b5c upstream.
Problem reported in Red Hat bz 1040329 for strict writes where we cache only when we hold oplock and write direct to the server when we don't.
When we receive an oplock break, we first change the oplock value for the inode in cifsInodeInfo->oplock to indicate that we no longer hold the oplock before we enqueue a task to flush changes to the backing device. Once we have completed flushing the changes, we return the oplock to the server.
There are 2 ways here where we can have data corruption
1) While we flush changes to the backing device as part of the oplock break, we can have processes write to the file. These writes check for the oplock, find none and attempt to write directly to the server. These direct writes made while we are flushing from cache could be overwritten by data being flushed from the cache causing data corruption.
2) While a thread runs in cifs_strict_writev, the machine could receive and process an oplock break after the thread has checked the oplock and found that it allows us to cache and before we have made changes to the cache. In that case, we end up with a dirty page in cache when we shouldn't have any. This will be flushed later and will overwrite all subsequent writes to the part of the file represented by this page.
Before making any writes to the server, we need to confirm that we are not in the process of flushing data to the server and if we are, we should wait until the process is complete before we attempt the write. We should also wait for existing writes to complete before we process an oplock break request which changes oplock values.
We add a version specific downgrade_oplock() operation to allow for differences in the oplock values set for the different smb versions.
--- fs/cifs/cifsfs.c | 14 +++++++++- fs/cifs/cifsglob.h | 8 ++++++ fs/cifs/cifsproto.h | 3 +++ fs/cifs/file.c | 31 +++++++++++++++++++--- fs/cifs/misc.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++-- fs/cifs/smb1ops.c | 11 ++++++++ fs/cifs/smb2misc.c | 18 ++++++++++--- fs/cifs/smb2ops.c | 14 ++++++++++ 8 files changed, 164 insertions(+), 9 deletions(-)
fs/cifs/cifsfs.c +13 -1
@@ -253,6 +253,11 @@ cifs_alloc_inode(struct super_block *sb)cifs_set_oplock_level (cifs_inode,0 ); cifs_inode->delete_pending = false; cifs_inode->invalid_mapping = false; +clear_bit (CIFS_INODE_PENDING_OPLOCK_BREAK , &cifs_inode->flags); +clear_bit (CIFS_INODE_PENDING_WRITERS , &cifs_inode->flags); +clear_bit (CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , &cifs_inode->flags); +spin_lock_init (&cifs_inode->writers_lock); + cifs_inode->writers =0 ; cifs_inode->vfs_inode.i_blkbits =14 ;/* 2**14 = CIFS_MAX_MSGSIZE */ cifs_inode->server_eof =0 ; cifs_inode->uniqueid =0 ;
@@ -731,19 +736,26 @@ static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos) {struct inode *inode =file_inode (iocb->ki_filp); +struct cifsInodeInfo *cinode =CIFS_I (inode);ssize_t written;int rc; + written =cifs_get_writer (cinode); +if (written) +return written; + written =generic_file_aio_write (iocb, iov, nr_segs, pos);if (CIFS_CACHE_WRITE (CIFS_I (inode))) -return written; + goto out; rc =filemap_fdatawrite (inode->i_mapping);if (rc)cifs_dbg (FYI ,"cifs_file_aio_write: %d rc on %p inode\n" , rc, inode); +out: +cifs_put_writer (cinode);return written; }
fs/cifs/cifsglob.h +8 -0
@@ -228,6 +228,8 @@ struct smb_version_operations {/* verify the message */ int (*check_message)(char *,unsigned int );bool (*is_oplock_break)(char *,struct TCP_Server_Info *); +void (*downgrade_oplock)(struct TCP_Server_Info *, +struct cifsInodeInfo *,bool );/* process transaction2 response */ bool (*check_trans2)(struct mid_q_entry *,struct TCP_Server_Info *,char *,int );
@@ -1072,6 +1074,12 @@ struct cifsInodeInfo {unsigned int epoch;/* used to track lease state changes */ bool delete_pending;/* DELETE_ON_CLOSE is set */ bool invalid_mapping;/* pagecache is invalid */ +unsigned long flags; +#define CIFS_INODE_PENDING_OPLOCK_BREAK (0)/* oplock break in progress */ +#define CIFS_INODE_PENDING_WRITERS (1)/* Writes in progress */ +#define CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 (2)/* Downgrade oplock to L2 */ +spinlock_t writers_lock; +unsigned int writers;/* Number of writers on this inode */ unsigned long time;/* jiffies of last update of inode */ u64 server_eof;/* current file size on server -- protected by i_lock */ u64 uniqueid;/* server inode number */
fs/cifs/cifsproto.h +3 -0
@@ -127,6 +127,9 @@ extern u64 cifs_UnixTimeToNT(struct timespec);extern struct timespec cnvrtDosUnixTm (__le16 le_date,__le16 le_time,int offset);extern void cifs_set_oplock_level (struct cifsInodeInfo *cinode,__u32 oplock); +extern int cifs_get_writer (struct cifsInodeInfo *cinode); +extern void cifs_put_writer (struct cifsInodeInfo *cinode); +extern void cifs_done_oplock_break (struct cifsInodeInfo *cinode);extern int cifs_unlock_range (struct cifsFileInfo *cfile,struct file_lock *flock,const unsigned int xid);extern int cifs_push_mandatory_locks (struct cifsFileInfo *cfile);
fs/cifs/file.c +28 -3
@@ -2611,12 +2611,20 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,struct cifs_tcon *tcon =tlink_tcon (cfile->tlink);ssize_t written; + written =cifs_get_writer (cinode); +if (written) +return written; +if (CIFS_CACHE_WRITE (cinode)) {if (cap_unix (tcon->ses) && (CIFS_UNIX_FCNTL_CAP &le64_to_cpu (tcon->fsUnixInfo.Capability)) - && ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) -return generic_file_aio_write (iocb, iov, nr_segs, pos); -return cifs_writev (iocb, iov, nr_segs, pos); + && ((cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NOPOSIXBRL ) ==0 )) { + written =generic_file_aio_write ( + iocb, iov, nr_segs, pos); + goto out; + } + written =cifs_writev (iocb, iov, nr_segs, pos); + goto out; }/* * For non-oplocked files in strict cache mode we need to write the data
@@ -2636,6 +2644,8 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov, inode); cinode->oplock =0 ; } +out: +cifs_put_writer (cinode);return written; }
@@ -3647,6 +3657,13 @@ static int cifs_launder_page(struct page *page)return rc; } +static int +cifs_pending_writers_wait (void *unused) +{ +schedule (); +return 0 ; +} +void cifs_oplock_break (struct work_struct *work) { struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
@@ -3654,8 +3671,15 @@ void cifs_oplock_break(struct work_struct *work)struct inode *inode = cfile->dentry->d_inode;struct cifsInodeInfo *cinode =CIFS_I (inode);struct cifs_tcon *tcon =tlink_tcon (cfile->tlink); +struct TCP_Server_Info *server = tcon->ses->server;int rc =0 ; +wait_on_bit (&cinode->flags,CIFS_INODE_PENDING_WRITERS , + cifs_pending_writers_wait,TASK_UNINTERRUPTIBLE ); + + server->ops->downgrade_oplock (server, cinode, +test_bit (CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , &cinode->flags)); +if (!CIFS_CACHE_WRITE (cinode) &&CIFS_CACHE_READ (cinode) &&cifs_has_mand_locks (cinode)) { cifs_dbg(FYI, "Reset oplock to None for inode=%p due to mand locks\n",
@@ -3692,6 +3716,7 @@ void cifs_oplock_break(struct work_struct *work) cinode);cifs_dbg (FYI ,"Oplock release rc = %d\n" , rc); } +cifs_done_oplock_break (cinode); }const struct address_space_operations cifs_addr_ops = {
fs/cifs/misc.c +72 -2
86 lines not on this page · raw message
fs/cifs/smb1ops.c +11 -0
@@ -372,6 +372,16 @@ coalesce_t2(char *second_buf, struct smb_hdr *target_hdr)return 0 ; } +static void +cifs_downgrade_oplock (struct TCP_Server_Info *server, +struct cifsInodeInfo *cinode,bool set_level2) +{ +if (set_level2) +cifs_set_oplock_level (cinode,OPLOCK_READ ); +else +cifs_set_oplock_level (cinode,0 ); +} +static bool cifs_check_trans2 (struct mid_q_entry *mid,struct TCP_Server_Info *server,char *buf,int malformed)
@@ -957,6 +967,7 @@ struct smb_version_operations smb1_operations = { .clear_stats = cifs_clear_stats, .print_stats = cifs_print_stats, .is_oplock_break = is_valid_oplock_break, + .downgrade_oplock = cifs_downgrade_oplock, .check_trans2 = cifs_check_trans2, .need_neg = cifs_need_neg, .negotiate = cifs_negotiate,
fs/cifs/smb2misc.c +15 -3
@@ -575,9 +575,21 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)else cfile->oplock_break_cancelled = false; - server->ops->set_oplock_level (cinode, - rsp->OplockLevel ?SMB2_OPLOCK_LEVEL_II :0 , -0 ,NULL ); +set_bit (CIFS_INODE_PENDING_OPLOCK_BREAK , + &cinode->flags); + +/* +* Set flag if the server downgrades the oplock +* to L2 else clear. +*/ +if (rsp->OplockLevel) +set_bit ( +CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , + &cinode->flags); +else +clear_bit ( +CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2 , + &cinode->flags);queue_work (cifsiod_wq, &cfile->oplock_break);
fs/cifs/smb2ops.c +14 -0
@@ -646,6 +646,17 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, }static void +smb2_downgrade_oplock (struct TCP_Server_Info *server, +struct cifsInodeInfo *cinode,bool set_level2) +{ +if (set_level2) + server->ops->set_oplock_level (cinode,SMB2_OPLOCK_LEVEL_II , +0 ,NULL ); +else + server->ops->set_oplock_level (cinode,0 ,0 ,NULL ); +} + +static void smb2_set_oplock_level (struct cifsInodeInfo *cinode,__u32 oplock,unsigned int epoch,bool *purge_cache) {
@@ -851,6 +862,7 @@ struct smb_version_operations smb20_operations = { .clear_stats = smb2_clear_stats, .print_stats = smb2_print_stats, .is_oplock_break = smb2_is_valid_oplock_break, + .downgrade_oplock = smb2_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
@@ -922,6 +934,7 @@ struct smb_version_operations smb21_operations = { .clear_stats = smb2_clear_stats, .print_stats = smb2_print_stats, .is_oplock_break = smb2_is_valid_oplock_break, + .downgrade_oplock = smb2_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
@@ -994,6 +1007,7 @@ struct smb_version_operations smb30_operations = { .print_stats = smb2_print_stats, .dump_share_caps = smb2_dump_share_caps, .is_oplock_break = smb2_is_valid_oplock_break, + .downgrade_oplock = smb2_downgrade_oplock, .need_neg = smb2_need_neg, .negotiate = smb2_negotiate, .negotiate_wsize = smb2_negotiate_wsize,
Signature · 1 line
1.9.3
PATCH 30/103 xen/spinlock: Don't enable them unconditionally.
In reply to Jiri SlabyFrom: Konrad Rzeszutek Wilk <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e0fc17a936334c08b2729fff87168c03fdecf5b6 upstream.
The git commit a945928ea2709bc0e8e8165d33aed855a0110279 ('xen: Do not enable spinlocks before jump_label_init() has executed') was added to deal with the jump machinery. Earlier the code that turned on the jump label was only called by Xen specific functions. But now that it had been moved to the initcall machinery it gets called on Xen, KVM, and baremetal - ouch!. And the detection machinery to only call it on Xen wasn't remembered in the heat of merge window excitement.
This means that the slowpath is enabled on baremetal while it should not be.
--- arch/x86/xen/spinlock.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/x86/xen/spinlock.c +4 -1
@@ -274,7 +274,7 @@ void __init xen_init_spinlocks(void)printk (KERN_DEBUG "xen: PV spinlocks disabled\n" );return ; } - +printk (KERN_DEBUG "xen: PV spinlocks enabled\n" ); pv_lock_ops.lock_spinning =PV_CALLEE_SAVE (xen_lock_spinning); pv_lock_ops.unlock_kick = xen_unlock_kick; }
@@ -290,6 +290,9 @@ static __init int xen_init_spinlocks_jump(void)if (!xen_pvspin)return 0 ; +if (!xen_domain ()) +return 0 ; +static_key_slow_inc (¶virt_ticketlocks_enabled);return 0 ; }
Signature · 1 line
1.9.3
PATCH 31/103 HID: core: do not scan constant input report
In reply to Jiri SlabyFrom: Benjamin Tissoires <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e24d0d399b2fce71b627043e900ef28283850482 upstream.
The Microsoft Surface Type/Touch Cover 2 is a fancy device which advertised itself as a multitouch device but with constant input reports. This way, hid_scan_report() gives the group MULTITOUCH to it, but hid-multitouch can not handle it due to the constant collection ignored by hid-input.
To prevent such crap in the future, and while we do not fix this particular device, make the scan_report coherent with hid-input.c, and ignore constant input reports.
--- drivers/hid/hid-core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/hid/hid-core.c +3 -0
@@ -718,6 +718,9 @@ static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)case HID_MAIN_ITEM_TAG_END_COLLECTION :break ;case HID_MAIN_ITEM_TAG_INPUT : +/* ignore constant inputs, they will be ignored by hid-input */ +if (data &HID_MAIN_ITEM_CONSTANT ) +break ;for (i =0 ; i < parser->local.usage_index; i++)hid_scan_input_usage (parser, parser->local.usage[i]);break ;
Signature · 1 line
1.9.3
PATCH 32/103 HID: add NO_INIT_REPORTS quirk for Synaptics Touch Pad V 103S
In reply to Jiri SlabyFrom: Hans de Goede <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 2f433083e854ec72c19dc9b0e1cebcc8e230fd75 upstream.
This touchpad seriously dislikes init reports, not only timeing out, but also refusing to work after this.
--- drivers/hid/hid-ids.h | 1 + drivers/hid/usbhid/hid-quirks.c | 1 + 2 files changed, 2 insertions(+)
drivers/hid/hid-ids.h +1 -0
@@ -812,6 +812,7 @@#define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10#define USB_DEVICE_ID_SYNAPTICS_HD 0x0ac3#define USB_DEVICE_ID_SYNAPTICS_QUAD_HD 0x1ac3 +#define USB_DEVICE_ID_SYNAPTICS_TP_V103 0x5710#define USB_VENDOR_ID_THINGM 0x27b8#define USB_DEVICE_ID_BLINK1 0x01ed
drivers/hid/usbhid/hid-quirks.c +1 -0
@@ -119,6 +119,7 @@ static const struct hid_blacklist { { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS2, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_HD, HID_QUIRK_NO_INIT_REPORTS }, { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_QUAD_HD, HID_QUIRK_NO_INIT_REPORTS }, + { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP_V103, HID_QUIRK_NO_INIT_REPORTS }, { 0, 0 } };
Signature · 1 line
1.9.3
PATCH 33/103 md/raid1: r1buf_pool_alloc: free allocate pages when subsequent allocation fails.
In reply to Jiri SlabyFrom: NeilBrown <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit da1aab3dca9aa88ae34ca392470b8943159e25fe upstream.
When performing a user-request check/repair (MD_RECOVERY_REQUEST is set) on a raid1, we allocate multiple bios each with their own set of pages.
If the page allocations for one bio fails, we currently do *not* free the pages allocated for the previous bios, nor do we free the bio itself.
This patch frees all the already-allocate pages, and makes sure that all the bios are freed as well.
This bug can cause a memory leak which can ultimately OOM a machine. It was introduced in 3.10-rc1.
--- drivers/md/raid1.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/md/raid1.c +13 -4
@@ -94,6 +94,7 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)struct pool_info *pi = data;struct r1bio *r1_bio;struct bio *bio; +int need_pages;int i, j; r1_bio =r1bio_pool_alloc (gfp_flags, pi);
@@ -116,15 +117,15 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)* RESYNC_PAGES for each bio. */ if (test_bit (MD_RECOVERY_REQUESTED , &pi->mddev->recovery)) - j = pi->raid_disks; + need_pages = pi->raid_disks;else - j =1 ; -while (j--) { + need_pages =1 ; +for (j =0 ; j < need_pages; j++) { bio = r1_bio->bios[j]; bio->bi_vcnt =RESYNC_PAGES ;if (bio_alloc_pages (bio, gfp_flags)) - goto out_free_bio; + goto out_free_pages; }/* If not user-requests, copy the page pointers to all bios */ if (!test_bit (MD_RECOVERY_REQUESTED , &pi->mddev->recovery)) {
@@ -138,6 +139,14 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data)return r1_bio; +out_free_pages: +while (--j >=0 ) { +struct bio_vec *bv; + +bio_for_each_segment_all (bv, r1_bio->bios[j], i) +__free_page (bv->bv_page); + } + out_free_bio:while (++j < pi->raid_disks)bio_put (r1_bio->bios[j]);
Signature · 1 line
1.9.3
PATCH 34/103 mm/hugetlb.c: add cond_resched_lock() in return_unused_surplus_pages()
In reply to Jiri SlabyFrom: "Mizuma, Masayoshi" <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 7848a4bf51b34f41fcc9bd77e837126d99ae84e3 upstream.
soft lockup in freeing gigantic hugepage fixed in commit 55f67141a892 "mm:
hugetlb: fix softlockup when a large number of hugepages are freed." can happen in return_unused_surplus_pages(), so let's fix it.
--- mm/hugetlb.c | 1 + 1 file changed, 1 insertion(+)
mm/hugetlb.c +1 -0
@@ -1177,6 +1177,7 @@ static void return_unused_surplus_pages(struct hstate *h,while (nr_pages--) {if (!free_pool_huge_page (h, &node_states[N_MEMORY ],1 ))break ; +cond_resched_lock (&hugetlb_lock); } }
Signature · 1 line
1.9.3
PATCH 35/103 mm: use paravirt friendly ops for NUMA hinting ptes
In reply to Jiri SlabyFrom: Mel Gorman <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 29c7787075c92ca8af353acd5301481e6f37082f upstream.
David Vrabel identified a regression when using automatic NUMA balancing under Xen whereby page table entries were getting corrupted due to the use of native PTE operations. Quoting him
Xen PV guest page tables require that their entries use machine addresses if the preset bit (_PAGE_PRESENT) is set, and (for successful migration) non-present PTEs must use pseudo-physical addresses. This is because on migration MFNs in present PTEs are translated to PFNs (canonicalised) so they may be translated back to the new MFN in the destination domain (uncanonicalised).
pte_mknonnuma(), pmd_mknonnuma(), pte_mknuma() and pmd_mknuma() set and clear the _PAGE_PRESENT bit using pte_set_flags(), pte_clear_flags(), etc.
In a Xen PV guest, these functions must translate MFNs to PFNs when clearing _PAGE_PRESENT and translate PFNs to MFNs when setting _PAGE_PRESENT.
His suggested fix converted p[te|md]_[set|clear]_flags to using paravirt-friendly ops but this is overkill. He suggested an alternative of using p[te|md]_modify in the NUMA page table operations but this is does more work than necessary and would require looking up a VMA for protections.
This patch modifies the NUMA page table operations to use paravirt friendly operations to set/clear the flags of interest. Unfortunately this will take a performance hit when updating the PTEs on CONFIG_PARAVIRT but I do not see a way around it that does not break Xen.
--- include/asm-generic/pgtable.h | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-)
include/asm-generic/pgtable.h +23 -8
@@ -669,32 +669,47 @@ static inline int pmd_numa(pmd_t pmd)#ifndef pte_mknonnumastatic inline pte_t pte_mknonnuma (pte_t pte) { - pte =pte_clear_flags (pte, _PAGE_NUMA); -return pte_set_flags (pte, _PAGE_PRESENT|_PAGE_ACCESSED); +pteval_t val =pte_val (pte); + + val &= ~_PAGE_NUMA; + val |= (_PAGE_PRESENT|_PAGE_ACCESSED); +return __pte (val); }#endif #ifndef pmd_mknonnumastatic inline pmd_t pmd_mknonnuma (pmd_t pmd) { - pmd =pmd_clear_flags (pmd, _PAGE_NUMA); -return pmd_set_flags (pmd, _PAGE_PRESENT|_PAGE_ACCESSED); +pmdval_t val =pmd_val (pmd); + + val &= ~_PAGE_NUMA; + val |= (_PAGE_PRESENT|_PAGE_ACCESSED); + +return __pmd (val); }#endif #ifndef pte_mknumastatic inline pte_t pte_mknuma (pte_t pte) { - pte =pte_set_flags (pte, _PAGE_NUMA); -return pte_clear_flags (pte, _PAGE_PRESENT); +pteval_t val =pte_val (pte); + + val &= ~_PAGE_PRESENT; + val |= _PAGE_NUMA; + +return __pte (val); }#endif #ifndef pmd_mknumastatic inline pmd_t pmd_mknuma (pmd_t pmd) { - pmd =pmd_set_flags (pmd, _PAGE_NUMA); -return pmd_clear_flags (pmd, _PAGE_PRESENT); +pmdval_t val =pmd_val (pmd); + + val &= ~_PAGE_PRESENT; + val |= _PAGE_NUMA; + +return __pmd (val); }#endif #else
Signature · 1 line
1.9.3
PATCH 36/103 USB: cdc-acm: Remove Motorola/Telit H24 serial interfaces from ACM driver
In reply to Jiri SlabyFrom: Michael Ulbricht <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 895d240d1db0b2736d779200788e4c4aea28a0c6 upstream.
By specifying NO_UNION_NORMAL the ACM driver does only use the first two USB interfaces (modem data & control). The AT Port, Diagnostic and NMEA interfaces are left to the USB serial driver.
--- drivers/usb/class/cdc-acm.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
drivers/usb/class/cdc-acm.c +21 -7
@@ -1560,13 +1560,27 @@ static const struct usb_device_id acm_ids[] = { },/* Motorola H24 HSPA module: */ { USB_DEVICE(0x22b8, 0x2d91) }, /* modem */ - { USB_DEVICE(0x22b8, 0x2d92) }, /* modem + diagnostics */ - { USB_DEVICE(0x22b8, 0x2d93) }, /* modem + AT port */ - { USB_DEVICE(0x22b8, 0x2d95) }, /* modem + AT port + diagnostics */ - { USB_DEVICE(0x22b8, 0x2d96) }, /* modem + NMEA */ - { USB_DEVICE(0x22b8, 0x2d97) }, /* modem + diagnostics + NMEA */ - { USB_DEVICE(0x22b8, 0x2d99) }, /* modem + AT port + NMEA */ - { USB_DEVICE(0x22b8, 0x2d9a) }, /* modem + AT port + diagnostics + NMEA */ + { USB_DEVICE(0x22b8, 0x2d92), /* modem + diagnostics */ + .driver_info =NO_UNION_NORMAL ,/* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d93), /* modem + AT port */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d95), /* modem + AT port + diagnostics */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d96), /* modem + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d97), /* modem + diagnostics + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d99), /* modem + AT port + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, + { USB_DEVICE(0x22b8, 0x2d9a), /* modem + AT port + diagnostics + NMEA */ + .driver_info = NO_UNION_NORMAL, /* handle only modem interface */ + }, { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
Signature · 1 line
1.9.3
PATCH 37/103 USB: cp210x: Add 8281 (Nanotec Plug & Drive)
In reply to Jiri SlabyFrom: Tristan Bruns <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 72b3007951010ce1bbf950e23b19d9839fa905a5 upstream.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -104,6 +104,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x10C4, 0x8218) }, /* Lipowsky Industrie Elektronik GmbH, HARP-1 */ { USB_DEVICE(0x10C4, 0x822B) }, /* Modem EDGE(GSM) Comander 2 */ { USB_DEVICE(0x10C4, 0x826B) }, /* Cygnal Integrated Products, Inc., Fasttrax GPS demonstration module */ + { USB_DEVICE(0x10C4, 0x8281) }, /* Nanotec Plug & Drive */ { USB_DEVICE(0x10C4, 0x8293) }, /* Telegesis ETRX2USB */ { USB_DEVICE(0x10C4, 0x82F9) }, /* Procyon AVS */ { USB_DEVICE(0x10C4, 0x8341) }, /* Siemens MC35PU GPRS Modem */
Signature · 1 line
1.9.3
PATCH 38/103 USB: usb_wwan: fix handling of missing bulk endpoints
In reply to Jiri SlabyFrom: Johan Hovold <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit bd73bd8831696f189a479a0712ae95208e513d7e upstream.
Fix regression introduced by commit 8e493ca1767d ("USB: usb_wwan: fix bulk-urb allocation") by making sure to require both bulk-in and out endpoints during port probe.
The original option driver (which usb_wwan is based on) was written under the assumption that either endpoint could be missing, but evidently this cannot have been tested properly. Specifically, it would handle opening a device without bulk-in (but would blow up during resume which was implemented later), but not a missing bulk-out in write() (although it is handled in some places such as write_room()).
Fortunately (?), the driver also got the test for missing endpoints wrong so the urbs were in fact always allocated, although they would be initialised using the wrong endpoint address (0) and any submission of such an urb would fail.
The commit mentioned above fixed the test for missing endpoints but thereby exposed the other bugs which would now generate null-pointer exceptions rather than failed urb submissions.
The regression was introduced in v3.7, but the offending commit was also marked for stable.
--- drivers/usb/serial/usb_wwan.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/usb/serial/usb_wwan.c +3 -6
@@ -470,6 +470,9 @@ int usb_wwan_port_probe(struct usb_serial_port *port)int err;int i; +if (!port->bulk_in_size || !port->bulk_out_size) +return -ENODEV ; + portdata =kzalloc (sizeof (*portdata),GFP_KERNEL );if (!portdata)return -ENOMEM ;
@@ -477,9 +480,6 @@ int usb_wwan_port_probe(struct usb_serial_port *port)init_usb_anchor (&portdata->delayed);for (i =0 ; i <N_IN_URB ; i++) { -if (!port->bulk_in_size) -break ; - buffer = (u8 *)__get_free_page (GFP_KERNEL );if (!buffer) goto bail_out_error;
@@ -493,9 +493,6 @@ int usb_wwan_port_probe(struct usb_serial_port *port) }for (i =0 ; i <N_OUT_URB ; i++) { -if (!port->bulk_out_size) -break ; - buffer =kmalloc (OUT_BUFLEN ,GFP_KERNEL );if (!buffer) goto bail_out_error2;
Signature · 1 line
1.9.3
PATCH 39/103 USB: serial: ftdi_sio: add id for Brainboxes serial cards
In reply to Jiri SlabyFrom: Michele Baldessari <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit efe26e16b1d93ac0085e69178cc18811629e8fc5 upstream.
Custom VID/PIDs for Brainboxes cards as reported in
https://bugzilla.redhat.com/show_bug.cgi?id=1071914
--- drivers/usb/serial/ftdi_sio.c | 33 +++++++++++++++++++++++++++++++++ drivers/usb/serial/ftdi_sio_ids.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+)
drivers/usb/serial/ftdi_sio.c +33 -0
@@ -910,6 +910,39 @@ static struct usb_device_id id_table_combined [] = { { USB_DEVICE(FTDI_VID, FTDI_Z3X_PID) },/* Cressi Devices */ { USB_DEVICE(FTDI_VID, FTDI_CRESSI_PID) }, +/* Brainboxes Devices */ + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_001_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_012_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_023_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_VX_034_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_101_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_4_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_5_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_6_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_7_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_160_8_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_257_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_279_4_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_313_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_324_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_346_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_357_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_606_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_701_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_1_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) }, + { USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) }, { } /* Terminating entry */ };
drivers/usb/serial/ftdi_sio_ids.h +37 -0
@@ -1326,3 +1326,40 @@* Manufacturer: Cressi */ #define FTDI_CRESSI_PID 0x87d0 + +/* +* Brainboxes devices +*/ +#define BRAINBOXES_VID 0x05d1 +#define BRAINBOXES_VX_001_PID 0x1001/* VX-001 ExpressCard 1 Port RS232 */ +#define BRAINBOXES_VX_012_PID 0x1002/* VX-012 ExpressCard 2 Port RS232 */ +#define BRAINBOXES_VX_023_PID 0x1003/* VX-023 ExpressCard 1 Port RS422/485 */ +#define BRAINBOXES_VX_034_PID 0x1004/* VX-034 ExpressCard 2 Port RS422/485 */ +#define BRAINBOXES_US_101_PID 0x1011/* US-101 1xRS232 */ +#define BRAINBOXES_US_324_PID 0x1013/* US-324 1xRS422/485 1Mbaud */ +#define BRAINBOXES_US_606_1_PID 0x2001/* US-606 6 Port RS232 Serial Port 1 and 2 */ +#define BRAINBOXES_US_606_2_PID 0x2002/* US-606 6 Port RS232 Serial Port 3 and 4 */ +#define BRAINBOXES_US_606_3_PID 0x2003/* US-606 6 Port RS232 Serial Port 4 and 6 */ +#define BRAINBOXES_US_701_1_PID 0x2011/* US-701 4xRS232 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_701_2_PID 0x2012/* US-701 4xRS422 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_279_1_PID 0x2021/* US-279 8xRS422 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_279_2_PID 0x2022/* US-279 8xRS422 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_279_3_PID 0x2023/* US-279 8xRS422 1Mbaud Port 5 and 6 */ +#define BRAINBOXES_US_279_4_PID 0x2024/* US-279 8xRS422 1Mbaud Port 7 and 8 */ +#define BRAINBOXES_US_346_1_PID 0x3011/* US-346 4xRS422/485 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_346_2_PID 0x3012/* US-346 4xRS422/485 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_257_PID 0x5001/* US-257 2xRS232 1Mbaud */ +#define BRAINBOXES_US_313_PID 0x6001/* US-313 2xRS422/485 1Mbaud */ +#define BRAINBOXES_US_357_PID 0x7001/* US_357 1xRS232/422/485 */ +#define BRAINBOXES_US_842_1_PID 0x8001/* US-842 8xRS422/485 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_842_2_PID 0x8002/* US-842 8xRS422/485 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_842_3_PID 0x8003/* US-842 8xRS422/485 1Mbaud Port 5 and 6 */ +#define BRAINBOXES_US_842_4_PID 0x8004/* US-842 8xRS422/485 1Mbaud Port 7 and 8 */ +#define BRAINBOXES_US_160_1_PID 0x9001/* US-160 16xRS232 1Mbaud Port 1 and 2 */ +#define BRAINBOXES_US_160_2_PID 0x9002/* US-160 16xRS232 1Mbaud Port 3 and 4 */ +#define BRAINBOXES_US_160_3_PID 0x9003/* US-160 16xRS232 1Mbaud Port 5 and 6 */ +#define BRAINBOXES_US_160_4_PID 0x9004/* US-160 16xRS232 1Mbaud Port 7 and 8 */ +#define BRAINBOXES_US_160_5_PID 0x9005/* US-160 16xRS232 1Mbaud Port 9 and 10 */ +#define BRAINBOXES_US_160_6_PID 0x9006/* US-160 16xRS232 1Mbaud Port 11 and 12 */ +#define BRAINBOXES_US_160_7_PID 0x9007/* US-160 16xRS232 1Mbaud Port 13 and 14 */ +#define BRAINBOXES_US_160_8_PID 0x9008/* US-160 16xRS232 1Mbaud Port 15 and 16 */
Signature · 1 line
1.9.3
PATCH 40/103 usb: option driver, add support for Telit UE910v2
In reply to Jiri SlabyFrom: Daniele Palmas <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit d6de486bc22255779bd54b0fceb4c240962bf146 upstream.
option driver, added VID/PID for Telit UE910v2 modem
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -243,6 +243,7 @@ static void option_instat_callback(struct urb *urb);#define TELIT_PRODUCT_CC864_DUAL 0x1005#define TELIT_PRODUCT_CC864_SINGLE 0x1006#define TELIT_PRODUCT_DE910_DUAL 0x1010 +#define TELIT_PRODUCT_UE910_V2 0x1012#define TELIT_PRODUCT_LE920 0x1200/* ZTE PRODUCTS */
@@ -1041,6 +1042,7 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
Signature · 1 line
1.9.3
PATCH 41/103 Revert "USB: serial: add usbid for dell wwan card to sierra.c"
In reply to Jiri SlabyFrom: Johan Hovold <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 2e01280d2801c72878cf3a7119eac30077b463d5 upstream.
This reverts commit 1ebca9dad5abe8b2ed4dbd186cd657fb47c1f321.
This device was erroneously added to the sierra driver even though it's not a Sierra device and was already handled by the option driver.
--- drivers/usb/serial/sierra.c | 1 - 1 file changed, 1 deletion(-)
drivers/usb/serial/sierra.c +0 -1
@@ -291,7 +291,6 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x0f3d, 0x68A3), /* Airprime/Sierra Wireless Direct IP modems */ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist }, - { USB_DEVICE(0x413C, 0x08133) }, /* Dell Computer Corp. Wireless 5720 VZW Mobile Broadband (EVDO Rev-A) Minicard GPS Port */ { } };
Signature · 1 line
1.9.3
PATCH 42/103 USB: serial: fix sysfs-attribute removal deadlock
In reply to Jiri SlabyFrom: Johan Hovold <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 10164c2ad6d2c16809f6c09e278f946e47801b3a upstream.
Fix driver new_id sysfs-attribute removal deadlock by making sure to not hold any locks that the attribute operations grab when removing the attribute.
Specifically, usb_serial_deregister holds the table mutex when deregistering the driver, which includes removing the new_id attribute. This can lead to a deadlock as writing to new_id increments the attribute's active count before trying to grab the same mutex in usb_serial_probe.
The deadlock can easily be triggered by inserting a sleep in usb_serial_deregister and writing the id of an unbound device to new_id during module unload.
As the table mutex (in this case) is used to prevent subdriver unload during probe, it should be sufficient to only hold the lock while manipulating the usb-serial driver list during deregister. A racing probe will then either fail to find a matching subdriver or fail to get the corresponding module reference.
Since v3.15-rc1 this also triggers the following lockdep warning:
======================================================
[ INFO: possible circular locking dependency detected ]
3.15.0-rc2 #123 Tainted: G W
-------------------------------------------------------
modprobe/190 is trying to acquire lock:
(s_active#4){++++.+}, at: [<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
but task is already holding lock:
(table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (table_lock){+.+.+.}:
[<c0075f84>] __lock_acquire+0x1694/0x1ce4
[<c0076de8>] lock_acquire+0xb4/0x154
[<c03af3cc>] _raw_spin_lock+0x4c/0x5c
[<c02bbc24>] usb_store_new_id+0x14c/0x1ac
[<bf007eb4>] new_id_store+0x68/0x70 [usbserial]
[<c025f568>] drv_attr_store+0x30/0x3c
[<c01690e0>] sysfs_kf_write+0x5c/0x60
[<c01682c0>] kernfs_fop_write+0xd4/0x194
[<c010881c>] vfs_write+0xbc/0x198
[<c0108e4c>] SyS_write+0x4c/0xa0
[<c000f880>] ret_fast_syscall+0x0/0x48-> #0 (s_active#4){++++.+}:
[<c03a7a28>] print_circular_bug+0x68/0x2f8
[<c0076218>] __lock_acquire+0x1928/0x1ce4
[<c0076de8>] lock_acquire+0xb4/0x154
[<c0166b70>] __kernfs_remove+0x254/0x310
[<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
[<c0169fb8>] remove_files.isra.1+0x48/0x84
[<c016a2fc>] sysfs_remove_group+0x58/0xac
[<c016a414>] sysfs_remove_groups+0x34/0x44
[<c02623b8>] driver_remove_groups+0x1c/0x20
[<c0260e9c>] bus_remove_driver+0x3c/0xe4
[<c026235c>] driver_unregister+0x38/0x58
[<bf007fb4>] usb_serial_bus_deregister+0x84/0x88 [usbserial]
[<bf004db4>] usb_serial_deregister+0x6c/0x78 [usbserial]
[<bf005330>] usb_serial_deregister_drivers+0x2c/0x4c [usbserial]
[<bf016618>] usb_serial_module_exit+0x14/0x1c [sierra]
[<c009d6cc>] SyS_delete_module+0x184/0x210
[<c000f880>] ret_fast_syscall+0x0/0x48other info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(table_lock);
lock(s_active#4);
lock(table_lock); lock(s_active#4);
*** DEADLOCK ***
1 lock held by modprobe/190:
#0: (table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
stack backtrace: CPU: 0 PID: 190 Comm: modprobe Tainted: G W 3.15.0-rc2 #123 [<c0015e10>] (unwind_backtrace) from [<c0013728>] (show_stack+0x20/0x24) [<c0013728>] (show_stack) from [<c03a9a54>] (dump_stack+0x24/0x28) [<c03a9a54>] (dump_stack) from [<c03a7cac>] (print_circular_bug+0x2ec/0x2f8) [<c03a7cac>] (print_circular_bug) from [<c0076218>] (__lock_acquire+0x1928/0x1ce4) [<c0076218>] (__lock_acquire) from [<c0076de8>] (lock_acquire+0xb4/0x154) [<c0076de8>] (lock_acquire) from [<c0166b70>] (__kernfs_remove+0x254/0x310) [<c0166b70>] (__kernfs_remove) from [<c0167aa0>] (kernfs_remove_by_name_ns+0x4c/0x94) [<c0167aa0>] (kernfs_remove_by_name_ns) from [<c0169fb8>] (remove_files.isra.1+0x48/0x84) [<c0169fb8>] (remove_files.isra.1) from [<c016a2fc>] (sysfs_remove_group+0x58/0xac) [<c016a2fc>] (sysfs_remove_group) from [<c016a414>] (sysfs_remove_groups+0x34/0x44) [<c016a414>] (sysfs_remove_groups) from [<c02623b8>] (driver_remove_groups+0x1c/0x20) [<c02623b8>] (driver_remove_groups) from [<c0260e9c>] (bus_remove_driver+0x3c/0xe4) [<c0260e9c>] (bus_remove_driver) from [<c026235c>] (driver_unregister+0x38/0x58) [<c026235c>] (driver_unregister) from [<bf007fb4>] (usb_serial_bus_deregister+0x84/0x88 [usbserial]) [<bf007fb4>] (usb_serial_bus_deregister [usbserial]) from [<bf004db4>] (usb_serial_deregister+0x6c/0x78 [usbserial]) [<bf004db4>] (usb_serial_deregister [usbserial]) from [<bf005330>] (usb_serial_deregister_drivers+0x2c/0x4c [usbserial]) [<bf005330>] (usb_serial_deregister_drivers [usbserial]) from [<bf016618>] (usb_serial_module_exit+0x14/0x1c [sierra]) [<bf016618>] (usb_serial_module_exit [sierra]) from [<c009d6cc>] (SyS_delete_module+0x184/0x210) [<c009d6cc>] (SyS_delete_module) from [<c000f880>] (ret_fast_syscall+0x0/0x48)
--- drivers/usb/serial/usb-serial.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/usb/serial/usb-serial.c +3 -1
@@ -1348,10 +1348,12 @@ static int usb_serial_register(struct usb_serial_driver *driver)static void usb_serial_deregister (struct usb_serial_driver *device) {pr_info ("USB Serial deregistering driver %s\n" , device->description); +mutex_lock (&table_lock);list_del (&device->driver_list); -usb_serial_bus_deregister (device);mutex_unlock (&table_lock); + +usb_serial_bus_deregister (device); }/**
Signature · 1 line
1.9.3
PATCH 43/103 USB: io_ti: fix firmware download on big-endian machines
In reply to Jiri SlabyFrom: Johan Hovold <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 5509076d1b4485ce9fb07705fcbcd2695907ab5b upstream.
During firmware download the device expects memory addresses in big-endian byte order. As the wIndex parameter which hold the address is sent in little-endian byte order regardless of host byte order, we need to use swab16 rather than cpu_to_be16.
Also make sure to handle the struct ti_i2c_desc size parameter which is returned in little-endian byte order.
--- drivers/usb/serial/io_ti.c | 50 ++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 17 deletions(-)
drivers/usb/serial/io_ti.c +33 -17
@@ -29,6 +29,7 @@#include <linux/spinlock.h> #include <linux/mutex.h> #include <linux/serial.h> +#include <linux/swab.h> #include <linux/kfifo.h> #include <linux/ioctl.h> #include <linux/firmware.h>
@@ -281,7 +282,7 @@ static int read_download_mem(struct usb_device *dev, int start_address, {int status =0 ;__u8 read_length; -__be16 be_start_address; +u16 be_start_address;dev_dbg (&dev->dev,"%s - @ %x for %d\n" , __func__, start_address, length);
@@ -297,10 +298,14 @@ static int read_download_mem(struct usb_device *dev, int start_address,if (read_length >1 ) {dev_dbg (&dev->dev,"%s - @ %x for %d\n" , __func__, start_address, read_length); } - be_start_address =cpu_to_be16 (start_address); +/* +* NOTE: Must use swab as wIndex is sent in little-endian +* byte order regardless of host byte order. +*/ + be_start_address =swab16 ((u16 )start_address); status =ti_vread_sync (dev,UMPC_MEMORY_READ , (__u16 )address_type, - (__force __u16 )be_start_address, + be_start_address, buffer, read_length);if (status) {
@@ -397,7 +402,7 @@ static int write_i2c_mem(struct edgeport_serial *serial,struct device *dev = &serial->serial->dev->dev;int status =0 ;int write_length; -__be16 be_start_address; +u16 be_start_address;/* We can only send a maximum of 1 aligned byte page at a time */
@@ -412,11 +417,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, __func__, start_address, write_length);usb_serial_debug_data (dev, __func__, write_length, buffer); -/* Write first page */ - be_start_address =cpu_to_be16 (start_address); +/* +* Write first page. +* +* NOTE: Must use swab as wIndex is sent in little-endian byte order +* regardless of host byte order. +*/ + be_start_address =swab16 ((u16 )start_address); status =ti_vsend_sync (serial->serial->dev,UMPC_MEMORY_WRITE , (__u16 )address_type, - (__force __u16 )be_start_address, + be_start_address, buffer, write_length);if (status) {dev_dbg (dev,"%s - ERROR %d\n" , __func__, status);
@@ -439,11 +449,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, __func__, start_address, write_length);usb_serial_debug_data (dev, __func__, write_length, buffer); -/* Write next page */ - be_start_address =cpu_to_be16 (start_address); +/* +* Write next page. +* +* NOTE: Must use swab as wIndex is sent in little-endian byte +* order regardless of host byte order. +*/ + be_start_address =swab16 ((u16 )start_address); status =ti_vsend_sync (serial->serial->dev,UMPC_MEMORY_WRITE , (__u16 )address_type, - (__force __u16 )be_start_address, + be_start_address, buffer, write_length);if (status) {dev_err (dev,"%s - ERROR %d\n" , __func__, status);
@@ -590,8 +605,8 @@ static int get_descriptor_addr(struct edgeport_serial *serial,if (rom_desc->Type == desc_type)return start_address; - start_address = start_address +sizeof (struct ti_i2c_desc ) - + rom_desc->Size; + start_address = start_address +sizeof (struct ti_i2c_desc ) + +le16_to_cpu (rom_desc->Size); }while ((start_address <TI_MAX_I2C_SIZE ) && rom_desc->Type);
@@ -604,7 +619,7 @@ static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer)__u16 i;__u8 cs =0 ; -for (i =0 ; i < rom_desc->Size; i++) +for (i =0 ; i <le16_to_cpu (rom_desc->Size); i++) cs = (__u8)(cs + buffer[i]);if (cs != rom_desc->CheckSum) {
@@ -658,7 +673,7 @@ static int check_i2c_image(struct edgeport_serial *serial)break ;if ((start_address +sizeof (struct ti_i2c_desc ) + - rom_desc->Size) >TI_MAX_I2C_SIZE ) { +le16_to_cpu (rom_desc->Size)) >TI_MAX_I2C_SIZE ) { status = -ENODEV ;dev_dbg (dev,"%s - structure too big, erroring out.\n" , __func__);break ;
@@ -673,7 +688,8 @@ static int check_i2c_image(struct edgeport_serial *serial)/* Read the descriptor data */ status =read_rom (serial, start_address +sizeof (struct ti_i2c_desc ), - rom_desc->Size, buffer); +le16_to_cpu (rom_desc->Size), + buffer);if (status)break ;
@@ -682,7 +698,7 @@ static int check_i2c_image(struct edgeport_serial *serial)break ; } start_address = start_address +sizeof (struct ti_i2c_desc ) + - rom_desc->Size; +le16_to_cpu (rom_desc->Size); }while ((rom_desc->Type !=I2C_DESC_TYPE_ION ) && (start_address <TI_MAX_I2C_SIZE ));
@@ -721,7 +737,7 @@ static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer)/* Read the descriptor data */ status =read_rom (serial, start_address+sizeof (struct ti_i2c_desc ), - rom_desc->Size, buffer); +le16_to_cpu (rom_desc->Size), buffer);if (status) goto exit;
Signature · 1 line
1.9.3
PATCH 44/103 usb: qcserial: add Sierra Wireless EM7355
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit a00986f81182a69dee4d2c48e8c19805bdf0f790 upstream.
--- drivers/usb/serial/qcserial.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/qcserial.c +3 -0
@@ -139,6 +139,9 @@ static const struct usb_device_id id_table[] = { {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 0)}, /* Sierra Wireless EM7355 Device Management */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 2)}, /* Sierra Wireless EM7355 NMEA */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 3)}, /* Sierra Wireless EM7355 Modem */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */
Signature · 1 line
1.9.3
PATCH 45/103 usb: qcserial: add Sierra Wireless MC73xx
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 70a3615fc07c2330ed7c1e922f3c44f4a67c0762 upstream.
--- drivers/usb/serial/qcserial.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/qcserial.c +3 -0
@@ -136,6 +136,9 @@ static const struct usb_device_id id_table[] = { {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)}, /* Sierra Wireless MC7710 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)}, /* Sierra Wireless MC7710 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)}, /* Sierra Wireless MC7710 Modem */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 0)}, /* Sierra Wireless MC73xx Device Management */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 2)}, /* Sierra Wireless MC73xx NMEA */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 3)}, /* Sierra Wireless MC73xx Modem */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */
Signature · 1 line
1.9.3
PATCH 46/103 usb: qcserial: add Sierra Wireless MC7305/MC7355
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit bce4f588f19d59fc07fadfeb0b2a3a06c942827a upstream.
--- drivers/usb/serial/qcserial.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/qcserial.c +3 -0
@@ -145,6 +145,9 @@ static const struct usb_device_id id_table[] = { {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 0)}, /* Sierra Wireless EM7355 Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 2)}, /* Sierra Wireless EM7355 NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 3)}, /* Sierra Wireless EM7355 Modem */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 0)}, /* Sierra Wireless MC7305/MC7355 Device Management */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 2)}, /* Sierra Wireless MC7305/MC7355 NMEA */ + {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 3)}, /* Sierra Wireless MC7305/MC7355 Modem */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */
Signature · 1 line
1.9.3
PATCH 47/103 usb: option: add Olivetti Olicard 500
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 533b3994610f316e5cd61b56d0c4daa15c830f89 upstream.
Device interface layout:
0: ff/ff/ff - serial
1: ff/ff/ff - serial AT+PPP
2: 08/06/50 - storage
3: ff/ff/ff - serial
4: ff/ff/ff - QMI/wwan
--- drivers/usb/serial/option.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/serial/option.c +4 -0
@@ -349,6 +349,7 @@ static void option_instat_callback(struct urb *urb);#define OLIVETTI_PRODUCT_OLICARD100 0xc000#define OLIVETTI_PRODUCT_OLICARD145 0xc003#define OLIVETTI_PRODUCT_OLICARD200 0xc005 +#define OLIVETTI_PRODUCT_OLICARD500 0xc00b/* Celot products */ #define CELOT_VENDOR_ID 0x211f
@@ -1545,6 +1546,9 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, + { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD500), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist + }, { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) },
Signature · 1 line
1.9.3
PATCH 48/103 usb: option: add Alcatel L800MA
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit dd6b48ecec2ea7d15f28d5e5474388681899a5e1 upstream.
Device interface layout:
0: ff/ff/ff - serial
1: ff/00/00 - serial AT+PPP
2: ff/ff/ff - QMI/wwan
3: 08/06/50 - storage
--- drivers/usb/serial/option.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/option.c +3 -0
@@ -287,6 +287,7 @@ static void option_instat_callback(struct urb *urb);#define ALCATEL_PRODUCT_X060S_X200 0x0000#define ALCATEL_PRODUCT_X220_X500D 0x0017#define ALCATEL_PRODUCT_L100V 0x011e +#define ALCATEL_PRODUCT_L800MA 0x0203#define PIRELLI_VENDOR_ID 0x1266#define PIRELLI_PRODUCT_C100_1 0x1002
@@ -1501,6 +1502,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L800MA), + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14),
Signature · 1 line
1.9.3
PATCH 49/103 usb: option: add and update a number of CMOTech devices
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 34f972d6156fe9eea2ab7bb418c71f9d1d5c8e7b upstream.
A number of older CMOTech modems are based on Qualcomm chips. The blacklisted interfaces are QMI/wwan.
--- drivers/usb/serial/option.c | 74 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 4 deletions(-)
drivers/usb/serial/option.c +70 -4
@@ -234,8 +234,31 @@ static void option_instat_callback(struct urb *urb);#define QUALCOMM_VENDOR_ID 0x05C6#define CMOTECH_VENDOR_ID 0x16d8 -#define CMOTECH_PRODUCT_6008 0x6008 -#define CMOTECH_PRODUCT_6280 0x6280 +#define CMOTECH_PRODUCT_6001 0x6001 +#define CMOTECH_PRODUCT_CMU_300 0x6002 +#define CMOTECH_PRODUCT_6003 0x6003 +#define CMOTECH_PRODUCT_6004 0x6004 +#define CMOTECH_PRODUCT_6005 0x6005 +#define CMOTECH_PRODUCT_CGU_628A 0x6006 +#define CMOTECH_PRODUCT_CHE_628S 0x6007 +#define CMOTECH_PRODUCT_CMU_301 0x6008 +#define CMOTECH_PRODUCT_CHU_628 0x6280 +#define CMOTECH_PRODUCT_CHU_628S 0x6281 +#define CMOTECH_PRODUCT_CDU_680 0x6803 +#define CMOTECH_PRODUCT_CDU_685A 0x6804 +#define CMOTECH_PRODUCT_CHU_720S 0x7001 +#define CMOTECH_PRODUCT_7002 0x7002 +#define CMOTECH_PRODUCT_CHU_629K 0x7003 +#define CMOTECH_PRODUCT_7004 0x7004 +#define CMOTECH_PRODUCT_7005 0x7005 +#define CMOTECH_PRODUCT_CGU_629 0x7006 +#define CMOTECH_PRODUCT_CHU_629S 0x700a +#define CMOTECH_PRODUCT_CHU_720I 0x7211 +#define CMOTECH_PRODUCT_7212 0x7212 +#define CMOTECH_PRODUCT_7213 0x7213 +#define CMOTECH_PRODUCT_7251 0x7251 +#define CMOTECH_PRODUCT_7252 0x7252 +#define CMOTECH_PRODUCT_7253 0x7253#define TELIT_VENDOR_ID 0x1bc7#define TELIT_PRODUCT_UC864E 0x1003
@@ -504,6 +527,10 @@ static const struct option_blacklist_info huawei_cdc12_blacklist = { .reserved = BIT(1) | BIT(2), }; +static const struct option_blacklist_info net_intf0_blacklist = { + .reserved =BIT (0 ), +}; +static const struct option_blacklist_info net_intf1_blacklist = { .reserved =BIT (1 ), };
@@ -1037,8 +1064,47 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ - { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ - { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6004) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6005) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_628A) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHE_628S), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_301), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628S) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_680) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_685A) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720S), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7002), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629K), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7004), + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7005) }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_629), + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629S), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720I), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7212), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7213), + .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7251), + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7252), + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, + { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7253), + .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) },
Signature · 1 line
1.9.3
PATCH 50/103 mlx4_en: don't use napi_synchronize inside mlx4_en_netpoll
In reply to Jiri SlabyFrom: Chris Mason <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit c98235cb8584a72e95786e17d695a8e5fafcd766 upstream.
The mlx4 driver is triggering schedules while atomic inside mlx4_en_netpoll:
spin_lock_irqsave(&cq->lock, flags); napi_synchronize(&cq->napi); ^^^^^ msleep here mlx4_en_process_rx_cq(dev, cq, 0); spin_unlock_irqrestore(&cq->lock, flags);
This was part of a patch by Alexander Guller from Mellanox in 2011, but it still isn't upstream.
--- drivers/net/ethernet/mellanox/mlx4/en_cq.c | 1 - drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 +----- drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - 3 files changed, 1 insertion(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx4/en_cq.c +0 -1
@@ -55,7 +55,6 @@ int mlx4_en_create_cq(struct mlx4_en_priv *priv, cq->ring = ring; cq->is_tx = mode; -spin_lock_init (&cq->lock); err =mlx4_alloc_hwq_res (mdev->dev, &cq->wqres, cq->buf_size,2 *PAGE_SIZE );
drivers/net/ethernet/mellanox/mlx4/en_netdev.c +1 -5
@@ -1219,15 +1219,11 @@ static void mlx4_en_netpoll(struct net_device *dev) {struct mlx4_en_priv *priv =netdev_priv (dev);struct mlx4_en_cq *cq; -unsigned long flags;int i;for (i =0 ; i < priv->rx_ring_num; i++) { cq = &priv->rx_cq[i]; -spin_lock_irqsave (&cq->lock, flags); -napi_synchronize (&cq->napi); -mlx4_en_process_rx_cq (dev, cq,0 ); -spin_unlock_irqrestore (&cq->lock, flags); +napi_schedule (&cq->napi); } }#endif
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +0 -1
@@ -306,7 +306,6 @@ struct mlx4_en_cq {struct mlx4_cq mcq;struct mlx4_hwq_resources wqres;int ring; -spinlock_t lock;struct net_device *dev;struct napi_struct napi;int size;
Signature · 1 line
1.9.3
PATCH 51/103 fs: Don't return 0 from get_anon_bdev
In reply to Jiri SlabyFrom: Thomas Bächler <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit a2a4dc494a7b7135f460e38e788c4a58f65e4ac3 upstream.
Commit 9e30cc9595303b27b48 removed an internal mount. This has the side-effect that rootfs now has FSID 0. Many userspace utilities assume that st_dev in struct stat is never 0, so this change breaks a number of tools in early userspace.
Since we don't know how many userspace programs are affected, make sure that FSID is at least 1.
References: http://article.gmane.org/gmane.linux.kernel/1666905
References: http://permalink.gmane.org/gmane.linux.utilities.util-linux-ng/8557
--- fs/super.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/super.c +4 -1
@@ -845,7 +845,10 @@ void emergency_remount(void)static DEFINE_IDA (unnamed_dev_ida);static DEFINE_SPINLOCK (unnamed_dev_lock);/* protects the above */ -static int unnamed_dev_start =0 ;/* don't bother trying below it */ +/* Many userspace utilities consider an FSID of 0 invalid. +* Always return at least 1 from get_anon_bdev. +*/ +static int unnamed_dev_start =1 ;int get_anon_bdev (dev_t *p) {
Signature · 1 line
1.9.3
PATCH 52/103 drm/vmwgfx: correct fb_fix_screeninfo.line_length
In reply to Jiri SlabyFrom: Christopher Friedt <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit aa6de142c901cd2d90ef08db30ae87da214bedcc upstream.
Previously, the vmwgfx_fb driver would allow users to call FBIOSET_VINFO, but it would not adjust the FINFO properly, resulting in distorted screen rendering. The patch corrects that behaviour.
See https://bugs.gentoo.org/show_bug.cgi?id=494794 for examples.
--- drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c +4 -1
@@ -147,7 +147,7 @@ static int vmw_fb_check_var(struct fb_var_screeninfo *var, }if (!vmw_kms_validate_mode_vram (vmw_priv, - info->fix.line_length, + var->xres * var->bits_per_pixel/8 , var->yoffset + var->yres)) {DRM_ERROR ("Requested geom can not fit in framebuffer\n" );return -EINVAL ;
@@ -162,6 +162,8 @@ static int vmw_fb_set_par(struct fb_info *info)struct vmw_private *vmw_priv = par->vmw_priv;int ret; + info->fix.line_length = info->var.xres * info->var.bits_per_pixel/8 ; + ret =vmw_kms_write_svga (vmw_priv, info->var.xres, info->var.yres, info->fix.line_length, par->bpp, par->depth);
@@ -177,6 +179,7 @@ static int vmw_fb_set_par(struct fb_info *info)vmw_write (vmw_priv,SVGA_REG_DISPLAY_POSITION_Y , info->var.yoffset);vmw_write (vmw_priv,SVGA_REG_DISPLAY_WIDTH , info->var.xres);vmw_write (vmw_priv,SVGA_REG_DISPLAY_HEIGHT , info->var.yres); +vmw_write (vmw_priv,SVGA_REG_BYTES_PER_LINE , info->fix.line_length);vmw_write (vmw_priv,SVGA_REG_DISPLAY_ID ,SVGA_ID_INVALID ); }
Signature · 1 line
1.9.3
PATCH 53/103 drm/vmwgfx: Make sure user-space can't DMA across buffer object boundaries v2
In reply to Jiri SlabyFrom: Thomas Hellstrom <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit cbd75e97a525e3819c02dc18bc2d67aa544c9e45 upstream.
We already check that the buffer object we're accessing is registered with the file. Now also make sure that we can't DMA across buffer object boundaries.
v2: Code commenting update.
--- drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c +22 -0
@@ -834,14 +834,36 @@ static int vmw_cmd_dma(struct vmw_private *dev_priv,SVGA3dCmdSurfaceDMA dma; } *cmd;int ret; +SVGA3dCmdSurfaceDMASuffix *suffix; +uint32_t bo_size; cmd = container_of(header, struct vmw_dma_cmd, header); + suffix = (SVGA3dCmdSurfaceDMASuffix *)((unsigned long ) &cmd->dma + + header->size -sizeof (*suffix)); + +/* Make sure device and verifier stays in sync. */ +if (unlikely (suffix->suffixSize !=sizeof (*suffix))) { +DRM_ERROR ("Invalid DMA suffix size.\n" ); +return -EINVAL ; + } + ret =vmw_translate_guest_ptr (dev_priv, sw_context, &cmd->dma.guest.ptr, &vmw_bo);if (unlikely (ret !=0 ))return ret; +/* Make sure DMA doesn't cross BO boundaries. */ + bo_size = vmw_bo->base.num_pages *PAGE_SIZE ; +if (unlikely (cmd->dma.guest.ptr.offset > bo_size)) { +DRM_ERROR ("Invalid DMA offset.\n" ); +return -EINVAL ; + } + + bo_size -= cmd->dma.guest.ptr.offset; +if (unlikely (suffix->maximumOffset > bo_size)) + suffix->maximumOffset = bo_size; + ret =vmw_cmd_res_check (dev_priv, sw_context, vmw_res_surface, user_surface_converter, &cmd->dma.host.sid,NULL );
Signature · 1 line
1.9.3
PATCH 54/103 drm/qxl: unset a pointer in sync_obj_unref
In reply to Jiri SlabyFrom: Maarten Lankhorst <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 41ccec352f3c823931a7d9d2a9c7880c14d7415a upstream.
This fixes a BUG_ON(bo->sync_obj != NULL); in ttm_bo_release_list.
--- drivers/gpu/drm/qxl/qxl_ttm.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/qxl/qxl_ttm.c +1 -0
@@ -433,6 +433,7 @@ static int qxl_sync_obj_flush(void *sync_obj)static void qxl_sync_obj_unref (void **sync_obj) { + *sync_obj =NULL ; }static void *qxl_sync_obj_ref (void *sync_obj)
Signature · 1 line
1.9.3
PATCH 55/103 drm/radeon: call drm_edid_to_eld when we update the edid
In reply to Jiri SlabyFrom: Alex Deucher <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit 16086279353cbfecbb3ead474072dced17b97ddc upstream.
This needs to be done to update some of the fields in the connector structure used by the audio code.
Noticed by several users on irc.
--- drivers/gpu/drm/radeon/radeon_display.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/radeon/radeon_display.c +1 -0
@@ -745,6 +745,7 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)if (radeon_connector->edid) {drm_mode_connector_update_edid_property (&radeon_connector->base, radeon_connector->edid); ret =drm_add_edid_modes (&radeon_connector->base, radeon_connector->edid); +drm_edid_to_eld (&radeon_connector->base, radeon_connector->edid);return ret; }drm_mode_connector_update_edid_property (&radeon_connector->base,NULL );
Signature · 1 line
1.9.3
PATCH 56/103 drm/radeon: fix typo in spectre_golden_registers
In reply to Jiri SlabyFrom: Alex Deucher <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit f1553174a207f68a4ec19d436003097e0a4dc405 upstream.
--- drivers/gpu/drm/radeon/cik.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/cik.c +1 -1
@@ -1092,7 +1092,7 @@ static const u32 spectre_golden_registers[] =0x8a14 ,0xf000003f ,0x00000007 ,0x8b24 ,0xffffffff ,0x00ffffff ,0x28350 ,0x3f3f3fff ,0x00000082 , -0x28355 ,0x0000003f ,0x00000000 , +0x28354 ,0x0000003f ,0x00000000 ,0x3e78 ,0x00000001 ,0x00000002 ,0x913c ,0xffff03df ,0x00000004 , 0xc768, 0x00000008, 0x00000008,
Signature · 1 line
1.9.3
PATCH 57/103 drm/i915/tv: fix gen4 composite s-video tv-out
In reply to Jiri SlabyFrom: Jani Nikula <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
commit e1f23f3dd817f53f622e486913ac662add46eeed upstream.
This is *not* bisected, but the likely regression is
commit c35614380d5c956bfda20eab2755b2f5a7d6f1e7
Author: Zhao Yakui <[email protected]> Date: Tue Nov 24 09:48:48 2009 +0800
drm/i915: Don't set up the TV port if it isn't in the BIOS table.
The commit does not check for all TV device types that might be present in the VBT, disabling TV out for the missing ones. Add composite S-video.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73362
--- drivers/gpu/drm/i915/intel_tv.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/intel_tv.c +7 -2
@@ -1530,9 +1530,14 @@ static int tv_is_present_in_vbt(struct drm_device *dev)/* * If the device type is not TV, continue. */ -if (p_child->device_type !=DEVICE_TYPE_INT_TV && - p_child->device_type !=DEVICE_TYPE_TV ) +switch (p_child->device_type) { +case DEVICE_TYPE_INT_TV : +case DEVICE_TYPE_TV : +case DEVICE_TYPE_TV_SVIDEO_COMPOSITE : +break ; +default :continue ; + }/* Only when the addin_offset is non-zero, it is regarded * as present. */
Signature · 1 line
1.9.3
PATCH 58/103 net: sctp: wake up all assocs if sndbuf policy is per socket
In reply to Jiri SlabyFrom: Daniel Borkmann <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 52c35befb69b005c3fc5afdaae3a5717ad013411 ]
SCTP charges chunks for wmem accounting via skb->truesize in sctp_set_owner_w(), and sctp_wfree() respectively as the reverse operation. If a sender runs out of wmem, it needs to wait via sctp_wait_for_sndbuf(), and gets woken up by a call to __sctp_write_space() mostly via sctp_wfree().
__sctp_write_space() is being called per association. Although we assign sk->sk_write_space() to sctp_write_space(), which is then being done per socket, it is only used if send space is increased per socket option (SO_SNDBUF), as SOCK_USE_WRITE_QUEUE is set and therefore not invoked in sock_wfree().
Commit 4c3a5bdae293 ("sctp: Don't charge for data in sndbuf again when transmitting packet") fixed an issue where in case sctp_packet_transmit() manages to queue up more than sndbuf bytes, sctp_wait_for_sndbuf() will never be woken up again unless it is interrupted by a signal. However, a still remaining issue is that if net.sctp.sndbuf_policy=0, that is accounting per socket, and one-to-many sockets are in use, the reclaimed write space from sctp_wfree() is 'unfairly' handed back on the server to the association that is the lucky one to be woken up again via __sctp_write_space(), while the remaining associations are never be woken up again (unless by a signal).
The effect disappears with net.sctp.sndbuf_policy=1, that is wmem accounting per association, as it guarantees a fair share of wmem among associations.
Therefore, if we have reclaimed memory in case of per socket accounting, wake all related associations to a socket in a fair manner, that is, traverse the socket association list starting from the current neighbour of the association and issue a __sctp_write_space() to everyone until we end up waking ourselves. This guarantees that no association is preferred over another and even if more associations are taken into the one-to-many session, all receivers will get messages from the server and are not stalled forever on high load. This setting still leaves the advantage of per socket accounting in touch as an association can still use up global limits if unused by others.
--- net/sctp/socket.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-)
net/sctp/socket.c +35 -1
@@ -6564,6 +6564,40 @@ static void __sctp_write_space(struct sctp_association *asoc) } } +static void sctp_wake_up_waiters (struct sock *sk, +struct sctp_association *asoc) +{ +struct sctp_association *tmp = asoc; + +/* We do accounting for the sndbuf space per association, +* so we only need to wake our own association. +*/ +if (asoc->ep->sndbuf_policy) +return __sctp_write_space (asoc); + +/* Accounting for the sndbuf space is per socket, so we +* need to wake up others, try to be fair and in case of +* other associations, let them have a go first instead +* of just doing a sctp_write_space() call. +* +* Note that we reach sctp_wake_up_waiters() only when +* associations free up queued chunks, thus we are under +* lock and the list of associations on a socket is +* guaranteed not to change. +*/ +for (tmp =list_next_entry (tmp, asocs);1 ; + tmp =list_next_entry (tmp, asocs)) { +/* Manually skip the head element. */ +if (&tmp->asocs == &((sctp_sk (sk))->ep->asocs)) +continue ; +/* Wake up association. */ +__sctp_write_space (tmp); +/* We've reached the end. */ +if (tmp == asoc) +break ; + } +} +/* Do accounting for the sndbuf space. * Decrement the used sndbuf space of the corresponding association by the * data size which was just transmitted(freed).
@@ -6591,7 +6625,7 @@ static void sctp_wfree(struct sk_buff *skb)sk_mem_uncharge (sk, skb->truesize);sock_wfree (skb); -__sctp_write_space (asoc); +sctp_wake_up_waiters (sk, asoc);sctp_association_put (asoc); }
Signature · 1 line
1.9.3
PATCH 59/103 net: sctp: test if association is dead in sctp_wake_up_waiters
In reply to Jiri SlabyFrom: Daniel Borkmann <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 1e1cdf8ac78793e0875465e98a648df64694a8d0 ]
In function sctp_wake_up_waiters(), we need to involve a test if the association is declared dead. If so, we don't have any reference to a possible sibling association anymore and need to invoke sctp_write_space() instead, and normally walk the socket's associations and notify them of new wmem space. The reason for special casing is that otherwise, we could run into the following issue when a sctp_primitive_SEND() call from sctp_sendmsg() fails, and tries to flush an association's outq, i.e. in the following way:
sctp_association_free()
`-> list_del(&asoc->asocs) <-- poisons list pointer
asoc->base.dead = true
sctp_outq_free(&asoc->outqueue)
`-> __sctp_outq_teardown()
`-> sctp_chunk_free()
`-> consume_skb()
`-> sctp_wfree()
`-> sctp_wake_up_waiters() <-- dereferences poisoned pointers
if asoc->ep->sndbuf_policy=0Therefore, only walk the list in an 'optimized' way if we find that the current association is still active. We could also use list_del_init() in addition when we call sctp_association_free(), but as Vlad suggests, we want to trap such bugs and thus leave it poisoned as is.
Why is it safe to resolve the issue by testing for asoc->base.dead? Parallel calls to sctp_sendmsg() are protected under socket lock, that is lock_sock()/release_sock(). Only within that path under lock held, we're setting skb/chunk owner via sctp_set_owner_w(). Eventually, chunks are freed directly by an association still under that lock. So when traversing association list on destruction time from sctp_wake_up_waiters() via sctp_wfree(), a different CPU can't be running sctp_wfree() while another one calls sctp_association_free() as both happens under the same lock. Therefore, this can also not race with setting/testing against asoc->base.dead as we are guaranteed for this to happen in order, under lock. Further, Vlad says: the times we check asoc->base.dead is when we've cached an association pointer for later processing. In between cache and processing, the association may have been freed and is simply still around due to reference counts. We check asoc->base.dead under a lock, so it should always be safe to check and not race against sctp_association_free(). Stress-testing seems fine now, too.
--- net/sctp/socket.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/sctp/socket.c +6 -0
@@ -6575,6 +6575,12 @@ static void sctp_wake_up_waiters(struct sock *sk,if (asoc->ep->sndbuf_policy)return __sctp_write_space (asoc); +/* If association goes down and is just flushing its +* outq, then just normally notify others. +*/ +if (asoc->base.dead) +return sctp_write_space (sk); +/* Accounting for the sndbuf space is per socket, so we * need to wake up others, try to be fair and in case of * other associations, let them have a go first instead
Signature · 1 line
1.9.3
PATCH 60/103 l2tp: take PMTU from tunnel UDP socket
In reply to Jiri SlabyFrom: Dmitry Petukhov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit f34c4a35d87949fbb0e0f31eba3c054e9f8199ba ]
When l2tp driver tries to get PMTU for the tunnel destination, it uses the pointer to struct sock that represents PPPoX socket, while it should use the pointer that represents UDP socket of the tunnel.
--- net/l2tp/l2tp_ppp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/l2tp/l2tp_ppp.c +2 -2
@@ -754,9 +754,9 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, session->deref = pppol2tp_session_sock_put;/* If PMTU discovery was enabled, use the MTU that was discovered */ - dst =sk_dst_get (sk); + dst =sk_dst_get (tunnel->sock);if (dst !=NULL ) { -u32 pmtu =dst_mtu (__sk_dst_get (sk)); +u32 pmtu =dst_mtu (__sk_dst_get (tunnel->sock));if (pmtu !=0 ) session->mtu = session->mru = pmtu -PPPOL2TP_HEADER_OVERHEAD ;
Signature · 1 line
1.9.3
PATCH 61/103 net: core: don't account for udp header size when computing seglen
In reply to Jiri SlabyFrom: Florian Westphal <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 6d39d589bb76ee8a1c6cde6822006ae0053decff ]
In case of tcp, gso_size contains the tcpmss.
For UFO (udp fragmentation offloading) skbs, gso_size is the fragment payload size, i.e. we must not account for udp header size.
Otherwise, when using virtio drivers, a to-be-forwarded UFO GSO packet will be needlessly fragmented in the forward path, because we think its individual segments are too large for the outgoing link.
--- net/core/skbuff.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
net/core/skbuff.c +7 -5
@@ -3535,12 +3535,14 @@ EXPORT_SYMBOL_GPL(skb_scrub_packet);unsigned int skb_gso_transport_seglen (const struct sk_buff *skb) {const struct skb_shared_info *shinfo =skb_shinfo (skb); -unsigned int hdr_len;if (likely (shinfo->gso_type & (SKB_GSO_TCPV4 |SKB_GSO_TCPV6 ))) - hdr_len =tcp_hdrlen (skb); -else - hdr_len =sizeof (struct udphdr ); -return hdr_len + shinfo->gso_size; +return tcp_hdrlen (skb) + shinfo->gso_size; + +/* UFO sets gso_size to the size of the fragmentation +* payload, i.e. the size of the L4 (UDP) header is already +* accounted for. +*/ +return shinfo->gso_size; }EXPORT_SYMBOL_GPL (skb_gso_transport_seglen);
Signature · 1 line
1.9.3
PATCH 62/103 bonding: Remove debug_fs files when module init fails
In reply to Jiri SlabyFrom: Thomas Richter <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit db29868653394937037d71dc3545768302dda643 ]
Remove the bonding debug_fs entries when the module initialization fails. The debug_fs
entries should be removed together with all other already allocated resources.
--- drivers/net/bonding/bond_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/bonding/bond_main.c +1 -0
@@ -4623,6 +4623,7 @@ static int __init bonding_init(void) out:return res; err: +bond_destroy_debugfs ();rtnl_link_unregister (&bond_link_ops); err_link:unregister_pernet_subsys (&bond_net_ops);
Signature · 1 line
1.9.3
PATCH 63/103 bridge: Fix double free and memory leak around br_allowed_ingress
In reply to Jiri SlabyFrom: Toshiaki Makita <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit eb7076182d1ae4bc4641534134ed707100d76acc ]
br_allowed_ingress() has two problems.
1. If br_allowed_ingress() is called by br_handle_frame_finish() and vlan_untag() in br_allowed_ingress() fails, skb will be freed by both vlan_untag() and br_handle_frame_finish().
2. If br_allowed_ingress() is called by br_dev_xmit() and br_allowed_ingress() fails, the skb will not be freed.
Fix these two problems by freeing the skb in br_allowed_ingress() if it fails.
--- net/bridge/br_input.c | 2 +- net/bridge/br_vlan.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-)
net/bridge/br_input.c +1 -1
@@ -72,7 +72,7 @@ int br_handle_frame_finish(struct sk_buff *skb) goto drop;if (!br_allowed_ingress (p->br,nbp_get_vlan_info (p), skb, &vid)) - goto drop; + goto out;/* insert into forwarding database after filtering to avoid spoofing */ br = p->br;
net/bridge/br_vlan.c +4 -3
@@ -201,7 +201,7 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,* rejected. */ if (!v) -return false; + goto drop; err =br_vlan_get_tag (skb, vid);if (!*vid) {
@@ -212,7 +212,7 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,* vlan untagged or priority-tagged traffic belongs to. */ if (pvid ==VLAN_N_VID ) -return false; + goto drop;/* PVID is set on this port. Any untagged or priority-tagged * ingress frame is considered to belong to this vlan.
@@ -235,7 +235,8 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,/* Frame had a valid vlan tag. See if vlan is allowed */ if (test_bit (*vid, v->vlan_bitmap))return true; - +drop: +kfree_skb (skb);return false; }
Signature · 1 line
1.9.3
PATCH 64/103 ipv6: Limit mtu to 65575 bytes
In reply to Jiri SlabyFrom: Eric Dumazet <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 30f78d8ebf7f514801e71b88a10c948275168518 ]
Francois reported that setting big mtu on loopback device could prevent tcp sessions making progress.
We do not support (yet ?) IPv6 Jumbograms and cook corrupted packets.
We must limit the IPv6 MTU to (65535 + 40) bytes in theory.
Tested:
ifconfig lo mtu 70000
netperf -H ::1
Before patch : Throughput : 0.05 Mbits
After patch : Throughput : 35484 Mbits
--- include/net/ip6_route.h | 5 +++++ net/ipv6/route.c | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-)
include/net/ip6_route.h +5 -0
@@ -32,6 +32,11 @@ struct route_info {#define RT6_LOOKUP_F_SRCPREF_PUBLIC 0x00000010#define RT6_LOOKUP_F_SRCPREF_COA 0x00000020 +/* We do not (yet ?) support IPv6 jumbograms (RFC 2675) +* Unlike IPv4, hdr->seg_len doesn't include the IPv6 header +*/ +#define IP6_MAX_MTU (0xFFFF + sizeof(struct ipv6hdr)) +/* * rt6_srcprefs2flags() and rt6_flags2srcprefs() translate * between IPV6_ADDR_PREFERENCES socket option values
net/ipv6/route.c +3 -2
@@ -1329,7 +1329,7 @@ static unsigned int ip6_mtu(const struct dst_entry *dst)unsigned int mtu =dst_metric_raw (dst,RTAX_MTU );if (mtu) -return mtu; + goto out; mtu =IPV6_MIN_MTU ;
@@ -1339,7 +1339,8 @@ static unsigned int ip6_mtu(const struct dst_entry *dst) mtu = idev->cnf.mtu6;rcu_read_unlock (); -return mtu; +out: + return min_t(unsigned int, mtu, IP6_MAX_MTU); }static struct dst_entry *icmp6_dst_gc_list;
Signature · 1 line
1.9.3
PATCH 65/103 gre: don't allow to add the same tunnel twice
In reply to Jiri SlabyFrom: Nicolas Dichtel <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 5a4552752d8f7f4cef1d98775ece7adb7616fde2 ]
Before the patch, it was possible to add two times the same tunnel:
ip l a gre1 type gre remote 10.16.0.121 local 10.16.0.249 ip l a gre2 type gre remote 10.16.0.121 local 10.16.0.249
It was possible, because ip_tunnel_newlink() calls ip_tunnel_find() with the argument dev->type, which was set only later (when calling ndo_init handler in register_netdevice()). Let's set this type in the setup handler, which is called before newlink handler.
Introduced by commit c54419321455 ("GRE: Refactor GRE tunneling code.").
--- net/ipv4/ip_gre.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_gre.c +1 -1
@@ -463,6 +463,7 @@ static const struct net_device_ops ipgre_netdev_ops = {static void ipgre_tunnel_setup (struct net_device *dev) { dev->netdev_ops = &ipgre_netdev_ops; + dev->type =ARPHRD_IPGRE ;ip_tunnel_setup (dev, ipgre_net_id); }
@@ -501,7 +502,6 @@ static int ipgre_tunnel_init(struct net_device *dev)memcpy (dev->dev_addr, &iph->saddr,4 );memcpy (dev->broadcast, &iph->daddr,4 ); - dev->type =ARPHRD_IPGRE ; dev->flags =IFF_NOARP ; dev->priv_flags &= ~IFF_XMIT_DST_RELEASE ; dev->addr_len =4 ;
Signature · 1 line
1.9.3
PATCH 66/103 vti: don't allow to add the same tunnel twice
In reply to Jiri SlabyFrom: Nicolas Dichtel <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 8d89dcdf80d88007647945a753821a06eb6cc5a5 ]
Before the patch, it was possible to add two times the same tunnel:
ip l a vti1 type vti remote 10.16.0.121 local 10.16.0.249 key 41 ip l a vti2 type vti remote 10.16.0.121 local 10.16.0.249 key 41
It was possible, because ip_tunnel_newlink() calls ip_tunnel_find() with the argument dev->type, which was set only later (when calling ndo_init handler in register_netdevice()). Let's set this type in the setup handler, which is called before newlink handler.
Introduced by commit b9959fd3b0fa ("vti: switch to new ip tunnel code").
--- net/ipv4/ip_vti.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/ip_vti.c +1 -1
@@ -271,6 +271,7 @@ static const struct net_device_ops vti_netdev_ops = {static void vti_tunnel_setup (struct net_device *dev) { dev->netdev_ops = &vti_netdev_ops; + dev->type =ARPHRD_TUNNEL ;ip_tunnel_setup (dev, vti_net_id); }
@@ -282,7 +283,6 @@ static int vti_tunnel_init(struct net_device *dev)memcpy (dev->dev_addr, &iph->saddr,4 );memcpy (dev->broadcast, &iph->daddr,4 ); - dev->type =ARPHRD_TUNNEL ; dev->hard_header_len =LL_MAX_HEADER +sizeof (struct iphdr ); dev->mtu =ETH_DATA_LEN ; dev->flags =IFF_NOARP ;
Signature · 1 line
1.9.3
PATCH 67/103 ipv4: return valid RTA_IIF on ip route get
In reply to Jiri SlabyFrom: Julian Anastasov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 91146153da2feab18efab2e13b0945b6bb704ded ]
Extend commit 13378cad02afc2adc6c0e07fca03903c7ada0b37 ("ipv4: Change rt->rt_iif encoding.") from 3.6 to return valid RTA_IIF on 'ip route get ... iif DEVICE' instead of rt_iif 0 which is displayed as 'iif *'.
inet_iif is not appropriate to use because skb_iif is not set. Use the skb->dev->ifindex instead.
--- net/ipv4/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/route.c +1 -1
@@ -2358,7 +2358,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, } } else#endif -if (nla_put_u32 (skb,RTA_IIF , rt->rt_iif)) +if (nla_put_u32 (skb,RTA_IIF , skb->dev->ifindex)) goto nla_put_failure; }
Signature · 1 line
1.9.3
PATCH 68/103 filter: prevent nla extensions to peek beyond the end of the message
In reply to Jiri SlabyFrom: Mathias Krause <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 05ab8f2647e4221cbdb3856dd7d32bd5407316b3 ]
The BPF_S_ANC_NLATTR and BPF_S_ANC_NLATTR_NEST extensions fail to check for a minimal message length before testing the supplied offset to be within the bounds of the message. This allows the subtraction of the nla header to underflow and therefore -- as the data type is unsigned -- allowing far to big offset and length values for the search of the netlink attribute.
The remainder calculation for the BPF_S_ANC_NLATTR_NEST extension is also wrong. It has the minuend and subtrahend mixed up, therefore calculates a huge length value, allowing to overrun the end of the message while looking for the netlink attribute.
The following three BPF snippets will trigger the bugs when attached to a UNIX datagram socket and parsing a message with length 1, 2 or 3.
,-[ PoC for missing size check in BPF_S_ANC_NLATTR ]--
| ld #0x87654321 | ldx #42 | ld #nla | ret a
`---
,-[ PoC for the same bug in BPF_S_ANC_NLATTR_NEST ]--
| ld #0x87654321 | ldx #42 | ld #nlan | ret a
`---
,-[ PoC for wrong remainder calculation in BPF_S_ANC_NLATTR_NEST ]--
| ; (needs a fake netlink header at offset 0) | ld #0 | ldx #42 | ld #nlan | ret a
`---
Fix the first issue by ensuring the message length fulfills the minimal size constrains of a nla header. Fix the second bug by getting the math for the remainder calculation right.
--- net/core/filter.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/core/filter.c +5 -1
@@ -355,6 +355,8 @@ load_b:if (skb_is_nonlinear (skb))return 0 ; +if (skb->len <sizeof (struct nlattr )) +return 0 ;if (A > skb->len -sizeof (struct nlattr ))return 0 ;
@@ -371,11 +373,13 @@ load_b:if (skb_is_nonlinear (skb))return 0 ; +if (skb->len <sizeof (struct nlattr )) +return 0 ;if (A > skb->len -sizeof (struct nlattr ))return 0 ; nla = (struct nlattr *)&skb->data[A ]; -if (nla->nla_len >A - skb->len) +if (nla->nla_len > skb->len -A )return 0 ; nla =nla_find_nested (nla,X );
Signature · 1 line
1.9.3
PATCH 69/103 ip6_gre: don't allow to remove the fb_tunnel_dev
In reply to Jiri SlabyFrom: Nicolas Dichtel <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 54d63f787b652755e66eb4dd8892ee6d3f5197fc ]
It's possible to remove the FB tunnel with the command 'ip link del ip6gre0' but this is unsafe, the module always supposes that this device exists. For example, ip6gre_tunnel_lookup() may use it unconditionally.
Let's add a rtnl handler for dellink, which will never remove the FB tunnel (we let ip6gre_destroy_tunnels() do the job).
Introduced by commit c12b395a4664 ("gre: Support GRE over IPv6").
--- net/ipv6/ip6_gre.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
net/ipv6/ip6_gre.c +10 -0
@@ -1554,6 +1554,15 @@ static int ip6gre_changelink(struct net_device *dev, struct nlattr *tb[],return 0 ; } +static void ip6gre_dellink (struct net_device *dev,struct list_head *head) +{ +struct net *net =dev_net (dev); +struct ip6gre_net *ign =net_generic (net, ip6gre_net_id); + +if (dev != ign->fb_tunnel_dev) +unregister_netdevice_queue (dev, head); +} +static size_t ip6gre_get_size (const struct net_device *dev) {return
@@ -1631,6 +1640,7 @@ static struct rtnl_link_ops ip6gre_link_ops __read_mostly = { .validate = ip6gre_tunnel_validate, .newlink = ip6gre_newlink, .changelink = ip6gre_changelink, + .dellink = ip6gre_dellink, .get_size = ip6gre_get_size, .fill_info = ip6gre_fill_info, };
Signature · 1 line
1.9.3
PATCH 70/103 vlan: Fix lockdep warning when vlan dev handle notification
In reply to Jiri SlabyFrom: dingtianhong <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit dc8eaaa006350d24030502a4521542e74b5cb39f ]
When I open the LOCKDEP config and run these steps:
modprobe 8021q
vconfig add eth2 20
vconfig add eth2.20 30
ifconfig eth2 xx.xx.xx.xx
then the Call Trace happened:
[32524.386288] =============================================
[32524.386293] [ INFO: possible recursive locking detected ]
[32524.386298] 3.14.0-rc2-0.7-default+ #35 Tainted: G O
[32524.386302] ---------------------------------------------
[32524.386306] ifconfig/3103 is trying to acquire lock:
[32524.386310] (&vlan_netdev_addr_lock_key/1){+.....}, at: [<ffffffff814275f4>] dev_mc_sync+0x64/0xb0
[32524.386326]
[32524.386326] but task is already holding lock:
[32524.386330] (&vlan_netdev_addr_lock_key/1){+.....}, at: [<ffffffff8141af83>] dev_set_rx_mode+0x23/0x40
[32524.386341]
[32524.386341] other info that might help us debug this:
[32524.386345] Possible unsafe locking scenario:
[32524.386345]
[32524.386350] CPU0
[32524.386352] ----
[32524.386354] lock(&vlan_netdev_addr_lock_key/1);
[32524.386359] lock(&vlan_netdev_addr_lock_key/1);
[32524.386364]
[32524.386364] *** DEADLOCK ***
[32524.386364]
[32524.386368] May be due to missing lock nesting notation
[32524.386368]
[32524.386373] 2 locks held by ifconfig/3103:
[32524.386376] #0: (rtnl_mutex){+.+.+.}, at: [<ffffffff81431d42>] rtnl_lock+0x12/0x20
[32524.386387] #1: (&vlan_netdev_addr_lock_key/1){+.....}, at: [<ffffffff8141af83>] dev_set_rx_mode+0x23/0x40
[32524.386398]
[32524.386398] stack backtrace:
[32524.386403] CPU: 1 PID: 3103 Comm: ifconfig Tainted: G O 3.14.0-rc2-0.7-default+ #35
[32524.386409] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007
[32524.386414] ffffffff81ffae40 ffff8800d9625ae8 ffffffff814f68a2 ffff8800d9625bc8
[32524.386421] ffffffff810a35fb ffff8800d8a8d9d0 00000000d9625b28 ffff8800d8a8e5d0
[32524.386428] 000003cc00000000 0000000000000002 ffff8800d8a8e5f8 0000000000000000
[32524.386435] Call Trace:
[32524.386441] [<ffffffff814f68a2>] dump_stack+0x6a/0x78
[32524.386448] [<ffffffff810a35fb>] __lock_acquire+0x7ab/0x1940
[32524.386454] [<ffffffff810a323a>] ? __lock_acquire+0x3ea/0x1940
[32524.386459] [<ffffffff810a4874>] lock_acquire+0xe4/0x110
[32524.386464] [<ffffffff814275f4>] ? dev_mc_sync+0x64/0xb0
[32524.386471] [<ffffffff814fc07a>] _raw_spin_lock_nested+0x2a/0x40
[32524.386476] [<ffffffff814275f4>] ? dev_mc_sync+0x64/0xb0
[32524.386481] [<ffffffff814275f4>] dev_mc_sync+0x64/0xb0
[32524.386489] [<ffffffffa0500cab>] vlan_dev_set_rx_mode+0x2b/0x50 [8021q]
[32524.386495] [<ffffffff8141addf>] __dev_set_rx_mode+0x5f/0xb0
[32524.386500] [<ffffffff8141af8b>] dev_set_rx_mode+0x2b/0x40
[32524.386506] [<ffffffff8141b3cf>] __dev_open+0xef/0x150
[32524.386511] [<ffffffff8141b177>] __dev_change_flags+0xa7/0x190
[32524.386516] [<ffffffff8141b292>] dev_change_flags+0x32/0x80
[32524.386524] [<ffffffff8149ca56>] devinet_ioctl+0x7d6/0x830
[32524.386532] [<ffffffff81437b0b>] ? dev_ioctl+0x34b/0x660
[32524.386540] [<ffffffff814a05b0>] inet_ioctl+0x80/0xa0
[32524.386550] [<ffffffff8140199d>] sock_do_ioctl+0x2d/0x60
[32524.386558] [<ffffffff81401a52>] sock_ioctl+0x82/0x2a0
[32524.386568] [<ffffffff811a7123>] do_vfs_ioctl+0x93/0x590
[32524.386578] [<ffffffff811b2705>] ? rcu_read_lock_held+0x45/0x50
[32524.386586] [<ffffffff811b39e5>] ? __fget_light+0x105/0x110
[32524.386594] [<ffffffff811a76b1>] SyS_ioctl+0x91/0xb0
[32524.386604] [<ffffffff815057e2>] system_call_fastpath+0x16/0x1b========================================================================
The reason is that all of the addr_lock_key for vlan dev have the same class, so if we change the status for vlan dev, the vlan dev and its real dev will hold the same class of addr_lock_key together, so the warning happened.
we should distinguish the lock depth for vlan dev and its real dev.
v1->v2: Convert the vlan_netdev_addr_lock_key to an array of eight elements, which
could support to add 8 vlan id on a same vlan dev, I think it is enough for current scene, because a netdev's name is limited to IFNAMSIZ which could not hold 8 vlan id, and the vlan dev would not meet the same class key with its real dev.
The new function vlan_dev_get_lockdep_subkey() will return the subkey and make the vlan dev could get a suitable class key.
v2->v3: According David's suggestion, I use the subclass to distinguish the lock key for vlan dev
and its real dev, but it make no sense, because the difference for subclass in the lock_class_key doesn't mean that the difference class for lock_key, so I use lock_depth to distinguish the different depth for every vlan dev, the same depth of the vlan dev could have the same lock_class_key, I import the MAX_LOCK_DEPTH from the include/linux/sched.h, I think it is enough here, the lockdep should never exceed that value.
v3->v4: Add a huge array of locking keys will waste static kernel memory and is not a appropriate method,
we could use _nested() variants to fix the problem, calculate the depth for every vlan dev, and use the depth as the subclass for addr_lock_key.
--- net/8021q/vlan_dev.c | 46 +++++++++++++++++++++++++++++++++++++++++----- net/core/dev.c | 1 + 2 files changed, 42 insertions(+), 5 deletions(-)
net/8021q/vlan_dev.c +41 -5
@@ -512,10 +512,48 @@ static void vlan_dev_change_rx_flags(struct net_device *dev, int change) } } +static int vlan_calculate_locking_subclass (struct net_device *real_dev) +{ +int subclass =0 ; + +while (is_vlan_dev (real_dev)) { + subclass++; + real_dev =vlan_dev_priv (real_dev)->real_dev; + } + +return subclass; +} + +static void vlan_dev_mc_sync (struct net_device *to,struct net_device *from) +{ +int err =0 , subclass; + + subclass =vlan_calculate_locking_subclass (to); + +spin_lock_nested (&to->addr_list_lock, subclass); + err =__hw_addr_sync (&to->mc, &from->mc, to->addr_len); +if (!err) +__dev_set_rx_mode (to); +spin_unlock (&to->addr_list_lock); +} + +static void vlan_dev_uc_sync (struct net_device *to,struct net_device *from) +{ +int err =0 , subclass; + + subclass =vlan_calculate_locking_subclass (to); + +spin_lock_nested (&to->addr_list_lock, subclass); + err =__hw_addr_sync (&to->uc, &from->uc, to->addr_len); +if (!err) +__dev_set_rx_mode (to); +spin_unlock (&to->addr_list_lock); +} +static void vlan_dev_set_rx_mode (struct net_device *vlan_dev) { -dev_mc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); -dev_uc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); +vlan_dev_mc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); +vlan_dev_uc_sync (vlan_dev_priv (vlan_dev)->real_dev, vlan_dev); }/*
@@ -624,9 +662,7 @@ static int vlan_dev_init(struct net_device *dev)SET_NETDEV_DEVTYPE (dev, &vlan_type); -if (is_vlan_dev (real_dev)) - subclass =1 ; - + subclass =vlan_calculate_locking_subclass (dev);vlan_dev_set_lockdep_class (dev, subclass); vlan_dev_priv(dev)->vlan_pcpu_stats = alloc_percpu(struct vlan_pcpu_stats);
net/core/dev.c +1 -0
@@ -4968,6 +4968,7 @@ void __dev_set_rx_mode(struct net_device *dev)if (ops->ndo_set_rx_mode) ops->ndo_set_rx_mode (dev); } +EXPORT_SYMBOL (__dev_set_rx_mode);void dev_set_rx_mode (struct net_device *dev) {
Signature · 1 line
1.9.3
PATCH 71/103 tg3: update rx_jumbo_pending ring param only when jumbo frames are enabled
In reply to Jiri SlabyFrom: Ivan Vecera <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
The patch fixes a problem with dropped jumbo frames after usage of 'ethtool -G ... rx'.
Scenario:
1. ip link set eth0 up
2. ethtool -G eth0 rx N # <- This zeroes rx-jumbo
3. ip link set mtu 9000 dev eth0
The ethtool command set rx_jumbo_pending to zero so any received jumbo packets are dropped and you need to use 'ethtool -G eth0 rx-jumbo N' to workaround the issue.
The patch changes the logic so rx_jumbo_pending value is changed only if jumbo frames are enabled (MTU > 1500).
--- drivers/net/ethernet/broadcom/tg3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/tg3.c +3 -1
@@ -12197,7 +12197,9 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *eif (tg3_flag (tp,MAX_RXPEND_64 ) && tp->rx_pending >63 ) tp->rx_pending =63 ; - tp->rx_jumbo_pending = ering->rx_jumbo_pending; + +if (tg3_flag (tp,JUMBO_RING_ENABLE )) + tp->rx_jumbo_pending = ering->rx_jumbo_pending;for (i =0 ; i < tp->irq_max; i++) tp->napi[i].tx_pending = ering->tx_pending;
Signature · 1 line
1.9.3
PATCH 72/103 net: sctp: cache auth_enable per endpoint
In reply to Jiri SlabyFrom: Vlad Yasevich <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit b14878ccb7fac0242db82720b784ab62c467c0dc ]
Currently, it is possible to create an SCTP socket, then switch auth_enable via sysctl setting to 1 and crash the system on connect:
Oops[#1]:
CPU: 0 PID: 0 Comm: swapper Not tainted 3.14.1-mipsgit-20140415 #1 task: ffffffff8056ce80 ti: ffffffff8055c000 task.ti: ffffffff8055c000 [...] Call Trace: [<ffffffff8043c4e8>] sctp_auth_asoc_set_default_hmac+0x68/0x80 [<ffffffff8042b300>] sctp_process_init+0x5e0/0x8a4 [<ffffffff8042188c>] sctp_sf_do_5_1B_init+0x234/0x34c [<ffffffff804228c8>] sctp_do_sm+0xb4/0x1e8 [<ffffffff80425a08>] sctp_endpoint_bh_rcv+0x1c4/0x214 [<ffffffff8043af68>] sctp_rcv+0x588/0x630 [<ffffffff8043e8e8>] sctp6_rcv+0x10/0x24 [<ffffffff803acb50>] ip6_input+0x2c0/0x440 [<ffffffff8030fc00>] __netif_receive_skb_core+0x4a8/0x564 [<ffffffff80310650>] process_backlog+0xb4/0x18c [<ffffffff80313cbc>] net_rx_action+0x12c/0x210 [<ffffffff80034254>] __do_softirq+0x17c/0x2ac [<ffffffff800345e0>] irq_exit+0x54/0xb0 [<ffffffff800075a4>] ret_from_irq+0x0/0x4 [<ffffffff800090ec>] rm7k_wait_irqoff+0x24/0x48 [<ffffffff8005e388>] cpu_startup_entry+0xc0/0x148 [<ffffffff805a88b0>] start_kernel+0x37c/0x398 Code: dd0900b8 000330f8 0126302d <dcc60000> 50c0fff1 0047182a a48306a0 03e00008 00000000 ---[ end trace b530b0551467f2fd ]--- Kernel panic - not syncing: Fatal exception in interrupt
What happens while auth_enable=0 in that case is, that ep->auth_hmacs is initialized to NULL in sctp_auth_init_hmacs() when endpoint is being created.
After that point, if an admin switches over to auth_enable=1, the machine can crash due to NULL pointer dereference during reception of an INIT chunk. When we enter sctp_process_init() via sctp_sf_do_5_1B_init() in order to respond to an INIT chunk, the INIT verification succeeds and while we walk and process all INIT params via sctp_process_param() we find that net->sctp.auth_enable is set, therefore do not fall through, but invoke sctp_auth_asoc_set_default_hmac() instead, and thus, dereference what we have set to NULL during endpoint initialization phase.
The fix is to make auth_enable immutable by caching its value during endpoint initialization, so that its original value is being carried along until destruction. The bug seems to originate from the very first days.
Fix in joint work with Daniel Borkmann.
--- include/net/sctp/structs.h | 4 +++- net/sctp/auth.c | 17 ++++++--------- net/sctp/endpointola.c | 3 ++- net/sctp/sm_make_chunk.c | 32 ++++++++++++++------------- net/sctp/sm_statefuns.c | 6 +++--- net/sctp/socket.c | 54 ++++++++++++++++++++++------------------------ net/sctp/sysctl.c | 38 ++++++++++++++++++++++++++++++-- 7 files changed, 93 insertions(+), 61 deletions(-)
include/net/sctp/structs.h +3 -1
@@ -1245,6 +1245,7 @@ struct sctp_endpoint {/* SCTP-AUTH: endpoint shared keys */ struct list_head endpoint_shared_keys;__u16 active_key_id; +__u8 auth_enable; };/* Recover the outter endpoint structure. */
@@ -1273,7 +1274,8 @@ struct sctp_endpoint *sctp_endpoint_is_match(struct sctp_endpoint *,int sctp_has_association (struct net *net,const union sctp_addr *laddr,const union sctp_addr *paddr); -int sctp_verify_init (struct net *net,const struct sctp_association *asoc, +int sctp_verify_init (struct net *net,const struct sctp_endpoint *ep, +const struct sctp_association *asoc,sctp_cid_t ,sctp_init_chunk_t *peer_init,struct sctp_chunk *chunk,struct sctp_chunk **err_chunk); int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk,
net/sctp/auth.c +6 -11
@@ -387,14 +387,13 @@ nomem:*/ int sctp_auth_asoc_init_active_key (struct sctp_association *asoc,gfp_t gfp) { -struct net *net =sock_net (asoc->base.sk);struct sctp_auth_bytes *secret;struct sctp_shared_key *ep_key;/* If we don't support AUTH, or peer is not capable * we don't need to do anything. */ -if (!net->sctp.auth_enable || !asoc->peer.auth_capable) +if (!asoc->ep->auth_enable || !asoc->peer.auth_capable)return 0 ;/* If the key_id is non-zero and we couldn't find an
@@ -441,16 +440,16 @@ struct sctp_shared_key *sctp_auth_get_shkey(*/ int sctp_auth_init_hmacs (struct sctp_endpoint *ep,gfp_t gfp) { -struct net *net =sock_net (ep->base.sk);struct crypto_hash *tfm =NULL ;__u16 id; -/* if the transforms are already allocted, we are done */ -if (!net->sctp.auth_enable) { +/* If AUTH extension is disabled, we are done */ +if (!ep->auth_enable) { ep->auth_hmacs =NULL ;return 0 ; } +/* If the transforms are already allocated, we are done */ if (ep->auth_hmacs)return 0 ;
@@ -671,12 +670,10 @@ static int __sctp_auth_cid(sctp_cid_t chunk, struct sctp_chunks_param *param)/* Check if peer requested that this chunk is authenticated */ int sctp_auth_send_cid (sctp_cid_t chunk,const struct sctp_association *asoc) { -struct net *net;if (!asoc)return 0 ; - net =sock_net (asoc->base.sk); -if (!net->sctp.auth_enable || !asoc->peer.auth_capable) +if (!asoc->ep->auth_enable || !asoc->peer.auth_capable)return 0 ;return __sctp_auth_cid (chunk, asoc->peer.peer_chunks);
@@ -685,12 +682,10 @@ int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc)/* Check if we requested that peer authenticate this chunk. */ int sctp_auth_recv_cid (sctp_cid_t chunk,const struct sctp_association *asoc) { -struct net *net;if (!asoc)return 0 ; - net =sock_net (asoc->base.sk); -if (!net->sctp.auth_enable) +if (!asoc->ep->auth_enable)return 0 ; return __sctp_auth_cid(chunk,
net/sctp/endpointola.c +2 -1
@@ -69,7 +69,8 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,if (!ep->digest)return NULL ; -if (net->sctp.auth_enable) { + ep->auth_enable = net->sctp.auth_enable; +if (ep->auth_enable) {/* Allocate space for HMACS and CHUNKS authentication * variables. There are arrays that we encode directly * into parameters to make the rest of the operations easier.
net/sctp/sm_make_chunk.c +17 -15
@@ -218,6 +218,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, gfp_t gfp, int vparam_len) {struct net *net =sock_net (asoc->base.sk); +struct sctp_endpoint *ep = asoc->ep;sctp_inithdr_t init;union sctp_params addrs;size_t chunksize;
@@ -277,7 +278,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, chunksize += vparam_len;/* Account for AUTH related parameters */ -if (net->sctp.auth_enable) { +if (ep->auth_enable) {/* Add random parameter length*/ chunksize +=sizeof (asoc->c.auth_random);
@@ -362,7 +363,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, }/* Add SCTP-AUTH chunks to the parameter list */ -if (net->sctp.auth_enable) { +if (ep->auth_enable) {sctp_addto_chunk (retval,sizeof (asoc->c.auth_random), asoc->c.auth_random);if (auth_hmacs)
@@ -2023,7 +2024,7 @@ static void sctp_process_ext_param(struct sctp_association *asoc,/* if the peer reports AUTH, assume that he * supports AUTH. */ -if (net->sctp.auth_enable) +if (asoc->ep->auth_enable) asoc->peer.auth_capable =1 ;break ;case SCTP_CID_ASCONF :
@@ -2115,6 +2116,7 @@ static sctp_ierror_t sctp_process_unk_param(const struct sctp_association *asoc,* SCTP_IERROR_NO_ERROR - continue with the chunk */ static sctp_ierror_t sctp_verify_param(struct net *net, + const struct sctp_endpoint *ep, const struct sctp_association *asoc, union sctp_params param, sctp_cid_t cid,
@@ -2165,7 +2167,7 @@ static sctp_ierror_t sctp_verify_param(struct net *net, goto fallthrough;case SCTP_PARAM_RANDOM : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fallthrough;/* SCTP-AUTH: Secion 6.1
@@ -2182,7 +2184,7 @@ static sctp_ierror_t sctp_verify_param(struct net *net,break ;case SCTP_PARAM_CHUNKS : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fallthrough;/* SCTP-AUTH: Section 3.2
@@ -2198,7 +2200,7 @@ static sctp_ierror_t sctp_verify_param(struct net *net,break ;case SCTP_PARAM_HMAC_ALGO : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fallthrough; hmacs = (struct sctp_hmac_algo_param *)param.p;
@@ -2233,10 +2235,9 @@ fallthrough: }/* Verify the INIT packet before we process it. */ -int sctp_verify_init (struct net *net,const struct sctp_association *asoc, -sctp_cid_t cid, -sctp_init_chunk_t *peer_init, -struct sctp_chunk *chunk, +int sctp_verify_init (struct net *net,const struct sctp_endpoint *ep, +const struct sctp_association *asoc,sctp_cid_t cid, +sctp_init_chunk_t *peer_init,struct sctp_chunk *chunk,struct sctp_chunk **errp) {union sctp_params param;
@@ -2277,8 +2278,8 @@ int sctp_verify_init(struct net *net, const struct sctp_association *asoc,/* Verify all the variable length parameters */ sctp_walk_params(param, peer_init, init_hdr.params) { - - result =sctp_verify_param (net, asoc, param, cid, chunk, errp); + result =sctp_verify_param (net, ep, asoc, param, cid, + chunk, errp);switch (result) {case SCTP_IERROR_ABORT :case SCTP_IERROR_NOMEM :
@@ -2510,6 +2511,7 @@ static int sctp_process_param(struct sctp_association *asoc,struct sctp_af *af;union sctp_addr_param *addr_param;struct sctp_transport *t; +struct sctp_endpoint *ep = asoc->ep;/* We maintain all INIT parameters in network byte order all the * time. This allows us to not worry about whether the parameters
@@ -2649,7 +2651,7 @@ do_addr_param: goto fall_through;case SCTP_PARAM_RANDOM : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fall_through;/* Save peer's random parameter */
@@ -2662,7 +2664,7 @@ do_addr_param:break ;case SCTP_PARAM_HMAC_ALGO : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fall_through;/* Save peer's HMAC list */
@@ -2678,7 +2680,7 @@ do_addr_param:break ;case SCTP_PARAM_CHUNKS : -if (!net->sctp.auth_enable) +if (!ep->auth_enable) goto fall_through; asoc->peer.peer_chunks = kmemdup(param.p,
net/sctp/sm_statefuns.c +3 -3
@@ -358,7 +358,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,/* Verify the INIT chunk before processing it. */ err_chunk =NULL ; -if (!sctp_verify_init (net, asoc, chunk->chunk_hdr->type, +if (!sctp_verify_init (net, ep, asoc, chunk->chunk_hdr->type, (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, &err_chunk)) {/* This chunk contains fatal error. It is to be discarded.
@@ -525,7 +525,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(struct net *net,/* Verify the INIT chunk before processing it. */ err_chunk =NULL ; -if (!sctp_verify_init (net, asoc, chunk->chunk_hdr->type, +if (!sctp_verify_init (net, ep, asoc, chunk->chunk_hdr->type, (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, &err_chunk)) {
@@ -1431,7 +1431,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(/* Verify the INIT chunk before processing it. */ err_chunk =NULL ; -if (!sctp_verify_init (net, asoc, chunk->chunk_hdr->type, +if (!sctp_verify_init (net, ep, asoc, chunk->chunk_hdr->type, (sctp_init_chunk_t *)chunk->chunk_hdr, chunk, &err_chunk)) {/* This chunk contains fatal error. It is to be discarded.
net/sctp/socket.c +26 -28
188 lines not on this page · raw message
net/sctp/sysctl.c +36 -2
@@ -59,8 +59,11 @@ extern int sysctl_sctp_wmem[3];static int proc_sctp_do_hmac_alg (struct ctl_table *ctl,int write,void __user *buffer,size_t *lenp, -loff_t *ppos); +static int proc_sctp_do_auth (struct ctl_table *ctl,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos); +static struct ctl_table sctp_table[] = { { .procname ="sctp_mem" ,
@@ -261,7 +264,7 @@ static struct ctl_table sctp_net_table[] = { .data = &init_net.sctp.auth_enable, .maxlen = sizeof(int), .mode = 0644, - .proc_handler = proc_dointvec, + .proc_handler = proc_sctp_do_auth, }, { .procname = "addr_scope_policy",
@@ -342,6 +345,37 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl,return ret; } +static int proc_sctp_do_auth (struct ctl_table *ctl,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos) +{ +struct net *net = current->nsproxy->net_ns; +struct ctl_table tbl; +int new_value, ret; + +memset (&tbl,0 ,sizeof (struct ctl_table )); + tbl.maxlen =sizeof (unsigned int ); + +if (write) + tbl.data = &new_value; +else + tbl.data = &net->sctp.auth_enable; + + ret =proc_dointvec (&tbl, write, buffer, lenp, ppos); + +if (write) { +struct sock *sk = net->sctp.ctl_sock; + + net->sctp.auth_enable = new_value; +/* Update the value in the control socket */ +lock_sock (sk); +sctp_sk (sk)->ep->auth_enable = new_value; +release_sock (sk); + } + +return ret; +} +int sctp_sysctl_net_register (struct net *net) {struct ctl_table *table;
Signature · 1 line
1.9.3
PATCH 73/103 net: Fix ns_capable check in sock_diag_put_filterinfo
In reply to Jiri SlabyFrom: Andrew Lutomirski <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 78541c1dc60b65ecfce5a6a096fc260219d6784e ]
The caller needs capabilities on the namespace being queried, not on their own namespace. This is a security bug, although it likely has only a minor impact.
--- include/linux/sock_diag.h | 2 +- net/core/sock_diag.c | 4 ++-- net/packet/diag.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-)
include/linux/sock_diag.h +1 -1
@@ -23,7 +23,7 @@ int sock_diag_check_cookie(void *sk, __u32 *cookie);void sock_diag_save_cookie (void *sk,__u32 *cookie);int sock_diag_put_meminfo (struct sock *sk,struct sk_buff *skb,int attr); -int sock_diag_put_filterinfo (struct user_namespace *user_ns,struct sock *sk, +int sock_diag_put_filterinfo (struct sock *sk,struct sk_buff *skb,int attrtype);#endif
net/core/sock_diag.c +2 -2
@@ -49,7 +49,7 @@ int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attrtype) }EXPORT_SYMBOL_GPL (sock_diag_put_meminfo); -int sock_diag_put_filterinfo (struct user_namespace *user_ns,struct sock *sk, +int sock_diag_put_filterinfo (struct sock *sk,struct sk_buff *skb,int attrtype) {struct nlattr *attr;
@@ -57,7 +57,7 @@ int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk,unsigned int len;int err =0 ; -if (!ns_capable (user_ns,CAP_NET_ADMIN )) { +if (!ns_capable (sock_net (sk)->user_ns,CAP_NET_ADMIN )) {nla_reserve (skb, attrtype,0 );return 0 ; }
net/packet/diag.c +1 -1
@@ -171,7 +171,7 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, goto out_nlmsg_trim;if ((req->pdiag_show &PACKET_SHOW_FILTER ) && -sock_diag_put_filterinfo (user_ns, sk, skb,PACKET_DIAG_FILTER )) +sock_diag_put_filterinfo (sk, skb,PACKET_DIAG_FILTER )) goto out_nlmsg_trim;return nlmsg_end (skb, nlh);
Signature · 1 line
1.9.3
PATCH 74/103 rtnetlink: Warn when interface's information won't fit in our packet
In reply to Jiri SlabyFrom: David Gibson <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 973462bbde79bb827824c73b59027a0aed5c9ca6 ]
Without IFLA_EXT_MASK specified, the information reported for a single interface in response to RTM_GETLINK is expected to fit within a netlink packet of NLMSG_GOODSIZE.
If it doesn't, however, things will go badly wrong, When listing all interfaces, netlink_dump() will incorrectly treat -EMSGSIZE on the first message in a packet as the end of the listing and omit information for that interface and all subsequent ones. This can cause getifaddrs(3) to enter an infinite loop.
This patch won't fix the problem, but it will WARN_ON() making it easier to track down what's going wrong.
--- net/core/rtnetlink.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
net/core/rtnetlink.c +12 -5
@@ -1070,6 +1070,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)struct hlist_head *head;struct nlattr *tb[IFLA_MAX +1 ];u32 ext_filter_mask =0 ; +int err; s_h = cb->args[0 ]; s_idx = cb->args[1 ];
@@ -1090,11 +1091,17 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)hlist_for_each_entry_rcu (dev, head, index_hlist) {if (idx < s_idx) goto cont; -if (rtnl_fill_ifinfo (skb, dev,RTM_NEWLINK , -NETLINK_CB (cb->skb).portid, - cb->nlh->nlmsg_seq,0 , -NLM_F_MULTI , - ext_filter_mask) <=0 ) + err =rtnl_fill_ifinfo (skb, dev,RTM_NEWLINK , +NETLINK_CB (cb->skb).portid, + cb->nlh->nlmsg_seq,0 , +NLM_F_MULTI , + ext_filter_mask); +/* If we ran out of room on the first message, +* we're in trouble +*/ +WARN_ON ((err == -EMSGSIZE ) && (skb->len ==0 )); + +if (err <=0 ) goto out;nl_dump_check_consistent (cb,nlmsg_hdr (skb));
Signature · 1 line
1.9.3
PATCH 75/103 rtnetlink: Only supply IFLA_VF_PORTS information when RTEXT_FILTER_VF is set
In reply to Jiri SlabyFrom: David Gibson <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit c53864fd60227de025cb79e05493b13f69843971 ]
Since 115c9b81928360d769a76c632bae62d15206a94a (rtnetlink: Fix problem with buffer allocation), RTM_NEWLINK messages only contain the IFLA_VFINFO_LIST attribute if they were solicited by a GETLINK message containing an IFLA_EXT_MASK attribute with the RTEXT_FILTER_VF flag.
That was done because some user programs broke when they received more data than expected - because IFLA_VFINFO_LIST contains information for each VF it can become large if there are many VFs.
However, the IFLA_VF_PORTS attribute, supplied for devices which implement ndo_get_vf_port (currently the 'enic' driver only), has the same problem. It supplies per-VF information and can therefore become large, but it is not currently conditional on the IFLA_EXT_MASK value.
Worse, it interacts badly with the existing EXT_MASK handling. When IFLA_EXT_MASK is not supplied, the buffer for netlink replies is fixed at NLMSG_GOODSIZE. If the information for IFLA_VF_PORTS exceeds this, then rtnl_fill_ifinfo() returns -EMSGSIZE on the first message in a packet. netlink_dump() will misinterpret this as having finished the listing and omit data for this interface and all subsequent ones. That can cause getifaddrs(3) to enter an infinite loop.
This patch addresses the problem by only supplying IFLA_VF_PORTS when IFLA_EXT_MASK is supplied with the RTEXT_FILTER_VF flag set.
--- net/core/rtnetlink.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-)
net/core/rtnetlink.c +10 -6
@@ -714,7 +714,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev,return 0 ; } -static size_t rtnl_port_size (const struct net_device *dev) +static size_t rtnl_port_size (const struct net_device *dev, +u32 ext_filter_mask) {size_t port_size =nla_total_size (4 )/* PORT_VF */ +nla_total_size (PORT_PROFILE_MAX )/* PORT_PROFILE */
@@ -730,7 +731,8 @@ static size_t rtnl_port_size(const struct net_device *dev)size_t port_self_size =nla_total_size (sizeof (struct nlattr )) + port_size; -if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) +if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || + !(ext_filter_mask &RTEXT_FILTER_VF ))return 0 ;if (dev_num_vf (dev->dev.parent)) return port_self_size + vf_ports_size +
@@ -765,7 +767,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, +nla_total_size (ext_filter_mask &RTEXT_FILTER_VF ?4 :0 )/* IFLA_NUM_VF */ +rtnl_vfinfo_size (dev, ext_filter_mask)/* IFLA_VFINFO_LIST */ - +rtnl_port_size (dev)/* IFLA_VF_PORTS + IFLA_PORT_SELF */ + +rtnl_port_size (dev, ext_filter_mask)/* IFLA_VF_PORTS + IFLA_PORT_SELF */ +rtnl_link_get_size (dev)/* IFLA_LINKINFO */ +rtnl_link_get_af_size (dev)/* IFLA_AF_SPEC */ +nla_total_size (MAX_PHYS_PORT_ID_LEN );/* IFLA_PHYS_PORT_ID */
@@ -827,11 +829,13 @@ static int rtnl_port_self_fill(struct sk_buff *skb, struct net_device *dev)return 0 ; } -static int rtnl_port_fill (struct sk_buff *skb,struct net_device *dev) +static int rtnl_port_fill (struct sk_buff *skb,struct net_device *dev, +u32 ext_filter_mask) {int err; -if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) +if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || + !(ext_filter_mask &RTEXT_FILTER_VF ))return 0 ; err =rtnl_port_self_fill (skb, dev);
@@ -1016,7 +1020,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,nla_nest_end (skb, vfinfo); } -if (rtnl_port_fill (skb, dev)) +if (rtnl_port_fill (skb, dev, ext_filter_mask)) goto nla_put_failure;if (dev->rtnl_link_ops) {
Signature · 1 line
1.9.3
PATCH 76/103 ipv6: fib: fix fib dump restart
In reply to Jiri SlabyFrom: Kumar Sundararajan <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 1c2658545816088477e91860c3a645053719cb54 ]
When the ipv6 fib changes during a table dump, the walk is restarted and the number of nodes dumped are skipped. But the existing code doesn't advance to the next node after a node is skipped. This can cause the dump to loop or produce lots of duplicates when the fib is modified during the dump.
This change advances the walk to the next node if the current node is skipped after a restart.
--- net/ipv6/ip6_fib.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/ip6_fib.c +2 -1
@@ -1418,7 +1418,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w)if (w->skip) { w->skip--; -continue ; + goto skip; } err = w->func (w);
@@ -1428,6 +1428,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w) w->count++;continue ; } +skip: w->state =FWS_U ;case FWS_U :if (fn == w->root)
Signature · 1 line
1.9.3
PATCH 77/103 bridge: Handle IFLA_ADDRESS correctly when creating bridge device
In reply to Jiri SlabyFrom: Toshiaki Makita <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 30313a3d5794472c3548d7288e306a5492030370 ]
When bridge device is created with IFLA_ADDRESS, we are not calling br_stp_change_bridge_id(), which leads to incorrect local fdb management and bridge id calculation, and prevents us from receiving frames on the bridge device.
--- net/bridge/br_netlink.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
net/bridge/br_netlink.c +15 -0
@@ -446,6 +446,20 @@ static int br_validate(struct nlattr *tb[], struct nlattr *data[])return 0 ; } +static int br_dev_newlink (struct net *src_net,struct net_device *dev, +struct nlattr *tb[],struct nlattr *data[]) +{ +struct net_bridge *br =netdev_priv (dev); + +if (tb[IFLA_ADDRESS ]) { +spin_lock_bh (&br->lock); +br_stp_change_bridge_id (br,nla_data (tb[IFLA_ADDRESS ])); +spin_unlock_bh (&br->lock); + } + +return register_netdevice (dev); +} +static size_t br_get_link_af_size (const struct net_device *dev) {struct net_port_vlans *pv;
@@ -474,6 +488,7 @@ struct rtnl_link_ops br_link_ops __read_mostly = { .priv_size = sizeof(struct net_bridge), .setup = br_dev_setup, .validate = br_validate, + .newlink = br_dev_newlink, .dellink = br_dev_delete, };
Signature · 1 line
1.9.3
PATCH 78/103 sctp: reset flowi4_oif parameter on route lookup
In reply to Jiri SlabyFrom: Xufeng Zhang <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 85350871317a5adb35519d9dc6fc9e80809d42ad ]
commit 813b3b5db83 (ipv4: Use caller's on-stack flowi as-is in output route lookups.) introduces another regression which is very similar to the problem of commit e6b45241c (ipv4: reset flowi parameters on route connect) wants to fix:
Before we call ip_route_output_key() in sctp_v4_get_dst() to get a dst that matches a bind address as the source address, we have already called this function previously and the flowi parameters have been initialized including flowi4_oif, so when we call this function again, the process in __ip_route_output_key() will be different because of the setting of flowi4_oif, and we'll get a networking device which corresponds to the inputted flowi4_oif as the output device, this is wrong because we'll never hit this place if the previously returned source address of dst match one of the bound addresses.
To reproduce this problem, a vlan setting is enough:
# ifconfig eth0 up # route del default # vconfig add eth0 2 # vconfig add eth0 3 # ifconfig eth0.2 10.0.1.14 netmask 255.255.255.0 # route add default gw 10.0.1.254 dev eth0.2 # ifconfig eth0.3 10.0.0.14 netmask 255.255.255.0 # ip rule add from 10.0.0.14 table 4 # ip route add table 4 default via 10.0.0.254 src 10.0.0.14 dev eth0.3 # sctp_darn -H 10.0.0.14 -P 36422 -h 10.1.4.134 -p 36422 -s -I You'll detect that all the flow are routed to eth0.2(10.0.1.254).
--- net/sctp/protocol.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
net/sctp/protocol.c +6 -1
@@ -492,8 +492,13 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,continue ;if ((laddr->state ==SCTP_ADDR_SRC ) && (AF_INET == laddr->a.sa.sa_family)) { - fl4->saddr = laddr->a.v4.sin_addr.s_addr; fl4->fl4_sport = laddr->a.v4.sin_port; +flowi4_update_output (fl4, + asoc->base.sk->sk_bound_dev_if, +RT_CONN_FLAGS (asoc->base.sk), + daddr->v4.sin_addr.s_addr, + laddr->a.v4.sin_addr.s_addr); + rt =ip_route_output_key (sock_net (sk), fl4);if (!IS_ERR (rt)) { dst = &rt->dst;
Signature · 1 line
1.9.3
PATCH 79/103 net: qmi_wwan: add Sierra Wireless EM7355
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit b85f5deaf052340021d025e120a9858f084a1d79 ]
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -711,6 +711,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ + {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
Signature · 1 line
1.9.3
PATCH 80/103 net: qmi_wwan: add Sierra Wireless MC73xx
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 1c138607a7be64074d7fba68d0d533ec38f9d17b ]
--- drivers/net/usb/qmi_wwan.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/usb/qmi_wwan.c +3 -0
@@ -710,6 +710,9 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ {QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */ + {QMI_FIXED_INTF(0x1199, 0x68c0, 8)}, /* Sierra Wireless MC73xx */ + {QMI_FIXED_INTF(0x1199, 0x68c0, 10)}, /* Sierra Wireless MC73xx */ + {QMI_FIXED_INTF(0x1199, 0x68c0, 11)}, /* Sierra Wireless MC73xx */ {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */
Signature · 1 line
1.9.3
PATCH 81/103 net: qmi_wwan: add Sierra Wireless MC7305/MC7355
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 9214224e43e4264b02686ea8b455f310935607b5 ]
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -715,6 +715,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1199, 0x68c0, 11)}, /* Sierra Wireless MC73xx */ {QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */ {QMI_FIXED_INTF(0x1199, 0x901f, 8)}, /* Sierra Wireless EM7355 */ + {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
Signature · 1 line
1.9.3
PATCH 82/103 net: qmi_wwan: add Olivetti Olicard 500
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit efc0b25c3add97717ece57bf5319792ca98f348e ]
Device interface layout:
0: ff/ff/ff - serial
1: ff/ff/ff - serial AT+PPP
2: 08/06/50 - storage
3: ff/ff/ff - serial
4: ff/ff/ff - QMI/wwan
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -723,6 +723,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ {QMI_FIXED_INTF(0x0b3c, 0xc005, 6)}, /* Olivetti Olicard 200 */ + {QMI_FIXED_INTF(0x0b3c, 0xc00b, 4)}, /* Olivetti Olicard 500 */ {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)}, /* Cinterion PLxx */ {QMI_FIXED_INTF(0x1e2d, 0x0053, 4)}, /* Cinterion PHxx,PXxx */
Signature · 1 line
1.9.3
PATCH 83/103 net: qmi_wwan: add Alcatel L800MA
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 75573660c47a0db7cc931dcf154945610e02130a ]
Device interface layout:
0: ff/ff/ff - serial
1: ff/00/00 - serial AT+PPP
2: ff/ff/ff - QMI/wwan
3: 08/06/50 - storage
--- drivers/net/usb/qmi_wwan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/usb/qmi_wwan.c +1 -0
@@ -718,6 +718,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1199, 0x9041, 8)}, /* Sierra Wireless MC7305/MC7355 */ {QMI_FIXED_INTF(0x1199, 0x9051, 8)}, /* Netgear AirCard 340U */ {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ + {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
Signature · 1 line
1.9.3
PATCH 84/103 net: qmi_wwan: add a number of CMOTech devices
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 41be7d90993b1502d445bfc59e58348c258ce66a ]
A number of older CMOTech modems are based on Qualcomm chips and exporting a QMI/wwan function.
--- drivers/net/usb/qmi_wwan.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/net/usb/qmi_wwan.c +16 -0
@@ -649,6 +649,22 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x05c6, 0x920d, 5)}, {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ + {QMI_FIXED_INTF(0x16d8, 0x6003, 0)}, /* CMOTech 6003 */ + {QMI_FIXED_INTF(0x16d8, 0x6007, 0)}, /* CMOTech CHE-628S */ + {QMI_FIXED_INTF(0x16d8, 0x6008, 0)}, /* CMOTech CMU-301 */ + {QMI_FIXED_INTF(0x16d8, 0x6280, 0)}, /* CMOTech CHU-628 */ + {QMI_FIXED_INTF(0x16d8, 0x7001, 0)}, /* CMOTech CHU-720S */ + {QMI_FIXED_INTF(0x16d8, 0x7002, 0)}, /* CMOTech 7002 */ + {QMI_FIXED_INTF(0x16d8, 0x7003, 4)}, /* CMOTech CHU-629K */ + {QMI_FIXED_INTF(0x16d8, 0x7004, 3)}, /* CMOTech 7004 */ + {QMI_FIXED_INTF(0x16d8, 0x7006, 5)}, /* CMOTech CGU-629 */ + {QMI_FIXED_INTF(0x16d8, 0x700a, 4)}, /* CMOTech CHU-629S */ + {QMI_FIXED_INTF(0x16d8, 0x7211, 0)}, /* CMOTech CHU-720I */ + {QMI_FIXED_INTF(0x16d8, 0x7212, 0)}, /* CMOTech 7212 */ + {QMI_FIXED_INTF(0x16d8, 0x7213, 0)}, /* CMOTech 7213 */ + {QMI_FIXED_INTF(0x16d8, 0x7251, 1)}, /* CMOTech 7251 */ + {QMI_FIXED_INTF(0x16d8, 0x7252, 1)}, /* CMOTech 7252 */ + {QMI_FIXED_INTF(0x16d8, 0x7253, 1)}, /* CMOTech 7253 */ {QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, {QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, {QMI_FIXED_INTF(0x19d2, 0x0017, 3)},
Signature · 1 line
1.9.3
PATCH 85/103 net: qmi_wwan: add a number of Dell devices
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 6f10c5d1b1aeddb63d33070abb8bc5a177beeb1f ]
Dan writes:
"The Dell drivers use the same configuration for PIDs:
81A2: Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card 81A3: Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card 81A4: Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card 81A8: Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card 81A9: Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card
These devices are all clearly Sierra devices, but are also definitely Gobi-based. The A8 might be the MC7700/7710 and A9 is likely a MC7750.
Quoted 1 line
Quoted 1 line
From DellGobi5kSetup.exe from the Dell drivers:
usbif0: serial/firmware loader?
usbif2: nmea
usbif3: modem/ppp
usbif8: net/QMI"
--- drivers/net/usb/qmi_wwan.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/usb/qmi_wwan.c +5 -0
@@ -743,6 +743,11 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x0b3c, 0xc00b, 4)}, /* Olivetti Olicard 500 */ {QMI_FIXED_INTF(0x1e2d, 0x0060, 4)}, /* Cinterion PLxx */ {QMI_FIXED_INTF(0x1e2d, 0x0053, 4)}, /* Cinterion PHxx,PXxx */ + {QMI_FIXED_INTF(0x413c, 0x81a2, 8)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a3, 8)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a4, 8)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a8, 8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ + {QMI_FIXED_INTF(0x413c, 0x81a9, 8)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card *//* 4. Gobi 1000 devices */ {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
Signature · 1 line
1.9.3
PATCH 86/103 slip: fix spinlock variant
In reply to Jiri SlabyFrom: Oliver Hartkopp <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit ddcde142bed44490e338ed1124cb149976d355bb ]
With commit cc9fa74e2a ("slip/slcan: added locking in wakeup function") a formerly missing locking was added to slip.c and slcan.c by Andre Naujoks.
Alexander Stein contributed the fix 367525c8c2 ("can: slcan: Fix spinlock variant") as the kernel lock debugging advised to use spin_lock_bh() instead of just using spin_lock().
This fix has to be applied to the same code section in slip.c for the same reason too.
--- drivers/net/slip/slip.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/slip/slip.c +3 -3
@@ -429,13 +429,13 @@ static void slip_write_wakeup(struct tty_struct *tty)if (!sl || sl->magic !=SLIP_MAGIC || !netif_running (sl->dev))return ; -spin_lock (&sl->lock); +spin_lock_bh (&sl->lock);if (sl->xleft <=0 ) {/* Now serial buffer is almost free & we can start * transmission of another packet */ sl->dev->stats.tx_packets++;clear_bit (TTY_DO_WRITE_WAKEUP , &tty->flags); -spin_unlock (&sl->lock); +spin_unlock_bh (&sl->lock);sl_unlock (sl);return ; }
@@ -443,7 +443,7 @@ static void slip_write_wakeup(struct tty_struct *tty) actual = tty->ops->write (tty, sl->xhead, sl->xleft); sl->xleft -= actual; sl->xhead += actual; -spin_unlock (&sl->lock); +spin_unlock_bh (&sl->lock); }static void sl_tx_timeout (struct net_device *dev)
Signature · 1 line
1.9.3
PATCH 87/103 mactap: Fix checksum errors for non-gso packets in bridge mode
In reply to Jiri SlabyFrom: Vlad Yasevich <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit cbdb04279ccaefcc702c8757757eea8ed76e50cf ]
The following is a problematic configuration:
VM1: virtio-net device connected to macvtap0@eth0
VM2: e1000 device connect to macvtap1@eth0
The problem is is that virtio-net supports checksum offloading and thus sends the packets to the host with CHECKSUM_PARTIAL set. On the other hand, e1000 does not support any acceleration.
For small TCP packets (and this includes the 3-way handshake), e1000 ends up receiving packets that only have a partial checksum set. This causes TCP to fail checksum validation and to drop packets. As a result tcp connections can not be established.
Commit 3e4f8b787370978733ca6cae452720a4f0c296b8
macvtap: Perform GSO on forwarding path.
fixes this issue for large packets wthat will end up undergoing GSO. This commit adds a check for the non-GSO case and attempts to compute the checksum for partially checksummed packets in the non-GSO case.
--- drivers/net/macvtap.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/macvtap.c +9 -0
@@ -315,6 +315,15 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) segs = nskb; } }else { +/* If we receive a partial checksum and the tap side +* doesn't support checksum offload, compute the checksum. +* Note: it doesn't matter which checksum feature to +* check, we either support them all or none. +*/ +if (skb->ip_summed ==CHECKSUM_PARTIAL && + !(features &NETIF_F_ALL_CSUM ) && +skb_checksum_help (skb)) + goto drop;skb_queue_tail (&q->sk.sk_receive_queue, skb); }
Signature · 1 line
1.9.3
PATCH 88/103 Revert "macvlan : fix checksums error when we are in bridge mode"
In reply to Jiri SlabyFrom: Vlad Yasevich <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit f114890cdf84d753f6b41cd0cc44ba51d16313da ]
This reverts commit 12a2856b604476c27d85a5f9a57ae1661fc46019. The commit above doesn't appear to be necessary any more as the checksums appear to be correctly computed/validated.
Additionally the above commit breaks kvm configurations where one VM is using a device that support checksum offload (virtio) and the other VM does not.
In this case, packets leaving virtio device will have CHECKSUM_PARTIAL set. The packets is forwarded to a macvtap that has offload features turned off. Since we use CHECKSUM_UNNECESSARY, the host does does not update the checksum and thus a bad checksum is passed up to the guest.
--- drivers/net/macvlan.c | 3 --- 1 file changed, 3 deletions(-)
drivers/net/macvlan.c +0 -3
@@ -263,11 +263,9 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)const struct macvlan_dev *vlan =netdev_priv (dev);const struct macvlan_port *port = vlan->port;const struct macvlan_dev *dest; -__u8 ip_summed = skb->ip_summed;if (vlan->mode ==MACVLAN_MODE_BRIDGE ) {const struct ethhdr *eth = (void *)skb->data; - skb->ip_summed =CHECKSUM_UNNECESSARY ;/* send to other bridge ports directly */ if (is_multicast_ether_addr (eth->h_dest)) {
@@ -285,7 +283,6 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev) } xmit_world: - skb->ip_summed = ip_summed; skb->dev = vlan->lowerdev;return dev_queue_xmit (skb); }
Signature · 1 line
1.9.3
PATCH 89/103 tcp_cubic: fix the range of delayed_ack
In reply to Jiri SlabyFrom: Liu Yu <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 0cda345d1b2201dd15591b163e3c92bad5191745 ]
commit b9f47a3aaeab (tcp_cubic: limit delayed_ack ratio to prevent divide error) try to prevent divide error, but there is still a little chance that delayed_ack can reach zero. In case the param cnt get negative value, then ratio+cnt would overflow and may happen to be zero. As a result, min(ratio, ACK_RATIO_LIMIT) will calculate to be zero.
In some old kernels, such as 2.6.32, there is a bug that would pass negative param, which then ultimately leads to this divide error.
commit 5b35e1e6e9c (tcp: fix tcp_trim_head() to adjust segment count with skb MSS) fixed the negative param issue. However, it's safe that we fix the range of delayed_ack as well, to make sure we do not hit a divide by zero.
--- net/ipv4/tcp_cubic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_cubic.c +1 -1
@@ -408,7 +408,7 @@ static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us) ratio -= ca->delayed_ack >>ACK_RATIO_SHIFT ; ratio += cnt; - ca->delayed_ack =min (ratio,ACK_RATIO_LIMIT ); + ca->delayed_ack =clamp (ratio,1U ,ACK_RATIO_LIMIT ); }/* Some calls are for duplicates without timetamps */
Signature · 1 line
1.9.3
PATCH 90/103 vsock: Make transport the proto owner
In reply to Jiri SlabyFrom: Andy King <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 2c4a336e0a3e203fab6aa8d8f7bb70a0ad968a6b ]
Right now the core vsock module is the owner of the proto family. This means there's nothing preventing the transport module from unloading if there are open sockets, which results in a panic. Fix that by allowing the transport to be the owner, which will refcount it properly.
Includes version bump to 1.0.1.0-k
Passes checkpatch this time, I swear...
--- include/net/af_vsock.h | 6 +++++- net/vmw_vsock/af_vsock.c | 47 ++++++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 26 deletions(-)
include/net/af_vsock.h +5 -1
@@ -155,7 +155,11 @@ struct vsock_transport {/**** CORE ****/ -int vsock_core_init (const struct vsock_transport *t); +int __vsock_core_init (const struct vsock_transport *t,struct module *owner); +static inline int vsock_core_init (const struct vsock_transport *t) +{ +return __vsock_core_init (t,THIS_MODULE ); +}void vsock_core_exit (void );/**** UTILS ****/
net/vmw_vsock/af_vsock.c +22 -25
72 lines not on this page · raw message
Signature · 1 line
1.9.3
PATCH 91/103 ip_tunnel: Set network header properly for IP_ECN_decapsulate()
In reply to Jiri SlabyFrom: Ying Cai <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit e96f2e7c430014eff52c93cabef1ad4f42ed0db1 ]
In ip_tunnel_rcv(), set skb->network_header to inner IP header before IP_ECN_decapsulate().
Without the fix, IP_ECN_decapsulate() takes outer IP header as inner IP header, possibly causing error messages or packet drops.
Note that this skb_reset_network_header() call was in this spot when the original feature for checking consistency of ECN bits through tunnels was added in eccc1bb8d4b4 ("tunnel: drop packet if ECN present with not-ECT"). It was only removed from this spot in 3d7b46cd20e3 ("ip_tunnel: push generic protocol handling to ip_tunnel module.").
--- net/ipv4/ip_tunnel.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv4/ip_tunnel.c +2 -0
@@ -433,6 +433,8 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, tunnel->i_seqno =ntohl (tpi->seq) +1 ; } +skb_reset_network_header (skb); + err =IP_ECN_decapsulate (iph, skb);if (unlikely (err)) {if (log_ecn_error)
Signature · 1 line
1.9.3
PATCH 92/103 net: ipv4: ip_forward: fix inverted local_df test
In reply to Jiri SlabyFrom: Florian Westphal <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit ca6c5d4ad216d5942ae544bbf02503041bd802aa ]
local_df means 'ignore DF bit if set', so if its set we're allowed to perform ip fragmentation.
This wasn't noticed earlier because the output path also drops such skbs (and emits needed icmp error) and because netfilter ip defrag did not set local_df until couple of days ago.
Only difference is that DF-packets-larger-than MTU now discarded earlier (f.e. we avoid pointless netfilter postrouting trip).
While at it, drop the repeated test ip_exceeds_mtu, checking it once is enough...
--- net/ipv4/ip_forward.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/ip_forward.c +2 -2
@@ -42,12 +42,12 @@static bool ip_may_fragment (const struct sk_buff *skb) {return unlikely ((ip_hdr (skb)->frag_off &htons (IP_DF )) ==0 ) || - !skb->local_df; + skb->local_df; }static bool ip_exceeds_mtu (const struct sk_buff *skb,unsigned int mtu) { -if (skb->len <= mtu || skb->local_df) +if (skb->len <= mtu)return false;if (skb_is_gso (skb) &&skb_gso_network_seglen (skb) <= mtu)
Signature · 1 line
1.9.3
PATCH 93/103 net: ipv6: send pkttoobig immediately if orig frag size > mtu
In reply to Jiri SlabyFrom: Florian Westphal <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 418a31561d594a2b636c1e2fa94ecd9e1245abb1 ]
If conntrack defragments incoming ipv6 frags it stores largest original frag size in ip6cb and sets ->local_df.
We must thus first test the largest original frag size vs. mtu, and not vice versa.
Without this patch PKTTOOBIG is still generated in ip6_fragment() later in the stack, but
1) IPSTATS_MIB_INTOOBIGERRORS won't increment
2) packet did (needlessly) traverse netfilter postrouting hook.
--- net/ipv6/ip6_output.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/ipv6/ip6_output.c +5 -1
@@ -323,12 +323,16 @@ static inline int ip6_forward_finish(struct sk_buff *skb)static bool ip6_pkt_too_big (const struct sk_buff *skb,unsigned int mtu) { -if (skb->len <= mtu || skb->local_df) +if (skb->len <= mtu)return false; +/* ipv6 conntrack defrag sets max_frag_size + local_df */ if (IP6CB (skb)->frag_max_size &&IP6CB (skb)->frag_max_size > mtu)return true; +if (skb->local_df) +return false; +if (skb_is_gso (skb) &&skb_gso_network_seglen (skb) <= mtu)return false;
Signature · 1 line
1.9.3
PATCH 94/103 ipv4: fib_semantics: increment fib_info_cnt after fib_info allocation
In reply to Jiri SlabyFrom: Sergey Popovich <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit aeefa1ecfc799b0ea2c4979617f14cecd5cccbfd ]
Increment fib_info_cnt in fib_create_info() right after successfuly alllocating fib_info structure, overwise fib_metrics allocation failure leads to fib_info_cnt incorrectly decremented in free_fib_info(), called on error path from fib_create_info().
--- net/ipv4/fib_semantics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/fib_semantics.c +1 -1
@@ -819,13 +819,13 @@ struct fib_info *fib_create_info(struct fib_config *cfg) fi =kzalloc (sizeof (*fi)+nhs*sizeof (struct fib_nh ),GFP_KERNEL );if (fi ==NULL ) goto failure; + fib_info_cnt++;if (cfg->fc_mx) { fi->fib_metrics =kzalloc (sizeof (u32) *RTAX_MAX ,GFP_KERNEL );if (!fi->fib_metrics) goto failure; }else fi->fib_metrics = (u32 *) dst_default_metrics; - fib_info_cnt++; fi->fib_net =hold_net (net); fi->fib_protocol = cfg->fc_protocol;
Signature · 1 line
1.9.3
PATCH 95/103 net: cdc_mbim: handle unaccelerated VLAN tagged frames
In reply to Jiri SlabyFrom: Bjørn Mork <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 6b5eeb7f874b689403e52a646e485d0191ab9507 ]
This driver maps 802.1q VLANs to MBIM sessions. The mapping is based on a bogus assumption that all tagged frames will use the acceleration API because we enable NETIF_F_HW_VLAN_CTAG_TX. This fails for e.g. frames tagged in userspace using packet sockets. Such frames will erroneously be considered as untagged and silently dropped based on not being IP.
Fix by falling back to looking into the ethernet header for a tag if no accelerated tag was found.
--- drivers/net/usb/cdc_mbim.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-)
drivers/net/usb/cdc_mbim.c +28 -11
@@ -120,6 +120,16 @@ static void cdc_mbim_unbind(struct usbnet *dev, struct usb_interface *intf)cdc_ncm_unbind (dev, intf); } +/* verify that the ethernet protocol is IPv4 or IPv6 */ +static bool is_ip_proto (__be16 proto) +{ +switch (proto) { +case htons (ETH_P_IP ): +case htons (ETH_P_IPV6 ): +return true; + } +return false; +}static struct sk_buff *cdc_mbim_tx_fixup (struct usbnet *dev,struct sk_buff *skb,gfp_t flags) {
@@ -128,6 +138,7 @@ static struct sk_buff *cdc_mbim_tx_fixup(struct usbnet *dev, struct sk_buff *skbstruct cdc_ncm_ctx *ctx = info->ctx;__le32 sign =cpu_to_le32 (USB_CDC_MBIM_NDP16_IPS_SIGN );u16 tci =0 ; +bool is_ip;u8 *c;if (!ctx)
@@ -137,25 +148,32 @@ static struct sk_buff *cdc_mbim_tx_fixup(struct usbnet *dev, struct sk_buff *skbif (skb->len <=ETH_HLEN ) goto error; +/* Some applications using e.g. packet sockets will +* bypass the VLAN acceleration and create tagged +* ethernet frames directly. We primarily look for +* the accelerated out-of-band tag, but fall back if +* required +*/ +skb_reset_mac_header (skb); +if (vlan_get_tag (skb, &tci) <0 && skb->len >VLAN_ETH_HLEN && +__vlan_get_tag (skb, &tci) ==0 ) { + is_ip =is_ip_proto (vlan_eth_hdr (skb)->h_vlan_encapsulated_proto); +skb_pull (skb,VLAN_ETH_HLEN ); + }else { + is_ip =is_ip_proto (eth_hdr (skb)->h_proto); +skb_pull (skb,ETH_HLEN ); + } +/* mapping VLANs to MBIM sessions: * no tag => IPS session <0> * 1 - 255 => IPS session <vlanid> * 256 - 511 => DSS session <vlanid - 256> * 512 - 4095 => unsupported, drop */ -vlan_get_tag (skb, &tci); -switch (tci &0x0f00 ) {case 0x0000 :/* VLAN ID 0 - 255 */ -/* verify that datagram is IPv4 or IPv6 */ -skb_reset_mac_header (skb); -switch (eth_hdr (skb)->h_proto) { -case htons (ETH_P_IP ): -case htons (ETH_P_IPV6 ): -break ; -default : +if (!is_ip) goto error; - } c = (u8 *)&sign; c[3 ] = tci;break ;
@@ -169,7 +187,6 @@ static struct sk_buff *cdc_mbim_tx_fixup(struct usbnet *dev, struct sk_buff *skb "unsupported tci=0x%04x\n", tci); goto error; } -skb_pull (skb,ETH_HLEN ); }spin_lock_bh (&ctx->mtx);
Signature · 1 line
1.9.3
PATCH 96/103 macvlan: Don't propagate IFF_ALLMULTI changes on down interfaces.
In reply to Jiri SlabyFrom: Peter Christensen <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit bbeb0eadcf9fe74fb2b9b1a6fea82cd538b1e556 ]
Clearing the IFF_ALLMULTI flag on a down interface could cause an allmulti overflow on the underlying interface.
Attempting the set IFF_ALLMULTI on the underlying interface would cause an error and the log message:
"allmulti touches root, set allmulti failed."
--- drivers/net/macvlan.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/macvlan.c +4 -2
@@ -425,8 +425,10 @@ static void macvlan_change_rx_flags(struct net_device *dev, int change)struct macvlan_dev *vlan =netdev_priv (dev);struct net_device *lowerdev = vlan->lowerdev; -if (change &IFF_ALLMULTI ) -dev_set_allmulti (lowerdev, dev->flags &IFF_ALLMULTI ?1 :-1 ); +if (dev->flags &IFF_UP ) { +if (change &IFF_ALLMULTI ) +dev_set_allmulti (lowerdev, dev->flags &IFF_ALLMULTI ?1 :-1 ); + } }static void macvlan_set_mac_lists (struct net_device *dev)
Signature · 1 line
1.9.3
PATCH 97/103 sfc: fix calling of free_irq with already free vector
In reply to Jiri SlabyFrom: Nikolay Aleksandrov <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 1c3639005f48492e5f2d965779efd814e80f8b15 ]
If the sfc driver is in legacy interrupt mode (either explicitly by using interrupt_mode module param or by falling back to it) it will hit a warning at kernel/irq/manage.c because it will try to free an irq which wasn't allocated by it in the first place because the MSI(X) irqs are zero and it'll try to free them unconditionally. So fix it by checking if we're in legacy mode and freeing the appropriate irqs.
--- drivers/net/ethernet/sfc/nic.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/net/ethernet/sfc/nic.c +8 -6
@@ -155,13 +155,15 @@ void efx_nic_fini_interrupt(struct efx_nic *efx) efx->net_dev->rx_cpu_rmap =NULL ;#endif -/* Disable MSI/MSI-X interrupts */ -efx_for_each_channel (channel, efx) -free_irq (channel->irq, &efx->msi_context[channel->channel]); - -/* Disable legacy interrupt */ -if (efx->legacy_irq) +if (EFX_INT_MODE_USE_MSI (efx)) { +/* Disable MSI/MSI-X interrupts */ +efx_for_each_channel (channel, efx) +free_irq (channel->irq, + &efx->msi_context[channel->channel]); + }else { +/* Disable legacy interrupt */ free_irq (efx->legacy_irq, efx); + } }/* Register dump */
Signature · 1 line
1.9.3
PATCH 98/103 ip6_tunnel: fix potential NULL pointer dereference
In reply to Jiri SlabyFrom: Susant Sahani <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit c8965932a2e3b70197ec02c6741c29460279e2a8 ]
The function ip6_tnl_validate assumes that the rtnl attribute IFLA_IPTUN_PROTO always be filled . If this attribute is not filled by the userspace application kernel get crashed with NULL pointer dereference. This patch fixes the potential kernel crash when IFLA_IPTUN_PROTO is missing .
--- net/ipv6/ip6_tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/ip6_tunnel.c +1 -1
@@ -1549,7 +1549,7 @@ static int ip6_tnl_validate(struct nlattr *tb[], struct nlattr *data[]) {u8 proto; -if (!data) +if (!data || !data[IFLA_IPTUN_PROTO ])return 0 ; proto =nla_get_u8 (data[IFLA_IPTUN_PROTO ]);
Signature · 1 line
1.9.3
PATCH 99/103 rtnetlink: wait for unregistering devices in rtnl_link_unregister()
In reply to Jiri SlabyFrom: Cong Wang <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 200b916f3575bdf11609cb447661b8d5957b0bbf ]
From: Cong Wang <[email protected]>
commit 50624c934db18ab90 (net: Delay default_device_exit_batch until no devices are unregistering) introduced rtnl_lock_unregistering() for default_device_exit_batch(). Same race could happen we when rmmod a driver which calls rtnl_link_unregister() as we call dev->destructor without rtnl lock.
For long term, I think we should clean up the mess of netdev_run_todo() and net namespce exit code.
--- include/linux/rtnetlink.h | 5 +++++ net/core/dev.c | 2 +- net/core/net_namespace.c | 2 +- net/core/rtnetlink.c | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 39 insertions(+), 3 deletions(-)
include/linux/rtnetlink.h +5 -0
@@ -4,6 +4,7 @@#include <linux/mutex.h> #include <linux/netdevice.h> +#include <linux/wait.h> #include <uapi/linux/rtnetlink.h> extern int rtnetlink_send (struct sk_buff *skb,struct net *net,u32 pid,u32 group,int echo);
@@ -22,6 +23,10 @@ extern void rtnl_lock(void);extern void rtnl_unlock (void );extern int rtnl_trylock (void );extern int rtnl_is_locked (void ); + +extern wait_queue_head_t netdev_unregistering_wq; +extern struct mutex net_mutex; +#ifdef CONFIG_PROVE_LOCKING extern int lockdep_rtnl_is_held (void );#endif /* #ifdef CONFIG_PROVE_LOCKING */
net/core/dev.c +1 -1
@@ -5247,7 +5247,7 @@ static int dev_new_index(struct net *net)/* Delayed registration/unregisteration */ static LIST_HEAD (net_todo_list); -static DECLARE_WAIT_QUEUE_HEAD (netdev_unregistering_wq); +DECLARE_WAIT_QUEUE_HEAD (netdev_unregistering_wq);static void net_set_todo (struct net_device *dev) {
net/core/net_namespace.c +1 -1
@@ -24,7 +24,7 @@static LIST_HEAD (pernet_list);static struct list_head *first_device = &pernet_list; -static DEFINE_MUTEX (net_mutex); +DEFINE_MUTEX (net_mutex);LIST_HEAD (net_namespace_list);EXPORT_SYMBOL_GPL (net_namespace_list);
net/core/rtnetlink.c +32 -1
@@ -353,15 +353,46 @@ void __rtnl_link_unregister(struct rtnl_link_ops *ops) }EXPORT_SYMBOL_GPL (__rtnl_link_unregister); +/* Return with the rtnl_lock held when there are no network +* devices unregistering in any network namespace. +*/ +static void rtnl_lock_unregistering_all (void ) +{ +struct net *net; +bool unregistering; +DEFINE_WAIT (wait); + +for (;;) { +prepare_to_wait (&netdev_unregistering_wq, &wait, +TASK_UNINTERRUPTIBLE ); + unregistering = false; +rtnl_lock (); +for_each_net (net) { +if (net->dev_unreg_count >0 ) { + unregistering = true; +break ; + } + } +if (!unregistering) +break ; +__rtnl_unlock (); +schedule (); + } +finish_wait (&netdev_unregistering_wq, &wait); +} +/** * rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink. * @ops: struct rtnl_link_ops * to unregister */ void rtnl_link_unregister (struct rtnl_link_ops *ops) { -rtnl_lock (); +/* Close the race with cleanup_net() */ +mutex_lock (&net_mutex); +rtnl_lock_unregistering_all ();__rtnl_link_unregister (ops);rtnl_unlock (); +mutex_unlock (&net_mutex); }EXPORT_SYMBOL_GPL (rtnl_link_unregister);
Signature · 1 line
1.9.3
PATCH 100/103 batman-adv: increase orig refcount when storing ref in gw_node
In reply to Jiri SlabyFrom: Antonio Quartulli <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 377fe0f968b30a1a714fab53a908061914f30e26 ]
A pointer to the orig_node representing a bat-gateway is stored in the gw_node->orig_node member, but the refcount for such orig_node is never increased.
This leads to memory faults when gw_node->orig_node is accessed and the originator has already been freed.
Fix this by increasing the refcount on gw_node creation and decreasing it on gw_node free.
--- net/batman-adv/gateway_client.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/batman-adv/gateway_client.c +9 -2
@@ -38,8 +38,10 @@static void batadv_gw_node_free_ref (struct batadv_gw_node *gw_node) { -if (atomic_dec_and_test (&gw_node->refcount)) +if (atomic_dec_and_test (&gw_node->refcount)) { +batadv_orig_node_free_ref (gw_node->orig_node);kfree_rcu (gw_node, rcu); + } } static struct batadv_gw_node *
@@ -344,9 +346,14 @@ static void batadv_gw_node_add(struct batadv_priv *bat_priv,struct batadv_gw_node *gw_node;int down, up; +if (!atomic_inc_not_zero (&orig_node->refcount)) +return ; + gw_node =kzalloc (sizeof (*gw_node),GFP_ATOMIC ); -if (!gw_node) +if (!gw_node) { +batadv_orig_node_free_ref (orig_node);return ; + }INIT_HLIST_NODE (&gw_node->list); gw_node->orig_node = orig_node;
Signature · 1 line
1.9.3
PATCH 101/103 ip_tunnel: Initialize the fallback device properly
In reply to Jiri SlabyFrom: Steffen Klassert <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit 78ff4be45a4c51d8fb21ad92e4fabb467c6c3eeb ]
We need to initialize the fallback device to have a correct mtu set on this device. Otherwise the mtu is set to null and the device is unusable.
--- net/ipv4/ip_tunnel.c | 1 + 1 file changed, 1 insertion(+)
net/ipv4/ip_tunnel.c +1 -0
@@ -855,6 +855,7 @@ int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id,*/ if (!IS_ERR (itn->fb_tunnel_dev)) { itn->fb_tunnel_dev->features |=NETIF_F_NETNS_LOCAL ; + itn->fb_tunnel_dev->mtu =ip_tunnel_bind_dev (itn->fb_tunnel_dev);ip_tunnel_add (itn,netdev_priv (itn->fb_tunnel_dev)); }rtnl_unlock ();
Signature · 1 line
1.9.3
PATCH 102/103 ipv4: initialise the itag variable in __mkroute_input
In reply to Jiri SlabyFrom: Li RongQing <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit fbdc0ad095c0a299e9abf5d8ac8f58374951149a ]
the value of itag is a random value from stack, and may not be initiated by fib_validate_source, which called fib_combine_itag if CONFIG_IP_ROUTE_CLASSID is not set
This will make the cached dst uncertainty
--- net/ipv4/route.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/route.c +1 -1
@@ -1525,7 +1525,7 @@ static int __mkroute_input(struct sk_buff *skb,struct in_device *out_dev;unsigned int flags =0 ;bool do_cache; -u32 itag; +u32 itag =0 ;/* get a working reference to the output device */ out_dev =__in_dev_get_rcu (FIB_RES_DEV (*res));
Signature · 1 line
1.9.3
PATCH 103/103 net-gro: reset skb->truesize in napi_reuse_skb()
In reply to Jiri SlabyFrom: Eric Dumazet <[email protected]>
3.12-stable review patch. If anyone has any objections, please let me know.
===============
[ Upstream commit e33d0ba8047b049c9262fdb1fcafb93cb52ceceb ]
Recycling skb always had been very tough...
This time it appears GRO layer can accumulate skb->truesize adjustments made by drivers when they attach a fragment to skb.
skb_gro_receive() can only subtract from skb->truesize the used part of a fragment.
I spotted this problem seeing TcpExtPruneCalled and TcpExtTCPRcvCollapsed that were unexpected with a recent kernel, where TCP receive window should be sized properly to accept traffic coming from a driver not overshooting skb->truesize.
--- net/core/dev.c | 1 + 1 file changed, 1 insertion(+)
net/core/dev.c +1 -0
@@ -3959,6 +3959,7 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) skb->vlan_tci =0 ; skb->dev = napi->dev; skb->skb_iif =0 ; + skb->truesize =SKB_TRUESIZE (skb_end_offset (skb)); napi->skb = skb; }
Signature · 1 line
1.9.3
Quoted 8 lines · Jiri Slaby
This is the start of the stable review cycle for the 3.12.21 release. There are 103 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 Mon Jun 2 13:47:39 2014 Anything received after that time might be too late.
Build results:
total: 143 pass: 133 skipped: 7 fail: 3
Qemu tests all passed.
For reference, failing builds are
unicore32:defconfig - still fails for all releases
powerpc:ppc64e_defconfig - fail if built with binutils 2.4; patch pending
powerpc:chroma_defconfig - fail if built with binutils 2.4; patch pending
Results are as expected. Details are available at http://server.roeck-us.net:8010/builders.
Guenter
Quoted 2 lines · Guenter Roeck
Results are as expected. Details are available at
http://server.roeck-us.net:8010/builders.
Quoted 1 line · Shuah Khan
Compiled and booted on my test systems. No dmesg regressions.
Thank you both!
Quoted 2 lines · Marian Marinov
Do you have a repo from which one could pull the review patches directly?
Yes, it is at:
https://git.kernel.org/cgit/linux/kernel/git/jirislaby/linux-stable.git/log/?h=stable-3.12-queue
thanks,
Signature · 2 lines
js suse labs
Quoted 8 lines · Jiri Slaby
This is the start of the stable review cycle for the 3.12.21 release. There are 103 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 Mon Jun 2 13:47:39 2014 Anything received after that time might be too late.
Quoted 7 lines
The whole patch series can be found in one patch at:
http://kernel.org/pub/linux/kernel/people/jirislaby/stable-review/patch-3.12.21-rc1.xzand the diffstat can be found below.
thanks,
js
Compiled and booted on my test systems. No dmesg regressions.
-- Shuah
Signature · 4 lines
Shuah Khan Senior Linux Kernel Developer - Open Source Group Samsung Research America(Silicon Valley) [email protected] | (970) 672-0658