2.6.37.3-stable review
Subsystems (50)
cover 2.6.37.3-stable review
This is the start of the stable review cycle for the 2.6.37.3 release. There are 73 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 us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Tuesday March 8 2011, 00:00:00 UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.37.3-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
Documentation/networking/dns_resolver.txt | 9 ++- Makefile | 2 +- arch/x86/include/asm/acpi.h | 1 + arch/x86/include/asm/smpboot_hooks.h | 2 +- arch/x86/kernel/acpi/boot.c | 14 +++- arch/x86/kernel/early-quirks.c | 16 ++--- block/blk-core.c | 18 ++--- block/blk-flush.c | 8 ++- block/blk-throttle.c | 29 +++++--- block/cfq-iosched.c | 6 +- block/elevator.c | 4 +- block/genhd.c | 2 +- drivers/acpi/debugfs.c | 20 ++++-- drivers/block/floppy.c | 2 +- drivers/block/loop.c | 5 -- drivers/bluetooth/ath3k.c | 5 ++ drivers/bluetooth/btusb.c | 12 ++- drivers/gpu/drm/drm_irq.c | 3 +- drivers/gpu/drm/i915/i915_dma.c | 11 +++ drivers/gpu/drm/radeon/radeon_display.c | 2 +- drivers/md/linear.c | 1 - drivers/md/md.c | 25 +++++++- drivers/md/md.h | 2 + drivers/md/multipath.c | 1 - drivers/md/raid0.c | 1 - drivers/md/raid1.c | 6 +- drivers/md/raid10.c | 7 +- drivers/md/raid5.c | 1 - drivers/mfd/tps6586x.c | 10 ++-- drivers/mfd/ucb1x00-ts.c | 12 +++- drivers/net/e1000e/ich8lan.c | 16 +++-- drivers/net/e1000e/netdev.c | 3 +- drivers/net/e1000e/phy.c | 14 ++++ drivers/net/r8169.c | 6 ++ drivers/net/tg3.c | 8 ++- drivers/net/wireless/ath/ath9k/hif_usb.c | 9 ++- drivers/net/wireless/ath/carl9170/usb.c | 2 + drivers/net/wireless/p54/p54pci.c | 14 +++-- drivers/net/wireless/p54/p54usb.c | 1 + drivers/rtc/rtc-ds3232.c | 14 +++-- drivers/scsi/scsi_lib.c | 2 +- drivers/scsi/scsi_transport_fc.c | 2 +- drivers/staging/brcm80211/sys/wl_mac80211.c | 14 +++- drivers/staging/brcm80211/sys/wlc_mac80211.c | 14 ++++- drivers/staging/brcm80211/sys/wlc_pub.h | 2 + drivers/staging/comedi/drivers/mite.c | 2 - drivers/staging/comedi/drivers/ni_6527.c | 4 + drivers/staging/comedi/drivers/ni_65xx.c | 4 + drivers/staging/comedi/drivers/ni_660x.c | 4 + drivers/staging/comedi/drivers/ni_670x.c | 4 + drivers/staging/comedi/drivers/ni_pcidio.c | 4 + drivers/staging/comedi/drivers/ni_pcimio.c | 4 + drivers/staging/usbip/vhci.h | 6 +- drivers/staging/usbip/vhci_hcd.c | 54 ++++++++++++-- drivers/staging/usbip/vhci_rx.c | 15 +++-- drivers/usb/core/hub.c | 23 +++--- drivers/usb/core/quirks.c | 8 ++ drivers/usb/host/xhci-ring.c | 40 ++++++----- drivers/usb/musb/musb_core.c | 1 + drivers/usb/musb/omap2430.c | 1 + drivers/usb/serial/sierra.c | 3 + drivers/usb/serial/usb_wwan.c | 15 +++-- drivers/usb/serial/visor.c | 12 +++ fs/block_dev.c | 12 ++-- fs/eventpoll.c | 95 ++++++++++++++++++++++++++ fs/ext2/namei.c | 9 +-- fs/fuse/file.c | 52 ++++++++++++-- fs/fuse/fuse_i.h | 6 ++- fs/gfs2/main.c | 9 +-- fs/inode.c | 31 ++++++-- fs/internal.h | 2 +- fs/nilfs2/btnode.c | 5 -- fs/nilfs2/btnode.h | 1 - fs/nilfs2/mdt.c | 4 +- fs/nilfs2/page.h | 1 - fs/nilfs2/segment.c | 3 +- fs/nilfs2/super.c | 2 +- fs/ocfs2/refcounttree.c | 7 ++- fs/ocfs2/super.c | 28 ++++++-- fs/partitions/ldm.c | 5 ++ include/drm/drmP.h | 2 +- include/linux/blkdev.h | 5 +- include/linux/fs.h | 4 +- include/linux/pm.h | 2 + include/linux/pm_wakeup.h | 25 ++++--- include/linux/vmstat.h | 10 ++- kernel/time/tick-broadcast.c | 10 +++ kernel/time/tick-common.c | 6 ++- kernel/time/tick-internal.h | 3 + lib/swiotlb.c | 6 +- mm/memory.c | 2 + mm/page_alloc.c | 5 +- mm/vmscan.c | 19 +++++- mm/vmstat.c | 36 ++-------- net/dccp/input.c | 7 +- net/dns_resolver/dns_key.c | 20 +++++- net/ipv4/devinet.c | 30 ++++++--- net/ipv4/inet_timewait_sock.c | 2 + net/wireless/wext-compat.c | 4 +- sound/pci/hda/patch_conexant.c | 5 ++ sound/pci/hda/patch_via.c | 2 +- sound/soc/imx/eukrea-tlv320.c | 2 +- sound/soc/pxa/e740_wm9705.c | 4 +- sound/soc/pxa/e750_wm9705.c | 4 +- sound/soc/pxa/e800_wm9712.c | 4 +- sound/soc/pxa/em-x270.c | 4 +- sound/soc/pxa/mioa701_wm9713.c | 4 +- sound/soc/pxa/palm27x.c | 4 +- sound/soc/pxa/tosa.c | 4 +- sound/soc/pxa/zylonite.c | 4 +- sound/usb/card.c | 4 + sound/usb/pcm.c | 7 ++- sound/usb/usbaudio.h | 1 + 113 files changed, 763 insertions(+), 322 deletions(-)
PATCH 1/73 usb: musb: omap2430: fix kernel panic on reboot
2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Johan Hovold <[email protected]>
commit b193b412e62b134adf69af286c7e7f8e99259350 upstream.
Cancel idle timer in musb_platform_exit.
The idle timer could trigger after clock had been disabled leading to kernel panic when MUSB_DEVCTL is accessed in musb_do_idle on 2.6.37.
The fault below is no longer triggered on 2.6.38-rc4 (clock is disabled later, and only if compiled as a module, and the offending memory access has moved) but the timer should be cancelled nonetheless.
Rebooting... musb_hdrc musb_hdrc: remove, state 4
usb usb1: USB disconnect, address 1musb_hdrc musb_hdrc: USB bus 1 deregistered
Unhandled fault: external abort on non-linefetch (0x1028) at 0xfa0ab060
Internal error: : 1028 [#1] PREEMPT last sysfs file: /sys/kernel/uevent_seqnum Modules linked in: CPU: 0 Not tainted (2.6.37+ #6) PC is at musb_do_idle+0x24/0x138 LR is at musb_do_idle+0x18/0x138 pc : [<c02377d8>] lr : [<c02377cc>] psr: 80000193
sp : cf2bdd80 ip : cf2bdd80 fp : c048a20c
r10: c048a60c r9 : c048a40c r8 : cf85e110
r7 : cf2bc000 r6 : 40000113 r5 : c0489800 r4 : cf85e110 r3 : 00000004 r2 : 00000006 r1 : fa0ab000 r0 : cf8a7000
Flags: Nzcv IRQs off FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c5387d Table: 8faac019 DAC: 00000015 Process reboot (pid: 769, stack limit = 0xcf2bc2f0)
Stack: (0xcf2bdd80 to 0xcf2be000)
dd80: 00000103 c0489800 c02377b4 c005fa34 00000555 c0071a8c c04a3858 cf2bdda8
dda0: 00000555 c048a00c cf2bdda8 cf2bdda8 1838beb0 00000103 00000004 cf2bc000
ddc0: 00000001 00000001 c04896c8 0000000a 00000000 c005ac14 00000001 c003f32c
dde0: 00000000 00000025 00000000 cf2bc000 00000002 00000001 cf2bc000 00000000
de00: 00000001 c005ad08 cf2bc000 c002e07c c03ec039 ffffffff fa200000 c0033608
de20: 00000001 00000000 cf852c14 cf81f200 c045b714 c045b708 cf2bc000 c04a37e8
de40: c0033c04 cf2bc000 00000000 00000001 cf2bde68 cf2bde68 c01c3abc c004f7d8
de60: 60000013 ffffffff c0033c04 00000000 01234567 fee1dead 00000000 c006627c
de80: 00000001 c00662c8 28121969 c00663ec cfa38c40 cf9f6a00 cf2bded0 cf9f6a0c
dea0: 00000000 cf92f000 00008914 c02cd284 c04a55c8 c028b398 c00715c0 becf24a8
dec0: 30687465 00000000 00000000 00000000 00000002 1301a8c0 00000000 00000000
dee0: 00000002 1301a8c0 00000000 00000000 c0450494 cf527920 00011f10 cf2bdf08
df00: 00011f10 cf2bdf10 00011f10 cf2bdf18 c00f0b44 c004f7e8 cf2bdf18 cf2bdf18
df20: 00011f10 cf2bdf30 00011f10 cf2bdf38 cf401300 cf486100 00000008 c00d2b28
df40: 00011f10 cf401300 00200200 c00d3388 00011f10 cfb63a88 cfb63a80 c00c2f08
df60: 00000000 00000000 cfb63a80 00000000 cf0a3480 00000006 c0033c04 cfb63a80
df80: 00000000 c00c0104 00000003 cf0a3480 cfb63a80 00000000 00000001 00000004
dfa0: 00000058 c0033a80 00000000 00000001 fee1dead 28121969 01234567 00000000
dfc0: 00000000 00000001 00000004 00000058 00000001 00000001 00000000 00000001
dfe0: 4024d200 becf2cb0 00009210 4024d218 60000010 fee1dead 00000000 00000000 [<c02377d8>] (musb_do_idle+0x24/0x138) from [<c005fa34>] (run_timer_softirq+0x1a8/0x26) [<c005fa34>] (run_timer_softirq+0x1a8/0x26c) from [<c005ac14>] (__do_softirq+0x88/0x13) [<c005ac14>] (__do_softirq+0x88/0x138) from [<c005ad08>] (irq_exit+0x44/0x98) [<c005ad08>] (irq_exit+0x44/0x98) from [<c002e07c>] (asm_do_IRQ+0x7c/0xa0) [<c002e07c>] (asm_do_IRQ+0x7c/0xa0) from [<c0033608>] (__irq_svc+0x48/0xa8)
Exception stack(0xcf2bde20 to 0xcf2bde68)
de20: 00000001 00000000 cf852c14 cf81f200 c045b714 c045b708 cf2bc000 c04a37e8
de40: c0033c04 cf2bc000 00000000 00000001 cf2bde68 cf2bde68 c01c3abc c004f7d8
de60: 60000013 ffffffff
[<c0033608>] (__irq_svc+0x48/0xa8) from [<c004f7d8>] (sub_preempt_count+0x0/0xb8)
Code: ebf86030 e5940098 e594108c e5902010 (e5d13060) ---[ end trace 3689c0d808f9bf7c ]--- Kernel panic - not syncing: Fatal exception in interrupt
--- drivers/usb/musb/omap2430.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/musb/omap2430.c +1 -0
@@ -317,6 +317,7 @@ static int musb_platform_resume(struct mint musb_platform_exit (struct musb *musb) { +del_timer_sync (&musb_idle_timer);musb_platform_suspend (musb);
PATCH 2/73 USB: add quirks entry for Keytouch QWERTY Panel
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <[email protected]>
commit 3c18e30f87ac5466bddbb05cf955605efd7db025 upstream.
This patch (as1448) adds a quirks entry for the Keytouch QWERTY Panel firmware, used in the IEC 60945 keyboard. This device crashes during enumeration when the computer asks for its configuration string descriptor.
--- drivers/usb/core/quirks.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/core/quirks.c +4 -0
@@ -68,6 +68,10 @@ static const struct usb_device_id usb_qu/* M-Systems Flash Disk Pioneers */ { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, + /* Keytouch QWERTY Panel keyboard */ + { USB_DEVICE(0x0926, 0x3333), .driver_info = + USB_QUIRK_CONFIG_INTF_STRINGS }, + /* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */ { USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF },
PATCH 3/73 USB: Add Samsung SGH-I500/Android modem ID switch to visor driver
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Maciej Szmigiero <[email protected]>
commit acb52cb1613e1d3c8a8c650717cc51965c60d7d4 upstream.
[USB]Add Samsung SGH-I500/Android modem ID switch to visor driver
Samsung decided to reuse USB ID of its old CDMA phone SGH-I500 for the modem part of some of their Android phones. At least Galaxy Spica is affected.
This modem needs ACM driver and does not work with visor driver which binds the conflicting ID for SGH-I500.
Because SGH-I500 is pretty an old hardware its best to add switch to visor
driver in cause somebody still wants to use that phone with Linux.
Note that this is needed only when using the Android phone as modem, not in USB storage or ADB mode.
--- drivers/usb/serial/visor.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/usb/serial/visor.c +12 -0
@@ -27,6 +27,7 @@#include <linux/uaccess.h> #include <linux/usb.h> #include <linux/usb/serial.h> +#include <linux/usb/cdc.h> #include "visor.h" /*
@@ -479,6 +480,17 @@ static int visor_probe(struct usb_serialdbg ("%s" , __func__); +/* +* some Samsung Android phones in modem mode have the same ID +* as SPH-I500, but they are ACM devices, so dont bind to them +*/ +if (id->idVendor ==SAMSUNG_VENDOR_ID && + id->idProduct ==SAMSUNG_SPH_I500_ID && + serial->dev->descriptor.bDeviceClass ==USB_CLASS_COMM && + serial->dev->descriptor.bDeviceSubClass == +USB_CDC_SUBCLASS_ACM ) +return -ENODEV ; +if (serial->dev->actconfig->desc.bConfigurationValue !=1 ) {dev_err (&serial->dev->dev,"active config #%d != 1 ??\n" , serial->dev->actconfig->desc.bConfigurationValue);
PATCH 4/73 USB: Add quirk for Samsung Android phone modem
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Maciej Szmigiero <[email protected]>
commit 72a012ce0a02c6c616676a24b40ff81d1aaeafda upstream.
My Galaxy Spica needs this quirk when in modem mode, otherwise it causes endless USB bus resets and is unusable in this mode.
Unfortunately Samsung decided to reuse ID of its old CDMA phone SGH-I500 for the modem part.
That's why in addition to this patch the visor driver must be prevented from binding to SPH-I500 ID, so ACM driver can do that.
--- drivers/usb/core/quirks.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/core/quirks.c +4 -0
@@ -48,6 +48,10 @@ static const struct usb_device_id usb_qu { USB_DEVICE(0x04b4, 0x0526), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS }, + /* Samsung Android phone modem - ID conflict with SPH-I500 */ + { USB_DEVICE(0x04e8, 0x6601), .driver_info = + USB_QUIRK_CONFIG_INTF_STRINGS }, + /* Roland SC-8820 */ { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME },
PATCH 5/73 USB: serial/usb_wwan, fix tty NULL dereference
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jiri Slaby <[email protected]>
commit 38237fd2be9421c104f84cc35665097bdce89013 upstream.
tty_port_tty_get may return without any problems NULL. Handle this case and do not oops in usb_wwan_indat_callback by dereferencing it.
The oops:
Unable to handle kernel paging request for data at address 0x000000d8 Faulting instruction address: 0xc0175b3c Oops: Kernel access of bad area, sig: 11 [#1] PowerPC 40x Platform last sysfs file: /sys/devices/pci0000:00/0000:00:00.0/0000:01:00.0/0000:02:09.2/usb1/idVendor Modules linked in: NIP: c0175b3c LR: c0175e7c CTR: c0215c90 REGS: c77f7d50 TRAP: 0300 Not tainted (2.6.37-rc5) MSR: 00021030 <ME,CE,IR,DR> CR: 88482028 XER: 2000005f DEAR: 000000d8, ESR: 00000000
TASK = c7141b90[1149] 'wvdial' THREAD: c2750000
GPR00: 00021030 c77f7e00 c7141b90 00000000 0000000e 00000000 0000000e c0410680
GPR08: c683db00 00000000 00000001 c03c81f8 88482028 10073ef4 ffffffb9 ffffff94
GPR16: 00000000 fde036c0 00200200 00100100 00000001 ffffff8d c34fabcc 00000000
GPR24: c71120d4 00000000 00000000 0000000e 00021030 00000000 00000000 0000000e NIP [c0175b3c] tty_buffer_request_room+0x2c/0x194
LR [c0175e7c] tty_insert_flip_string_fixed_flag+0x3c/0xb0
Call Trace:
[c77f7e00] [00000003] 0x3 (unreliable)
[c77f7e30] [c0175e7c] tty_insert_flip_string_fixed_flag+0x3c/0xb0 [c77f7e60] [c0215df4] usb_wwan_indat_callback+0x164/0x170
...
References: https://bugzilla.kernel.org/show_bug.cgi?id=24582
--- drivers/usb/serial/usb_wwan.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/usb/serial/usb_wwan.c +9 -6
@@ -216,12 +216,15 @@ static void usb_wwan_indat_callback(stru __func__, status, endpoint); }else { tty =tty_port_tty_get (&port->port); -if (urb->actual_length) { -tty_insert_flip_string (tty, data, urb->actual_length); -tty_flip_buffer_push (tty); - }else -dbg ("%s: empty read urb received" , __func__); -tty_kref_put (tty); +if (tty) { +if (urb->actual_length) { +tty_insert_flip_string (tty, data, + urb->actual_length); +tty_flip_buffer_push (tty); + }else +dbg ("%s: empty read urb received" , __func__); +tty_kref_put (tty); + }/* Resubmit urb so we continue receiving */ if (status != -ESHUTDOWN ) {
PATCH 6/73 sierra: add new ID for Airprime/Sierra USB IP modem
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jon Thomas <[email protected]>
commit e1dc5157c574e7249dc1cd072fde2e48b3011533 upstream.
I picked up a new Sierra usb 308 (At&t Shockwave) on 2/2011 and the vendor code is 0x0f3d
Looking up vendor and product id's I see:
0f3d Airprime, Incorporated
0112 CDMA 1xEVDO PC Card, PC 5220
Sierra and Airprime are somehow related and I'm guessing the At&t usb 308 might be have some common hardware with the AirPrime SL809x.
--- drivers/usb/serial/sierra.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/serial/sierra.c +3 -0
@@ -301,6 +301,9 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless Direct IP modems */ .driver_info = (kernel_ulong_t)&direct_ip_interface_blacklist }, + { 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 */ { }
PATCH 7/73 Revert "Bluetooth: Enable USB autosuspend by default on btusb"
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Linus Torvalds <[email protected]>
commit 78794b2cdeac37ac1fd950fc9c4454b56d88ac03 upstream.
This reverts commit 556ea928f78a390fe16ae584e6433dff304d3014.
Jeff Chua reports that it can cause some bluetooth devices (he mentions an Bluetooth Intermec scanner) to just stop responding after a while with messages like
[ 4533.361959] btusb 8-1:1.0: no reset_resume for driver btusb? [ 4533.361964] btusb 8-1:1.1: no reset_resume for driver btusb?
from the kernel. See also
https://bugzilla.kernel.org/show_bug.cgi?id=26182
for other reports.
--- drivers/bluetooth/btusb.c | 2 -- 1 file changed, 2 deletions(-)
drivers/bluetooth/btusb.c +0 -2
@@ -1038,8 +1038,6 @@ static int btusb_probe(struct usb_interfusb_set_intfdata (intf, data); -usb_enable_autosuspend (interface_to_usbdev (intf)); -return 0 ; }
PATCH 8/73 p54pci: update receive dma buffers before and after processing
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Christian Lamparter <[email protected]>
commit 0bf719dfdecc5552155cbec78e49fa06e531e35c upstream.
Documentation/DMA-API-HOWTO.txt states:
"DMA transfers need to be synced properly in order for the cpu and device to see the most uptodate and correct copy of the DMA buffer."
--- drivers/net/wireless/p54/p54pci.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/net/wireless/p54/p54pci.c +9 -5
@@ -199,6 +199,7 @@ static void p54p_check_rx_ring(struct iewhile (i != idx) {u16 len;struct sk_buff *skb; +dma_addr_t dma_addr; desc = &ring[i]; len =le16_to_cpu (desc->len); skb = rx_buf[i];
@@ -216,17 +217,20 @@ static void p54p_check_rx_ring(struct ie len = priv->common.rx_mtu; } + dma_addr =le32_to_cpu (desc->host_addr); +pci_dma_sync_single_for_cpu (priv->pdev, dma_addr, + priv->common.rx_mtu +32 ,PCI_DMA_FROMDEVICE );skb_put (skb, len);if (p54_rx (dev, skb)) { -pci_unmap_single (priv->pdev, -le32_to_cpu (desc->host_addr), - priv->common.rx_mtu +32 , -PCI_DMA_FROMDEVICE ); +pci_unmap_single (priv->pdev, dma_addr, + priv->common.rx_mtu +32 ,PCI_DMA_FROMDEVICE ); rx_buf[i] =NULL ; - desc->host_addr =0 ; + desc->host_addr =cpu_to_le32 (0 ); }else {skb_trim (skb,0 ); +pci_dma_sync_single_for_device (priv->pdev, dma_addr, + priv->common.rx_mtu +32 ,PCI_DMA_FROMDEVICE ); desc->len =cpu_to_le16 (priv->common.rx_mtu +32 ); }
PATCH 9/73 Revert "drm/radeon/kms: switch back to min->max pll post divider iteration"
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alex Deucher <[email protected]>
commit bd6a60afeb4c9ada3ff27f1d13db1a2b5c11d8c0 upstream.
This reverts commit a6f9761743bf35b052180f4a8bdae4d2cc0465f6.
Remove this commit as it is no longer necessary. The relevant bugs were fixed properly in:
drm/radeon/kms: hopefully fix pll issues for real (v3) 5b40ddf888398ce4cccbf3b9d0a18d90149ed7ff drm/radeon/kms: add missing frac fb div flag for dce4+ 9f4283f49f0a96a64c5a45fe56f0f8c942885eef
This commit also broke certain ~5 Mhz modes on old arcade monitors, so reverting this commit fixes:
https://bugzilla.kernel.org/show_bug.cgi?id=29502
--- drivers/gpu/drm/radeon/radeon_display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/radeon/radeon_display.c +1 -1
@@ -639,7 +639,7 @@ void radeon_compute_pll_legacy(struct ra max_fractional_feed_div = pll->max_frac_feedback_div; } -for (post_div = min_post_div; post_div <= max_post_div; ++post_div) { +for (post_div = max_post_div; post_div >= min_post_div; --post_div) {uint32_t ref_div;if ((pll->flags &RADEON_PLL_NO_ODD_POST_DIV ) && (post_div &1 ))
PATCH 10/73 tcp: fix inet_twsk_deschedule()
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Eric Dumazet <[email protected]>
commit 91035f0b7d89291af728b6f3e370c3be58fcbe1b upstream.
Eric W. Biederman reported a lockdep splat in inet_twsk_deschedule()
This is caused by inet_twsk_purge(), run from process context, and commit 575f4cd5a5b6394577 (net: Use rcu lookups in inet_twsk_purge.) removed the BH disabling that was necessary.
Add the BH disabling but fine grained, right before calling inet_twsk_deschedule(), instead of whole function.
With help from Linus Torvalds and Eric W. Biederman
--- net/ipv4/inet_timewait_sock.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv4/inet_timewait_sock.c +2 -0
@@ -505,7 +505,9 @@ restart: }rcu_read_unlock (); +local_bh_disable ();inet_twsk_deschedule (tw, twdr); +local_bh_enable ();inet_twsk_put (tw); goto restart_rcu; }
PATCH 11/73 mm: prevent concurrent unmap_mapping_range() on the same inode
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Miklos Szeredi <[email protected]>
commit 2aa15890f3c191326678f1bd68af61ec6b8753ec upstream.
Michael Leun reported that running parallel opens on a fuse filesystem can trigger a "kernel BUG at mm/truncate.c:475"
Gurudas Pai reported the same bug on NFS.
The reason is, unmap_mapping_range() is not prepared for more than one concurrent invocation per inode. For example:
thread1: going through a big range, stops in the middle of a vma and
stores the restart address in vm_truncate_count.
thread2: comes in with a small (e.g. single page) unmap request on
the same vma, somewhere before restart_address, finds that the vma was already unmapped up to the restart address and happily returns without doing anything.
Another scenario would be two big unmap requests, both having to restart the unmapping and each one setting vm_truncate_count to its own value. This could go on forever without any of them being able to finish.
Truncate and hole punching already serialize with i_mutex. Other callers of unmap_mapping_range() do not, and it's difficult to get i_mutex protection for all callers. In particular ->d_revalidate(), which calls invalidate_inode_pages2_range() in fuse, may be called with or without i_mutex.
This patch adds a new mutex to 'struct address_space' to prevent running multiple concurrent unmap_mapping_range() on the same mapping.
[ We'll hopefully get rid of all this with the upcoming mm
preemptibility series by Peter Zijlstra, the "mm: Remove i_mmap_mutex lockbreak" patch in particular. But that is for 2.6.39 ]
--- fs/gfs2/main.c | 9 +-------- fs/inode.c | 22 +++++++++++++++------- fs/nilfs2/btnode.c | 5 ----- fs/nilfs2/btnode.h | 1 - fs/nilfs2/mdt.c | 4 ++-- fs/nilfs2/page.h | 1 - fs/nilfs2/super.c | 2 +- include/linux/fs.h | 2 ++ mm/memory.c | 2 ++ 9 files changed, 23 insertions(+), 25 deletions(-)
fs/gfs2/main.c +1 -8
@@ -59,14 +59,7 @@ static void gfs2_init_gl_aspace_once(voistruct address_space *mapping = (struct address_space *)(gl +1 );gfs2_init_glock_once (gl); -memset (mapping,0 ,sizeof (*mapping)); -INIT_RADIX_TREE (&mapping->page_tree,GFP_ATOMIC ); -spin_lock_init (&mapping->tree_lock); -spin_lock_init (&mapping->i_mmap_lock); -INIT_LIST_HEAD (&mapping->private_list); -spin_lock_init (&mapping->private_lock); -INIT_RAW_PRIO_TREE_ROOT (&mapping->i_mmap); -INIT_LIST_HEAD (&mapping->i_mmap_nonlinear); +address_space_init_once (mapping); }/**
fs/inode.c +15 -7
@@ -280,6 +280,20 @@ static void destroy_inode(struct inode *kmem_cache_free (inode_cachep, (inode)); } +void address_space_init_once (struct address_space *mapping) +{ +memset (mapping,0 ,sizeof (*mapping)); +INIT_RADIX_TREE (&mapping->page_tree,GFP_ATOMIC ); +spin_lock_init (&mapping->tree_lock); +spin_lock_init (&mapping->i_mmap_lock); +INIT_LIST_HEAD (&mapping->private_list); +spin_lock_init (&mapping->private_lock); +INIT_RAW_PRIO_TREE_ROOT (&mapping->i_mmap); +INIT_LIST_HEAD (&mapping->i_mmap_nonlinear); +mutex_init (&mapping->unmap_mutex); +} +EXPORT_SYMBOL (address_space_init_once); +/* * These are initializations that only need to be done * once, because the fields are idempotent across use
@@ -293,13 +307,7 @@ void inode_init_once(struct inode *inodeINIT_LIST_HEAD (&inode->i_devices);INIT_LIST_HEAD (&inode->i_wb_list);INIT_LIST_HEAD (&inode->i_lru); -INIT_RADIX_TREE (&inode->i_data.page_tree,GFP_ATOMIC ); -spin_lock_init (&inode->i_data.tree_lock); -spin_lock_init (&inode->i_data.i_mmap_lock); -INIT_LIST_HEAD (&inode->i_data.private_list); -spin_lock_init (&inode->i_data.private_lock); -INIT_RAW_PRIO_TREE_ROOT (&inode->i_data.i_mmap); -INIT_LIST_HEAD (&inode->i_data.i_mmap_nonlinear); +address_space_init_once (&inode->i_data);i_size_ordered_init (inode);#ifdef CONFIG_FSNOTIFY INIT_HLIST_HEAD (&inode->i_fsnotify_marks);
fs/nilfs2/btnode.c +0 -5
@@ -35,11 +35,6 @@#include "btnode.h" -void nilfs_btnode_cache_init_once (struct address_space *btnc) -{ -nilfs_mapping_init_once (btnc); -} -static const struct address_space_operations def_btnode_aops = { .sync_page = block_sync_page, };
fs/nilfs2/btnode.h +0 -1
@@ -37,7 +37,6 @@ struct nilfs_btnode_chkey_ctxt {struct buffer_head *newbh; }; -void nilfs_btnode_cache_init_once (struct address_space *);void nilfs_btnode_cache_init (struct address_space *,struct backing_dev_info *);void nilfs_btnode_cache_clear (struct address_space *); struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc,
fs/nilfs2/mdt.c +2 -2
@@ -460,9 +460,9 @@ int nilfs_mdt_setup_shadow_map(struct instruct backing_dev_info *bdi = inode->i_sb->s_bdi;INIT_LIST_HEAD (&shadow->frozen_buffers); -nilfs_mapping_init_once (&shadow->frozen_data); +address_space_init_once (&shadow->frozen_data);nilfs_mapping_init (&shadow->frozen_data, bdi, &shadow_map_aops); -nilfs_mapping_init_once (&shadow->frozen_btnodes); +address_space_init_once (&shadow->frozen_btnodes);nilfs_mapping_init (&shadow->frozen_btnodes, bdi, &shadow_map_aops); mi->mi_shadow = shadow;return 0 ;
fs/nilfs2/page.h +0 -1
@@ -61,7 +61,6 @@ void nilfs_free_private_page(struct pageint nilfs_copy_dirty_pages (struct address_space *,struct address_space *);void nilfs_copy_back_pages (struct address_space *,struct address_space *);void nilfs_clear_dirty_pages (struct address_space *); -void nilfs_mapping_init_once (struct address_space *mapping);void nilfs_mapping_init (struct address_space *mapping,struct backing_dev_info *bdi,const struct address_space_operations *aops);
fs/nilfs2/super.c +1 -1
@@ -1263,7 +1263,7 @@ static void nilfs_inode_init_once(void *#ifdef CONFIG_NILFS_XATTR init_rwsem (&ii->xattr_sem);#endif -nilfs_btnode_cache_init_once (&ii->i_btnode_cache); +address_space_init_once (&ii->i_btnode_cache); ii->i_bmap = &ii->i_bmap_data;inode_init_once (&ii->vfs_inode); }
include/linux/fs.h +2 -0
@@ -646,6 +646,7 @@ struct address_space {spinlock_t private_lock;/* for use by the address_space */ struct list_head private_list;/* ditto */ struct address_space *assoc_mapping;/* ditto */ +struct mutex unmap_mutex;/* to protect unmapping */ } __attribute__((aligned(sizeof(long))));/* * On most architectures that alignment is already the case; but
@@ -2203,6 +2204,7 @@ extern loff_t vfs_llseek(struct file *fiextern int inode_init_always (struct super_block *,struct inode *);extern void inode_init_once (struct inode *); +extern void address_space_init_once (struct address_space *mapping);extern void ihold (struct inode * inode);extern void iput (struct inode *);extern struct inode *igrab (struct inode *);
mm/memory.c +2 -0
@@ -2572,6 +2572,7 @@ void unmap_mapping_range(struct address_ details.last_index =ULONG_MAX ; details.i_mmap_lock = &mapping->i_mmap_lock; +mutex_lock (&mapping->unmap_mutex);spin_lock (&mapping->i_mmap_lock);/* Protect against endless unmapping loops */
@@ -2588,6 +2589,7 @@ void unmap_mapping_range(struct address_if (unlikely (!list_empty (&mapping->i_mmap_nonlinear)))unmap_mapping_range_list (&mapping->i_mmap_nonlinear, &details);spin_unlock (&mapping->i_mmap_lock); +mutex_unlock (&mapping->unmap_mutex); }EXPORT_SYMBOL (unmap_mapping_range);
PATCH 12/73 staging: brcm80211: remove assert to avoid panic since 2.6.37 kernel
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Arend van Spriel <[email protected]>
commit d062d44a8386c82c06e483f0c0d1124ba3cab2c8 upstream
The driver assumed it would receive skb packets from MAC80211 which are not cloned. To guard this assumption an assert was placed in the transmit routine. As of kernel 2.6.37 it turns out MAC80211 does pass skb packets that are cloned. The assert is also not needed as it does not lead to a failure state in our driver when the packet is cloned. Therefore the assert can safely be removed.
Quoted 6 lines
commit
f8a0a781488ec7288d1049e5d2022850aa98f7b6Author: Felix Fietkau <[email protected]> Date: Sat Dec 18 19:30:50 2010 +0100mac80211: fix potentially redundant skb data copying
Quoted 9 lines
When an skb is shared, it needs to be duplicated, along with its data If the skb does not have enough headroom, using
skb_copymight cause t buffer to be copied twice (once byskb_copyand once bypskb_expand_heFix this by usingskb_cloneinitially and lettingieee80211_skb_resizeout the rest.Signed-off-by Felix Fietkau <[email protected]>Signed-off-by John W. Linville <[email protected]>
--- drivers/staging/brcm80211/sys/wlc_mac80211.c | 1 - 1 file changed, 1 deletion(-)
drivers/staging/brcm80211/sys/wlc_mac80211.c +0 -1
@@ -5336,7 +5336,6 @@ wlc_sendpkt_mac80211(wlc_info_t *wlc, vo fifo = prio2fifo[prio];ASSERT ((uint )PKTHEADROOM (sdu) >=TXOFF ); -ASSERT (!PKTSHARED (sdu));ASSERT (!PKTNEXT (sdu));ASSERT (!PKTLINK (sdu));ASSERT (fifo <NFIFO );
PATCH 13/73 staging: brcm80211: bugfix for softmac crash on multi cpu configurations
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Roland Vossen <[email protected]>
commit 6a3be6e6e7feb4cb35275475d6a863b748d59cc3 upstream
Solved a locking issue that resulted in driver crashes with the 43224 and 43225 chips. The problem has been reported on several fora. Root cause was two fold:
hardware was being manipulated by two unsynchronized threads, and a scan operation could interfere with an ongoing dynamic calibration process. Fix was to invoke a lock on wl_ops_config() operation and to set internal flags when a scan operation is started and stopped.
Please add this to the staging-linus branch.
--- drivers/staging/brcm80211/sys/wl_mac80211.c | 14 ++++++++++---- drivers/staging/brcm80211/sys/wlc_mac80211.c | 13 +++++++++++++ drivers/staging/brcm80211/sys/wlc_pub.h | 2 ++ 3 files changed, 25 insertions(+), 4 deletions(-)
drivers/staging/brcm80211/sys/wl_mac80211.c +10 -4
@@ -353,9 +353,7 @@ ieee_set_channel(struct ieee80211_hw *hwswitch (type) {case NL80211_CHAN_HT20 :case NL80211_CHAN_NO_HT : -WL_LOCK (wl); err =wlc_set (wl->wlc,WLC_SET_CHANNEL , chan->hw_value); -WL_UNLOCK (wl);break ;case NL80211_CHAN_HT40MINUS :case NL80211_CHAN_HT40PLUS :
@@ -376,6 +374,7 @@ static int wl_ops_config(struct ieee8021int err =0 ;int new_int; +WL_LOCK (wl);if (changed &IEEE80211_CONF_CHANGE_LISTEN_INTERVAL ) {WL_NONE (("%s: Setting listen interval to %d\n" , __func__, conf->listen_interval));
@@ -431,6 +430,7 @@ static int wl_ops_config(struct ieee8021 } config_out: +WL_UNLOCK (wl);return err; }
@@ -559,14 +559,20 @@ wl_ops_set_tim(struct ieee80211_hw *hw,static void wl_ops_sw_scan_start (struct ieee80211_hw *hw) { +struct wl_info *wl = hw->priv;WL_NONE (("Scan Start\n" )); -return ; +WL_LOCK (wl); +wlc_scan_start (wl->wlc); +WL_UNLOCK (wl); }static void wl_ops_sw_scan_complete (struct ieee80211_hw *hw) { +struct wl_info *wl = hw->priv;WL_NONE (("Scan Complete\n" )); -return ; +WL_LOCK (wl); +wlc_scan_stop (wl->wlc); +WL_UNLOCK (wl); }static void wl_ops_set_tsf (struct ieee80211_hw *hw,u64 tsf)
drivers/staging/brcm80211/sys/wlc_mac80211.c +13 -0
@@ -8672,3 +8672,16 @@ static void wlc_txq_free(wlc_info_t *wlckfree (qi); } + +/* +* Flag 'scan in progress' to withold dynamic phy calibration +*/ +void wlc_scan_start (struct wlc_info *wlc) +{ +wlc_phy_hold_upd (wlc->band->pi,PHY_HOLD_FOR_SCAN , true); +} + +void wlc_scan_stop (struct wlc_info *wlc) +{ +wlc_phy_hold_upd (wlc->band->pi,PHY_HOLD_FOR_SCAN , false); +}
drivers/staging/brcm80211/sys/wlc_pub.h +2 -0
@@ -568,6 +568,8 @@ extern void wlc_enable_mac(struct wlc_inextern u16 wlc_rate_shm_offset (struct wlc_info *wlc,u8 rate);extern u32 wlc_get_rspec_history (struct wlc_bsscfg *cfg);extern u32 wlc_get_current_highest_rate (struct wlc_bsscfg *cfg); +extern void wlc_scan_start (struct wlc_info *wlc); +extern void wlc_scan_stop (struct wlc_info *wlc);static inline int wlc_iovar_getuint (struct wlc_info *wlc,const char *name,uint *arg)
PATCH 14/73 staging: usbip: vhci: update reference count for usb_device
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Max Vozeler <[email protected]>
commit 7606ee8aa33287dd3e6eb44c78541b87a413a325 upstream.
This fixes an oops observed when reading status during removal of a device:
[ 1706.648285] general protection fault: 0000 [#1] SMP [ 1706.648294] last sysfs file: /sys/devices/platform/vhci_hcd/status [ 1706.648297] CPU 1 [ 1706.648300] Modules linked in: binfmt_misc microcode fuse loop vhci_hcd(N) usbip(N) usbcore usbip_common_mod(N) rtc_core rtc_lib joydev dm_mirror dm_region_hash dm_log linear dm_snapshot xennet dm_mod ext3 mbcache jbd processor thermal_sys hwmon xenblk cdrom [ 1706.648324] Supported: Yes [ 1706.648327] Pid: 10422, comm: usbip Tainted: G N 2.6.32.12-0.7-xen #1 [ 1706.648330] RIP: e030:[<ffffffff801b10d5>] [<ffffffff801b10d5>] strnlen+0x5/0x40 [ 1706.648340] RSP: e02b:ffff8800a994dd30 EFLAGS: 00010286 [ 1706.648343] RAX: ffffffff80481ec1 RBX: 0000000000000000 RCX: 0000000000000002 [ 1706.648347] RDX: 00200d1d4f1c001c RSI: ffffffffffffffff RDI: 00200d1d4f1c001c [ 1706.648350] RBP: ffff880129a1c0aa R08: ffffffffa01901c4 R09: 0000000000000006 [ 1706.648353] R10: 0000000000000000 R11: 0000000000000000 R12: ffff8800a9a1c0ab [ 1706.648357] R13: 00200d1d4f1c001c R14: 00000000ffffffff R15: ffff880129a1c0aa [ 1706.648363] FS: 00007f2f2e9ca700(0000) GS:ffff880001018000(0000) knlGS:0000000000000000 [ 1706.648367] CS: e033 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1706.648370] CR2: 000000000071b048 CR3: 00000000b4b68000 CR4: 0000000000002660 [ 1706.648374] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 1706.648378] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [ 1706.648381] Process usbip (pid: 10422, threadinfo ffff8800a994c000, task ffff88007b170200) [ 1706.648385] Stack: [ 1706.648387] ffffffff801b28c9 0000000000000002 ffffffffa01901c4 ffff8800a9a1c0ab [ 1706.648391] <0> ffffffffa01901c6 ffff8800a994de08 ffffffff801b339b 0000000000000004 [ 1706.648397] <0> 0000000affffffff ffffffffffffffff 00000000000067c0 0000000000000000 [ 1706.648404] Call Trace: [ 1706.648413] [<ffffffff801b28c9>] string+0x39/0xe0 [ 1706.648419] [<ffffffff801b339b>] vsnprintf+0x1eb/0x620 [ 1706.648423] [<ffffffff801b3813>] sprintf+0x43/0x50 [ 1706.648429] [<ffffffffa018d719>] show_status+0x1b9/0x220 [vhci_hcd] [ 1706.648438] [<ffffffff8024a2b7>] dev_attr_show+0x27/0x60 [ 1706.648445] [<ffffffff80144821>] sysfs_read_file+0x101/0x1d0 [ 1706.648451] [<ffffffff800da4a7>] vfs_read+0xc7/0x130 [ 1706.648457] [<ffffffff800da613>] sys_read+0x53/0xa0 [ 1706.648462] [<ffffffff80007458>] system_call_fastpath+0x16/0x1b [ 1706.648468] [<00007f2f2de40f30>] 0x7f2f2de40f30 [ 1706.648470] Code: 66 0f 1f 44 00 00 48 83 c2 01 80 3a 00 75 f7 48 89 d0 48 29 f8 f3 c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 48 85 f6 74 29 <80> 3f 00 74 24 48 8d 56 ff 48 89 f8 eb 0e 0f 1f 44 00 00 48 83 [ 1706.648507] RIP [<ffffffff801b10d5>] strnlen+0x5/0x40 [ 1706.648511] RSP <ffff8800a994dd30> [ 1706.649575] ---[ end trace b4eb72bf2e149593 ]---
--- drivers/staging/usbip/vhci_hcd.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/staging/usbip/vhci_hcd.c +10 -3
@@ -607,7 +607,9 @@ static int vhci_urb_enqueue(struct usb_hdev_info (dev,"SetAddress Request (%d) to port %d\n" , ctrlreq->wValue, vdev->rhport); - vdev->udev = urb->dev; +if (vdev->udev) +usb_put_dev (vdev->udev); + vdev->udev =usb_get_dev (urb->dev);spin_lock (&vdev->ud.lock); vdev->ud.status =VDEV_ST_USED ;
@@ -627,8 +629,9 @@ static int vhci_urb_enqueue(struct usb_h"Get_Descriptor to device 0 " "(get max pipe size)\n"); -/* FIXME: reference count? (usb_get_dev()) */ - vdev->udev = urb->dev; +if (vdev->udev) +usb_put_dev (vdev->udev); + vdev->udev =usb_get_dev (urb->dev); goto out;default :
@@ -887,6 +890,10 @@ static void vhci_device_reset(struct usb vdev->speed =0 ; vdev->devid =0 ; +if (vdev->udev) +usb_put_dev (vdev->udev); + vdev->udev =NULL ; + ud->tcp_socket =NULL ; ud->status =VDEV_ST_NULL ;
PATCH 15/73 staging: usbip: vhci: give back URBs from in-flight unlink requests
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Max Vozeler <[email protected]>
commit b92a5e23737172c52656a090977408a80d7f06d1 upstream.
If we never received a RET_UNLINK because the TCP connection broke the pending URBs still need to be unlinked and given back.
Previously processes would be stuck trying to kill the URB even after the device was detached.
--- drivers/staging/usbip/vhci.h | 3 +++ drivers/staging/usbip/vhci_hcd.c | 24 +++++++++++++++++++++++- drivers/staging/usbip/vhci_rx.c | 15 +++++++++------ 3 files changed, 35 insertions(+), 7 deletions(-)
drivers/staging/usbip/vhci.h +3 -0
@@ -119,6 +119,9 @@ void rh_port_disconnect(int rhport);void vhci_rx_loop (struct usbip_task *ut);void vhci_tx_loop (struct usbip_task *ut); +struct urb *pickup_urb_and_free_priv (struct vhci_device *vdev, +__u32 seqnum); +#define hardware (&the_controller->pdev.dev)static inline struct vhci_device *port_to_vdev (__u32 port)
drivers/staging/usbip/vhci_hcd.c +23 -1
@@ -808,7 +808,6 @@ static int vhci_urb_dequeue(struct usb_hreturn 0 ; } -static void vhci_device_unlink_cleanup (struct vhci_device *vdev) {struct vhci_unlink *unlink, *tmp;
@@ -816,11 +815,34 @@ static void vhci_device_unlink_cleanup(sspin_lock (&vdev->priv_lock);list_for_each_entry_safe (unlink, tmp, &vdev->unlink_tx, list) { +usbip_uinfo ("unlink cleanup tx %lu\n" , unlink->unlink_seqnum);list_del (&unlink->list);kfree (unlink); }list_for_each_entry_safe (unlink, tmp, &vdev->unlink_rx, list) { +struct urb *urb; + +/* give back URB of unanswered unlink request */ +usbip_uinfo ("unlink cleanup rx %lu\n" , unlink->unlink_seqnum); + + urb =pickup_urb_and_free_priv (vdev, unlink->unlink_seqnum); +if (!urb) { +usbip_uinfo ("the urb (seqnum %lu) was already given back\n" , + unlink->unlink_seqnum); +list_del (&unlink->list); +kfree (unlink); +continue ; + } + + urb->status = -ENODEV ; + +spin_lock (&the_controller->lock); +usb_hcd_unlink_urb_from_ep (vhci_to_hcd (the_controller), urb); +spin_unlock (&the_controller->lock); + +usb_hcd_giveback_urb (vhci_to_hcd (the_controller), urb, urb->status); +list_del (&unlink->list);kfree (unlink); }
drivers/staging/usbip/vhci_rx.c +9 -6
@@ -23,16 +23,14 @@#include "vhci.h" -/* get URB from transmitted urb queue */ -static struct urb *pickup_urb_and_free_priv (struct vhci_device *vdev, +/* get URB from transmitted urb queue. caller must hold vdev->priv_lock */ +struct urb *pickup_urb_and_free_priv (struct vhci_device *vdev,__u32 seqnum) {struct vhci_priv *priv, *tmp;struct urb *urb =NULL ;int status; -spin_lock (&vdev->priv_lock); -list_for_each_entry_safe (priv, tmp, &vdev->priv_rx, list) {if (priv->seqnum == seqnum) { urb = priv->urb;
@@ -63,8 +61,6 @@ static struct urb *pickup_urb_and_free_p } } -spin_unlock (&vdev->priv_lock); -return urb; }
@@ -74,9 +70,11 @@ static void vhci_recv_ret_submit(structstruct usbip_device *ud = &vdev->ud;struct urb *urb; +spin_lock (&vdev->priv_lock); urb =pickup_urb_and_free_priv (vdev, pdu->base.seqnum); +spin_unlock (&vdev->priv_lock);if (!urb) { usbip_uerr("cannot find a urb of seqnum %u\n",
@@ -161,7 +159,12 @@ static void vhci_recv_ret_unlink(structreturn ; } +spin_lock (&vdev->priv_lock); + urb =pickup_urb_and_free_priv (vdev, unlink->unlink_seqnum); + +spin_unlock (&vdev->priv_lock); +if (!urb) {/* * I get the result of a unlink request. But, it seems that I
PATCH 16/73 staging: usbip: vhci: refuse to enqueue for dead connections
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Max Vozeler <[email protected]>
commit 6d212153a838354078cc7d96f9bb23b7d1fd3d1b upstream.
There can be requests to enqueue URBs while we are shutting down a connection.
--- drivers/staging/usbip/vhci_hcd.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/staging/usbip/vhci_hcd.c +13 -2
@@ -559,6 +559,7 @@ static int vhci_urb_enqueue(struct usb_hstruct device *dev = &urb->dev->dev;int ret =0 ;unsigned long flags; +struct vhci_device *vdev;usbip_dbg_vhci_hc ("enter, usb_hcd %p urb %p mem_flags %d\n" , hcd, urb, mem_flags);
@@ -574,6 +575,18 @@ static int vhci_urb_enqueue(struct usb_hreturn urb->status; } + vdev =port_to_vdev (the_controller->pending_port); + +/* refuse enqueue for dead connection */ +spin_lock (&vdev->ud.lock); +if (vdev->ud.status ==VDEV_ST_NULL || vdev->ud.status ==VDEV_ST_ERROR ) { +usbip_uerr ("enqueue for inactive port %d\n" , vdev->rhport); +spin_unlock (&vdev->ud.lock); +spin_unlock_irqrestore (&the_controller->lock, flags); +return -ENODEV ; + } +spin_unlock (&vdev->ud.lock); + ret =usb_hcd_link_urb_to_ep (hcd, urb);if (ret) goto no_need_unlink;
@@ -592,8 +605,6 @@ static int vhci_urb_enqueue(struct usb_h__u8 type =usb_pipetype (urb->pipe);struct usb_ctrlrequest *ctrlreq = (struct usb_ctrlrequest *) urb->setup_packet; -struct vhci_device *vdev = -port_to_vdev (the_controller->pending_port);if (type !=PIPE_CONTROL || !ctrlreq) {dev_err (dev,"invalid request to devnum 0\n" );
PATCH 17/73 staging: usbip: vhci: use urb->dev->portnum to find port
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Max Vozeler <[email protected]>
commit 01446ef5af4e8802369bf4d257806e24345a9371 upstream.
The access to pending_port was racy when two devices were being attached at the same time.
--- drivers/staging/usbip/vhci.h | 3 --- drivers/staging/usbip/vhci_hcd.c | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-)
drivers/staging/usbip/vhci.h +0 -3
@@ -100,9 +100,6 @@ struct vhci_hcd {* But, the index of this array begins from 0. */ struct vhci_device vdev[VHCI_NPORTS ]; - -/* vhci_device which has not been assiged its address yet */ -int pending_port; };
drivers/staging/usbip/vhci_hcd.c +1 -3
@@ -138,8 +138,6 @@ void rh_port_connect(int rhport, enum us* the_controller->vdev[rhport].ud.status = VDEV_CONNECT; * spin_unlock(&the_controller->vdev[rhport].ud.lock); */ - the_controller->pending_port = rhport; -spin_unlock_irqrestore (&the_controller->lock, flags);usb_hcd_poll_rh_status (vhci_to_hcd (the_controller));
@@ -575,7 +573,7 @@ static int vhci_urb_enqueue(struct usb_hreturn urb->status; } - vdev =port_to_vdev (the_controller->pending_port); + vdev =port_to_vdev (urb->dev->portnum-1 );/* refuse enqueue for dead connection */ spin_lock (&vdev->ud.lock);
PATCH 18/73 epoll: prevent creating circular epoll structures
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Davide Libenzi <[email protected]>
commit 22bacca48a1755f79b7e0f192ddb9fbb7fc6e64e upstream.
In several places, an epoll fd can call another file's ->f_op->poll() method with ep->mtx held. This is in general unsafe, because that other file could itself be an epoll fd that contains the original epoll fd.
The code defends against this possibility in its own ->poll() method using ep_call_nested, but there are several other unsafe calls to ->poll elsewhere that can be made to deadlock. For example, the following simple program causes the call in ep_insert recursively call the original fd's ->poll, leading to deadlock:
#include <unistd.h>
#include <sys/epoll.h>
int main(void) {
int e1, e2, p[2];
struct epoll_event evt = {
.events = EPOLLIN
};
e1 = epoll_create(1);
e2 = epoll_create(2);
pipe(p);
epoll_ctl(e2, EPOLL_CTL_ADD, e1, &evt);
epoll_ctl(e1, EPOLL_CTL_ADD, p[0], &evt);
write(p[1], p, sizeof p);
epoll_ctl(e1, EPOLL_CTL_ADD, e2, &evt);
return 0;}
On insertion, check whether the inserted file is itself a struct epoll, and if so, do a recursive walk to detect whether inserting this file would create a loop of epoll structures, which could lead to deadlock.
--- fs/eventpoll.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+)
fs/eventpoll.c +95 -0
@@ -63,6 +63,13 @@* cleanup path and it is also acquired by eventpoll_release_file() * if a file has been pushed inside an epoll set and it is then * close()d without a previous call toepoll_ctl(EPOLL_CTL_DEL). +* It is also acquired when inserting an epoll fd onto another epoll +* fd. We do this so that we walk the epoll tree and ensure that this +* insertion does not create a cycle of epoll file descriptors, which +* could lead to deadlock. We need a global mutex to prevent two +* simultaneous inserts (A into B and B into A) from racing and +* constructing a cycle without either insert observing that it is +* going to. * It is possible to drop the "ep->mtx" and to use the global * mutex "epmutex" (together with "ep->lock") to have it working, * but having "ep->mtx" will make the interface more scalable.
@@ -224,6 +231,9 @@ static int max_user_watches __read_mostl*/ static DEFINE_MUTEX (epmutex); +/* Used to check for epoll file descriptor inclusion loops */ +static struct nested_calls poll_loop_ncalls; +/* Used for safe wake up implementation */ static struct nested_calls poll_safewake_ncalls;
@@ -1195,6 +1205,62 @@ retry:return res; } +/** +* ep_loop_check_proc - Callback function to be passed to the @ep_call_nested() +* API, to verify that adding an epoll file inside another +* epoll structure, does not violate the constraints, in +* terms of closed loops, or too deep chains (which can +* result in excessive stack usage). +* +* @priv: Pointer to the epoll file to be currently checked. +* @cookie: Original cookie for this call. This is the top-of-the-chain epoll +* data structure pointer. +* @call_nests: Current dept of the @ep_call_nested() call stack. +* +* Returns: Returns zero if adding the epoll @file inside current epoll +* structure @ep does not violate the constraints, or -1 otherwise. +*/ +static int ep_loop_check_proc (void *priv,void *cookie,int call_nests) +{ +int error =0 ; +struct file *file = priv; +struct eventpoll *ep = file->private_data; +struct rb_node *rbp; +struct epitem *epi; + +mutex_lock (&ep->mtx); +for (rbp =rb_first (&ep->rbr); rbp; rbp =rb_next (rbp)) { + epi = rb_entry(rbp, struct epitem, rbn); +if (unlikely (is_file_epoll (epi->ffd.file))) { + error =ep_call_nested (&poll_loop_ncalls,EP_MAX_NESTS , + ep_loop_check_proc, epi->ffd.file, + epi->ffd.file->private_data, current); +if (error !=0 ) +break ; + } + } +mutex_unlock (&ep->mtx); + +return error; +} + +/** +* ep_loop_check - Performs a check to verify that adding an epoll file (@file) +* another epoll file (represented by @ep) does not create +* closed loops or too deep chains. +* +* @ep: Pointer to the epoll private data structure. +* @file: Pointer to the epoll file to be checked. +* +* Returns: Returns zero if adding the epoll @file inside current epoll +* structure @ep does not violate the constraints, or -1 otherwise. +*/ +static int ep_loop_check (struct eventpoll *ep,struct file *file) +{ +return ep_call_nested (&poll_loop_ncalls,EP_MAX_NESTS , + ep_loop_check_proc, file, ep, current); +} +/* * Open an eventpoll file descriptor. */
@@ -1243,6 +1309,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, in struct epoll_event __user *, event) {int error; +int did_lock_epmutex =0 ;struct file *file, *tfile;struct eventpoll *ep;struct epitem *epi;
@@ -1284,6 +1351,25 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, in*/ ep = file->private_data; +/* +* When we insert an epoll file descriptor, inside another epoll file +* descriptor, there is the change of creating closed loops, which are +* better be handled here, than in more critical paths. +* +* We hold epmutex across the loop check and the insert in this case, in +* order to prevent two separate inserts from racing and each doing the +* insert "at the same time" such that ep_loop_check passes on both +* before either one does the insert, thereby creating a cycle. +*/ +if (unlikely (is_file_epoll (tfile) && op ==EPOLL_CTL_ADD )) { +mutex_lock (&epmutex); + did_lock_epmutex =1 ; + error = -ELOOP ; +if (ep_loop_check (ep, tfile) !=0 ) + goto error_tgt_fput; + } + +mutex_lock (&ep->mtx);/*
@@ -1319,6 +1405,9 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, inmutex_unlock (&ep->mtx); error_tgt_fput: +if (unlikely (did_lock_epmutex)) +mutex_unlock (&epmutex); +fput (tfile); error_fput:fput (file);
@@ -1437,6 +1526,12 @@ static int __init eventpoll_init(void) max_user_watches = (((si.totalram - si.totalhigh) /25 ) <<PAGE_SHIFT ) /EP_ITEM_COST ; +/* +* Initialize the structure used to perform epoll file descriptor +* inclusion loops checks. +*/ +ep_nested_calls_init (&poll_loop_ncalls); +/* Initialize the structure used to perform safe poll wait head wake ups */ ep_nested_calls_init (&poll_safewake_ncalls);
PATCH 19/73 swiotlb: fix wrong panic
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: FUJITA Tomonori <[email protected]>
commit fba99fa38b023224680308a482e12a0eca87e4e1 upstream.
swiotlb's map_page wrongly calls panic() when it can't find a buffer fit for device's dma mask. It should return an error instead.
Devices with an odd dma mask (i.e. under 4G) like b44 network card hit this bug (the system crashes):
http://marc.info/?l=linux-kernel&m=129648943830106&w=2
If swiotlb returns an error, b44 driver can use the own bouncing mechanism.
--- lib/swiotlb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
lib/swiotlb.c +4 -2
@@ -686,8 +686,10 @@ dma_addr_t swiotlb_map_page(struct devic/* * Ensure that the address returned is DMA'ble */ -if (!dma_capable (dev, dev_addr, size)) -panic ("map_single: bounce buffer is not DMA'ble" ); +if (!dma_capable (dev, dev_addr, size)) { +swiotlb_tbl_unmap_single (dev, map, size, dir); + dev_addr =swiotlb_virt_to_bus (dev, io_tlb_overflow_buffer); + }return dev_addr; }
PATCH 20/73 ldm: corrupted partition table can cause kernel oops
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Timo Warns <[email protected]>
commit 294f6cf48666825d23c9372ef37631232746e40d upstream.
The kernel automatically evaluates partition tables of storage devices. The code for evaluating LDM partitions (in fs/partitions/ldm.c) contains a bug that causes a kernel oops on certain corrupted LDM partitions. A kernel subsystem seems to crash, because, after the oops, the kernel no longer recognizes newly connected storage devices.
The patch changes ldm_parse_vmdb() to Validate the value of vblk_size.
--- fs/partitions/ldm.c | 5 +++++ 1 file changed, 5 insertions(+)
fs/partitions/ldm.c +5 -0
@@ -251,6 +251,11 @@ static bool ldm_parse_vmdb (const u8 *da } vm->vblk_size =get_unaligned_be32 (data +0x08 ); +if (vm->vblk_size ==0 ) { +ldm_error ("Illegal VBLK size" ); +return false; + } + vm->vblk_offset =get_unaligned_be32 (data +0x0C ); vm->last_vblk_seq =get_unaligned_be32 (data +0x04 );
PATCH 21/73 drivers/rtc/rtc-ds3232.c: fix time range difference between linux and RTC chip
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Lei Xu <[email protected]>
commit a2d6d2fa90c0e1d2cc1d59ccb5bbe93bb28b7413 upstream.
In linux rtc_time struct, tm_mon range is 0~11, tm_wday range is 0~6, while in RTC HW REG, month range is 1~12, day of the week range is 1~7, this patch adjusts difference of them.
The efect of this bug was that most of month will be operated on as the next month by the hardware (When in Jan it maybe even worse). For example, if in May, software wrote 4 to the hardware, which handled it as April. Then the logic would be different between software and hardware, which would cause weird things to happen.
--- drivers/rtc/rtc-ds3232.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/rtc/rtc-ds3232.c +9 -5
@@ -1,7 +1,7 @@/* * RTC client/driver for the Maxim/Dallas DS3232 Real-Time Clock over I2C * -* Copyright (C) 2009-2010 Freescale Semiconductor. +* Copyright (C) 2009-2011 Freescale Semiconductor. * Author: Jack Lan <[email protected]> * * This program is free software; you can redistribute it and/or modify it
@@ -141,9 +141,11 @@ static int ds3232_read_time(struct devic time->tm_hour =bcd2bin (hour); } - time->tm_wday =bcd2bin (week); +/* Day of the week in linux range is 0~6 while 1~7 in RTC chip */ + time->tm_wday =bcd2bin (week) -1 ; time->tm_mday =bcd2bin (day); - time->tm_mon =bcd2bin (month &0x7F ); +/* linux tm_mon range:0~11, while month range is 1~12 in RTC chip */ + time->tm_mon =bcd2bin (month &0x7F ) -1 ;if (century) add_century =100 ;
@@ -162,9 +164,11 @@ static int ds3232_set_time(struct device buf[0 ] =bin2bcd (time->tm_sec); buf[1 ] =bin2bcd (time->tm_min); buf[2 ] =bin2bcd (time->tm_hour); - buf[3 ] =bin2bcd (time->tm_wday);/* Day of the week */ +/* Day of the week in linux range is 0~6 while 1~7 in RTC chip */ + buf[3 ] =bin2bcd (time->tm_wday +1 ); buf[4 ] =bin2bcd (time->tm_mday);/* Date */ - buf[5 ] =bin2bcd (time->tm_mon); +/* linux tm_mon range:0~11, while month range is 1~12 in RTC chip */ + buf[5 ] =bin2bcd (time->tm_mon +1 );if (time->tm_year >=100 ) { buf[5 ] |=0x80 ; buf[6 ] =bin2bcd (time->tm_year -100 );
PATCH 22/73 mm: fix dubious code in __count_immobile_pages()
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Namhyung Kim <[email protected]>
commit 29723fccc837d20039078f7a571e8d457eb0d6c6 upstream.
When pfn_valid_within() failed 'iter' was incremented twice.
--- mm/page_alloc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
mm/page_alloc.c +2 -3
@@ -5335,10 +5335,9 @@ __count_immobile_pages(struct zone *zonefor (found =0 , iter =0 ; iter < pageblock_nr_pages; iter++) {unsigned long check = pfn + iter; -if (!pfn_valid_within (check)) { - iter++; +if (!pfn_valid_within (check))continue ; - } + page =pfn_to_page (check);if (!page_count (page)) {if (PageBuddy (page))
PATCH 23/73 md: correctly handle probe of an mdp device.
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: NeilBrown <[email protected]>
commit 8f5f02c460b7ca74ce55ce126ce0c1e58a3f923d upstream.
'mdp' devices are md devices with preallocated device numbers for partitions. As such it is possible to mknod and open a partition before opening the whole device.
this causes md_probe() to be called with a device number of a partition, which in-turn calls mddev_find with such a number.
However mddev_find expects the number of a 'whole device' and does the wrong thing with partition numbers.
So add code to mddev_find to remove the 'partition' part of a device number and just work with the 'whole device'.
This patch addresses https://bugzilla.kernel.org/show_bug.cgi?id=28652
--- drivers/md/md.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/md/md.c +3 -0
@@ -553,6 +553,9 @@ static mddev_t * mddev_find(dev_t unit) {mddev_t *mddev, *new =NULL ; +if (unit &&MAJOR (unit) !=MD_MAJOR ) + unit &= ~((1 <<MdpMinorShift)-1 ); + retry:spin_lock (&all_mddevs_lock);
PATCH 24/73 md: avoid spinlock problem in blk_throtl_exit
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: NeilBrown <[email protected]>
commit da9cf5050a2e3dbc3cf26a8d908482eb4485ed49 upstream.
blk_throtl_exit assumes that ->queue_lock still exists, so make sure that it does.
To do this, we stop redirecting ->queue_lock to conf->device_lock and leave it pointing where it is initialised - __queue_lock.
As the blk_plug functions check the ->queue_lock is held, we now take that spin_lock explicitly around the plug functions. We don't need the locking, just the warning removal.
This is needed for any kernel with the blk_throtl code, which is which is 2.6.37 and later.
--- drivers/md/linear.c | 1 - drivers/md/multipath.c | 1 - drivers/md/raid0.c | 1 - drivers/md/raid1.c | 6 ++++-- drivers/md/raid10.c | 7 ++++--- drivers/md/raid5.c | 1 - 6 files changed, 8 insertions(+), 9 deletions(-)
drivers/md/linear.c +0 -1
@@ -216,7 +216,6 @@ static int linear_run (mddev_t *mddev)if (md_check_no_bitmap (mddev))return -EINVAL ; - mddev->queue->queue_lock = &mddev->queue->__queue_lock; conf =linear_conf (mddev, mddev->raid_disks);if (!conf)
drivers/md/multipath.c +0 -1
@@ -435,7 +435,6 @@ static int multipath_run (mddev_t *mddev* bookkeeping area. [whatever we allocate in multipath_run(), * should be freed in multipath_stop()] */ - mddev->queue->queue_lock = &mddev->queue->__queue_lock; conf =kzalloc (sizeof (multipath_conf_t),GFP_KERNEL ); mddev->private = conf;
drivers/md/raid0.c +0 -1
@@ -353,7 +353,6 @@ static int raid0_run(mddev_t *mddev)if (md_check_no_bitmap (mddev))return -EINVAL ;blk_queue_max_hw_sectors (mddev->queue, mddev->chunk_sectors); - mddev->queue->queue_lock = &mddev->queue->__queue_lock;/* if private is not null, we are here after takeover */ if (mddev->private ==NULL ) {
drivers/md/raid1.c +4 -2
@@ -593,7 +593,10 @@ static int flush_pending_writes(conf_t *if (conf->pending_bio_list.head) {struct bio *bio; bio =bio_list_get (&conf->pending_bio_list); +/* Only take the spinlock to quiet a warning */ +spin_lock (conf->mddev->queue->queue_lock);blk_remove_plug (conf->mddev->queue); +spin_unlock (conf->mddev->queue->queue_lock);spin_unlock_irq (&conf->device_lock);/* flush any pending bitmap writes to * disk before proceeding w/ I/O */
@@ -959,7 +962,7 @@ static int make_request(mddev_t *mddev,atomic_inc (&r1_bio->remaining);spin_lock_irqsave (&conf->device_lock, flags);bio_list_add (&conf->pending_bio_list, mbio); -blk_plug_device (mddev->queue); +blk_plug_device_unlocked (mddev->queue);spin_unlock_irqrestore (&conf->device_lock, flags); }r1_bio_write_done (r1_bio, bio->bi_vcnt, behind_pages, behind_pages !=NULL );
@@ -2024,7 +2027,6 @@ static int run(mddev_t *mddev)if (IS_ERR (conf))return PTR_ERR (conf); - mddev->queue->queue_lock = &conf->device_lock;list_for_each_entry (rdev, &mddev->disks, same_set) {disk_stack_limits (mddev->gendisk, rdev->bdev, rdev->data_offset <<9 );
drivers/md/raid10.c +4 -3
@@ -662,7 +662,10 @@ static int flush_pending_writes(conf_t *if (conf->pending_bio_list.head) {struct bio *bio; bio =bio_list_get (&conf->pending_bio_list); +/* Spinlock only taken to quiet a warning */ +spin_lock (conf->mddev->queue->queue_lock);blk_remove_plug (conf->mddev->queue); +spin_unlock (conf->mddev->queue->queue_lock);spin_unlock_irq (&conf->device_lock);/* flush any pending bitmap writes to disk * before proceeding w/ I/O */
@@ -971,7 +974,7 @@ static int make_request(mddev_t *mddev,atomic_inc (&r10_bio->remaining);spin_lock_irqsave (&conf->device_lock, flags);bio_list_add (&conf->pending_bio_list, mbio); -blk_plug_device (mddev->queue); +blk_plug_device_unlocked (mddev->queue);spin_unlock_irqrestore (&conf->device_lock, flags); }
@@ -2303,8 +2306,6 @@ static int run(mddev_t *mddev)if (!conf) goto out; - mddev->queue->queue_lock = &conf->device_lock; - mddev->thread = conf->thread; conf->thread =NULL ;
drivers/md/raid5.c +0 -1
@@ -5205,7 +5205,6 @@ static int run(mddev_t *mddev) mddev->queue->backing_dev_info.congested_data = mddev; mddev->queue->backing_dev_info.congested_fn = raid5_congested; - mddev->queue->queue_lock = &conf->device_lock; mddev->queue->unplug_fn = raid5_unplug_queue; chunk_size = mddev->chunk_sectors <<9 ;
PATCH 25/73 md: Fix - again - partition detection when array becomes active
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: NeilBrown <[email protected]>
commit f0b4f7e2f29af678bd9af43422c537dcb6008603 upstream.
Revert
b821eaa572fd737faaf6928ba046e571526c36c6
and
f3b99be19ded511a1bf05a148276239d9f13eefaWhen I wrote the first of these I had a wrong idea about the lifetime of 'struct block_device'. It can disappear at any time that the block device is not open if it falls out of the inode cache.
So relying on the 'size' recorded with it to detect when the device size has changed and so we need to revalidate, is wrong.
Rather, we really do need the 'changed' attribute stored directly in the mddev and set/tested as appropriate.
Without this patch, a sequence of:
mknod / open / close / unlink
(which can cause a block_device to be created and then destroyed) will result in a rescan of the partition table and consequence removal and addition of partitions.
Several of these in a row can get udev racing to create and unlink and other code can get confused.
With the patch, the rescan is only performed when needed and so there are no races.
This is suitable for any stable kernel from 2.6.35.
--- drivers/md/md.c | 22 +++++++++++++++++++++- drivers/md/md.h | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-)
drivers/md/md.c +21 -1
@@ -4614,6 +4614,7 @@ static int do_md_run(mddev_t *mddev) }set_capacity (mddev->gendisk, mddev->array_sectors);revalidate_disk (mddev->gendisk); + mddev->changed =1 ;kobject_uevent (&disk_to_dev (mddev->gendisk)->kobj,KOBJ_CHANGE ); out:return err;
@@ -4702,6 +4703,7 @@ static void md_clean(mddev_t *mddev) mddev->sync_speed_min = mddev->sync_speed_max =0 ; mddev->recovery =0 ; mddev->in_sync =0 ; + mddev->changed =0 ; mddev->degraded =0 ; mddev->safemode =0 ; mddev->bitmap_info.offset =0 ;
@@ -4811,6 +4813,7 @@ static int do_md_stop(mddev_t * mddev, iset_capacity (disk,0 );mutex_unlock (&mddev->open_mutex); + mddev->changed =1 ;revalidate_disk (disk);if (mddev->ro)
@@ -5994,7 +5997,7 @@ static int md_open(struct block_device *atomic_inc (&mddev->openers);mutex_unlock (&mddev->open_mutex); -check_disk_size_change (mddev->gendisk, bdev); +check_disk_change (bdev); out:return err; }
@@ -6009,6 +6012,21 @@ static int md_release(struct gendisk *direturn 0 ; } + +static int md_media_changed (struct gendisk *disk) +{ +mddev_t *mddev = disk->private_data; + +return mddev->changed; +} + +static int md_revalidate (struct gendisk *disk) +{ +mddev_t *mddev = disk->private_data; + + mddev->changed =0 ; +return 0 ; +}static const struct block_device_operations md_fops = { .owner =THIS_MODULE ,
@@ -6019,6 +6037,8 @@ static const struct block_device_operati .compat_ioctl = md_compat_ioctl, #endif .getgeo = md_getgeo, + .media_changed = md_media_changed, + .revalidate_disk= md_revalidate, };static int md_thread (void * arg)
drivers/md/md.h +2 -0
@@ -270,6 +270,8 @@ struct mddev_satomic_t active;/* general refcount */ atomic_t openers;/* number of active opens */ +int changed;/* True if we might need to +* reread partition info */ int degraded;/* whether md should consider * adding a spare */
PATCH 26/73 Fix over-zealous flush_disk when changing device size.
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: NeilBrown <[email protected]>
commit 93b270f76e7ef3b81001576860c2701931cdc78b upstream.
There are two cases when we call flush_disk.
In one, the device has disappeared (check_disk_change) so any data will hold becomes irrelevant.
In the oter, the device has changed size (check_disk_size_change) so data we hold may be irrelevant.
In both cases it makes sense to discard any 'clean' buffers, so they will be read back from the device if needed.
In the former case it makes sense to discard 'dirty' buffers as there will never be anywhere safe to write the data. In the second case it *does*not* make sense to discard dirty buffers as that will lead to file system corruption when you simply enlarge the containing devices.
flush_disk calls __invalidate_devices.__invalidate_device calls both invalidate_inodes and invalidate_bdev.
invalidate_inodes *does* discard I_DIRTY inodes and this does lead to fs corruption.
invalidate_bev *does*not* discard dirty pages, but I don't really care about that at present.
So this patch adds a flag to __invalidate_device (calling it __invalidate_device2) to indicate whether dirty buffers should be killed, and this is passed to invalidate_inodes which can choose to skip dirty inodes.
flusk_disk then passes true from check_disk_change and false from check_disk_size_change.
dm avoids tripping over this problem by calling i_size_write directly rathher than using check_disk_size_change.
md does use check_disk_size_change and so is affected.
This regression was introduced by commit 608aeef17a which causes check_disk_size_change to call flush_disk, so it is suitable for any kernel since 2.6.27.
--- block/genhd.c | 2 +- drivers/block/floppy.c | 2 +- fs/block_dev.c | 12 ++++++------ fs/inode.c | 9 ++++++++- fs/internal.h | 2 +- include/linux/fs.h | 2 +- 6 files changed, 18 insertions(+), 11 deletions(-)
block/genhd.c +1 -1
@@ -1285,7 +1285,7 @@ int invalidate_partition(struct gendiskstruct block_device *bdev =bdget_disk (disk, partno);if (bdev) {fsync_bdev (bdev); - res =__invalidate_device (bdev); + res =__invalidate_device (bdev, true);bdput (bdev); }return res;
drivers/block/floppy.c +1 -1
@@ -3276,7 +3276,7 @@ static int set_geometry(unsigned int cmdstruct block_device *bdev = opened_bdev[cnt];if (!bdev ||ITYPE (drive_state[cnt].fd_device) != type)continue ; -__invalidate_device (bdev); +__invalidate_device (bdev, true); }mutex_unlock (&open_lock); }else {
fs/block_dev.c +6 -6
@@ -1217,9 +1217,9 @@ EXPORT_SYMBOL(open_by_devnum);* when a disk has been changed -- either by a media change or online * resize. */ -static void flush_disk (struct block_device *bdev) +static void flush_disk (struct block_device *bdev,bool kill_dirty) { -if (__invalidate_device (bdev)) { +if (__invalidate_device (bdev, kill_dirty)) {char name[BDEVNAME_SIZE ] ="" ;if (bdev->bd_disk)
@@ -1256,7 +1256,7 @@ void check_disk_size_change(struct gendi"%s: detected capacity change from %lld to %lld\n" , name, bdev_size, disk_size);i_size_write (bdev->bd_inode, disk_size); -flush_disk (bdev); +flush_disk (bdev, false); } }EXPORT_SYMBOL (check_disk_size_change);
@@ -1308,7 +1308,7 @@ int check_disk_change(struct block_devicif (!bdops->media_changed (bdev->bd_disk))return 0 ; -flush_disk (bdev); +flush_disk (bdev, true);if (bdops->revalidate_disk) bdops->revalidate_disk (bdev->bd_disk);return 1 ;
@@ -1776,7 +1776,7 @@ void close_bdev_exclusive(struct block_dEXPORT_SYMBOL (close_bdev_exclusive); -int __invalidate_device (struct block_device *bdev) +int __invalidate_device (struct block_device *bdev,bool kill_dirty) {struct super_block *sb =get_super (bdev);int res =0 ;
@@ -1789,7 +1789,7 @@ int __invalidate_device(struct block_dev* hold). */ shrink_dcache_sb (sb); - res =invalidate_inodes (sb); + res =invalidate_inodes (sb, kill_dirty);drop_super (sb); }invalidate_bdev (bdev);
fs/inode.c +8 -1
@@ -532,11 +532,14 @@ void evict_inodes(struct super_block *sb/** * invalidate_inodes - attempt to free all inodes on a superblock * @sb: superblock to operate on +* @kill_dirty: flag to guide handling of dirty inodes * * Attempts to free all inodes for a given superblock. If there were any * busy inodes return a non-zero value, else zero. +* If @kill_dirty is set, discard dirty inodes too, otherwise treat +* them as busy. */ -int invalidate_inodes (struct super_block *sb) +int invalidate_inodes (struct super_block *sb,bool kill_dirty) {int busy =0 ;struct inode *inode, *next;
@@ -548,6 +551,10 @@ int invalidate_inodes(struct super_blocklist_for_each_entry_safe (inode, next, &sb->s_inodes, i_sb_list) {if (inode->i_state & (I_NEW |I_FREEING |I_WILL_FREE ))continue ; +if (inode->i_state &I_DIRTY && !kill_dirty) { + busy =1 ; +continue ; + }if (atomic_read (&inode->i_count)) { busy =1 ;continue ;
fs/internal.h +1 -1
@@ -107,4 +107,4 @@ extern void release_open_intent(struct n*/ extern int get_nr_dirty_inodes (void );extern void evict_inodes (struct super_block *); -extern int invalidate_inodes (struct super_block *); +extern int invalidate_inodes (struct super_block *,bool );
include/linux/fs.h +1 -1
@@ -2118,7 +2118,7 @@ extern void check_disk_size_change(struc struct block_device *bdev);extern int revalidate_disk (struct gendisk *);extern int check_disk_change (struct block_device *); -extern int __invalidate_device (struct block_device *); +extern int __invalidate_device (struct block_device *,bool );extern int invalidate_partition (struct gendisk *,int );#endif unsigned long invalidate_mapping_pages(struct address_space *mapping,
PATCH 27/73 PM: Make ACPI wakeup from S5 work again when CONFIG_PM_SLEEP is unset
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Rafael J. Wysocki <[email protected]>
commit 805bdaec1a44155db35f6ee5410d6bbc365324a8 upstream.
Commit 074037e (PM / Wakeup: Introduce wakeup source objects and event statistics (v3)) caused ACPI wakeup to only work if CONFIG_PM_SLEEP is set, but it also worked for CONFIG_PM_SLEEP unset before. This can be fixed by making device_set_wakeup_enable(), device_init_wakeup() and device_may_wakeup() work in the same way as before commit 074037e when CONFIG_PM_SLEEP is unset.
--- include/linux/pm.h | 2 ++ include/linux/pm_wakeup.h | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-)
include/linux/pm.h +2 -0
@@ -470,6 +470,8 @@ struct dev_pm_info {struct list_head entry;struct completion completion;struct wakeup_source *wakeup; +#else + unsigned int should_wakeup:1;#endif #ifdef CONFIG_PM_RUNTIME struct timer_list suspend_timer;
include/linux/pm_wakeup.h +14 -11
@@ -109,11 +109,6 @@ static inline bool device_can_wakeup(strreturn dev->power.can_wakeup; } -static inline bool device_may_wakeup (struct device *dev) -{ -return false; -} -static inline struct wakeup_source *wakeup_source_create (const char *name) {return NULL ;
@@ -134,24 +129,32 @@ static inline void wakeup_source_unregisstatic inline int device_wakeup_enable (struct device *dev) { -return -EINVAL ; + dev->power.should_wakeup = true; +return 0 ; }static inline int device_wakeup_disable (struct device *dev) { + dev->power.should_wakeup = false;return 0 ; } -static inline int device_init_wakeup (struct device *dev,bool val) +static inline int device_set_wakeup_enable (struct device *dev,bool enable) { - dev->power.can_wakeup = val; -return val ? -EINVAL :0 ; + dev->power.should_wakeup = enable; +return 0 ; } +static inline int device_init_wakeup (struct device *dev,bool val) +{ +device_set_wakeup_capable (dev, val); +device_set_wakeup_enable (dev, val); +return 0 ; +} -static inline int device_set_wakeup_enable (struct device *dev,bool enable) +static inline bool device_may_wakeup (struct device *dev) { -return -EINVAL ; +return dev->power.can_wakeup && dev->power.should_wakeup; }static inline void __pm_stay_awake (struct wakeup_source *ws) {}
PATCH 28/73 x86 quirk: Fix polarity for IRQ0 pin2 override on SB800 systems
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Andreas Herrmann <[email protected]>
commit 7f74f8f28a2bd9db9404f7d364e2097a0c42cc12 upstream.
On some SB800 systems polarity for IOAPIC pin2 is wrongly specified as low active by BIOS. This caused system hangs after resume from S3 when HPET was used in one-shot mode on such systems because a timer interrupt was missed (HPET signal is high active).
For more details see:
http://marc.info/?l=linux-kernel&m=129623757413868
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/acpi.h | 1 + arch/x86/kernel/acpi/boot.c | 14 ++++++++++---- arch/x86/kernel/early-quirks.c | 16 +++++++--------- 3 files changed, 18 insertions(+), 13 deletions(-)
arch/x86/include/asm/acpi.h +1 -0
@@ -88,6 +88,7 @@ extern int acpi_disabled;extern int acpi_pci_disabled;extern int acpi_skip_timer_override;extern int acpi_use_timer_override; +extern int acpi_fix_pin2_polarity;extern u8 acpi_sci_flags;extern int acpi_sci_override_gsi;
arch/x86/kernel/acpi/boot.c +10 -4
@@ -72,6 +72,7 @@ u8 acpi_sci_flags __initdata;int acpi_sci_override_gsi__initdata ;int acpi_skip_timer_override__initdata ;int acpi_use_timer_override__initdata ; +int acpi_fix_pin2_polarity__initdata ;#ifdef CONFIG_X86_LOCAL_APIC static u64 acpi_lapic_addr__initdata =APIC_DEFAULT_PHYS_BASE ;
@@ -410,10 +411,15 @@ acpi_parse_int_src_ovr(struct acpi_subtareturn 0 ; } -if (acpi_skip_timer_override && - intsrc->source_irq ==0 && intsrc->global_irq ==2 ) { -printk (PREFIX "BIOS IRQ0 pin2 override ignored.\n" ); -return 0 ; +if (intsrc->source_irq ==0 && intsrc->global_irq ==2 ) { +if (acpi_skip_timer_override) { +printk (PREFIX "BIOS IRQ0 pin2 override ignored.\n" ); +return 0 ; + } +if (acpi_fix_pin2_polarity && (intsrc->inti_flags &ACPI_MADT_POLARITY_MASK )) { + intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK ; +printk (PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n" ); + } } mp_override_legacy_irq(intsrc->source_irq,
arch/x86/kernel/early-quirks.c +7 -9
@@ -143,15 +143,10 @@ static void __init ati_bugs(int num, intstatic u32 __init ati_sbx00_rev (int num,int slot,int func) { -u32 old, d; +u32 d; - d =read_pci_config (num, slot, func,0x70 ); - old = d; - d &= ~(1 <<8 ); -write_pci_config (num, slot, func,0x70 , d); d =read_pci_config (num, slot, func,0x8 ); d &=0xff ; -write_pci_config (num, slot, func,0x70 , old);return d; }
@@ -160,13 +155,16 @@ static void __init ati_bugs_contd(int nu {u32 d, rev; -if (acpi_use_timer_override) -return ; - rev =ati_sbx00_rev (num, slot, func); +if (rev >=0x40 ) + acpi_fix_pin2_polarity =1 ; +if (rev >0x13 )return ; +if (acpi_use_timer_override) +return ; +/* check for IRQ0 interrupt swap */ d =read_pci_config (num, slot, func,0x64 );if (!(d & (1 <<14 )))
PATCH 29/73 xhci: Avoid BUG() in interrupt context
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Paul Zimmerman <[email protected]>
commit 68e41c5d032668e2905404afbef75bc58be179d6 upstream.
Change the BUGs in xhci_find_new_dequeue_state() to WARN_ONs, to avoid bringing down the box if one of them is hit
This patch should be queued for stable kernels back to 2.6.31.
--- drivers/usb/host/xhci-ring.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/usb/host/xhci-ring.c +9 -4
@@ -479,8 +479,11 @@ void xhci_find_new_dequeue_state(struct state->new_deq_seg =find_trb_seg (cur_td->start_seg, dev->eps[ep_index].stopped_trb, &state->new_cycle_state); -if (!state->new_deq_seg) -BUG (); +if (!state->new_deq_seg) { +WARN_ON (1 ); +return ; + } +/* Dig out the cycle state saved by the xHC during the stop ep cmd */ xhci_dbg (xhci,"Finding endpoint context\n" ); ep_ctx =xhci_get_ep_ctx (xhci, dev->out_ctx, ep_index);
@@ -491,8 +494,10 @@ void xhci_find_new_dequeue_state(struct state->new_deq_seg =find_trb_seg (state->new_deq_seg, state->new_deq_ptr, &state->new_cycle_state); -if (!state->new_deq_seg) -BUG (); +if (!state->new_deq_seg) { +WARN_ON (1 ); +return ; + } trb = &state->new_deq_ptr->generic; if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) &&
PATCH 30/73 xhci: Clarify some expressions in the TRB math
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Paul Zimmerman <[email protected]>
commit a2490187011cc2263117626615a581927d19f1d3 upstream.
This makes it easier to spot some problems, which will be fixed by the next patch in the series. Also change dev_dbg to dev_err in check_trb_math(), so any math errors will be visible even when running with debug disabled.
Note: This patch changes the expressions containing "((1 << TRB_MAX_BUFF_SHIFT) - 1)" to use the equivalent "(TRB_MAX_BUFF_SIZE - 1)". No change in behavior is intended for those expressions.
This patch should be queued for stable kernels back to 2.6.31.
--- drivers/usb/host/xhci-ring.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-)
drivers/usb/host/xhci-ring.c +10 -12
@@ -2374,7 +2374,7 @@ static unsigned int count_sg_trbs_needed/* Scatter gather list entries may cross 64KB boundaries */ running_total =TRB_MAX_BUFF_SIZE - - (sg_dma_address (sg) & ((1 <<TRB_MAX_BUFF_SHIFT ) -1 )); + (sg_dma_address (sg) & (TRB_MAX_BUFF_SIZE -1 ));if (running_total !=0 ) num_trbs++;
@@ -2404,11 +2404,11 @@ static unsigned int count_sg_trbs_neededstatic void check_trb_math (struct urb *urb,int num_trbs,int running_total) {if (num_trbs !=0 ) -dev_dbg (&urb->dev->dev,"%s - ep %#x - Miscalculated number of " +dev_err (&urb->dev->dev,"%s - ep %#x - Miscalculated number of " "TRBs, %d left\n" , __func__, urb->ep->desc.bEndpointAddress, num_trbs);if (running_total != urb->transfer_buffer_length) - dev_dbg(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, " + dev_err(&urb->dev->dev, "%s - ep %#x - Miscalculated tx length, " "queued %#x (%d), asked for %#x (%d)\n", __func__, urb->ep->desc.bEndpointAddress,
@@ -2540,8 +2540,7 @@ static int queue_bulk_sg_tx(struct xhci_ sg = urb->sg; addr = (u64 )sg_dma_address (sg); this_sg_len =sg_dma_len (sg); - trb_buff_len =TRB_MAX_BUFF_SIZE - - (addr & ((1 <<TRB_MAX_BUFF_SHIFT ) -1 )); + trb_buff_len =TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE -1 )); trb_buff_len =min_t (int, trb_buff_len, this_sg_len);if (trb_buff_len > urb->transfer_buffer_length) trb_buff_len = urb->transfer_buffer_length;
@@ -2577,7 +2576,7 @@ static int queue_bulk_sg_tx(struct xhci_ (unsigned int ) (addr +TRB_MAX_BUFF_SIZE ) & ~(TRB_MAX_BUFF_SIZE -1 ), (unsigned int) addr + trb_buff_len);if (TRB_MAX_BUFF_SIZE - - (addr & ((1 <<TRB_MAX_BUFF_SHIFT ) -1 )) < trb_buff_len) { + (addr & (TRB_MAX_BUFF_SIZE -1 )) < trb_buff_len) {xhci_warn (xhci,"WARN: sg dma xfer crosses 64KB boundaries!\n" ); xhci_dbg(xhci, "Next boundary at %#x, end dma = %#x\n", (unsigned int) (addr + TRB_MAX_BUFF_SIZE) & ~(TRB_MAX_BUFF_SIZE - 1),
@@ -2621,7 +2620,7 @@ static int queue_bulk_sg_tx(struct xhci_ } trb_buff_len =TRB_MAX_BUFF_SIZE - - (addr & ((1 <<TRB_MAX_BUFF_SHIFT ) -1 )); + (addr & (TRB_MAX_BUFF_SIZE -1 )); trb_buff_len =min_t (int, trb_buff_len, this_sg_len);if (running_total + trb_buff_len > urb->transfer_buffer_length) trb_buff_len =
@@ -2661,7 +2660,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd * num_trbs =0 ;/* How much data is (potentially) left before the 64KB boundary? */ running_total =TRB_MAX_BUFF_SIZE - - (urb->transfer_dma & ((1 <<TRB_MAX_BUFF_SHIFT ) -1 )); + (urb->transfer_dma & (TRB_MAX_BUFF_SIZE -1 ));/* If there's some data on this 64KB chunk, or we have to send a * zero-length transfer, we need at least one TRB
@@ -2704,8 +2703,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd */* How much data is in the first TRB? */ addr = (u64 ) urb->transfer_dma; trb_buff_len =TRB_MAX_BUFF_SIZE - - (urb->transfer_dma & ((1 <<TRB_MAX_BUFF_SHIFT ) -1 )); -if (urb->transfer_buffer_length < trb_buff_len) + (urb->transfer_dma & (TRB_MAX_BUFF_SIZE -1 )); +if (trb_buff_len > urb->transfer_buffer_length) trb_buff_len = urb->transfer_buffer_length; first_trb = true;
@@ -2877,8 +2876,7 @@ static int count_isoc_trbs_needed(struct addr = (u64) (urb->transfer_dma + urb->iso_frame_desc[i].offset); td_len = urb->iso_frame_desc[i].length; - running_total =TRB_MAX_BUFF_SIZE - - (addr & ((1 <<TRB_MAX_BUFF_SHIFT ) -1 )); + running_total =TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE -1 ));if (running_total !=0 ) num_trbs++;
PATCH 31/73 xhci: Fix errors in the running total calculations in the TRB math
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Paul Zimmerman <[email protected]>
commit 5807795bd4dececdf553719cc02869e633395787 upstream.
Calculations like
running_total = TRB_MAX_BUFF_SIZE - (sg_dma_address(sg) & (TRB_MAX_BUFF_SIZE - 1)); if (running_total != 0) num_trbs++;
are incorrect, because running_total can never be zero, so the if() expression will never be true. I think the intention was that running_total be in the range of 0 to TRB_MAX_BUFF_SIZE-1, not 1 to TRB_MAX_BUFF_SIZE. So adding a
running_total &= TRB_MAX_BUFF_SIZE - 1;
fixes the problem.
This patch should be queued for stable kernels back to 2.6.31.
--- drivers/usb/host/xhci-ring.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/host/xhci-ring.c +3 -0
@@ -2375,6 +2375,7 @@ static unsigned int count_sg_trbs_needed/* Scatter gather list entries may cross 64KB boundaries */ running_total =TRB_MAX_BUFF_SIZE - (sg_dma_address (sg) & (TRB_MAX_BUFF_SIZE -1 )); + running_total &=TRB_MAX_BUFF_SIZE -1 ;if (running_total !=0 ) num_trbs++;
@@ -2661,6 +2662,7 @@ int xhci_queue_bulk_tx(struct xhci_hcd */* How much data is (potentially) left before the 64KB boundary? */ running_total =TRB_MAX_BUFF_SIZE - (urb->transfer_dma & (TRB_MAX_BUFF_SIZE -1 )); + running_total &=TRB_MAX_BUFF_SIZE -1 ;/* If there's some data on this 64KB chunk, or we have to send a * zero-length transfer, we need at least one TRB
@@ -2877,6 +2879,7 @@ static int count_isoc_trbs_needed(struct td_len = urb->iso_frame_desc[i].length; running_total =TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE -1 )); + running_total &=TRB_MAX_BUFF_SIZE -1 ;if (running_total !=0 ) num_trbs++;
PATCH 32/73 xhci: Fix an error in count_sg_trbs_needed()
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Paul Zimmerman <[email protected]>
commit bcd2fde05341cef0052e49566ec88b406a521cf3 upstream.
The expression
while (running_total < sg_dma_len(sg))
does not take into account that the remaining data length can be less than sg_dma_len(sg). In that case, running_total can end up being greater than the total data length, so an extra TRB is counted. Changing the expression to
while (running_total < sg_dma_len(sg) && running_total < temp)
fixes that.
This patch should be queued for stable kernels back to 2.6.31.
--- drivers/usb/host/xhci-ring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/xhci-ring.c +1 -1
@@ -2380,7 +2380,7 @@ static unsigned int count_sg_trbs_needed num_trbs++;/* How many more 64KB chunks to transfer, how many more TRBs? */ -while (running_total <sg_dma_len (sg)) { +while (running_total <sg_dma_len (sg) && running_total < temp) { num_trbs++; running_total +=TRB_MAX_BUFF_SIZE ; }
PATCH 33/73 USB: Reset USB 3.0 devices on (re)discovery
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Luben Tuikov <[email protected]>
commit 07194ab7be63a972096309ab0ea747df455c6a20 upstream.
If the device isn't reset, the XHCI HCD sends SET ADDRESS to address 0 while the device is already in Addressed state, and the request is dropped on the floor as it is addressed to the default address. This sequence of events, which this patch fixes looks like this:
usb_reset_and_verify_device()
hub_port_init() hub_set_address() SET_ADDRESS to 0 with 1 usb_get_device_descriptor(udev, 8) usb_get_device_descriptor(udev, 18) descriptors_changed() --> goto re_enumerate: hub_port_logical_disconnect() kick_khubd()
And then:
hub_events()
hub_port_connect_change()
usb_disconnect()
usb_disable_device()
new device struct
sets device state to Powered
choose_address()
hub_port_init() <-- no reset, but SET ADDRESS to 0 with 1, timeout!
The solution is to always reset the device inhub_port_init() to put it in a known state.
Note from Sarah Sharp:
This patch should be queued for stable trees all the way back to 2.6.34, since that was the first kernel that supported configured device reset. The code this patch touches has been there since 2.6.32, but the bug would never be hit before 2.6.34 because the xHCI driver would completely reject an attempt to reset a configured device under xHCI.
--- drivers/usb/core/hub.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-)
drivers/usb/core/hub.c +7 -11
@@ -2672,17 +2672,13 @@ hub_port_init (struct usb_hub *hub, strumutex_lock (&usb_address0_mutex); -if (!udev->config && oldspeed ==USB_SPEED_SUPER ) { -/* Don't reset USB 3.0 devices during an initial setup */ -usb_set_device_state (udev,USB_STATE_DEFAULT ); - }else { -/* Reset the device; full speed may morph to high speed */ -/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */ - retval =hub_port_reset (hub, port1, udev, delay); -if (retval <0 )/* error or disconnect */ - goto fail; -/* success, speed is known */ - } +/* Reset the device; full speed may morph to high speed */ +/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */ + retval =hub_port_reset (hub, port1, udev, delay); +if (retval <0 )/* error or disconnect */ + goto fail; +/* success, speed is known */ + retval = -ENODEV ;if (oldspeed !=USB_SPEED_UNKNOWN && oldspeed != udev->speed) {
PATCH 34/73 USB: prevent buggy hubs from crashing the USB stack
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Alan Stern <[email protected]>
commit d199c96d41d80a567493e12b8e96ea056a1350c1 upstream.
If anyone comes across a high-speed hub that (by mistake or by design) claims to have no Transaction Translators, plugging a full- or low-speed device into it will cause the USB stack to crash. This patch (as1446) prevents the problem by ignoring such devices, since the kernel has no way to communicate with them.
--- drivers/usb/core/hub.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/usb/core/hub.c +5 -0
@@ -2740,6 +2740,11 @@ hub_port_init (struct usb_hub *hub, stru udev->ttport = hdev->ttport; }else if (udev->speed !=USB_SPEED_HIGH && hdev->speed ==USB_SPEED_HIGH ) { +if (!hub->tt.hub) { +dev_err (&udev->dev,"parent hub has no TT\n" ); + retval = -EINVAL ; + goto fail; + } udev->tt = &hub->tt; udev->ttport = port1; }
PATCH 35/73 usb: musb: core: set has_tt flag
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Felipe Balbi <[email protected]>
commit ec95d35a6bd0047f05fe8a21e6c52f8bb418da55 upstream.
MUSB is a non-standard host implementation which can handle all speeds with the same core. We need to set has_tt flag after commit d199c96d41d80a567493e12b8e96ea056a1350c1 (USB: prevent buggy hubs from crashing the USB stack) in order for MUSB HCD to continue working.
--- drivers/usb/musb/musb_core.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/musb/musb_core.c +1 -0
@@ -1880,6 +1880,7 @@ allocate_instance(struct device *dev,INIT_LIST_HEAD (&musb->out_bulk); hcd->uses_new_polling =1 ; + hcd->has_tt =1 ; musb->vbuserr_retry =VBUSERR_RETRY_COUNT ; musb->a_wait_bcon =OTG_TIME_A_WAIT_BCON ;
PATCH 36/73 ALSA: HDA: Add a new Conexant codec 506e (20590)
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: David Henningsson <[email protected]>
commit 6da8b51657a9cd5a87b4e6e4c7bc76b598a95175 upstream.
Conexant 506e/20590 has the same graph as the rest of the 5066 family.
--- sound/pci/hda/patch_conexant.c | 3 +++ 1 file changed, 3 insertions(+)
sound/pci/hda/patch_conexant.c +3 -0
@@ -3890,6 +3890,8 @@ static struct hda_codec_preset snd_hda_p .patch = patch_cxt5066 }, { .id = 0x14f15069, .name = "CX20585", .patch = patch_cxt5066 }, + { .id = 0x14f1506e, .name = "CX20590", + .patch = patch_cxt5066 }, { .id = 0x14f15097, .name = "CX20631", .patch = patch_conexant_auto }, { .id = 0x14f15098, .name = "CX20632",
@@ -3916,6 +3918,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15066"MODULE_ALIAS ("snd-hda-codec-id:14f15067" );MODULE_ALIAS ("snd-hda-codec-id:14f15068" );MODULE_ALIAS ("snd-hda-codec-id:14f15069" ); +MODULE_ALIAS ("snd-hda-codec-id:14f1506e" );MODULE_ALIAS ("snd-hda-codec-id:14f15097" );MODULE_ALIAS ("snd-hda-codec-id:14f15098" );MODULE_ALIAS ("snd-hda-codec-id:14f150a1" );
PATCH 37/73 ALSA: usb-audio: fix oops due to cleanup race when disconnecting
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Takashi Iwai <[email protected]>
commit 382225e62bdb8059b7f915b133426425516dd300 upstream.
When a USB audio device is disconnected, snd_usb_audio_disconnect() kills all audio URBs. At the same time, the application, after being notified of the disconnection, might close the device, in which case ALSA calls the .hw_free callback, which should free the URBs too.
Commit de1b8b93a0ba "[ALSA] Fix hang-up at disconnection of usb-audio" prevented snd_usb_hw_free() from freeing the URBs to avoid a hang that resulted from this race, but this introduced another race because the URB callbacks could now be executed after snd_usb_hw_free() has returned, and try to access already freed data.
Fix the first race by introducing a mutex to serialize the disconnect callback and all PCM callbacks that manage URBs (hw_free and hw_params).
--- sound/usb/card.c | 4 ++++ sound/usb/pcm.c | 7 +++++-- sound/usb/usbaudio.h | 1 + 3 files changed, 10 insertions(+), 2 deletions(-)
sound/usb/card.c +4 -0
@@ -323,6 +323,7 @@ static int snd_usb_audio_create(struct ureturn -ENOMEM ; } +mutex_init (&chip->shutdown_mutex); chip->index = idx; chip->dev = dev; chip->card = card;
@@ -531,6 +532,7 @@ static void snd_usb_audio_disconnect(str chip = ptr; card = chip->card;mutex_lock (®ister_mutex); +mutex_lock (&chip->shutdown_mutex); chip->shutdown =1 ; chip->num_interfaces--;if (chip->num_interfaces <=0 ) {
@@ -548,9 +550,11 @@ static void snd_usb_audio_disconnect(strsnd_usb_mixer_disconnect (p); } usb_chip[chip->index] =NULL ; +mutex_unlock (&chip->shutdown_mutex);mutex_unlock (®ister_mutex);snd_card_free_when_closed (card); }else { +mutex_unlock (&chip->shutdown_mutex);mutex_unlock (®ister_mutex); } }
sound/usb/pcm.c +5 -2
@@ -361,6 +361,7 @@ static int snd_usb_hw_params(struct snd_ }if (changed) { +mutex_lock (&subs->stream->chip->shutdown_mutex);/* format changed */ snd_usb_release_substream_urbs (subs,0 );/* influenced: period_bytes, channels, rate, format, */
@@ -368,6 +369,7 @@ static int snd_usb_hw_params(struct snd_params_rate (hw_params),snd_pcm_format_physical_width (params_format (hw_params)) * params_channels(hw_params)); +mutex_unlock (&subs->stream->chip->shutdown_mutex); }return ret;
@@ -385,8 +387,9 @@ static int snd_usb_hw_free(struct snd_pc subs->cur_audiofmt =NULL ; subs->cur_rate =0 ; subs->period_bytes =0 ; -if (!subs->stream->chip->shutdown) -snd_usb_release_substream_urbs (subs,0 ); +mutex_lock (&subs->stream->chip->shutdown_mutex); +snd_usb_release_substream_urbs (subs,0 ); +mutex_unlock (&subs->stream->chip->shutdown_mutex);return snd_pcm_lib_free_vmalloc_buffer (substream); }
sound/usb/usbaudio.h +1 -0
@@ -36,6 +36,7 @@ struct snd_usb_audio {struct snd_card *card;u32 usb_id;int shutdown; +struct mutex shutdown_mutex; unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */int num_interfaces;int num_suspended_intf;
PATCH 38/73 ALSA: HDA: Fix mic initialization in VIA auto parser
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: David Henningsson <[email protected]>
commit 306496761745942d8167e9193a738b559a7fb0b3 upstream.
This typo caused some microphone inputs not to be correctly initialized on VIA codecs.
--- sound/pci/hda/patch_via.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_via.c +1 -1
@@ -568,7 +568,7 @@ static void via_auto_init_analog_input(shda_nid_t nid = cfg->inputs[i].pin;if (spec->smart51_enabled &&is_smart51_pins (spec, nid)) ctl =PIN_OUT ; -else if (i ==AUTO_PIN_MIC ) +else if (cfg->inputs[i].type ==AUTO_PIN_MIC ) ctl =PIN_VREF50 ;else ctl =PIN_IN ;
PATCH 39/73 ALSA: HDA: Add ideapad quirk for two Dell machines
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: David Henningsson <[email protected]>
commit ebbd224c22a00dbbee95031a0d6d595460f6f2b3 upstream.
These two Dell machines have been reported working well with the ideapad model.
--- sound/pci/hda/patch_conexant.c | 2 ++ 1 file changed, 2 insertions(+)
sound/pci/hda/patch_conexant.c +2 -0
@@ -3106,6 +3106,8 @@ static struct snd_pci_quirk cxt5066_cfg_SND_PCI_QUIRK (0x1028 ,0x0401 ,"Dell Vostro 1014" ,CXT5066_DELL_VOSTRO ),SND_PCI_QUIRK (0x1028 ,0x0402 ,"Dell Vostro" ,CXT5066_DELL_VOSTRO ),SND_PCI_QUIRK (0x1028 ,0x0408 ,"Dell Inspiron One 19T" ,CXT5066_IDEAPAD ), +SND_PCI_QUIRK (0x1028 ,0x050f ,"Dell Inspiron" ,CXT5066_IDEAPAD ), +SND_PCI_QUIRK (0x1028 ,0x0510 ,"Dell Vostro" ,CXT5066_IDEAPAD ),SND_PCI_QUIRK (0x103c ,0x360b ,"HP G60" ,CXT5066_HP_LAPTOP ),SND_PCI_QUIRK (0x1043 ,0x13f3 ,"Asus A52J" ,CXT5066_HP_LAPTOP ), SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD),
PATCH 40/73 ocfs2: Check heartbeat mode for kernel stacks only
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mark Fasheh <[email protected]>
commit 52c303c56c3638944b5f733e3961dc58eb8c7270 upstream.
Commit 2c442719e90a44a6982c033d69df4aae4b167cfa added some checks for proper heartbeat mode when the o2cb stack is running. Unfortunately, it didn't take into account that a userpsace stack could be running. Fix this by only doing the check if o2cb is in use. This patch allows userspace stacks to mount the fs again.
--- fs/ocfs2/super.c | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-)
fs/ocfs2/super.c +20 -8
@@ -1310,7 +1310,7 @@ static int ocfs2_parse_options(struct sustruct mount_options *mopt, int is_remount) { - int status; + int status, user_stack = 0;char *p;u32 tmp;
@@ -1453,6 +1453,15 @@ static int ocfs2_parse_options(struct sumemcpy (mopt->cluster_stack, args[0 ].from,OCFS2_STACK_LABEL_LEN ); mopt->cluster_stack[OCFS2_STACK_LABEL_LEN ] ='\0' ; +/* +* Open code the memcmp here as we don't have +* an osb to pass to +* ocfs2_userspace_stack(). +*/ +if (memcmp (mopt->cluster_stack, +OCFS2_CLASSIC_CLUSTER_STACK , +OCFS2_STACK_LABEL_LEN )) + user_stack =1 ;break ;case Opt_inode64: mopt->mount_opt |=OCFS2_MOUNT_INODE64 ;
@@ -1508,13 +1517,16 @@ static int ocfs2_parse_options(struct su } } -/* Ensure only one heartbeat mode */ - tmp = mopt->mount_opt & (OCFS2_MOUNT_HB_LOCAL |OCFS2_MOUNT_HB_GLOBAL | -OCFS2_MOUNT_HB_NONE ); -if (hweight32 (tmp) !=1 ) { -mlog (ML_ERROR ,"Invalid heartbeat mount options\n" ); - status =0 ; - goto bail; +if (user_stack ==0 ) { +/* Ensure only one heartbeat mode */ + tmp = mopt->mount_opt & (OCFS2_MOUNT_HB_LOCAL | +OCFS2_MOUNT_HB_GLOBAL | +OCFS2_MOUNT_HB_NONE ); +if (hweight32 (tmp) !=1 ) { +mlog (ML_ERROR ,"Invalid heartbeat mount options\n" ); + status =0 ; + goto bail; + } } status =1 ;
PATCH 41/73 Ocfs2/refcounttree: Fix a bug for refcounttree to writeback clusters in a right number.
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tristan Ye <[email protected]>
commit acf3bb007e5636ef4c17505affb0974175108553 upstream.
Current refcounttree codes actually didn't writeback the new pages out in write-back mode, due to a bug of always passing a ZERO number of clusters to 'ocfs2_cow_sync_writeback', the patch tries to pass a proper one in.
--- fs/ocfs2/refcounttree.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/ocfs2/refcounttree.c +5 -2
@@ -3228,7 +3228,7 @@ static int ocfs2_make_clusters_writable( u32 num_clusters, unsigned int e_flags) { int ret, delete, index, credits = 0; -u32 new_bit, new_len; +u32 new_bit, new_len, orig_num_clusters;unsigned int set_len;struct ocfs2_super *osb =OCFS2_SB (sb);handle_t *handle;
@@ -3261,6 +3261,8 @@ static int ocfs2_make_clusters_writable( goto out; } + orig_num_clusters = num_clusters; +while (num_clusters) { ret = ocfs2_get_refcount_rec(ref_ci, context->ref_root_bh, p_cluster, num_clusters,
@@ -3348,7 +3350,8 @@ static int ocfs2_make_clusters_writable(* in write-back mode. */ if (context->get_clusters == ocfs2_di_get_clusters) { - ret =ocfs2_cow_sync_writeback (sb, context, cpos, num_clusters); + ret =ocfs2_cow_sync_writeback (sb, context, cpos, + orig_num_clusters);if (ret)mlog_errno (ret); }
PATCH 42/73 drm: fix unsigned vs signed comparison issue in modeset ctl ioctl.
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dave Airlie <[email protected]>
commit 1922756124ddd53846877416d92ba4a802bc658f upstream.
This fixes CVE-2011-1013.
--- drivers/gpu/drm/drm_irq.c | 3 ++- include/drm/drmP.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_irq.c +2 -1
@@ -549,7 +549,8 @@ int drm_modeset_ctl(struct drm_device *d struct drm_file *file_priv) {struct drm_modeset_ctl *modeset = data; -int crtc, ret =0 ; +int ret =0 ; +unsigned int crtc;/* If drm_vblank_init() hasn't been called yet, just no-op */ if (!dev->num_crtcs)
include/drm/drmP.h +1 -1
@@ -1022,7 +1022,7 @@ struct drm_device {struct platform_device *platformdev;/**< Platform device struture */ struct drm_sg_mem *sg;/**< Scatter gather memory */ -int num_crtcs;/**< Number of CRTCs on this device */ +unsigned int num_crtcs;/**< Number of CRTCs on this device */ void *dev_private;/**< device private data */ void *mm_private;struct address_space *dev_mapping;
PATCH 43/73 ACPI / debugfs: Fix buffer overflows, double free
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Vasiliy Kulikov <[email protected]>
commit 2949ad50711cc161721cf788711722eeeca33764 upstream.
File position is not controlled, it may lead to overwrites of arbitrary kernel memory. Also the code may kfree() the same pointer multiple times.
One more flaw is still present: if multiple processes open the file then all 3 static variables are shared, leading to various race conditions. They should be moved to file->private_data.
--- drivers/acpi/debugfs.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
drivers/acpi/debugfs.c +14 -6
@@ -26,7 +26,9 @@ static ssize_t cm_write(struct file *fil size_t count, loff_t *ppos) {static char *buf; -static int uncopied_bytes; +static u32 max_size; +static u32 uncopied_bytes; +struct acpi_table_header table;acpi_status status;
@@ -37,19 +39,24 @@ static ssize_t cm_write(struct file *filif (copy_from_user (&table, user_buf,sizeof (struct acpi_table_header )))return -EFAULT ; - uncopied_bytes = table.length; - buf =kzalloc (uncopied_bytes,GFP_KERNEL ); + uncopied_bytes = max_size = table.length; + buf =kzalloc (max_size,GFP_KERNEL );if (!buf)return -ENOMEM ; } -if (uncopied_bytes < count) { -kfree (buf); +if (buf ==NULL ) +return -EINVAL ; + +if ((*ppos > max_size) || + (*ppos + count > max_size) || + (*ppos + count < count) || + (count > uncopied_bytes))return -EINVAL ; - }if (copy_from_user (buf + (*ppos), user_buf, count)) {kfree (buf); + buf =NULL ;return -EFAULT ; }
@@ -59,6 +66,7 @@ static ssize_t cm_write(struct file *filif (!uncopied_bytes) { status =acpi_install_method (buf);kfree (buf); + buf =NULL ;if (ACPI_FAILURE (status))return -EINVAL ;add_taint (TAINT_OVERRIDDEN_ACPI_TABLE );
PATCH 44/73 mfd: Avoid tps6586x burst writes
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: [email protected] <[email protected]>
commit 4b57018dcd6418e18c08088c89f123da8a7bfc45 upstream.
tps6586 does not support burst writes. i2c writes have to be 1 byte at a time.
--- drivers/mfd/tps6586x.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/mfd/tps6586x.c +5 -5
@@ -152,12 +152,12 @@ static inline int __tps6586x_write(strucstatic inline int __tps6586x_writes (struct i2c_client *client,int reg,int len,uint8_t *val) { -int ret; +int ret, i; - ret =i2c_smbus_write_i2c_block_data (client, reg, len, val); -if (ret <0 ) { -dev_err (&client->dev,"failed writings to 0x%02x\n" , reg); -return ret; +for (i =0 ; i < len; i++) { + ret =__tps6586x_write (client, reg + i, *(val + i)); +if (ret <0 ) +return ret; }return 0 ;
PATCH 45/73 mfd: Fix NULL pointer due to non-initialized ucb1x00-ts absinfo
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jochen Friedrich <[email protected]>
commit 9063f1f15eec35e5fd608879cef8be5728f2d12a upstream.
Call input_set_abs_params instead of manually setting absbit only. This fixes this oops:
Unable to handle kernel NULL pointer dereference at virtual address 00000024 Internal error: Oops: 41b67017 [#1] CPU: 0 Not tainted (2.6.37 #4) pc : [<c016d1fc>] lr : [<00000000>] psr: 20000093
sp : c19e5f30 ip : c19e5e6c fp : c19e5f58
r10: 00000000 r9 : c19e4000 r8 : 00000003
r7 : 000001e4 r6 : 00000001 r5 : c1854400 r4 : 00000003 r3 : 00000018 r2 : 00000018 r1 : 00000018 r0 : c185447c
Flags: nzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: c1b6717f Table: c1b6717f DAC: 00000017
Stack: (0xc19e5f30 to 0xc19e6000)
5f20: 00000003 00000003 c1854400 00000013
5f40: 00000001 000001e4 000001c5 c19e5f80 c19e5f5c c016d5e8 c016cf5c 000001e4 5f60: c1854400 c18b5860 00000000 00000171 000001e4 c19e5fc4 c19e5f84 c01559a4 5f80: c016d584 c18b5868 00000000 c1bb5c40 c0035afc c18b5868 c18b5868 c1a55d54 5fa0: c18b5860 c0155750 00000013 00000000 00000000 00000000 c19e5ff4 c19e5fc8 5fc0: c0050174 c015575c 00000000 c18b5860 00000000 c19e5fd4 c19e5fd4 c1a55d54 5fe0: c00500f0 c003b464 00000000 c19e5ff8 c003b464 c00500fc 04000400 04000400
Backtrace:
Function entered at [<c016cf50>] from [<c016d5e8>] Function entered at [<c016d578>] from [<c01559a4>]
r8:000001e4 r7:00000171 r6:00000000 r5:c18b5860 r4:c1854400
Function entered at [<c0155750>] from [<c0050174>] Function entered at [<c00500f0>] from [<c003b464>]
r6:c003b464 r5:c00500f0 r4:c1a55d54
Code: e59520fc e1a03286 e0433186 e0822003 (e592000c)
Quoted 1 line
Quoted 1 line
PC;
c016d1fc<input_handle_event+2ac/5a0> <=====
Trace; c016cf50 <input_handle_event+0/5a0>
Trace; c016d5e8 <input_event+70/88>
Trace; c016d578 <input_event+0/88>
Trace; c01559a4 <ucb1x00_thread+254/2dc>
Trace; c0155750 <ucb1x00_thread+0/2dc>
Trace; c0050174 <kthread+84/8c>
Trace; c00500f0 <kthread+0/8c>
Trace; c003b464 <do_exit+0/624>
--- drivers/mfd/ucb1x00-ts.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/mfd/ucb1x00-ts.c +9 -3
@@ -385,12 +385,18 @@ static int ucb1x00_ts_add(struct ucb1x00 idev->close = ucb1x00_ts_close;__set_bit (EV_ABS , idev->evbit); -__set_bit (ABS_X , idev->absbit); -__set_bit (ABS_Y , idev->absbit); -__set_bit (ABS_PRESSURE , idev->absbit);input_set_drvdata (idev, ts); +ucb1x00_adc_enable (ts->ucb); + ts->x_res =ucb1x00_ts_read_xres (ts); + ts->y_res =ucb1x00_ts_read_yres (ts); +ucb1x00_adc_disable (ts->ucb); + +input_set_abs_params (idev,ABS_X ,0 , ts->x_res,0 ,0 ); +input_set_abs_params (idev,ABS_Y ,0 , ts->y_res,0 ,0 ); +input_set_abs_params (idev,ABS_PRESSURE ,0 ,0 ,0 ,0 ); + err =input_register_device (idev);if (err) goto fail;
PATCH 46/73 x86: Use u32 instead of long to set reset vector back to 0
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Don Zickus <[email protected]>
commit 299c56966a72b9109d47c71a6db52097098703dd upstream.
A customer of ours, complained that when setting the reset vector back to 0, it trashed other data and hung their box. They noticed when only 4 bytes were set to 0 instead of 8, everything worked correctly.
Mathew pointed out:
| | We're supposed to be resetting trampoline_phys_low and | trampoline_phys_high here, which are two 16-bit values. | Writing 64 bits is definitely going to overwrite space | that we're not supposed to be touching. |
So limit the area modified to u32.
LKML-Reference: <[email protected]>
--- arch/x86/include/asm/smpboot_hooks.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/include/asm/smpboot_hooks.h +1 -1
@@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_*/ CMOS_WRITE (0 ,0xf ); - *((volatile long *)phys_to_virt (apic->trampoline_phys_low)) =0 ; + *((volatile u32 *)phys_to_virt (apic->trampoline_phys_low)) =0 ; }static inline void __init smpboot_setup_io_apic (void )
PATCH 47/73 Bluetooth: add Atheros BT AR9285 fw supported
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Yu-Chen Cho <[email protected]>
commit 509e7861d8a5e26bb07b5a3a13e2b9e442283631 upstream.
Add the btusb.c blacklist [03f0:311d] for Atheros AR9285 Malbec BT and add to ath3k.c ath3-1.fw (md5:1211fa34c09e10ba48381586b7c3883d) supported this device.
--- drivers/bluetooth/ath3k.c | 2 ++ drivers/bluetooth/btusb.c | 3 +++ 2 files changed, 5 insertions(+)
drivers/bluetooth/ath3k.c +2 -0
@@ -39,6 +39,8 @@ static struct usb_device_id ath3k_table[/* Atheros AR3011 with sflash firmware*/ { USB_DEVICE(0x0CF3, 0x3002) }, +/* Atheros AR9285 Malbec with sflash firmware */ + { USB_DEVICE(0x03F0, 0x311D) }, { } /* Terminating entry */ };
drivers/bluetooth/btusb.c +3 -0
@@ -102,6 +102,9 @@ static struct usb_device_id blacklist_ta/* Atheros 3011 with sflash firmware */ { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, + /* Atheros AR9285 Malbec with sflash firmware */ + { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, + /* Broadcom BCM2035 */ { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
PATCH 48/73 Bluetooth: fix crash with quirky dongles doing sound
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Oliver Neukum <[email protected]>
commit 8efdd0cdc54f3bb5db464b3baf88f7441f54da47 upstream.
Quirky dongles sometimes do not use the iso interface which causes a crash with runtime PM
--- drivers/bluetooth/btusb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/bluetooth/btusb.c +2 -2
@@ -829,7 +829,7 @@ static void btusb_work(struct work_strucif (hdev->conn_hash.sco_num >0 ) {if (!test_bit (BTUSB_DID_ISO_RESUME , &data->flags)) { - err =usb_autopm_get_interface (data->isoc); + err =usb_autopm_get_interface (data->isoc ? data->isoc : data->intf);if (err <0 ) {clear_bit (BTUSB_ISOC_RUNNING , &data->flags);usb_kill_anchored_urbs (&data->isoc_anchor);
@@ -858,7 +858,7 @@ static void btusb_work(struct work_struc__set_isoc_interface (hdev,0 );if (test_and_clear_bit (BTUSB_DID_ISO_RESUME , &data->flags)) -usb_autopm_put_interface (data->isoc); +usb_autopm_put_interface (data->isoc ? data->isoc : data->intf); } }
PATCH 49/73 Bluetooth: Add Atheros BT AR5BBU12 fw supported
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Yu-Chen Cho <[email protected]>
commit e9036e336a8e5640871e0006ea4a89982b25046f upstream.
Add the btusb.c blacklist [0489:e02c] for Atheros AR5BBU12 BT and add to ath3k.c supported this device.
--- drivers/bluetooth/ath3k.c | 3 +++ drivers/bluetooth/btusb.c | 3 +++ 2 files changed, 6 insertions(+)
drivers/bluetooth/ath3k.c +3 -0
@@ -41,6 +41,9 @@ static struct usb_device_id ath3k_table[/* Atheros AR9285 Malbec with sflash firmware */ { USB_DEVICE(0x03F0, 0x311D) }, + +/* Atheros AR5BBU12 with sflash firmware */ + { USB_DEVICE(0x0489, 0xE02C) }, { } /* Terminating entry */ };
drivers/bluetooth/btusb.c +3 -0
@@ -105,6 +105,9 @@ static struct usb_device_id blacklist_ta/* Atheros AR9285 Malbec with sflash firmware */ { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, + /* Atheros AR5BBU12 with sflash firmware */ + { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, + /* Broadcom BCM2035 */ { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
PATCH 50/73 eukrea-tlv320: fix platform_name
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Eric Bénard <[email protected]>
commit 43c63188821dc21b2af23a40a18faea6e386e90a upstream.
commit f0fba2ad1b6b53d5360125c41953b7afcd6deff0 included a mistake on the name of the platform in the snd_soc_dai_link structure.
--- sound/soc/imx/eukrea-tlv320.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/imx/eukrea-tlv320.c +1 -1
@@ -80,7 +80,7 @@ static struct snd_soc_dai_link eukrea_tl .name = "tlv320aic23", .stream_name = "TLV320AIC23", .codec_dai_name = "tlv320aic23-hifi", - .platform_name = "imx-pcm-audio.0", + .platform_name = "imx-fiq-pcm-audio.0", .codec_name = "tlv320aic23-codec.0-001a", .cpu_dai_name = "imx-ssi.0", .ops = &eukrea_tlv320_snd_ops,
PATCH 51/73 ASoC: correct pxa AC97 DAI names
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dmitry Eremin-Solenikov <[email protected]>
commit 4bfc4e2508234f9149fd33fae853e99fb9e4a75b upstream.
Correct names for pxa AC97 DAI are pxa2xx-ac97 and pxa2xx-ac97-aux. Fix that for all PXA platforms.
--- sound/soc/pxa/e740_wm9705.c | 4 ++-- sound/soc/pxa/e750_wm9705.c | 4 ++-- sound/soc/pxa/e800_wm9712.c | 4 ++-- sound/soc/pxa/em-x270.c | 4 ++-- sound/soc/pxa/mioa701_wm9713.c | 4 ++-- sound/soc/pxa/palm27x.c | 4 ++-- sound/soc/pxa/tosa.c | 4 ++-- sound/soc/pxa/zylonite.c | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-)
sound/soc/pxa/e740_wm9705.c +2 -2
@@ -117,7 +117,7 @@ static struct snd_soc_dai_link e740_dai[ { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_dai_name = "wm9705-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm9705-codec",
@@ -126,7 +126,7 @@ static struct snd_soc_dai_link e740_dai[ { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_dai_name = "wm9705-aux", .platform_name = "pxa-pcm-audio", .codec_name = "wm9705-codec",
sound/soc/pxa/e750_wm9705.c +2 -2
@@ -99,7 +99,7 @@ static struct snd_soc_dai_link e750_dai[ { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_dai_name = "wm9705-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm9705-codec",
@@ -109,7 +109,7 @@ static struct snd_soc_dai_link e750_dai[ { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_dai_name ="wm9705-aux", .platform_name = "pxa-pcm-audio", .codec_name = "wm9705-codec",
sound/soc/pxa/e800_wm9712.c +2 -2
@@ -89,7 +89,7 @@ static struct snd_soc_dai_link e800_dai[ { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_dai_name = "wm9712-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm9712-codec",
@@ -98,7 +98,7 @@ static struct snd_soc_dai_link e800_dai[ { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_dai_name ="wm9712-aux", .platform_name = "pxa-pcm-audio", .codec_name = "wm9712-codec",
sound/soc/pxa/em-x270.c +2 -2
@@ -38,7 +38,7 @@ static struct snd_soc_dai_link em_x270_d { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_dai_name = "wm9712-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm9712-codec",
@@ -46,7 +46,7 @@ static struct snd_soc_dai_link em_x270_d { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_dai_name ="wm9712-aux", .platform_name = "pxa-pcm-audio", .codec_name = "wm9712-codec",
sound/soc/pxa/mioa701_wm9713.c +2 -2
@@ -162,7 +162,7 @@ static struct snd_soc_dai_link mioa701_d { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_dai_name = "wm9713-hifi", .codec_name = "wm9713-codec", .init = mioa701_wm9713_init,
@@ -172,7 +172,7 @@ static struct snd_soc_dai_link mioa701_d { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_dai_name ="wm9713-aux", .codec_name = "wm9713-codec", .platform_name = "pxa-pcm-audio",
sound/soc/pxa/palm27x.c +2 -2
@@ -132,7 +132,7 @@ static struct snd_soc_dai_link palm27x_d { .name = "AC97 HiFi", .stream_name = "AC97 HiFi", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_dai_name = "wm9712-hifi", .codec_name = "wm9712-codec", .platform_name = "pxa-pcm-audio",
@@ -141,7 +141,7 @@ static struct snd_soc_dai_link palm27x_d { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_dai_name = "wm9712-aux", .codec_name = "wm9712-codec", .platform_name = "pxa-pcm-audio",
sound/soc/pxa/tosa.c +2 -2
@@ -217,7 +217,7 @@ static struct snd_soc_dai_link tosa_dai[ { .name = "AC97", .stream_name = "AC97 HiFi", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_dai_name = "wm9712-hifi", .platform_name = "pxa-pcm-audio", .codec_name = "wm9712-codec",
@@ -227,7 +227,7 @@ static struct snd_soc_dai_link tosa_dai[ { .name = "AC97 Aux", .stream_name = "AC97 Aux", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_dai_name = "wm9712-aux", .platform_name = "pxa-pcm-audio", .codec_name = "wm9712-codec",
sound/soc/pxa/zylonite.c +2 -2
@@ -166,7 +166,7 @@ static struct snd_soc_dai_link zylonite_ .stream_name = "AC97 HiFi", .codec_name = "wm9713-codec", .platform_name = "pxa-pcm-audio", - .cpu_dai_name = "pxa-ac97.0", + .cpu_dai_name = "pxa2xx-ac97", .codec_name = "wm9713-hifi", .init = zylonite_wm9713_init, },
@@ -175,7 +175,7 @@ static struct snd_soc_dai_link zylonite_ .stream_name = "AC97 Aux", .codec_name = "wm9713-codec", .platform_name = "pxa-pcm-audio", - .cpu_dai_name = "pxa-ac97.1", + .cpu_dai_name = "pxa2xx-ac97-aux", .codec_name = "wm9713-aux", }, {
PATCH 52/73 fuse: fix hang of single threaded fuseblk filesystem
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Miklos Szeredi <[email protected]>
commit 5a18ec176c934ca1bc9dc61580a5e0e90a9b5733 upstream.
Single threaded NTFS-3G could get stuck if a delayed RELEASE reply triggered a DESTROY request via path_put().
Fix this by
a) making RELEASE requests synchronous, whenever possible, on fuseblk filesystems
b) if not possible (triggered by an asynchronous read/write) then do the path_put() in a separate thread with schedule_work().
--- fs/fuse/file.c | 52 +++++++++++++++++++++++++++++++++++++++++++++------- fs/fuse/fuse_i.h | 6 +++++- 2 files changed, 50 insertions(+), 8 deletions(-)
fs/fuse/file.c +45 -7
@@ -86,18 +86,52 @@ struct fuse_file *fuse_file_get(struct freturn ff; } +static void fuse_release_async (struct work_struct *work) +{ +struct fuse_req *req; +struct fuse_conn *fc; +struct path path; + + req = container_of(work, struct fuse_req, misc.release.work); + path = req->misc.release.path; + fc =get_fuse_conn (path.dentry->d_inode); + +fuse_put_request (fc, req); +path_put (&path); +} +static void fuse_release_end (struct fuse_conn *fc,struct fuse_req *req) { -path_put (&req->misc.release.path); +if (fc->destroy_req) { +/* +* If this is a fuseblk mount, then it's possible that +* releasing the path will result in releasing the +* super block and sending the DESTROY request. If +* the server is single threaded, this would hang. +* For this reason do the path_put() in a separate +* thread. +*/ +atomic_inc (&req->count); +INIT_WORK (&req->misc.release.work, fuse_release_async); +schedule_work (&req->misc.release.work); + }else { +path_put (&req->misc.release.path); + } } -static void fuse_file_put (struct fuse_file *ff) +static void fuse_file_put (struct fuse_file *ff,bool sync) {if (atomic_dec_and_test (&ff->count)) {struct fuse_req *req = ff->reserved_req; - req->end = fuse_release_end; -fuse_request_send_background (ff->fc, req); +if (sync) { +fuse_request_send (ff->fc, req); +path_put (&req->misc.release.path); +fuse_put_request (ff->fc, req); + }else { + req->end = fuse_release_end; +fuse_request_send_background (ff->fc, req); + }kfree (ff); } }
@@ -219,8 +253,12 @@ void fuse_release_common(struct file *fi* Normally this will send the RELEASE request, however if * some asynchronous READ or WRITE requests are outstanding, * the sending will be delayed. +* +* Make the release synchronous if this is a fuseblk mount, +* synchronous RELEASE is allowed (and desirable) in this case +* because the server can be trusted not to screw up. */ -fuse_file_put (ff); +fuse_file_put (ff, ff->fc->destroy_req !=NULL ); }static int fuse_open (struct inode *inode,struct file *file)
@@ -558,7 +596,7 @@ static void fuse_readpages_end(struct fupage_cache_release (page); }if (req->ff) -fuse_file_put (req->ff); +fuse_file_put (req->ff, false); }static void fuse_send_readpages (struct fuse_req *req,struct file *file)
@@ -1137,7 +1175,7 @@ static ssize_t fuse_direct_write(structstatic void fuse_writepage_free (struct fuse_conn *fc,struct fuse_req *req) {__free_page (req->pages[0 ]); -fuse_file_put (req->ff); +fuse_file_put (req->ff, false); }static void fuse_writepage_finish (struct fuse_conn *fc,struct fuse_req *req)
fs/fuse/fuse_i.h +5 -1
@@ -21,6 +21,7 @@#include <linux/rwsem.h> #include <linux/rbtree.h> #include <linux/poll.h> +#include <linux/workqueue.h> /** Max number of pages that can be used in a single read request */ #define FUSE_MAX_PAGES_PER_REQ 32
@@ -257,7 +258,10 @@ struct fuse_req {union {struct fuse_forget_in forget_in;struct { -struct fuse_release_in in; +union { +struct fuse_release_in in; +struct work_struct work; + };struct path path; } release;struct fuse_init_in init_in;
PATCH 53/73 clockevents: Prevent oneshot mode when broadcast device is periodic
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Thomas Gleixner <[email protected]>
commit 3a142a0672b48a853f00af61f184c7341ac9c99d upstream.
When the per cpu timer is marked CLOCK_EVT_FEAT_C3STOP, then we only can switch into oneshot mode, when the backup broadcast device supports oneshot mode as well. Otherwise we would try to switch the broadcast device into an unsupported mode unconditionally. This went unnoticed so far as the current available broadcast devices support oneshot mode. Seth unearthed this problem while debugging and working around an hpet related BIOS wreckage.
Add the necessary check to tick_is_oneshot_available().
LKML-Reference: <[email protected]>
--- kernel/time/tick-broadcast.c | 10 ++++++++++ kernel/time/tick-common.c | 6 +++++- kernel/time/tick-internal.h | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-)
kernel/time/tick-broadcast.c +10 -0
@@ -600,4 +600,14 @@ int tick_broadcast_oneshot_active(void) return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT; } +/* +* Check whether the broadcast device supports oneshot. +*/ +bool tick_broadcast_oneshot_available (void ) +{ +struct clock_event_device *bc = tick_broadcast_device.evtdev; + +return bc ? bc->features &CLOCK_EVT_FEAT_ONESHOT : false; +} +#endif
kernel/time/tick-common.c +5 -1
@@ -51,7 +51,11 @@ int tick_is_oneshot_available(void) {struct clock_event_device *dev =__get_cpu_var (tick_cpu_device).evtdev; -return dev && (dev->features &CLOCK_EVT_FEAT_ONESHOT ); +if (!dev || !(dev->features &CLOCK_EVT_FEAT_ONESHOT )) +return 0 ; +if (!(dev->features &CLOCK_EVT_FEAT_C3STOP )) +return 1 ; +return tick_broadcast_oneshot_available (); }/*
kernel/time/tick-internal.h +3 -0
@@ -36,6 +36,7 @@ extern void tick_shutdown_broadcast_onesextern int tick_resume_broadcast_oneshot (struct clock_event_device *bc);extern int tick_broadcast_oneshot_active (void );extern void tick_check_oneshot_broadcast (int cpu); +bool tick_broadcast_oneshot_available (void );# else /* BROADCAST */ static inline void tick_broadcast_setup_oneshot (struct clock_event_device *bc) {
@@ -46,6 +47,7 @@ static inline void tick_broadcast_switchstatic inline void tick_shutdown_broadcast_oneshot (unsigned int *cpup) { }static inline int tick_broadcast_oneshot_active (void ) {return 0 ; }static inline void tick_check_oneshot_broadcast (int cpu) { } +static inline bool tick_broadcast_oneshot_available (void ) {return true; }# endif /* !BROADCAST */ #else /* !ONESHOT */
@@ -76,6 +78,7 @@ static inline int tick_resume_broadcast_ return 0; }static inline int tick_broadcast_oneshot_active (void ) {return 0 ; } +static inline bool tick_broadcast_oneshot_available (void ) {return false; }#endif /* !TICK_ONESHOT */ /*
PATCH 54/73 ext2: Fix link count corruption under heavy link+rename load
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Josh Hunt <[email protected]>
commit e8a80c6f769dd4622d8b211b398452158ee60c0b upstream.
vfs_rename_other() does not lock renamed inode with i_mutex. Thus changing i_nlink in a non-atomic manner (which happens in ext2_rename()) can corrupt it as reported and analyzed by Josh.
In fact, there is no good reason to mess with i_nlink of the moved file. We did it presumably to simulate linking into the new directory and unlinking from an old one. But the practical effect of this is disputable because fsck can possibly treat file as being properly linked into both directories without writing any error which is confusing. So we just stop increment-decrement games with i_nlink which also fixes the corruption.
--- fs/ext2/namei.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
fs/ext2/namei.c +2 -7
@@ -344,7 +344,6 @@ static int ext2_rename (struct inode * o new_de =ext2_find_entry (new_dir, &new_dentry->d_name, &new_page);if (!new_de) goto out_dir; -inode_inc_link_count (old_inode);ext2_set_link (new_dir, new_de, new_page, old_inode,1 ); new_inode->i_ctime =CURRENT_TIME_SEC ;if (dir_de)
@@ -356,12 +355,9 @@ static int ext2_rename (struct inode * oif (new_dir->i_nlink >=EXT2_LINK_MAX ) goto out_dir; } -inode_inc_link_count (old_inode); err =ext2_add_link (new_dentry, old_inode); -if (err) { -inode_dec_link_count (old_inode); +if (err) goto out_dir; - }if (dir_de)inode_inc_link_count (new_dir); }
@@ -369,12 +365,11 @@ static int ext2_rename (struct inode * o/* * Like most other Unix systems, set the ctime for inodes on a * rename. -* inode_dec_link_count() will mark the inode dirty. */ old_inode->i_ctime =CURRENT_TIME_SEC ; +mark_inode_dirty (old_inode);ext2_delete_entry (old_de, old_page); -inode_dec_link_count (old_inode);if (dir_de) {if (old_dir != new_dir)
PATCH 55/73 mm: vmstat: use a single setter function and callback for adjusting percpu thresholds
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mel Gorman <[email protected]>
commit b44129b30652c8771db2265939bb8b463724043d upstream.
reduce_pgdat_percpu_threshold() and restore_pgdat_percpu_threshold() exist to adjust the per-cpu vmstat thresholds while kswapd is awake to avoid errors due to counter drift. The functions duplicate some code so this patch replaces them with a single set_pgdat_percpu_threshold() that takes a callback function to calculate the desired threshold as a parameter.
--- include/linux/vmstat.h | 10 ++++++---- mm/vmscan.c | 19 +++++++++++++++++-- mm/vmstat.c | 36 +++++++----------------------------- 3 files changed, 30 insertions(+), 35 deletions(-)
include/linux/vmstat.h +6 -4
@@ -254,8 +254,11 @@ extern void dec_zone_state(struct zone *extern void __dec_zone_state (struct zone *,enum zone_stat_item );void refresh_cpu_vm_stats (int ); -void reduce_pgdat_percpu_threshold (pg_data_t *pgdat); -void restore_pgdat_percpu_threshold (pg_data_t *pgdat); + +int calculate_pressure_threshold (struct zone *zone); +int calculate_normal_threshold (struct zone *zone); +void set_pgdat_percpu_threshold (pg_data_t *pgdat, +int (*calculate_pressure)(struct zone *));#else /* CONFIG_SMP */ /*
@@ -300,8 +303,7 @@ static inline void __dec_zone_page_state#define dec_zone_page_state __dec_zone_page_state#define mod_zone_page_state __mod_zone_page_state -static inline void reduce_pgdat_percpu_threshold (pg_data_t *pgdat) { } -static inline void restore_pgdat_percpu_threshold (pg_data_t *pgdat) { } +#define set_pgdat_percpu_threshold (pgdat, callback) { }static inline void refresh_cpu_vm_stats (int cpu) { }#endif
mm/vmscan.c +17 -2
@@ -2448,9 +2448,24 @@ static int kswapd(void *p)*/ if (!sleeping_prematurely (pgdat, order, remaining)) {trace_mm_vmscan_kswapd_sleep (pgdat->node_id); -restore_pgdat_percpu_threshold (pgdat); + +/* +* vmstat counters are not perfectly +* accurate and the estimated value +* for counters such as NR_FREE_PAGES +* can deviate from the true value by +* nr_online_cpus * threshold. To +* avoid the zone watermarks being +* breached while under pressure, we +* reduce the per-cpu vmstat threshold +* while kswapd is awake and restore +* them before going back to sleep. +*/ +set_pgdat_percpu_threshold (pgdat, + calculate_normal_threshold);schedule (); -reduce_pgdat_percpu_threshold (pgdat); +set_pgdat_percpu_threshold (pgdat, + calculate_pressure_threshold); }else {if (remaining)count_vm_event (KSWAPD_LOW_WMARK_HIT_QUICKLY );
mm/vmstat.c +7 -29
@@ -83,7 +83,7 @@ EXPORT_SYMBOL(vm_stat);#ifdef CONFIG_SMP -static int calculate_pressure_threshold (struct zone *zone) +int calculate_pressure_threshold (struct zone *zone) {int threshold;int watermark_distance;
@@ -107,7 +107,7 @@ static int calculate_pressure_threshold(return threshold; } -static int calculate_threshold (struct zone *zone) +int calculate_normal_threshold (struct zone *zone) {int threshold;int mem;/* memory in 128 MB units */
@@ -166,7 +166,7 @@ static void refresh_zone_stat_thresholdsfor_each_populated_zone (zone) {unsigned long max_drift, tolerate_drift; - threshold =calculate_threshold (zone); + threshold =calculate_normal_threshold (zone);for_each_online_cpu (cpu)per_cpu_ptr (zone->pageset, cpu)->stat_threshold
@@ -185,46 +185,24 @@ static void refresh_zone_stat_thresholds } } -void reduce_pgdat_percpu_threshold (pg_data_t *pgdat) +void set_pgdat_percpu_threshold (pg_data_t *pgdat, +int (*calculate_pressure)(struct zone *)) {struct zone *zone;int cpu;int threshold;int i; -get_online_cpus ();for (i =0 ; i < pgdat->nr_zones; i++) { zone = &pgdat->node_zones[i];if (!zone->percpu_drift_mark)continue ; - threshold =calculate_pressure_threshold (zone); -for_each_online_cpu (cpu) -per_cpu_ptr (zone->pageset, cpu)->stat_threshold - = threshold; - } -put_online_cpus (); -} - -void restore_pgdat_percpu_threshold (pg_data_t *pgdat) -{ -struct zone *zone; -int cpu; -int threshold; -int i; - -get_online_cpus (); -for (i =0 ; i < pgdat->nr_zones; i++) { - zone = &pgdat->node_zones[i]; -if (!zone->percpu_drift_mark) -continue ; - - threshold =calculate_threshold (zone); -for_each_online_cpu (cpu) + threshold = (*calculate_pressure)(zone); +for_each_possible_cpu (cpu)per_cpu_ptr (zone->pageset, cpu)->stat_threshold = threshold; } -put_online_cpus (); }/*
PATCH 56/73 e1000e: 82579 PHY incorrectly identified during init
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Bruce Allan <[email protected]>
commit 664dc878ed6f0476b875547547a49e06f7a4e73b upstream.
During init, reading the 2 PHY ID registers back-to-back in the default fast mode could return invalid data (all F's) and in slow mode could return data to the second read the data from the first read. To resolve the issue in fast mode, set to slow mode before any PHY accesses; to resolve the issue in slow mode, put in a delay for every 82579 PHY access. Since this PHY is currently only paired with the pch2lan MAC and the PHY type is not known before the first PHY access which can fail this way, check for this based on MAC-type.
--- drivers/net/e1000e/ich8lan.c | 16 +++++++++++----- drivers/net/e1000e/phy.c | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-)
drivers/net/e1000e/ich8lan.c +11 -5
@@ -338,12 +338,17 @@ static s32 e1000_init_phy_params_pchlan( } phy->id = e1000_phy_unknown; - ret_val =e1000e_get_phy_id (hw); -if (ret_val) - goto out; -if ((phy->id ==0 ) || (phy->id ==PHY_REVISION_MASK )) { +switch (hw->mac.type) { +default : + ret_val =e1000e_get_phy_id (hw); +if (ret_val) + goto out; +if ((phy->id !=0 ) && (phy->id !=PHY_REVISION_MASK )) +break ; +/* fall-through */ +case e1000_pch2lan:/* -* In case the PHY needs to be in mdio slow mode (eg. 82577), +* In case the PHY needs to be in mdio slow mode, * set slow mode and try to get the PHY id again. */ ret_val =e1000_set_mdio_slow_mode_hv (hw);
@@ -352,6 +357,7 @@ static s32 e1000_init_phy_params_pchlan( ret_val =e1000e_get_phy_id (hw);if (ret_val) goto out; +break ; } phy->type =e1000e_get_phy_type_from_id (phy->id);
drivers/net/e1000e/phy.c +14 -0
@@ -226,6 +226,13 @@ s32 e1000e_read_phy_reg_mdic(struct e100 } *data = (u16 ) mdic; +/* +* Allow some time after each MDIC transaction to avoid +* reading duplicate data in the next MDIC transaction. +*/ +if (hw->mac.type == e1000_pch2lan) +udelay (100 ); +return 0 ; }
@@ -279,6 +286,13 @@ s32 e1000e_write_phy_reg_mdic(struct e10return -E1000_ERR_PHY ; } +/* +* Allow some time after each MDIC transaction to avoid +* reading duplicate data in the next MDIC transaction. +*/ +if (hw->mac.type == e1000_pch2lan) +udelay (100 ); +return 0 ; }
PATCH 57/73 Staging: comedi: Add MODULE_LICENSE and similar to NI modules
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ian Abbott <[email protected]>
commit 3c323c01b6bd5fd01be21a8f0cdc11e55997aa06 upstream.
As mentioned by W. Trevor King on the [email protected] list on "Thu, 27 Jan 2011 18:52:15 -0500", "Message-ID:
<[email protected]>", the ni_pcimio module is missing module metadata, including a license.
This patch adds module metadata to all the NI comedi driver modules. It also removes a duplicate MODULE_LICENSE("GPL") line from the "mite" module.
--- drivers/staging/comedi/drivers/mite.c | 2 -- drivers/staging/comedi/drivers/ni_6527.c | 4 ++++ drivers/staging/comedi/drivers/ni_65xx.c | 4 ++++ drivers/staging/comedi/drivers/ni_660x.c | 4 ++++ drivers/staging/comedi/drivers/ni_670x.c | 4 ++++ drivers/staging/comedi/drivers/ni_pcidio.c | 4 ++++ drivers/staging/comedi/drivers/ni_pcimio.c | 4 ++++ 7 files changed, 24 insertions(+), 2 deletions(-)
drivers/staging/comedi/drivers/mite.c +0 -2
@@ -61,8 +61,6 @@#define PCI_DAQ_SIZE 4096#define PCI_DAQ_SIZE_660X 8192 -MODULE_LICENSE ("GPL" ); -struct mite_struct *mite_devices;EXPORT_SYMBOL (mite_devices);
drivers/staging/comedi/drivers/ni_6527.c +4 -0
@@ -527,3 +527,7 @@ static void __exit driver_ni6527_cleanupmodule_init (driver_ni6527_init_module);module_exit (driver_ni6527_cleanup_module); + +MODULE_AUTHOR ("Comedi http://www.comedi.org" ); +MODULE_DESCRIPTION ("Comedi low-level driver" ); +MODULE_LICENSE ("GPL" );
drivers/staging/comedi/drivers/ni_65xx.c +4 -0
@@ -871,3 +871,7 @@ static void __exit driver_ni_65xx_cleanumodule_init (driver_ni_65xx_init_module);module_exit (driver_ni_65xx_cleanup_module); + +MODULE_AUTHOR ("Comedi http://www.comedi.org" ); +MODULE_DESCRIPTION ("Comedi low-level driver" ); +MODULE_LICENSE ("GPL" );
drivers/staging/comedi/drivers/ni_660x.c +4 -0
@@ -1421,3 +1421,7 @@ static int ni_660x_dio_insn_config(struc };return 0 ; } + +MODULE_AUTHOR ("Comedi http://www.comedi.org" ); +MODULE_DESCRIPTION ("Comedi low-level driver" ); +MODULE_LICENSE ("GPL" );
drivers/staging/comedi/drivers/ni_670x.c +4 -0
@@ -384,3 +384,7 @@ static int ni_670x_find_device(struct comite_list_devices ();return -EIO ; } + +MODULE_AUTHOR ("Comedi http://www.comedi.org" ); +MODULE_DESCRIPTION ("Comedi low-level driver" ); +MODULE_LICENSE ("GPL" );
drivers/staging/comedi/drivers/ni_pcidio.c +4 -0
@@ -1354,3 +1354,7 @@ static void __exit driver_pcidio_cleanupmodule_init (driver_pcidio_init_module);module_exit (driver_pcidio_cleanup_module); + +MODULE_AUTHOR ("Comedi http://www.comedi.org" ); +MODULE_DESCRIPTION ("Comedi low-level driver" ); +MODULE_LICENSE ("GPL" );
drivers/staging/comedi/drivers/ni_pcimio.c +4 -0
@@ -1853,3 +1853,7 @@ static int pcimio_dio_change(struct comereturn 0 ; } + +MODULE_AUTHOR ("Comedi http://www.comedi.org" ); +MODULE_DESCRIPTION ("Comedi low-level driver" ); +MODULE_LICENSE ("GPL" );
PATCH 58/73 fix cfg80211_wext_siwfreq lock ordering...
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Daniel J Blueman <[email protected]>
commit 4f919a3bc54da01db829c520ce4b1fabfde1c3f7 upstream.
I previously managed to reproduce a hang while scanning wireless channels (reproducible with airodump-ng hopping channels); subsequent lockdep instrumentation revealed a lock ordering issue.
Without knowing the design intent, it looks like the locks should be taken in reverse order; please comment.
=======================================================
[ INFO: possible circular locking dependency detected ] 2.6.38-rc5-341cd #4
-------------------------------------------------------
airodump-ng/15445 is trying to acquire lock:
(&rdev->devlist_mtx){+.+.+.}, at: [<ffffffff816b1266>]cfg80211_wext_siwfreq+0xc6/0x100
but task is already holding lock:
(&wdev->mtx){+.+.+.}, at: [<ffffffff816b125c>] cfg80211_wext_siwfreq+0xbc/0x100
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&wdev->mtx){+.+.+.}:
[<ffffffff810a79d6>] lock_acquire+0xc6/0x280
[<ffffffff816d6bce>] mutex_lock_nested+0x6e/0x4b0
[<ffffffff81696080>] cfg80211_netdev_notifier_call+0x430/0x5f0
[<ffffffff8109351b>] notifier_call_chain+0x8b/0x100
[<ffffffff810935b1>] raw_notifier_call_chain+0x11/0x20
[<ffffffff81576d92>] call_netdevice_notifiers+0x32/0x60
[<ffffffff815771a4>] __dev_notify_flags+0x34/0x80
[<ffffffff81577230>] dev_change_flags+0x40/0x70
[<ffffffff8158587c>] do_setlink+0x1fc/0x8d0
[<ffffffff81586042>] rtnl_setlink+0xf2/0x140
[<ffffffff81586923>] rtnetlink_rcv_msg+0x163/0x270
[<ffffffff8159d741>] netlink_rcv_skb+0xa1/0xd0
[<ffffffff815867b0>] rtnetlink_rcv+0x20/0x30
[<ffffffff8159d39a>] netlink_unicast+0x2ba/0x300
[<ffffffff8159dd57>] netlink_sendmsg+0x267/0x3e0
[<ffffffff8155e364>] sock_sendmsg+0xe4/0x110
[<ffffffff8155f3a3>] sys_sendmsg+0x253/0x3b0
[<ffffffff81003192>] system_call_fastpath+0x16/0x1b-> #0 (&rdev->devlist_mtx){+.+.+.}:
[<ffffffff810a7222>] __lock_acquire+0x1622/0x1d10
[<ffffffff810a79d6>] lock_acquire+0xc6/0x280
[<ffffffff816d6bce>] mutex_lock_nested+0x6e/0x4b0
[<ffffffff816b1266>] cfg80211_wext_siwfreq+0xc6/0x100
[<ffffffff816b2fad>] ioctl_standard_call+0x5d/0xd0
[<ffffffff816b3223>] T.808+0x163/0x170
[<ffffffff816b326a>] wext_handle_ioctl+0x3a/0x90
[<ffffffff815798d2>] dev_ioctl+0x6f2/0x830
[<ffffffff8155cf3d>] sock_ioctl+0xfd/0x290
[<ffffffff8117dffd>] do_vfs_ioctl+0x9d/0x590
[<ffffffff8117e53a>] sys_ioctl+0x4a/0x80
[<ffffffff81003192>] system_call_fastpath+0x16/0x1bother info that might help us debug this:
2 locks held by airodump-ng/15445:
#0: (rtnl_mutex){+.+.+.}, at: [<ffffffff81586782>] rtnl_lock+0x12/0x20 #1: (&wdev->mtx){+.+.+.}, at: [<ffffffff816b125c>]
cfg80211_wext_siwfreq+0xbc/0x100 stack backtrace: Pid: 15445, comm: airodump-ng Not tainted 2.6.38-rc5-341cd #4 Call Trace: [<ffffffff810a3f0a>] ? print_circular_bug+0xfa/0x100 [<ffffffff810a7222>] ? __lock_acquire+0x1622/0x1d10 [<ffffffff810a1f99>] ? trace_hardirqs_off_caller+0x29/0xc0 [<ffffffff810a79d6>] ? lock_acquire+0xc6/0x280 [<ffffffff816b1266>] ? cfg80211_wext_siwfreq+0xc6/0x100 [<ffffffff810a31d7>] ? mark_held_locks+0x67/0x90 [<ffffffff816d6bce>] ? mutex_lock_nested+0x6e/0x4b0 [<ffffffff816b1266>] ? cfg80211_wext_siwfreq+0xc6/0x100 [<ffffffff810a31d7>] ? mark_held_locks+0x67/0x90 [<ffffffff816b1266>] ? cfg80211_wext_siwfreq+0xc6/0x100 [<ffffffff816b1266>] ? cfg80211_wext_siwfreq+0xc6/0x100 [<ffffffff816b2fad>] ? ioctl_standard_call+0x5d/0xd0 [<ffffffff8157818b>] ? __dev_get_by_name+0x9b/0xc0 [<ffffffff816b2f50>] ? ioctl_standard_call+0x0/0xd0 [<ffffffff816b3223>] ? T.808+0x163/0x170 [<ffffffff8112ddf2>] ? might_fault+0x72/0xd0 [<ffffffff816b326a>] ? wext_handle_ioctl+0x3a/0x90 [<ffffffff8112de3b>] ? might_fault+0xbb/0xd0 [<ffffffff815798d2>] ? dev_ioctl+0x6f2/0x830 [<ffffffff810a1bae>] ? put_lock_stats+0xe/0x40 [<ffffffff810a1c8c>] ? lock_release_holdtime+0xac/0x150 [<ffffffff8155cf3d>] ? sock_ioctl+0xfd/0x290 [<ffffffff8117dffd>] ? do_vfs_ioctl+0x9d/0x590 [<ffffffff8116c8ff>] ? fget_light+0x1df/0x3c0 [<ffffffff8117e53a>] ? sys_ioctl+0x4a/0x80 [<ffffffff81003192>] ? system_call_fastpath+0x16/0x1b
--- net/wireless/wext-compat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/wireless/wext-compat.c +2 -2
@@ -802,11 +802,11 @@ int cfg80211_wext_siwfreq(struct net_devreturn freq;if (freq ==0 )return -EINVAL ; -wdev_lock (wdev);mutex_lock (&rdev->devlist_mtx); +wdev_lock (wdev); err =cfg80211_set_freq (rdev, wdev, freq,NL80211_CHAN_NO_HT ); -mutex_unlock (&rdev->devlist_mtx);wdev_unlock (wdev); +mutex_unlock (&rdev->devlist_mtx);return err;default :return -EOPNOTSUPP ;
PATCH 59/73 tg3: Restrict phy ioctl access
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Matt Carlson <[email protected]>
commit ed199facd070f8e551dc16a2ae1baa01d8d28ed4 upstream.
If management firmware is present and the device is down, the firmware will assume control of the phy. If a phy access were allowed from the host, it will collide with firmware phy accesses, resulting in unpredictable behavior. This patch fixes the problem by disallowing phy accesses during the problematic condition.
--- drivers/net/tg3.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/net/tg3.c +6 -2
@@ -11165,7 +11165,9 @@ static int tg3_ioctl(struct net_device *if (tp->phy_flags &TG3_PHYFLG_PHY_SERDES )break ;/* We have no PHY */ -if (tp->phy_flags &TG3_PHYFLG_IS_LOW_POWER ) +if ((tp->phy_flags &TG3_PHYFLG_IS_LOW_POWER ) || + ((tp->tg3_flags &TG3_FLAG_ENABLE_ASF ) && + !netif_running (dev)))return -EAGAIN ;spin_lock_bh (&tp->lock);
@@ -11181,7 +11183,9 @@ static int tg3_ioctl(struct net_device *if (tp->phy_flags &TG3_PHYFLG_PHY_SERDES )break ;/* We have no PHY */ -if (tp->phy_flags &TG3_PHYFLG_IS_LOW_POWER ) +if ((tp->phy_flags &TG3_PHYFLG_IS_LOW_POWER ) || + ((tp->tg3_flags &TG3_FLAG_ENABLE_ASF ) && + !netif_running (dev)))return -EAGAIN ;spin_lock_bh (&tp->lock);
PATCH 60/73 drm/i915: fix memory corruption with GM965 and >4GB RAM
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jan Niehusmann <[email protected]>
commit 6927faf30920b8c03dfa007e732642a1f1f20089 upstream.
On a Thinkpad x61s, I noticed some memory corruption when plugging/unplugging the external VGA connection. The symptoms are that 4 bytes at the beginning of a page get overwritten by zeroes. The address of the corruption varies when rebooting the machine, but stays constant while it's running (so it's possible to repeatedly write some data and then corrupt it again by plugging the cable).
Further investigation revealed that the corrupted address is (dev_priv->status_page_dmah->busaddr & 0xffffffff), ie. the beginning of the hardware status page of the i965 graphics card, cut to 32 bits.
So it seems that for some memory access, the hardware uses only 32 bit addressing. If the hardware status page is located >4GB, this corrupts unrelated memory.
--- drivers/gpu/drm/i915/i915_dma.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/gpu/drm/i915/i915_dma.c +11 -0
@@ -1943,6 +1943,17 @@ int i915_driver_load(struct drm_device *if (IS_GEN2 (dev))dma_set_coherent_mask (&dev->pdev->dev,DMA_BIT_MASK (30 )); +/* 965GM sometimes incorrectly writes to hardware status page (HWS) +* using 32bit addressing, overwriting memory if HWS is located +* above 4GB. +* +* The documentation also mentions an issue with undefined +* behaviour if any general state is accessed within a page above 4GB, +* which also needs to be handled carefully. +*/ +if (IS_BROADWATER (dev) ||IS_CRESTLINE (dev)) +dma_set_coherent_mask (&dev->pdev->dev,DMA_BIT_MASK (32 )); + dev_priv->regs =ioremap (base, size);if (!dev_priv->regs) {DRM_ERROR ("failed to map registers\n" );
PATCH 61/73 blk-throttle: Do not use kblockd workqueue for throtl work
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Vivek Goyal <[email protected]>
commit 450adcbe518ab3a3953d8475309525d22de77cba upstream.
o Dominik Klein reported a system hang issue while doing some blkio throttling testing.
https://lkml.org/lkml/2011/2/24/173
o Some tracing revealed that CFQ was not dispatching any more jobs as queue unplug was not happening. And queue unplug was not happening because unplug work was not being called as there was one throttling work on same cpu which as not finished yet. And throttling work had not finished as it was tyring to dispatch a bio to CFQ but all the request descriptors were consume to it was put to sleep.
o So basically it is a cyclic dependecny between CFQ unplug work and throtl dispatch work. Tejun suggested that use separate workqueue for such cases.
o This patch uses a separate workqueue for throttle related work and does not rely on kblockd workqueue anymore.
--- block/blk-core.c | 7 ------- block/blk-throttle.c | 29 ++++++++++++++++++----------- include/linux/blkdev.h | 3 --- 3 files changed, 18 insertions(+), 21 deletions(-)
block/blk-core.c +0 -7
@@ -2610,13 +2610,6 @@ int kblockd_schedule_work(struct request }EXPORT_SYMBOL (kblockd_schedule_work); -int kblockd_schedule_delayed_work (struct request_queue *q, -struct delayed_work *dwork,unsigned long delay) -{ -return queue_delayed_work (kblockd_workqueue, dwork, delay); -} -EXPORT_SYMBOL (kblockd_schedule_delayed_work); - int __init blk_dev_init(void) { BUILD_BUG_ON(__REQ_NR_BITS > 8 *
block/blk-throttle.c +18 -11
@@ -20,6 +20,11 @@ static int throtl_quantum = 32;/* Throttling is performed over 100ms slice and after that slice is renewed */ static unsigned long throtl_slice =HZ /10 ;/* 100 ms */ +/* A workqueue to queue throttle related work */ +static struct workqueue_struct *kthrotld_workqueue; +static void throtl_schedule_delayed_work (struct throtl_data *td, +unsigned long delay); +struct throtl_rb_root {struct rb_root rb;struct rb_node *left;
@@ -337,10 +342,9 @@ static void throtl_schedule_next_dispatcupdate_min_dispatch_time (st);if (time_before_eq (st->min_disptime, jiffies)) -throtl_schedule_delayed_work (td->queue,0 ); +throtl_schedule_delayed_work (td,0 );else -throtl_schedule_delayed_work (td->queue, - (st->min_disptime - jiffies)); +throtl_schedule_delayed_work (td, (st->min_disptime - jiffies)); } static inline void
@@ -807,10 +811,10 @@ void blk_throtl_work(struct work_struct }/* Call with queue lock held */ -void throtl_schedule_delayed_work (struct request_queue *q,unsigned long delay) +static void +throtl_schedule_delayed_work (struct throtl_data *td,unsigned long delay) { -struct throtl_data *td = q->td;struct delayed_work *dwork = &td->throtl_work;if (total_nr_queued (td) >0 ) {
@@ -819,12 +823,11 @@ void throtl_schedule_delayed_work(struct* Cancel that and schedule a new one. */ __cancel_delayed_work (dwork); -kblockd_schedule_delayed_work (q, dwork, delay); +queue_delayed_work (kthrotld_workqueue, dwork, delay);throtl_log (td,"schedule work. delay=%lu jiffies=%lu" , delay, jiffies); } } -EXPORT_SYMBOL (throtl_schedule_delayed_work);static void throtl_destroy_tg (struct throtl_data *td,struct throtl_grp *tg)
@@ -912,7 +915,7 @@ static void throtl_update_blkio_group_resmp_mb__after_atomic_inc ();/* Schedule a work now to process the limit change */ -throtl_schedule_delayed_work (td->queue,0 ); +throtl_schedule_delayed_work (td,0 ); } static void throtl_update_blkio_group_write_bps(void *key,
@@ -926,7 +929,7 @@ static void throtl_update_blkio_group_wrsmp_mb__before_atomic_inc ();atomic_inc (&td->limits_changed);smp_mb__after_atomic_inc (); -throtl_schedule_delayed_work (td->queue,0 ); +throtl_schedule_delayed_work (td,0 ); } static void throtl_update_blkio_group_read_iops(void *key,
@@ -940,7 +943,7 @@ static void throtl_update_blkio_group_resmp_mb__before_atomic_inc ();atomic_inc (&td->limits_changed);smp_mb__after_atomic_inc (); -throtl_schedule_delayed_work (td->queue,0 ); +throtl_schedule_delayed_work (td,0 ); } static void throtl_update_blkio_group_write_iops(void *key,
@@ -954,7 +957,7 @@ static void throtl_update_blkio_group_wrsmp_mb__before_atomic_inc ();atomic_inc (&td->limits_changed);smp_mb__after_atomic_inc (); -throtl_schedule_delayed_work (td->queue,0 ); +throtl_schedule_delayed_work (td,0 ); }void throtl_shutdown_timer_wq (struct request_queue *q)
@@ -1127,6 +1130,10 @@ void blk_throtl_exit(struct request_queustatic int __init throtl_init (void ) { + kthrotld_workqueue =alloc_workqueue ("kthrotld" ,WQ_MEM_RECLAIM ,0 ); +if (!kthrotld_workqueue) +panic ("Failed to create kthrotld\n" ); +blkio_policy_register (&blkio_policy_throtl);return 0 ; }
include/linux/blkdev.h +0 -3
@@ -1089,7 +1089,6 @@ static inline void put_dev_sector(Sectorstruct work_struct ;int kblockd_schedule_work (struct request_queue *q,struct work_struct *work); -int kblockd_schedule_delayed_work (struct request_queue *q,struct delayed_work *dwork,unsigned long delay);#ifdef CONFIG_BLK_CGROUP /*
@@ -1137,7 +1136,6 @@ static inline uint64_t rq_io_start_time_extern int blk_throtl_init (struct request_queue *q);extern void blk_throtl_exit (struct request_queue *q);extern int blk_throtl_bio (struct request_queue *q,struct bio **bio); -extern void throtl_schedule_delayed_work (struct request_queue *q,unsigned long delay);extern void throtl_shutdown_timer_wq (struct request_queue *q);#else /* CONFIG_BLK_DEV_THROTTLING */ static inline int blk_throtl_bio (struct request_queue *q,struct bio **bio)
@@ -1147,7 +1145,6 @@ static inline int blk_throtl_bio(structstatic inline int blk_throtl_init (struct request_queue *q) {return 0 ; }static inline int blk_throtl_exit (struct request_queue *q) {return 0 ; } -static inline void throtl_schedule_delayed_work (struct request_queue *q,unsigned long delay) {}static inline void throtl_shutdown_timer_wq (struct request_queue *q) {}#endif /* CONFIG_BLK_DEV_THROTTLING */
PATCH 62/73 block: add @force_kblockd to __blk_run_queue()
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tejun Heo <[email protected]>
commit 1654e7411a1ad4999fe7890ef51d2a2bbb1fcf76 upstream.
__blk_run_queue() automatically either calls q->request_fn() directly or schedules kblockd depending on whether the function is recursed. blk-flush implementation needs to be able to explicitly choose kblockd. Add @force_kblockd.
All the current users are converted to specify %false for the parameter and this patch doesn't introduce any behavior change.
stable: This is prerequisite for fixing ide oops caused by the new
blk-flush implementation.
--- block/blk-core.c | 11 ++++++----- block/blk-flush.c | 2 +- block/cfq-iosched.c | 6 +++--- block/elevator.c | 4 ++-- drivers/scsi/scsi_lib.c | 2 +- drivers/scsi/scsi_transport_fc.c | 2 +- include/linux/blkdev.h | 2 +- 7 files changed, 15 insertions(+), 14 deletions(-)
block/blk-core.c +6 -5
@@ -352,7 +352,7 @@ void blk_start_queue(struct request_queuWARN_ON (!irqs_disabled ());queue_flag_clear (QUEUE_FLAG_STOPPED , q); -__blk_run_queue (q); +__blk_run_queue (q, false); }EXPORT_SYMBOL (blk_start_queue);
@@ -403,13 +403,14 @@ EXPORT_SYMBOL(blk_sync_queue);/** * __blk_run_queue - run a single device queue * @q: The queue to run +* @force_kblockd: Don't run @q->request_fn directly. Use kblockd. * * Description: * See @blk_run_queue. This variant must be called with the queue lock * held and interrupts disabled. * */ -void __blk_run_queue (struct request_queue *q) +void __blk_run_queue (struct request_queue *q,bool force_kblockd) {blk_remove_plug (q);
@@ -423,7 +424,7 @@ void __blk_run_queue(struct request_queu* Only recurse once to avoid overrunning the stack, let the unplug * handling reinvoke the handler shortly if we already got there. */ -if (!queue_flag_test_and_set (QUEUE_FLAG_REENTER , q)) { +if (!force_kblockd && !queue_flag_test_and_set (QUEUE_FLAG_REENTER , q)) { q->request_fn (q);queue_flag_clear (QUEUE_FLAG_REENTER , q); }else {
@@ -446,7 +447,7 @@ void blk_run_queue(struct request_queueunsigned long flags;spin_lock_irqsave (q->queue_lock, flags); -__blk_run_queue (q); +__blk_run_queue (q, false);spin_unlock_irqrestore (q->queue_lock, flags); }EXPORT_SYMBOL (blk_run_queue);
@@ -1053,7 +1054,7 @@ void blk_insert_request(struct request_qdrive_stat_acct (rq,1 );__elv_add_request (q, rq, where,0 ); -__blk_run_queue (q); +__blk_run_queue (q, false);spin_unlock_irqrestore (q->queue_lock, flags); }EXPORT_SYMBOL (blk_insert_request);
block/blk-flush.c +1 -1
@@ -69,7 +69,7 @@ static void blk_flush_complete_seq_end_i* queue. Kick the queue in those cases. */ if (was_empty && next_rq) -__blk_run_queue (q); +__blk_run_queue (q, false); }static void pre_flush_end_io (struct request *rq,int error)
block/cfq-iosched.c +3 -3
@@ -3335,7 +3335,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, s cfqd->busy_queues > 1) { cfq_del_timer(cfqd, cfqq); cfq_clear_cfqq_wait_request(cfqq); - __blk_run_queue(cfqd->queue); + __blk_run_queue(cfqd->queue, false); } else {cfq_blkiocg_update_idle_time_stats ( &cfqq->cfqg->blkg);
@@ -3350,7 +3350,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, s* this new queue is RT and the current one is BE */ cfq_preempt_queue (cfqd, cfqq); -__blk_run_queue (cfqd->queue); +__blk_run_queue (cfqd->queue, false); } }
@@ -3711,7 +3711,7 @@ static void cfq_kick_queue(struct work_sstruct request_queue *q = cfqd->queue;spin_lock_irq (q->queue_lock); -__blk_run_queue (cfqd->queue); +__blk_run_queue (cfqd->queue, false);spin_unlock_irq (q->queue_lock); }
block/elevator.c +2 -2
@@ -602,7 +602,7 @@ void elv_quiesce_start(struct request_qu*/ elv_drain_elevator (q);while (q->rq.elvpriv) { -__blk_run_queue (q); +__blk_run_queue (q, false);spin_unlock_irq (q->queue_lock);msleep (10 );spin_lock_irq (q->queue_lock);
@@ -651,7 +651,7 @@ void elv_insert(struct request_queue *q,* with anything. There's no point in delaying queue * processing. */ -__blk_run_queue (q); +__blk_run_queue (q, false);break ;case ELEVATOR_INSERT_SORT :
drivers/scsi/scsi_lib.c +1 -1
@@ -443,7 +443,7 @@ static void scsi_run_queue(struct reques &sdev->request_queue->queue_flags);if (flagset)queue_flag_set (QUEUE_FLAG_REENTER , sdev->request_queue); -__blk_run_queue (sdev->request_queue); +__blk_run_queue (sdev->request_queue, false);if (flagset)queue_flag_clear (QUEUE_FLAG_REENTER , sdev->request_queue);spin_unlock (sdev->request_queue->queue_lock);
drivers/scsi/scsi_transport_fc.c +1 -1
@@ -3829,7 +3829,7 @@ fc_bsg_goose_queue(struct fc_rport *rpor !test_bit (QUEUE_FLAG_REENTER , &rport->rqst_q->queue_flags);if (flagset)queue_flag_set (QUEUE_FLAG_REENTER , rport->rqst_q); -__blk_run_queue (rport->rqst_q); +__blk_run_queue (rport->rqst_q, false);if (flagset)queue_flag_clear (QUEUE_FLAG_REENTER , rport->rqst_q);spin_unlock_irqrestore (rport->rqst_q->queue_lock, flags);
include/linux/blkdev.h +1 -1
@@ -700,7 +700,7 @@ extern void blk_start_queue(struct requeextern void blk_stop_queue (struct request_queue *q);extern void blk_sync_queue (struct request_queue *q);extern void __blk_stop_queue (struct request_queue *q); -extern void __blk_run_queue (struct request_queue *); +extern void __blk_run_queue (struct request_queue *q,bool force_kblockd);extern void blk_run_queue (struct request_queue *); extern int blk_rq_map_user(struct request_queue *, struct request *, struct rq_map_data *, void __user *, unsigned long,
PATCH 63/73 block: blk-flush shouldnt call directly into q->request_fn() __blk_run_queue()
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tejun Heo <[email protected]>
commit 255bb490c8c27eed484d538efe6ef6a7473bd3f6 upstream.
blk-flush decomposes a flush into sequence of multiple requests. On completion of a request, the next one is queued; however, block layer must not implicitly call into q->request_fn() directly from completion path. This makes the queue behave unexpectedly when seen from the drivers and violates the assumption that q->request_fn() is called with process context + queue_lock.
This patch makes blk-flush the following two changes to make sure q->request_fn() is not called directly from request completion path.
- blk_flush_complete_seq_end_io() now asks __blk_run_queue() to always use kblockd instead of calling directly into q->request_fn().
- queue_next_fseq() uses ELEVATOR_INSERT_REQUEUE instead of ELEVATOR_INSERT_FRONT so that elv_insert() doesn't try to unplug the request queue directly.
Reported by Jan in the following threads.
http://thread.gmane.org/gmane.linux.ide/48778
http://thread.gmane.org/gmane.linux.ide/48786
stable: applicable to v2.6.37.
--- block/blk-flush.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
block/blk-flush.c +5 -3
@@ -66,10 +66,12 @@ static void blk_flush_complete_seq_end_i/* * Moving a request silently to empty queue_head may stall the -* queue. Kick the queue in those cases. +* queue. Kick the queue in those cases. This function is called +* from request completion path and calling directly into +* request_fn may confuse the driver. Always use kblockd. */ if (was_empty && next_rq) -__blk_run_queue (q, false); +__blk_run_queue (q, true); }static void pre_flush_end_io (struct request *rq,int error)
@@ -130,7 +132,7 @@ static struct request *queue_next_fseq(sBUG (); } -elv_insert (q, rq,ELEVATOR_INSERT_FRONT ); +elv_insert (q, rq,ELEVATOR_INSERT_REQUEUE );return rq; }
PATCH 64/73 block: kill loop_mutex
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Petr Uzel <[email protected]>
commit fd51469fb68b987032e46297e0a4fe9020063c20 upstream.
Following steps lead to deadlock in kernel:
dd if=/dev/zero of=img bs=512 count=1000
losetup -f img
mkfs.ext2 /dev/loop0
mount -t ext2 -o loop /dev/loop0 mnt
umount mnt/
Stacktrace:
[<c102ec04>] irq_exit+0x36/0x59 [<c101502c>] smp_apic_timer_interrupt+0x6b/0x75 [<c127f639>] apic_timer_interrupt+0x31/0x38 [<c101df88>] mutex_spin_on_owner+0x54/0x5b [<fe2250e9>] lo_release+0x12/0x67 [loop] [<c10c4eae>] __blkdev_put+0x7c/0x10c [<c10a4da5>] fput+0xd5/0x1aa [<fe2250cf>] loop_clr_fd+0x1a9/0x1b1 [loop] [<fe225110>] lo_release+0x39/0x67 [loop] [<c10c4eae>] __blkdev_put+0x7c/0x10c [<c10a59d9>] deactivate_locked_super+0x17/0x36 [<c10b6f37>] sys_umount+0x27e/0x2a5 [<c10b6f69>] sys_oldumount+0xb/0xe [<c1002897>] sysenter_do_call+0x12/0x26
[<ffffffff>] 0xffffffff
Regression since 2a48fc0ab24241755dc9, which introduced the private loop_mutex as part of the BKL removal process.
As per [1], the mutex can be safely removed.
[1] http://www.gossamer-threads.com/lists/linux/kernel/1341930
Addresses: https://bugzilla.novell.com/show_bug.cgi?id=669394
Addresses: https://bugzilla.kernel.org/show_bug.cgi?id=29172
--- drivers/block/loop.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/block/loop.c +0 -5
@@ -78,7 +78,6 @@#include <asm/uaccess.h> -static DEFINE_MUTEX (loop_mutex);static LIST_HEAD (loop_devices);static DEFINE_MUTEX (loop_devices_mutex);
@@ -1505,11 +1504,9 @@ static int lo_open(struct block_device * {struct loop_device *lo = bdev->bd_disk->private_data; -mutex_lock (&loop_mutex);mutex_lock (&lo->lo_ctl_mutex); lo->lo_refcnt++;mutex_unlock (&lo->lo_ctl_mutex); -mutex_unlock (&loop_mutex);return 0 ; }
@@ -1519,7 +1516,6 @@ static int lo_release(struct gendisk *distruct loop_device *lo = disk->private_data;int err; -mutex_lock (&loop_mutex);mutex_lock (&lo->lo_ctl_mutex);if (--lo->lo_refcnt)
@@ -1544,7 +1540,6 @@ static int lo_release(struct gendisk *di out:mutex_unlock (&lo->lo_ctl_mutex); out_unlocked: -mutex_unlock (&loop_mutex);return 0 ; }
PATCH 65/73 ath9k_htc: Fix an endian issue
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Sujith Manoharan <[email protected]>
commit 2c27392dc4d4f5ee8a3967a520b8f6cac0418031 upstream.
The stream length/tag fields have to be in little endian format. Fixing this makes the driver work on big-endian platforms.
--- drivers/net/wireless/ath/ath9k/hif_usb.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/net/wireless/ath/ath9k/hif_usb.c +5 -4
@@ -210,8 +210,9 @@ static int __hif_usb_tx(struct hif_devicstruct tx_buf *tx_buf =NULL ;struct sk_buff *nskb =NULL ;int ret =0 , i; -u16 *hdr, tx_skb_cnt =0 ; +u16 tx_skb_cnt =0 ;u8 *buf; +__le16 *hdr;if (hif_dev->tx.tx_skb_cnt ==0 )return 0 ;
@@ -236,9 +237,9 @@ static int __hif_usb_tx(struct hif_devic buf = tx_buf->buf; buf += tx_buf->offset; - hdr = (u16 *)buf; - *hdr++ = nskb->len; - *hdr++ =ATH_USB_TX_STREAM_MODE_TAG ; + hdr = (__le16 *)buf; + *hdr++ =cpu_to_le16 (nskb->len); + *hdr++ =cpu_to_le16 (ATH_USB_TX_STREAM_MODE_TAG ); buf +=4 ;memcpy (buf, nskb->data, nskb->len); tx_buf->len = nskb->len +4 ;
PATCH 66/73 p54usb: add Senao NUB-350 usbid
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Christian Lamparter <[email protected]>
commit 2b799a6b25bb9f9fbc478782cd9503e8066ab618 upstream.
--- drivers/net/wireless/p54/p54usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/p54/p54usb.c +1 -0
@@ -98,6 +98,7 @@ static struct usb_device_id p54u_table[] {USB_DEVICE(0x1413, 0x5400)}, /* Telsey 802.11g USB2.0 Adapter */ {USB_DEVICE(0x1435, 0x0427)}, /* Inventel UR054G */ {USB_DEVICE(0x1668, 0x1050)}, /* Actiontec 802UIG-1 */ + {USB_DEVICE(0x1740, 0x1000)}, /* Senao NUB-350 */ {USB_DEVICE(0x2001, 0x3704)}, /* DLink DWL-G122 rev A2 */ {USB_DEVICE(0x2001, 0x3705)}, /* D-Link DWL-G120 rev C1 */ {USB_DEVICE(0x413c, 0x5513)}, /* Dell WLA3310 USB Wireless Adapter */
PATCH 67/73 nilfs2: fix regression that i-flag is not set on changeless checkpoints
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ryusuke Konishi <[email protected]>
commit 72746ac643928f6c3113b5aa783d8ea1b13949d2 upstream.
According to the report from Jiro SEKIBA titled "regression in 2.6.37?" (Message-Id: <8739n8vs1f.wl%[email protected]>), on 2.6.37 and later kernels, lscp command no longer displays "i" flag on checkpoints that snapshot operations or garbage collection created.
This is a regression of nilfs2 checkpointing function, and it's critical since it broke behavior of a part of nilfs2 applications. For instance, snapshot manager of TimeBrowse gets to create meaningless snapshots continuously; snapshot creation triggers another checkpoint, but applications cannot distinguish whether the new checkpoint contains meaningful changes or not without the i-flag.
This patch fixes the regression and brings that application behavior back to normal.
--- fs/nilfs2/segment.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nilfs2/segment.c +2 -1
@@ -430,7 +430,8 @@ static void nilfs_segctor_begin_finfo(stnilfs_segctor_map_segsum_entry ( sci, &sci->sc_binfo_ptr,sizeof (struct nilfs_finfo )); -if (inode->i_sb && !test_bit (NILFS_SC_HAVE_DELTA , &sci->sc_flags)) +if (NILFS_I (inode)->i_root && + !test_bit (NILFS_SC_HAVE_DELTA , &sci->sc_flags))set_bit (NILFS_SC_HAVE_DELTA , &sci->sc_flags);/* skip finfo */ }
PATCH 68/73 carl9170: add Airlive X.USB a/b/g/n USBID
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jan Puk <[email protected]>
commit c86664e5a285af1afa06416e450e7c4af04daa7c upstream.
"AirLive X.USB now works perfectly under a Linux
environment!"
--- drivers/net/wireless/ath/carl9170/usb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/ath/carl9170/usb.c +2 -0
@@ -118,6 +118,8 @@ static struct usb_device_id carl9170_usb { USB_DEVICE(0x057c, 0x8402) },/* Qwest/Actiontec 802AIN Wireless N USB Network Adapter */ { USB_DEVICE(0x1668, 0x1200) }, +/* Airlive X.USB a/b/g/n */ + { USB_DEVICE(0x1b75, 0x9170) }, /* terminate */ {}
PATCH 69/73 r8169: disable ASPM
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Stanislaw Gruszka <[email protected]>
commit ba04c7c93bbcb48ce880cf75b6e9dffcd79d4c7b upstream.
For some time is known that ASPM is causing troubles on r8169, i.e. make device randomly stop working without any errors in dmesg.
Currently Tomi Leppikangas reports that system with r8169 device hangs with MCE errors when ASPM is enabled:
https://bugzilla.redhat.com/show_bug.cgi?id=642861#c4
Lets disable ASPM for r8169 devices at all, to avoid problems with r8169 PCIe devices at least for some users.
--- drivers/net/r8169.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/r8169.c +6 -0
@@ -24,6 +24,7 @@#include <linux/init.h> #include <linux/dma-mapping.h> #include <linux/pm_runtime.h> +#include <linux/pci-aspm.h> #include <asm/system.h> #include <asm/io.h>
@@ -3047,6 +3048,11 @@ rtl8169_init_one(struct pci_dev *pdev, c mii->reg_num_mask =0x1f ; mii->supports_gmii = !!(cfg->features &RTL_FEATURE_GMII ); +/* disable ASPM completely as that cause random device stop working +* problems as well as full system hangs for some PCIe devices users */ +pci_disable_link_state (pdev,PCIE_LINK_STATE_L0S |PCIE_LINK_STATE_L1 | +PCIE_LINK_STATE_CLKPM ); +/* enable device (incl. PCI PM wakeup and hotplug setup) */ rc =pci_enable_device (pdev);if (rc <0 ) {
PATCH 70/73 dccp: fix oops on Reset after close
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Gerrit Renker <[email protected]>
commit 720dc34bbbe9493c7bd48b2243058b4e447a929d upstream.
This fixes a bug in the order of dccp_rcv_state_process() that still permitted reception even after closing the socket. A Reset after close thus causes a NULL pointer dereference by not preventing operations on an already torn-down socket.
dccp_v4_do_rcv()
| | state other than OPEN v dccp_rcv_state_process() | | DCCP_PKT_RESET v dccp_rcv_reset() | v
dccp_time_wait()
WARNING: at net/ipv4/inet_timewait_sock.c:141 __inet_twsk_hashdance+0x48/0x128() Modules linked in: arc4 ecb carl9170 rt2870sta(C) mac80211 r8712u(C) crc_ccitt ah [<c0038850>] (unwind_backtrace+0x0/0xec) from [<c0055364>] (warn_slowpath_common) [<c0055364>] (warn_slowpath_common+0x4c/0x64) from [<c0055398>] (warn_slowpath_n) [<c0055398>] (warn_slowpath_null+0x1c/0x24) from [<c02b72d0>] (__inet_twsk_hashd) [<c02b72d0>] (__inet_twsk_hashdance+0x48/0x128) from [<c031caa0>] (dccp_time_wai) [<c031caa0>] (dccp_time_wait+0x40/0xc8) from [<c031c15c>] (dccp_rcv_state_proces) [<c031c15c>] (dccp_rcv_state_process+0x120/0x538) from [<c032609c>] (dccp_v4_do_) [<c032609c>] (dccp_v4_do_rcv+0x11c/0x14c) from [<c0286594>] (release_sock+0xac/0) [<c0286594>] (release_sock+0xac/0x110) from [<c031fd34>] (dccp_close+0x28c/0x380) [<c031fd34>] (dccp_close+0x28c/0x380) from [<c02d9a78>] (inet_release+0x64/0x70)
The fix is by testing the socket state first. Receiving a packet in Closed state now also produces the required "No connection" Reset reply of RFC 4340, 8.3.1.
--- net/dccp/input.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
net/dccp/input.c +3 -4
@@ -621,6 +621,9 @@ int dccp_rcv_state_process(struct sock */* Caller (dccp_v4_do_rcv) will send Reset */ dcb->dccpd_reset_code =DCCP_RESET_CODE_NO_CONNECTION ;return 1 ; + }else if (sk->sk_state ==DCCP_CLOSED ) { + dcb->dccpd_reset_code =DCCP_RESET_CODE_NO_CONNECTION ; +return 1 ; }if (sk->sk_state !=DCCP_REQUESTING && sk->sk_state !=DCCP_RESPOND ) {
@@ -683,10 +686,6 @@ int dccp_rcv_state_process(struct sock * }switch (sk->sk_state) { -case DCCP_CLOSED : - dcb->dccpd_reset_code =DCCP_RESET_CODE_NO_CONNECTION ; -return 1 ; -case DCCP_REQUESTING : queued =dccp_rcv_request_sent_state_process (sk, skb, dh, len);if (queued >=0 )
PATCH 71/73 e1000e: disable broken PHY wakeup for ICH10 LOMs, use MAC wakeup instead
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Bruce Allan <[email protected]>
commit 4def99bbfd46e05c5e03b5b282cb4ee30e27ff19 upstream.
When support for 82577/82578 was added[1] in 2.6.31, PHY wakeup was in- advertently enabled (even though it does not function properly) on ICH10 LOMs. This patch makes it so that the ICH10 LOMs use MAC wakeup instead as was done with the initial support for those devices (i.e. 82567LM-3, 82567LF-3 and 82567V-4).
[1] commit a4f58f5455ba0efda36fb33c37074922d1527a10
--- drivers/net/e1000e/netdev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/e1000e/netdev.c +2 -1
@@ -5884,7 +5884,8 @@ static int __devinit e1000_probe(struct/* APME bit in EEPROM is mapped to WUC.APME */ eeprom_data =er32 (WUC ); eeprom_apme_mask =E1000_WUC_APME ; -if (eeprom_data &E1000_WUC_PHY_WAKE ) +if ((hw->mac.type > e1000_ich10lan) && + (eeprom_data &E1000_WUC_PHY_WAKE )) adapter->flags2 |=FLAG2_HAS_PHY_WAKEUP ; }else if (adapter->flags &FLAG_APME_IN_CTRL3 ) { if (adapter->flags & FLAG_APME_CHECK_PORT_B &&
PATCH 72/73 DNS: Fix a NULL pointer deref when trying to read an error key [CVE-2011-1076]
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: David Howells <[email protected]>
commit 1362fa078dae16776cd439791c6605b224ea6171 upstream.
When a DNS resolver key is instantiated with an error indication, attempts to read that key will result in an oops because user_read() is expecting there to be a payload - and there isn't one [CVE-2011-1076].
Give the DNS resolver key its own read handler that returns the error cached in key->type_data.x[0] as an error rather than crashing.
Also make the kenter() at the beginning of dns_resolver_instantiate() limit the amount of data it prints, since the data is not necessarily NUL-terminated.
The buggy code was added in:
commit 4a2d789267e00b5a1175ecd2ddefcc78b83fbf09 Author: Wang Lei <[email protected]> Date: Wed Aug 11 09:37:58 2010 +0100 Subject: DNS: If the DNS server returns an error, allow that to be cached [ver #2]
This can trivially be reproduced by any user with the following program compiled with -lkeyutils:
#include <stdlib.h>
#include <keyutils.h>
#include <err.h>
static char payload[] = "#dnserror=6";
int main()
{
key_serial_t key;
key = add_key("dns_resolver", "a", payload, sizeof(payload),
KEY_SPEC_SESSION_KEYRING);
if (key == -1)
err(1, "add_key");
if (keyctl_read(key, NULL, 0) == -1)
err(1, "read_key");
return 0;
}What should happen is that keyctl_read() reports error 6 (ENXIO) to the user:
dns-break: read_key: No such device or address
but instead the kernel oopses.
This cannot be reproduced with the 'keyutils add' or 'keyutils padd' commands as both of those cut the data down below the NUL termination that must be included in the data. Without this dns_resolver_instantiate() will return -EINVAL and the key will not be instantiated such that it can be read.
The oops looks like:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000010 IP: [<ffffffff811b99f7>] user_read+0x4f/0x8f PGD 3bdf8067 PUD 385b9067 PMD 0 Oops: 0000 [#1] SMP last sysfs file: /sys/devices/pci0000:00/0000:00:19.0/irq CPU 0 Modules linked in:
Pid: 2150, comm: dns-break Not tainted 2.6.38-rc7-cachefs+ #468 /DG965RY
RIP: 0010:[<ffffffff811b99f7>] [<ffffffff811b99f7>] user_read+0x4f/0x8f RSP: 0018:ffff88003bf47f08 EFLAGS: 00010246 RAX: 0000000000000001 RBX: ffff88003b5ea378 RCX: ffffffff81972368 RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff88003b5ea378 RBP: ffff88003bf47f28 R08: ffff88003be56620 R09: 0000000000000000 R10: 0000000000000395 R11: 0000000000000002 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: ffffffffffffffa1 FS: 00007feab5751700(0000) GS:ffff88003e000000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000010 CR3: 000000003de40000 CR4: 00000000000006f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process dns-break (pid: 2150, threadinfo ffff88003bf46000, task ffff88003be56090) Stack: ffff88003b5ea378 ffff88003b5ea3a0 0000000000000000 0000000000000000 ffff88003bf47f68 ffffffff811b708e ffff88003c442bc8 0000000000000000 00000000004005a0 00007fffba368060 0000000000000000 0000000000000000 Call Trace: [<ffffffff811b708e>] keyctl_read_key+0xac/0xcf [<ffffffff811b7c07>] sys_keyctl+0x75/0xb6 [<ffffffff81001f7b>] system_call_fastpath+0x16/0x1b Code: 75 1f 48 83 7b 28 00 75 18 c6 05 58 2b fb 00 01 be bb 00 00 00 48 c7 c7 76 1c 75 81 e8 13 c2 e9 ff 4c 8b b3 e0 00 00 00 4d 85 ed <41> 0f b7 5e 10 74 2d 4d 85 e4 74 28 e8 98 79 ee ff 49 39 dd 48 RIP [<ffffffff811b99f7>] user_read+0x4f/0x8f RSP <ffff88003bf47f08>
CR2: 0000000000000010
--- Documentation/networking/dns_resolver.txt | 9 ++++++++- net/dns_resolver/dns_key.c | 20 +++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-)
Documentation/networking/dns_resolver.txt +8 -1
@@ -61,7 +61,6 @@ before the more general line given above create dns_resolver foo:* * /usr/sbin/dns.foo %k - ===== USAGE =====
@@ -104,6 +103,14 @@ implemented in the module can be called returned also. +=============================== +READING DNS KEYS FROM USERSPACE +=============================== + +Keys of dns_resolver type can be read from userspace using keyctl_read() or +"keyctl read/print/pipe". + + ========= MECHANISM =========
net/dns_resolver/dns_key.c +17 -3
@@ -67,8 +67,9 @@ dns_resolver_instantiate(struct key *keysize_t result_len =0 ;const char *data = _data, *end, *opt; -kenter ("%%%d,%s,'%s',%zu" , - key->serial, key->description, data, datalen); +kenter ("%%%d,%s,'%*.*s',%zu" , + key->serial, key->description, + (int )datalen, (int )datalen, data, datalen);if (datalen <=1 || !data || data[datalen -1 ] !='\0' )return -EINVAL ;
@@ -217,6 +218,19 @@ static void dns_resolver_describe(constseq_printf (m,": %u" , key->datalen); } +/* +* read the DNS data +* - the key's semaphore is read-locked +*/ +static long dns_resolver_read (const struct key *key, +char __user *buffer,size_t buflen) +{ +if (key->type_data.x[0 ]) +return key->type_data.x[0 ]; + +return user_read (key, buffer, buflen); +} +struct key_type key_type_dns_resolver = { .name ="dns_resolver" , .instantiate = dns_resolver_instantiate,
@@ -224,7 +238,7 @@ struct key_type key_type_dns_resolver = .revoke = user_revoke, .destroy = user_destroy, .describe = dns_resolver_describe, - .read = user_read, + .read = dns_resolver_read, };static int __init init_dns_resolver (void )
PATCH 73/73 arp_notify: unconditionally send gratuitous ARP for NETDEV_NOTIFY_PEERS.
In reply to Greg KH2.6.37-stable review patch. If anyone has any objections, please let us know.
------------------
From: Ian Campbell <[email protected]>
commit d11327ad6695db8117c78d70611e71102ceec2ac upstream.
NETDEV_NOTIFY_PEER is an explicit request by the driver to send a link notification while NETDEV_UP/NETDEV_CHANGEADDR generate link notifications as a sort of side effect.
In the later cases the sysctl option is present because link notification events can have undesired effects e.g. if the link is flapping. I don't think this applies in the case of an explicit request from a driver.
This patch makes NETDEV_NOTIFY_PEER unconditional, if preferred we could add a new sysctl for this case which defaults to on.
This change causes Xen post-migration ARP notifications (which cause switches to relearn their MAC tables etc) to be sent by default.
--- net/ipv4/devinet.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)
net/ipv4/devinet.c +20 -10
@@ -1030,6 +1030,21 @@ static inline bool inetdev_valid_mtu(unsreturn mtu >=68 ; } +static void inetdev_send_gratuitous_arp (struct net_device *dev, +struct in_device *in_dev) + +{ +struct in_ifaddr *ifa = in_dev->ifa_list; + +if (!ifa) +return ; + +arp_send (ARPOP_REQUEST ,ETH_P_ARP , + ifa->ifa_address, dev, + ifa->ifa_address,NULL , + dev->dev_addr,NULL ); +} +/* Called only under RTNL semaphore */ static int inetdev_event(struct notifier_block *this, unsigned long event,
@@ -1082,18 +1097,13 @@ static int inetdev_event(struct notifier }ip_mc_up (in_dev);/* fall through */ -case NETDEV_NOTIFY_PEERS :case NETDEV_CHANGEADDR : +if (!IN_DEV_ARP_NOTIFY (in_dev)) +break ; +/* fall through */ +case NETDEV_NOTIFY_PEERS :/* Send gratuitous ARP to notify of link change */ -if (IN_DEV_ARP_NOTIFY (in_dev)) { -struct in_ifaddr *ifa = in_dev->ifa_list; - -if (ifa) -arp_send (ARPOP_REQUEST ,ETH_P_ARP , - ifa->ifa_address, dev, - ifa->ifa_address,NULL , - dev->dev_addr,NULL ); - } +inetdev_send_gratuitous_arp (dev, in_dev);break ;case NETDEV_DOWN :ip_mc_down (in_dev);