]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
.35 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Wed, 11 Aug 2010 00:31:24 +0000 (17:31 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 11 Aug 2010 00:31:24 +0000 (17:31 -0700)
22 files changed:
queue-2.6.35/alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch [new file with mode: 0644]
queue-2.6.35/char-nozomi-fix-tty-count-counting.patch [new file with mode: 0644]
queue-2.6.35/char-nozomi-set-tty-driver_data-appropriately.patch [new file with mode: 0644]
queue-2.6.35/drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch [new file with mode: 0644]
queue-2.6.35/ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch [new file with mode: 0644]
queue-2.6.35/ipmi-fix-acpi-detection-with-regspacing.patch [new file with mode: 0644]
queue-2.6.35/iwlwifi-fix-tx-tracer.patch [new file with mode: 0644]
queue-2.6.35/md-fix-another-deadlock-with-removing-sysfs-attributes.patch [new file with mode: 0644]
queue-2.6.35/md-move-revalidate_disk-back-outside-open_mutex.patch [new file with mode: 0644]
queue-2.6.35/md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch [new file with mode: 0644]
queue-2.6.35/mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch [new file with mode: 0644]
queue-2.6.35/pci-disable-msi-on-via-k8m800.patch [new file with mode: 0644]
queue-2.6.35/pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch [new file with mode: 0644]
queue-2.6.35/rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch [new file with mode: 0644]
queue-2.6.35/serial-add-support-for-ox16pci958-card.patch [new file with mode: 0644]
queue-2.6.35/series
queue-2.6.35/solos-pci-fix-race-condition-in-tasklet-rx-handling.patch [new file with mode: 0644]
queue-2.6.35/staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch [new file with mode: 0644]
queue-2.6.35/staging-line6-needs-to-select-snd_pcm.patch [new file with mode: 0644]
queue-2.6.35/staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch [new file with mode: 0644]
queue-2.6.35/staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch [new file with mode: 0644]
queue-2.6.35/x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch [new file with mode: 0644]

diff --git a/queue-2.6.35/alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch b/queue-2.6.35/alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch
new file mode 100644 (file)
index 0000000..1b43811
--- /dev/null
@@ -0,0 +1,31 @@
+From e096c8e6d5ed965f346d94befbbec2275dde3621 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 3 Aug 2010 17:20:35 +0200
+Subject: ALSA: hda - Add PC-beep whitelist for an Intel board
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit e096c8e6d5ed965f346d94befbbec2275dde3621 upstream.
+
+An Intel board needs a white-list entry to enable PC-beep.
+Otherwise the driver misdetects (due to bogus BIOS info) and ignores
+the PC-beep on 2.6.35.
+
+Reported-and-tested-by: Leandro Lucarella <luca@llucax.com.ar>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/pci/hda/patch_realtek.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -5183,6 +5183,7 @@ static void fillup_priv_adc_nids(struct
+ static struct snd_pci_quirk beep_white_list[] = {
+       SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
++      SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
+       {}
+ };
diff --git a/queue-2.6.35/char-nozomi-fix-tty-count-counting.patch b/queue-2.6.35/char-nozomi-fix-tty-count-counting.patch
new file mode 100644 (file)
index 0000000..02ba4e1
--- /dev/null
@@ -0,0 +1,33 @@
+From ee78bb95b7bea08b7774a02073ea2bb45611a9e1 Mon Sep 17 00:00:00 2001
+From: Jiri Slaby <jslaby@suse.cz>
+Date: Thu, 29 Jul 2010 11:09:47 +0200
+Subject: Char: nozomi, fix tty->count counting
+
+From: Jiri Slaby <jslaby@suse.cz>
+
+commit ee78bb95b7bea08b7774a02073ea2bb45611a9e1 upstream.
+
+Currently ntty_install omits to increment tty count and we get the
+following warnings:
+Warning: dev (noz2) tty->count(0) != #fd's(1) in tty_open
+
+So to fix that, add one tty->count++ there.
+
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/char/nozomi.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/char/nozomi.c
++++ b/drivers/char/nozomi.c
+@@ -1611,6 +1611,7 @@ static int ntty_install(struct tty_drive
+       ret = tty_init_termios(tty);
+       if (ret == 0) {
+               tty_driver_kref_get(driver);
++              tty->count++;
+               driver->ttys[tty->index] = tty;
+       }
+       return ret;
diff --git a/queue-2.6.35/char-nozomi-set-tty-driver_data-appropriately.patch b/queue-2.6.35/char-nozomi-set-tty-driver_data-appropriately.patch
new file mode 100644 (file)
index 0000000..8af5440
--- /dev/null
@@ -0,0 +1,60 @@
+From bf9c1fca9ae9a79ed209e7ab2c10b3862f3f6f72 Mon Sep 17 00:00:00 2001
+From: Jiri Slaby <jslaby@suse.cz>
+Date: Thu, 29 Jul 2010 11:46:32 +0200
+Subject: Char: nozomi, set tty->driver_data appropriately
+
+From: Jiri Slaby <jslaby@suse.cz>
+
+commit bf9c1fca9ae9a79ed209e7ab2c10b3862f3f6f72 upstream.
+
+Sorry, one more fix, this one depends on the other, so this is rather 2/2.
+--
+
+tty->driver_data is used all over the code, but never set. This
+results in oopses like:
+BUG: unable to handle kernel NULL pointer dereference at 0000000000000130
+IP: [<ffffffff814a0040>] mutex_lock+0x10/0x40
+...
+Pid: 2157, comm: modem-manager Not tainted 2.6.34.1-0.1-desktop #1 2768DR7/2768DR7
+RIP: 0010:[<ffffffff814a0040>]  [<ffffffff814a0040>] mutex_lock+0x10/0x40
+RSP: 0018:ffff88007b16fa50  EFLAGS: 00010286
+RAX: 0000000000000000 RBX: 0000000000000130 RCX: 0000000000000003
+RDX: 0000000000000003 RSI: 0000000000000286 RDI: 0000000000000130
+RBP: 0000000000001000 R08: 0000000000000000 R09: 0000000000000000
+R10: 0000000000000001 R11: 0000000000000000 R12: 0000000000000130
+R13: 0000000000000001 R14: 0000000000000000 R15: ffff88007b16feb4
+...
+Call Trace:
+ [<ffffffffa077690d>] ntty_write_room+0x4d/0x90 [nozomi]
+...
+
+Set tty->driver_data to the computed port in .install to not recompute it in
+every place where needed. Switch .open to use driver_data too.
+
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+Cc: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/char/nozomi.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/char/nozomi.c
++++ b/drivers/char/nozomi.c
+@@ -1612,6 +1612,7 @@ static int ntty_install(struct tty_drive
+       if (ret == 0) {
+               tty_driver_kref_get(driver);
+               tty->count++;
++              tty->driver_data = port;
+               driver->ttys[tty->index] = tty;
+       }
+       return ret;
+@@ -1640,7 +1641,7 @@ static int ntty_activate(struct tty_port
+ static int ntty_open(struct tty_struct *tty, struct file *filp)
+ {
+-      struct port *port = get_port_by_tty(tty);
++      struct port *port = tty->driver_data;
+       return tty_port_open(&port->port, tty, filp);
+ }
diff --git a/queue-2.6.35/drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch b/queue-2.6.35/drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch
new file mode 100644 (file)
index 0000000..1814278
--- /dev/null
@@ -0,0 +1,37 @@
+From fa260c00c1aa5c657793a7221e40d2400df5afd8 Mon Sep 17 00:00:00 2001
+From: Peter Huewe <peterhuewe@gmx.de>
+Date: Mon, 9 Aug 2010 17:18:23 -0700
+Subject: drivers/video/w100fb.c: ignore void return value / fix build failure
+
+From: Peter Huewe <peterhuewe@gmx.de>
+
+commit fa260c00c1aa5c657793a7221e40d2400df5afd8 upstream.
+
+Fix a build failure "error: void value not ignored as it ought to be"
+by removing an assignment of a void return value.  The functionality of
+the code is not changed.
+
+Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
+Acked-by: Henrik Kretzschmar <henne@nachtwindheim.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/video/w100fb.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/video/w100fb.c
++++ b/drivers/video/w100fb.c
+@@ -858,9 +858,9 @@ unsigned long w100fb_gpio_read(int port)
+ void w100fb_gpio_write(int port, unsigned long value)
+ {
+       if (port==W100_GPIO_PORT_A)
+-              value = writel(value, remapped_regs + mmGPIO_DATA);
++              writel(value, remapped_regs + mmGPIO_DATA);
+       else
+-              value = writel(value, remapped_regs + mmGPIO_DATA2);
++              writel(value, remapped_regs + mmGPIO_DATA2);
+ }
+ EXPORT_SYMBOL(w100fb_gpio_read);
+ EXPORT_SYMBOL(w100fb_gpio_write);
diff --git a/queue-2.6.35/ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch b/queue-2.6.35/ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch
new file mode 100644 (file)
index 0000000..c951ef7
--- /dev/null
@@ -0,0 +1,58 @@
+From 110712828365ccafcc61a7f4db44c31ed4cf8793 Mon Sep 17 00:00:00 2001
+From: Borislav Petkov <bp@alien8.de>
+Date: Mon, 5 Jul 2010 21:23:52 -0700
+Subject: ide-cd: Do not access completed requests in the irq handler
+
+From: Borislav Petkov <bp@alien8.de>
+
+commit 110712828365ccafcc61a7f4db44c31ed4cf8793 upstream.
+
+ide_cd_error_cmd() can complete an erroneous request with leftover
+buffers. Signal this with its return value so that the request is not
+accessed after its completion in the irq handler and we oops.
+
+Signed-off-by: Borislav Petkov <bp@alien8.de>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/ide/ide-cd.c |   14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+--- a/drivers/ide/ide-cd.c
++++ b/drivers/ide/ide-cd.c
+@@ -506,15 +506,22 @@ int ide_cd_queue_pc(ide_drive_t *drive,
+       return (flags & REQ_FAILED) ? -EIO : 0;
+ }
+-static void ide_cd_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd)
++/*
++ * returns true if rq has been completed
++ */
++static bool ide_cd_error_cmd(ide_drive_t *drive, struct ide_cmd *cmd)
+ {
+       unsigned int nr_bytes = cmd->nbytes - cmd->nleft;
+       if (cmd->tf_flags & IDE_TFLAG_WRITE)
+               nr_bytes -= cmd->last_xfer_len;
+-      if (nr_bytes > 0)
++      if (nr_bytes > 0) {
+               ide_complete_rq(drive, 0, nr_bytes);
++              return true;
++      }
++
++      return false;
+ }
+ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
+@@ -679,7 +686,8 @@ out_end:
+               }
+               if (uptodate == 0 && rq->bio)
+-                      ide_cd_error_cmd(drive, cmd);
++                      if (ide_cd_error_cmd(drive, cmd))
++                              return ide_stopped;
+               /* make sure it's fully ended */
+               if (blk_fs_request(rq) == 0) {
diff --git a/queue-2.6.35/ipmi-fix-acpi-detection-with-regspacing.patch b/queue-2.6.35/ipmi-fix-acpi-detection-with-regspacing.patch
new file mode 100644 (file)
index 0000000..ff4d947
--- /dev/null
@@ -0,0 +1,130 @@
+From d9e1b6c45059ccfff647a120769ae86da78dfdc4 Mon Sep 17 00:00:00 2001
+From: Yinghai Lu <yinghai@kernel.org>
+Date: Mon, 9 Aug 2010 17:18:22 -0700
+Subject: ipmi: fix ACPI detection with regspacing
+
+From: Yinghai Lu <yinghai@kernel.org>
+
+commit d9e1b6c45059ccfff647a120769ae86da78dfdc4 upstream.
+
+After the commit that changed ipmi_si detecting sequence from SMBIOS/ACPI
+to ACPI/SMBIOS,
+
+| commit 754d453185275951d39792865927ec494fa1ebd8
+| Author: Matthew Garrett <mjg@redhat.com>
+| Date:   Wed May 26 14:43:47 2010 -0700
+|
+|    ipmi: change device discovery order
+|
+|    The ipmi spec provides an ordering for si discovery.  Change the driver to
+|    match, with the exception of preferring smbios to SPMI as HPs (at least)
+|    contain accurate information in the former but not the latter.
+
+ipmi_si can not be initialized.
+
+[  138.799739] calling  init_ipmi_devintf+0x0/0x109 @ 1
+[  138.805050] ipmi device interface
+[  138.818131] initcall init_ipmi_devintf+0x0/0x109 returned 0 after 12797 usecs
+[  138.822998] calling  init_ipmi_si+0x0/0xa90 @ 1
+[  138.840276] IPMI System Interface driver.
+[  138.846137] ipmi_si: probing via ACPI
+[  138.849225] ipmi_si 00:09: [io  0x0ca2] regsize 1 spacing 1 irq 0
+[  138.864438] ipmi_si: Adding ACPI-specified kcs state machine
+[  138.870893] ipmi_si: probing via SMBIOS
+[  138.880945] ipmi_si: Adding SMBIOS-specified kcs state machineipmi_si: duplicate interface
+[  138.896511] ipmi_si: probing via SPMI
+[  138.899861] ipmi_si: Adding SPMI-specified kcs state machineipmi_si: duplicate interface
+[  138.917095] ipmi_si: Trying ACPI-specified kcs state machine at i/o address 0xca2, slave address 0x0, irq 0
+[  138.928658] ipmi_si: Interface detection failed
+[  138.953411] initcall init_ipmi_si+0x0/0xa90 returned 0 after 110847 usecs
+
+in smbios has
+DMI/SMBIOS
+Handle 0x00C5, DMI type 38, 18 bytes
+IPMI Device Information
+        Interface Type: KCS (Keyboard Control Style)
+        Specification Version: 2.0
+        I2C Slave Address: 0x00
+        NV Storage Device: Not Present
+        Base Address: 0x0000000000000CA2 (I/O)
+        Register Spacing: 32-bit Boundaries
+in DSDT has
+                    Device (BMC)
+                    {
+
+                        Name (_HID, EisaId ("IPI0001"))
+                        Method (_STA, 0, NotSerialized)
+                        {
+                            If (LEqual (OSN, Zero))
+                            {
+                                Return (Zero)
+                            }
+
+                            Return (0x0F)
+                        }
+
+                        Name (_STR, Unicode ("IPMI_KCS"))
+                        Name (_UID, Zero)
+                        Name (_CRS, ResourceTemplate ()
+                        {
+                            IO (Decode16,
+                                0x0CA2,             // Range Minimum
+                                0x0CA2,             // Range Maximum
+                                0x00,               // Alignment
+                                0x01,               // Length
+                                )
+                            IO (Decode16,
+                                0x0CA6,             // Range Minimum
+                                0x0CA6,             // Range Maximum
+                                0x00,               // Alignment
+                                0x01,               // Length
+                                )
+                        })
+                        Method (_IFT, 0, NotSerialized)
+                        {
+                            Return (One)
+                        }
+
+                        Method (_SRV, 0, NotSerialized)
+                        {
+                            Return (0x0200)
+                        }
+                    }
+
+so the reg spacing should be 4 instead of 1.
+
+Try to calculate regspacing for this kind of system.
+
+Observed on a Sun Fire X4800.  Other OSes work and pass certification.
+
+Signed-off-by: Yinghai Lu <yinghai@kernel.org>
+Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
+Acked-by: Matthew Garrett <mjg@redhat.com>
+Cc: Len Brown <len.brown@intel.com>
+Cc: Myron Stowe <myron.stowe@hp.com>
+Cc: Corey Minyard <minyard@acm.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/char/ipmi/ipmi_si_intf.c |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/drivers/char/ipmi/ipmi_si_intf.c
++++ b/drivers/char/ipmi/ipmi_si_intf.c
+@@ -2176,6 +2176,14 @@ static int __devinit ipmi_pnp_probe(stru
+       info->io.addr_data = res->start;
+       info->io.regspacing = DEFAULT_REGSPACING;
++      res = pnp_get_resource(dev,
++                             (info->io.addr_type == IPMI_IO_ADDR_SPACE) ?
++                                      IORESOURCE_IO : IORESOURCE_MEM,
++                             1);
++      if (res) {
++              if (res->start > info->io.addr_data)
++                      info->io.regspacing = res->start - info->io.addr_data;
++      }
+       info->io.regsize = DEFAULT_REGSPACING;
+       info->io.regshift = 0;
diff --git a/queue-2.6.35/iwlwifi-fix-tx-tracer.patch b/queue-2.6.35/iwlwifi-fix-tx-tracer.patch
new file mode 100644 (file)
index 0000000..04a3ef5
--- /dev/null
@@ -0,0 +1,32 @@
+From e95b743536937a72e1560c85696b425c5d1a1c18 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Fri, 6 Aug 2010 16:00:48 +0200
+Subject: iwlwifi: fix TX tracer
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit e95b743536937a72e1560c85696b425c5d1a1c18 upstream.
+
+The TX tracing code copies with the wrong length,
+which will typically copy too little data. Fix
+this by using the correct length variable.
+
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-devtrace.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-devtrace.h
++++ b/drivers/net/wireless/iwlwifi/iwl-devtrace.h
+@@ -193,7 +193,7 @@ TRACE_EVENT(iwlwifi_dev_tx,
+               __entry->framelen = buf0_len + buf1_len;
+               memcpy(__get_dynamic_array(tfd), tfd, tfdlen);
+               memcpy(__get_dynamic_array(buf0), buf0, buf0_len);
+-              memcpy(__get_dynamic_array(buf1), buf1, buf0_len);
++              memcpy(__get_dynamic_array(buf1), buf1, buf1_len);
+       ),
+       TP_printk("[%p] TX %.2x (%zu bytes)",
+                 __entry->priv,
diff --git a/queue-2.6.35/md-fix-another-deadlock-with-removing-sysfs-attributes.patch b/queue-2.6.35/md-fix-another-deadlock-with-removing-sysfs-attributes.patch
new file mode 100644 (file)
index 0000000..2767040
--- /dev/null
@@ -0,0 +1,117 @@
+From bb4f1e9d0e2ef93de8e36ca0f5f26625fcd70b7d Mon Sep 17 00:00:00 2001
+From: NeilBrown <neilb@suse.de>
+Date: Sun, 8 Aug 2010 21:18:03 +1000
+Subject: md: fix another deadlock with removing sysfs attributes.
+
+From: NeilBrown <neilb@suse.de>
+
+commit bb4f1e9d0e2ef93de8e36ca0f5f26625fcd70b7d upstream.
+
+Move the deletion of sysfs attributes from reconfig_mutex to
+open_mutex didn't really help as a process can try to take
+open_mutex while holding reconfig_mutex, so the same deadlock can
+happen, just requiring one more process to be involved in the chain.
+
+I looks like I cannot easily use locking to wait for the sysfs
+deletion to complete, so don't.
+
+The only things that we cannot do while the deletions are still
+pending is other things which can change the sysfs namespace: run,
+takeover, stop.  Each of these can fail with -EBUSY.
+So set a flag while doing a sysfs deletion, and fail run, takeover,
+stop if that flag is set.
+
+This is suitable for 2.6.35.x
+
+Signed-off-by: NeilBrown <neilb@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/md/md.c |   31 +++++++++++++++++--------------
+ drivers/md/md.h |    4 ++++
+ 2 files changed, 21 insertions(+), 14 deletions(-)
+
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -532,13 +532,17 @@ static void mddev_unlock(mddev_t * mddev
+                * an access to the files will try to take reconfig_mutex
+                * while holding the file unremovable, which leads to
+                * a deadlock.
+-               * So hold open_mutex instead - we are allowed to take
+-               * it while holding reconfig_mutex, and md_run can
+-               * use it to wait for the remove to complete.
++               * So hold set sysfs_active while the remove in happeing,
++               * and anything else which might set ->to_remove or my
++               * otherwise change the sysfs namespace will fail with
++               * -EBUSY if sysfs_active is still set.
++               * We set sysfs_active under reconfig_mutex and elsewhere
++               * test it under the same mutex to ensure its correct value
++               * is seen.
+                */
+               struct attribute_group *to_remove = mddev->to_remove;
+               mddev->to_remove = NULL;
+-              mutex_lock(&mddev->open_mutex);
++              mddev->sysfs_active = 1;
+               mutex_unlock(&mddev->reconfig_mutex);
+               if (to_remove != &md_redundancy_group)
+@@ -550,7 +554,7 @@ static void mddev_unlock(mddev_t * mddev
+                               sysfs_put(mddev->sysfs_action);
+                       mddev->sysfs_action = NULL;
+               }
+-              mutex_unlock(&mddev->open_mutex);
++              mddev->sysfs_active = 0;
+       } else
+               mutex_unlock(&mddev->reconfig_mutex);
+@@ -2960,7 +2964,9 @@ level_store(mddev_t *mddev, const char *
+        *  - new personality will access other array.
+        */
+-      if (mddev->sync_thread || mddev->reshape_position != MaxSector)
++      if (mddev->sync_thread ||
++          mddev->reshape_position != MaxSector ||
++          mddev->sysfs_active)
+               return -EBUSY;
+       if (!mddev->pers->quiesce) {
+@@ -4344,13 +4350,9 @@ static int md_run(mddev_t *mddev)
+       if (mddev->pers)
+               return -EBUSY;
+-
+-      /* These two calls synchronise us with the
+-       * sysfs_remove_group calls in mddev_unlock,
+-       * so they must have completed.
+-       */
+-      mutex_lock(&mddev->open_mutex);
+-      mutex_unlock(&mddev->open_mutex);
++      /* Cannot run until previous stop completes properly */
++      if (mddev->sysfs_active)
++              return -EBUSY;
+       /*
+        * Analyze all RAID superblock(s)
+@@ -4716,7 +4718,8 @@ static int do_md_stop(mddev_t * mddev, i
+       mdk_rdev_t *rdev;
+       mutex_lock(&mddev->open_mutex);
+-      if (atomic_read(&mddev->openers) > is_open) {
++      if (atomic_read(&mddev->openers) > is_open ||
++          mddev->sysfs_active) {
+               printk("md: %s still in use.\n",mdname(mddev));
+               err = -EBUSY;
+       } else if (mddev->pers) {
+--- a/drivers/md/md.h
++++ b/drivers/md/md.h
+@@ -125,6 +125,10 @@ struct mddev_s
+       int                             suspended;
+       atomic_t                        active_io;
+       int                             ro;
++      int                             sysfs_active; /* set when sysfs deletes
++                                                     * are happening, so run/
++                                                     * takeover/stop are not safe
++                                                     */
+       struct gendisk                  *gendisk;
diff --git a/queue-2.6.35/md-move-revalidate_disk-back-outside-open_mutex.patch b/queue-2.6.35/md-move-revalidate_disk-back-outside-open_mutex.patch
new file mode 100644 (file)
index 0000000..68a46ca
--- /dev/null
@@ -0,0 +1,63 @@
+From 147e0b6a639ac581ca3bf627bedc3f4a6d3eca66 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dan.j.williams@intel.com>
+Date: Fri, 6 Aug 2010 18:01:59 -0700
+Subject: md: move revalidate_disk() back outside open_mutex
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+commit 147e0b6a639ac581ca3bf627bedc3f4a6d3eca66 upstream.
+
+Commit b821eaa5 "md: remove ->changed and related code" moved
+revalidate_disk() under open_mutex, and lockdep noticed.
+
+[ INFO: possible circular locking dependency detected ]
+2.6.32-mdadm-locking #1
+-------------------------------------------------------
+mdadm/3640 is trying to acquire lock:
+ (&bdev->bd_mutex){+.+.+.}, at: [<ffffffff811acecb>] revalidate_disk+0x5b/0x90
+
+but task is already holding lock:
+ (&mddev->open_mutex){+.+...}, at: [<ffffffffa055e07a>] do_md_stop+0x4a/0x4d0 [md_mod]
+
+which lock already depends on the new lock.
+
+It is suitable for 2.6.35.x
+
+Reported-by: Przemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com>
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: NeilBrown <neilb@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/md/md.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -4711,7 +4711,7 @@ out:
+  */
+ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
+ {
+-      int err = 0;
++      int err = 0, revalidate = 0;
+       struct gendisk *disk = mddev->gendisk;
+       mdk_rdev_t *rdev;
+@@ -4740,7 +4740,7 @@ static int do_md_stop(mddev_t * mddev, i
+                       }
+               set_capacity(disk, 0);
+-              revalidate_disk(disk);
++              revalidate = 1;
+               if (mddev->ro)
+                       mddev->ro = 0;
+@@ -4748,6 +4748,8 @@ static int do_md_stop(mddev_t * mddev, i
+               err = 0;
+       }
+       mutex_unlock(&mddev->open_mutex);
++      if (revalidate)
++              revalidate_disk(disk);
+       if (err)
+               return err;
+       /*
diff --git a/queue-2.6.35/md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch b/queue-2.6.35/md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch
new file mode 100644 (file)
index 0000000..b4909fd
--- /dev/null
@@ -0,0 +1,59 @@
+From 51e9ac77035a3dfcb6fc0a88a0d80b6f99b5edb1 Mon Sep 17 00:00:00 2001
+From: NeilBrown <neilb@suse.de>
+Date: Sat, 7 Aug 2010 21:17:00 +1000
+Subject: md/raid10: fix deadlock with unaligned read during resync
+
+From: NeilBrown <neilb@suse.de>
+
+commit 51e9ac77035a3dfcb6fc0a88a0d80b6f99b5edb1 upstream.
+
+If the 'bio_split' path in raid10-read is used while
+resync/recovery is happening it is possible to deadlock.
+Fix this be elevating ->nr_waiting for the duration of both
+parts of the split request.
+
+This fixes a bug that has been present since 2.6.22
+but has only started manifesting recently for unknown reasons.
+It is suitable for and -stable since then.
+
+Reported-by:  Justin Bronder <jsbronder@gentoo.org>
+Tested-by:  Justin Bronder <jsbronder@gentoo.org>
+Signed-off-by: NeilBrown <neilb@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/md/raid10.c |   18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+--- a/drivers/md/raid10.c
++++ b/drivers/md/raid10.c
+@@ -825,11 +825,29 @@ static int make_request(mddev_t *mddev,
+                */
+               bp = bio_split(bio,
+                              chunk_sects - (bio->bi_sector & (chunk_sects - 1)) );
++
++              /* Each of these 'make_request' calls will call 'wait_barrier'.
++               * If the first succeeds but the second blocks due to the resync
++               * thread raising the barrier, we will deadlock because the
++               * IO to the underlying device will be queued in generic_make_request
++               * and will never complete, so will never reduce nr_pending.
++               * So increment nr_waiting here so no new raise_barriers will
++               * succeed, and so the second wait_barrier cannot block.
++               */
++              spin_lock_irq(&conf->resync_lock);
++              conf->nr_waiting++;
++              spin_unlock_irq(&conf->resync_lock);
++
+               if (make_request(mddev, &bp->bio1))
+                       generic_make_request(&bp->bio1);
+               if (make_request(mddev, &bp->bio2))
+                       generic_make_request(&bp->bio2);
++              spin_lock_irq(&conf->resync_lock);
++              conf->nr_waiting--;
++              wake_up(&conf->wait_barrier);
++              spin_unlock_irq(&conf->resync_lock);
++
+               bio_pair_release(bp);
+               return 0;
+       bad_map:
diff --git a/queue-2.6.35/mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch b/queue-2.6.35/mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch
new file mode 100644 (file)
index 0000000..12cb248
--- /dev/null
@@ -0,0 +1,65 @@
+From 966cca029f739716fbcc8068b8c6dfe381f86fc3 Mon Sep 17 00:00:00 2001
+From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
+Date: Mon, 9 Aug 2010 17:20:09 -0700
+Subject: mm: fix corruption of hibernation caused by reusing swap during image saving
+
+From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
+
+commit 966cca029f739716fbcc8068b8c6dfe381f86fc3 upstream.
+
+Since 2.6.31, swap_map[]'s refcounting was changed to show that a used
+swap entry is just for swap-cache, can be reused.  Then, while scanning
+free entry in swap_map[], a swap entry may be able to be reclaimed and
+reused.  It was caused by commit c9e444103b5e7a5 ("mm: reuse unused swap
+entry if necessary").
+
+But this caused deta corruption at resume. The scenario is
+
+- Assume a clean-swap cache, but mapped.
+
+- at hibernation_snapshot[], clean-swap-cache is saved as
+  clean-swap-cache and swap_map[] is marked as SWAP_HAS_CACHE.
+
+- then, save_image() is called.  And reuse SWAP_HAS_CACHE entry to save
+  image, and break the contents.
+
+After resume:
+
+- the memory reclaim runs and finds clean-not-referenced-swap-cache and
+  discards it because it's marked as clean.  But here, the contents on
+  disk and swap-cache is inconsistent.
+
+Hance memory is corrupted.
+
+This patch avoids the bug by not reclaiming swap-entry during hibernation.
+This is a quick fix for backporting.
+
+Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
+Cc: Rafael J. Wysocki <rjw@sisk.pl>
+Reported-by: Ondreg Zary <linux@rainbow-software.org>
+Tested-by: Ondreg Zary <linux@rainbow-software.org>
+Tested-by: Andrea Gelmini <andrea.gelmini@gmail.com>
+Acked-by: Hugh Dickins <hughd@google.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ mm/swapfile.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/mm/swapfile.c
++++ b/mm/swapfile.c
+@@ -318,8 +318,10 @@ checks:
+       if (offset > si->highest_bit)
+               scan_base = offset = si->lowest_bit;
+-      /* reuse swap entry of cache-only swap if not busy. */
+-      if (vm_swap_full() && si->swap_map[offset] == SWAP_HAS_CACHE) {
++      /* reuse swap entry of cache-only swap if not hibernation. */
++      if (vm_swap_full()
++              && usage == SWAP_HAS_CACHE
++              && si->swap_map[offset] == SWAP_HAS_CACHE) {
+               int swap_was_freed;
+               spin_unlock(&swap_lock);
+               swap_was_freed = __try_to_reclaim_swap(si, offset);
diff --git a/queue-2.6.35/pci-disable-msi-on-via-k8m800.patch b/queue-2.6.35/pci-disable-msi-on-via-k8m800.patch
new file mode 100644 (file)
index 0000000..a5f1755
--- /dev/null
@@ -0,0 +1,33 @@
+From 549e15611b4ac1de51ef0e0a79c2704f50a638a2 Mon Sep 17 00:00:00 2001
+From: Tejun Heo <tj@kernel.org>
+Date: Sun, 23 May 2010 10:22:55 +0200
+Subject: PCI: disable MSI on VIA K8M800
+
+From: Tejun Heo <tj@kernel.org>
+
+commit 549e15611b4ac1de51ef0e0a79c2704f50a638a2 upstream.
+
+MSI delivery from on-board ahci controller doesn't work on K8M800.  At
+this point, it's unclear whether the culprit is with the ahci
+controller or the host bridge.  Given the track record and considering
+the rather minimal impact of MSI, disabling it seems reasonable.
+
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Reported-by: Rainer Hurtado Navarro <publio.escipion.el.africano@gmail.com>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/quirks.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -2115,6 +2115,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AT
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3364, quirk_disable_all_msi);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8380_0, quirk_disable_all_msi);
+ /* Disable MSI on chipsets that are known to not support it */
+ static void __devinit quirk_disable_msi(struct pci_dev *dev)
diff --git a/queue-2.6.35/pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch b/queue-2.6.35/pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch
new file mode 100644 (file)
index 0000000..34bbf83
--- /dev/null
@@ -0,0 +1,38 @@
+From 3d2a531804d16cd8df6dbbb0429c6f143e756049 Mon Sep 17 00:00:00 2001
+From: Rafael J. Wysocki <rjw@sisk.pl>
+Date: Fri, 23 Jul 2010 22:19:55 +0200
+Subject: PCI: Do not run NVidia quirks related to MSI with MSI disabled
+
+From: Rafael J. Wysocki <rjw@sisk.pl>
+
+commit 3d2a531804d16cd8df6dbbb0429c6f143e756049 upstream.
+
+There is no reason to run NVidia-specific quirks related to HT MSI
+mappings with MSI disabled via pci=nomsi, so make
+__nv_msi_ht_cap_quirk() return immediately in that case.
+
+This allows at least one machine to boot 100% of the time with
+pci=nomsi (it still doesn't boot reliably without that).
+
+Addresses https://bugzilla.kernel.org/show_bug.cgi?id=16443 .
+
+Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
+Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/quirks.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -2390,6 +2390,9 @@ static void __devinit __nv_msi_ht_cap_qu
+       int pos;
+       int found;
++      if (!pci_msi_enabled())
++              return;
++
+       /* check if there is HT MSI cap or enabled on this device */
+       found = ht_check_msi_mapping(dev);
diff --git a/queue-2.6.35/rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch b/queue-2.6.35/rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch
new file mode 100644 (file)
index 0000000..ebe685f
--- /dev/null
@@ -0,0 +1,29 @@
+From 8f1d2d2be73a98c21e68fe2a26f633892d4abdd1 Mon Sep 17 00:00:00 2001
+From: John W. Linville <linville@tuxdriver.com>
+Date: Thu, 5 Aug 2010 13:46:27 -0400
+Subject: rtl8180: avoid potential NULL deref in rtl8180_beacon_work
+
+From: John W. Linville <linville@tuxdriver.com>
+
+commit 8f1d2d2be73a98c21e68fe2a26f633892d4abdd1 upstream.
+
+ieee80211_beacon_get can return NULL...
+
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/rtl818x/rtl8180_dev.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/net/wireless/rtl818x/rtl8180_dev.c
++++ b/drivers/net/wireless/rtl818x/rtl8180_dev.c
+@@ -688,6 +688,8 @@ void rtl8180_beacon_work(struct work_str
+       /* grab a fresh beacon */
+       skb = ieee80211_beacon_get(dev, vif);
++      if (!skb)
++              goto resched;
+       /*
+        * update beacon timestamp w/ TSF value
diff --git a/queue-2.6.35/serial-add-support-for-ox16pci958-card.patch b/queue-2.6.35/serial-add-support-for-ox16pci958-card.patch
new file mode 100644 (file)
index 0000000..4762853
--- /dev/null
@@ -0,0 +1,61 @@
+From e847003f00d5eca3e3b3a6a1199f82b51293faf6 Mon Sep 17 00:00:00 2001
+From: Lytochkin Boris <lytboris@gmail.com>
+Date: Mon, 26 Jul 2010 10:02:26 +0400
+Subject: serial: add support for OX16PCI958 card
+
+From: Lytochkin Boris <lytboris@gmail.com>
+
+commit e847003f00d5eca3e3b3a6a1199f82b51293faf6 upstream.
+
+Signed-off-by: Lytochkin Boris <lytboris@gmail.com>
+Tested-by: Lytochkin Boris <lytboris@gmail.com>
+Signed-off-by: Alexander Beregalov <a.beregalov@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/serial/8250_pci.c |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+--- a/drivers/serial/8250_pci.c
++++ b/drivers/serial/8250_pci.c
+@@ -994,6 +994,7 @@ static int skip_tx_en_setup(struct seria
+ #define PCI_DEVICE_ID_TITAN_800E      0xA014
+ #define PCI_DEVICE_ID_TITAN_200EI     0xA016
+ #define PCI_DEVICE_ID_TITAN_200EISI   0xA017
++#define PCI_DEVICE_ID_OXSEMI_16PCI958 0x9538
+ /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
+ #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584       0x1584
+@@ -1542,6 +1543,8 @@ enum pci_board_num_t {
+       pbn_b2_4_921600,
+       pbn_b2_8_921600,
++      pbn_b2_8_1152000,
++
+       pbn_b2_bt_1_115200,
+       pbn_b2_bt_2_115200,
+       pbn_b2_bt_4_115200,
+@@ -1960,6 +1963,13 @@ static struct pciserial_board pci_boards
+               .uart_offset    = 8,
+       },
++      [pbn_b2_8_1152000] = {
++              .flags          = FL_BASE2,
++              .num_ports      = 8,
++              .base_baud      = 1152000,
++              .uart_offset    = 8,
++      },
++
+       [pbn_b2_bt_1_115200] = {
+               .flags          = FL_BASE2|FL_BASE_BARS,
+               .num_ports      = 1,
+@@ -2875,6 +2885,9 @@ static struct pci_device_id serial_pci_t
+       {       PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI952,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b0_bt_2_921600 },
++      {       PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI958,
++              PCI_ANY_ID , PCI_ANY_ID, 0, 0,
++              pbn_b2_8_1152000 },
+       /*
+        * Oxford Semiconductor Inc. Tornado PCI express device range.
index fcf976023b39656c66da6254a25f43769cebb99b..20622f8bd2934a6b186c3de0d9d4b6caace84a31 100644 (file)
@@ -6,3 +6,24 @@ x86-kmmio-mmiotrace-fix-double-free-of-kmmio_fault_pages.patch
 x86-pci-use-host-bridge-_crs-info-on-asrock-alivesata2-glan.patch
 pcmcia-avoid-buffer-overflow-in-pcmcia_setup_isa_irq.patch
 x86-add-memory-modify-constraints-to-xchg-and-cmpxchg.patch
+staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch
+staging-line6-needs-to-select-snd_pcm.patch
+staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch
+staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch
+serial-add-support-for-ox16pci958-card.patch
+pci-do-not-run-nvidia-quirks-related-to-msi-with-msi-disabled.patch
+pci-disable-msi-on-via-k8m800.patch
+solos-pci-fix-race-condition-in-tasklet-rx-handling.patch
+x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch
+alsa-hda-add-pc-beep-whitelist-for-an-intel-board.patch
+char-nozomi-fix-tty-count-counting.patch
+char-nozomi-set-tty-driver_data-appropriately.patch
+mm-fix-corruption-of-hibernation-caused-by-reusing-swap-during-image-saving.patch
+drivers-video-w100fb.c-ignore-void-return-value-fix-build-failure.patch
+iwlwifi-fix-tx-tracer.patch
+rtl8180-avoid-potential-null-deref-in-rtl8180_beacon_work.patch
+ipmi-fix-acpi-detection-with-regspacing.patch
+ide-cd-do-not-access-completed-requests-in-the-irq-handler.patch
+md-move-revalidate_disk-back-outside-open_mutex.patch
+md-fix-another-deadlock-with-removing-sysfs-attributes.patch
+md-raid10-fix-deadlock-with-unaligned-read-during-resync.patch
diff --git a/queue-2.6.35/solos-pci-fix-race-condition-in-tasklet-rx-handling.patch b/queue-2.6.35/solos-pci-fix-race-condition-in-tasklet-rx-handling.patch
new file mode 100644 (file)
index 0000000..5bdf353
--- /dev/null
@@ -0,0 +1,66 @@
+From 1f6ea6e511e5ec730d8e88651da1b7b6e8fd1333 Mon Sep 17 00:00:00 2001
+From: David Woodhouse <David.Woodhouse@intel.com>
+Date: Sat, 7 Aug 2010 23:02:59 -0700
+Subject: solos-pci: Fix race condition in tasklet RX handling
+
+From: David Woodhouse <David.Woodhouse@intel.com>
+
+commit 1f6ea6e511e5ec730d8e88651da1b7b6e8fd1333 upstream.
+
+We were seeing faults in the solos-pci receive tasklet when packets
+arrived for a VCC which was currently being closed:
+
+[18842.727906] EIP: [<e082f490>] br2684_push+0x19/0x234 [br2684] SS:ESP 0068:dfb89d14
+
+[18845.090712] [<c13ecff3>] ? do_page_fault+0x0/0x2e1
+[18845.120042] [<e082f490>] ? br2684_push+0x19/0x234 [br2684]
+[18845.153530] [<e084fa13>] solos_bh+0x28b/0x7c8 [solos_pci]
+[18845.186488] [<e084f711>] ? solos_irq+0x2d/0x51 [solos_pci]
+[18845.219960] [<c100387b>] ? handle_irq+0x3b/0x48
+[18845.247732] [<c10265cb>] ? irq_exit+0x34/0x57
+[18845.274437] [<c1025720>] tasklet_action+0x42/0x69
+[18845.303247] [<c102643f>] __do_softirq+0x8e/0x129
+[18845.331540] [<c10264ff>] do_softirq+0x25/0x2a
+[18845.358274] [<c102664c>] _local_bh_enable_ip+0x5e/0x6a
+[18845.389677] [<c102666d>] local_bh_enable+0xb/0xe
+[18845.417944] [<e08490a8>] ppp_unregister_channel+0x32/0xbb [ppp_generic]
+[18845.458193] [<e08731ad>] pppox_unbind_sock+0x18/0x1f [pppox]
+
+This patch uses an RCU-inspired approach to fix it. In the RX tasklet's
+find_vcc() function we first refuse to use a VCC which already has the
+ATM_VF_READY bit cleared. And in the VCC close function, we synchronise
+with the tasklet to ensure that it can't still be using the VCC before
+we continue and allow the VCC to be destroyed.
+
+Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
+Tested-by: Nathan Williams <nathan@traverse.com.au>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/atm/solos-pci.c |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/atm/solos-pci.c
++++ b/drivers/atm/solos-pci.c
+@@ -781,7 +781,8 @@ static struct atm_vcc *find_vcc(struct a
+       sk_for_each(s, node, head) {
+               vcc = atm_sk(s);
+               if (vcc->dev == dev && vcc->vci == vci &&
+-                  vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE)
++                  vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE &&
++                  test_bit(ATM_VF_READY, &vcc->flags))
+                       goto out;
+       }
+       vcc = NULL;
+@@ -907,6 +908,10 @@ static void pclose(struct atm_vcc *vcc)
+       clear_bit(ATM_VF_ADDR, &vcc->flags);
+       clear_bit(ATM_VF_READY, &vcc->flags);
++      /* Hold up vcc_destroy_socket() (our caller) until solos_bh() in the
++         tasklet has finished processing any incoming packets (and, more to
++         the point, using the vcc pointer). */
++      tasklet_unlock_wait(&card->tlet);
+       return;
+ }
diff --git a/queue-2.6.35/staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch b/queue-2.6.35/staging-hv-fix-kconfig-dependency-of-hv_blkvsc.patch
new file mode 100644 (file)
index 0000000..5770ed6
--- /dev/null
@@ -0,0 +1,33 @@
+From 54d2379c20d814ced657cbc2c4ead8d1f8389fa2 Mon Sep 17 00:00:00 2001
+From: Haiyang Zhang <haiyangz@microsoft.com>
+Date: Fri, 23 Jul 2010 21:24:42 +0000
+Subject: staging: hv: Fix Kconfig dependency of hv_blkvsc
+
+From: Haiyang Zhang <haiyangz@microsoft.com>
+
+commit 54d2379c20d814ced657cbc2c4ead8d1f8389fa2 upstream.
+
+LBDAF is not available nor necessary on 64BIT kernel. This patch
+fixed the dependency for hv_blkvsc module on 64BIT kernel.
+Thanks vrataj2 [vrataj2@comcast.net] for reporting this problem.
+
+Reported-by: vrataj2 <vrataj2@comcast.net>
+Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
+Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/staging/hv/Kconfig |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/staging/hv/Kconfig
++++ b/drivers/staging/hv/Kconfig
+@@ -17,7 +17,7 @@ config HYPERV_STORAGE
+ config HYPERV_BLOCK
+       tristate "Microsoft Hyper-V virtual block driver"
+-      depends on BLOCK && SCSI && LBDAF
++      depends on BLOCK && SCSI && (LBDAF || 64BIT)
+       default HYPERV
+       help
+         Select this option to enable the Hyper-V virtual block driver.
diff --git a/queue-2.6.35/staging-line6-needs-to-select-snd_pcm.patch b/queue-2.6.35/staging-line6-needs-to-select-snd_pcm.patch
new file mode 100644 (file)
index 0000000..5497bb2
--- /dev/null
@@ -0,0 +1,39 @@
+From e928c077e5cdcd72ee762125b37232aec1ff49f3 Mon Sep 17 00:00:00 2001
+From: Randy Dunlap <randy.dunlap@oracle.com>
+Date: Tue, 27 Jul 2010 12:21:19 -0700
+Subject: Staging: line6: needs to select SND_PCM
+
+From: Randy Dunlap <randy.dunlap@oracle.com>
+
+commit e928c077e5cdcd72ee762125b37232aec1ff49f3 upstream.
+
+line6 uses snd_pcm*() functions, so it should select SND_PCM.
+
+ERROR: "snd_pcm_period_elapsed" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_set_ops" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_lib_free_pages" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_lib_ioctl" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_lib_malloc_pages" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_hw_constraint_ratdens" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_format_physical_width" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_lib_preallocate_pages_for_all" [drivers/staging/line6/line6usb.ko] undefined!
+ERROR: "snd_pcm_new" [drivers/staging/line6/line6usb.ko] undefined!
+
+Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
+Cc: Markus Grabner <grabner@icg.tugraz.at>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/staging/line6/Kconfig |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/staging/line6/Kconfig
++++ b/drivers/staging/line6/Kconfig
+@@ -2,6 +2,7 @@ config LINE6_USB
+       tristate "Line6 USB support"
+       depends on USB && SND
+       select SND_RAWMIDI
++      select SND_PCM
+       help
+         This is a driver for the guitar amp, cab, and effects modeller
+         PODxt Pro by Line6 (and similar devices), supporting the
diff --git a/queue-2.6.35/staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch b/queue-2.6.35/staging-panel-prevent-double-calling-of-parport_release-fix-oops.patch
new file mode 100644 (file)
index 0000000..282d62d
--- /dev/null
@@ -0,0 +1,43 @@
+From 060132ae42cce3f9d2fd34d9a17b98362b44b9f9 Mon Sep 17 00:00:00 2001
+From: Peter Huewe <peterhuewe@gmx.de>
+Date: Wed, 7 Jul 2010 04:52:16 +0200
+Subject: Staging: panel: Prevent double-calling of parport_release - fix oops.
+
+From: Peter Huewe <peterhuewe@gmx.de>
+
+commit 060132ae42cce3f9d2fd34d9a17b98362b44b9f9 upstream.
+
+This patch prevents the code from calling parport_release and
+parport_unregister_device twice with the same arguments - and thus fixes an oops.
+
+Rationale:
+After the first call the parport is already released and the
+handle isn't valid anymore and calling parport_release and
+parport_unregister_device twice isn't a good idea.
+
+Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
+Acked-by: Willy Tarreau <w@1wt.eu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/staging/panel/panel.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/staging/panel/panel.c
++++ b/drivers/staging/panel/panel.c
+@@ -2179,6 +2179,7 @@ int panel_init(void)
+               if (pprt) {
+                       parport_release(pprt);
+                       parport_unregister_device(pprt);
++                      pprt = NULL;
+               }
+               parport_unregister_driver(&panel_driver);
+               printk(KERN_ERR "Panel driver version " PANEL_VERSION
+@@ -2228,6 +2229,7 @@ static void __exit panel_cleanup_module(
+               /* TODO: free all input signals */
+               parport_release(pprt);
+               parport_unregister_device(pprt);
++              pprt = NULL;
+       }
+       parport_unregister_driver(&panel_driver);
+ }
diff --git a/queue-2.6.35/staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch b/queue-2.6.35/staging-rt2870-add-usb-id-for-belkin-f6d4050-v2.patch
new file mode 100644 (file)
index 0000000..907bd9c
--- /dev/null
@@ -0,0 +1,29 @@
+From 5d92fe3387d086fc2f10426fbdb6b86d6cce5a47 Mon Sep 17 00:00:00 2001
+From: Larry Finger <Larry.Finger@lwfinger.net>
+Date: Sun, 25 Jul 2010 16:14:53 -0500
+Subject: staging: rt2870: Add USB ID for Belkin F6D4050 v2
+
+From: Larry Finger <Larry.Finger@lwfinger.net>
+
+commit 5d92fe3387d086fc2f10426fbdb6b86d6cce5a47 upstream.
+
+Device missing from current tables.
+
+Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
+Tested-by: Rod Huffaker <rod.huffaker@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/staging/rt2860/usb_main_dev.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/staging/rt2860/usb_main_dev.c
++++ b/drivers/staging/rt2860/usb_main_dev.c
+@@ -64,6 +64,7 @@ struct usb_device_id rtusb_usb_id[] = {
+       {USB_DEVICE(0x14B2, 0x3C07)},   /* AL */
+       {USB_DEVICE(0x050D, 0x8053)},   /* Belkin */
+       {USB_DEVICE(0x050D, 0x825B)},   /* Belkin */
++      {USB_DEVICE(0x050D, 0x935B)},   /* Belkin F6D4050 v2 */
+       {USB_DEVICE(0x14B2, 0x3C23)},   /* Airlink */
+       {USB_DEVICE(0x14B2, 0x3C27)},   /* Airlink */
+       {USB_DEVICE(0x07AA, 0x002F)},   /* Corega */
diff --git a/queue-2.6.35/x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch b/queue-2.6.35/x86-mtrr-use-stop-machine-context-to-rendezvous-all-the-cpu-s.patch
new file mode 100644 (file)
index 0000000..3c626a2
--- /dev/null
@@ -0,0 +1,216 @@
+From 68f202e4e87cfab4439568bf397fcc5c7cf8d729 Mon Sep 17 00:00:00 2001
+From: Suresh Siddha <suresh.b.siddha@intel.com>
+Date: Fri, 30 Jul 2010 11:46:42 -0700
+Subject: x86, mtrr: Use stop machine context to rendezvous all the cpu's
+
+From: Suresh Siddha <suresh.b.siddha@intel.com>
+
+commit 68f202e4e87cfab4439568bf397fcc5c7cf8d729 upstream.
+
+Use the stop machine context rather than IPI's to rendezvous all the cpus for
+MTRR initialization that happens during cpu bringup or for MTRR modifications
+during runtime.
+
+This avoids deadlock scenario (reported by Prarit) like:
+
+cpu A holds a read_lock (tasklist_lock for example) with irqs enabled
+cpu B waits for the same lock with irqs disabled using write_lock_irq
+cpu C doing set_mtrr() (during AP bringup for example), which will try to
+rendezvous all the cpus using IPI's
+
+This will result in C and A come to the rendezvous point and waiting
+for B. B is stuck forever waiting for the lock and thus not
+reaching the rendezvous point.
+
+Using stop cpu (run in the process context of per cpu based keventd) to do
+this rendezvous, avoids this deadlock scenario.
+
+Also make sure all the cpu's are in the rendezvous handler before we proceed
+with the local_irq_save() on each cpu. This lock step disabling irqs on all
+the cpus will avoid other deadlock scenarios (for example involving
+with the blocking smp_call_function's etc).
+
+   [ This problem is very old. Marking -stable only for 2.6.35 as the
+     stop_one_cpu_nowait() API is present only in 2.6.35. Any older
+     kernel interested in this fix need to do some more work in backporting
+     this patch. ]
+
+Reported-by: Prarit Bhargava <prarit@redhat.com>
+Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
+LKML-Reference: <1280515602.2682.10.camel@sbsiddha-MOBL3.sc.intel.com>
+Acked-by: Prarit Bhargava <prarit@redhat.com>
+Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kernel/cpu/mtrr/main.c |   56 ++++++++++++++++++++++++++++++----------
+ arch/x86/kernel/smpboot.c       |    7 +++++
+ 2 files changed, 50 insertions(+), 13 deletions(-)
+
+--- a/arch/x86/kernel/cpu/mtrr/main.c
++++ b/arch/x86/kernel/cpu/mtrr/main.c
+@@ -35,6 +35,7 @@
+ #include <linux/types.h> /* FIXME: kvm_para.h needs this */
++#include <linux/stop_machine.h>
+ #include <linux/kvm_para.h>
+ #include <linux/uaccess.h>
+ #include <linux/module.h>
+@@ -143,22 +144,28 @@ struct set_mtrr_data {
+       mtrr_type       smp_type;
+ };
++static DEFINE_PER_CPU(struct cpu_stop_work, mtrr_work);
++
+ /**
+- * ipi_handler - Synchronisation handler. Executed by "other" CPUs.
++ * mtrr_work_handler - Synchronisation handler. Executed by "other" CPUs.
+  * @info: pointer to mtrr configuration data
+  *
+  * Returns nothing.
+  */
+-static void ipi_handler(void *info)
++static int mtrr_work_handler(void *info)
+ {
+ #ifdef CONFIG_SMP
+       struct set_mtrr_data *data = info;
+       unsigned long flags;
++      atomic_dec(&data->count);
++      while (!atomic_read(&data->gate))
++              cpu_relax();
++
+       local_irq_save(flags);
+       atomic_dec(&data->count);
+-      while (!atomic_read(&data->gate))
++      while (atomic_read(&data->gate))
+               cpu_relax();
+       /*  The master has cleared me to execute  */
+@@ -173,12 +180,13 @@ static void ipi_handler(void *info)
+       }
+       atomic_dec(&data->count);
+-      while (atomic_read(&data->gate))
++      while (!atomic_read(&data->gate))
+               cpu_relax();
+       atomic_dec(&data->count);
+       local_irq_restore(flags);
+ #endif
++      return 0;
+ }
+ static inline int types_compatible(mtrr_type type1, mtrr_type type2)
+@@ -198,7 +206,7 @@ static inline int types_compatible(mtrr_
+  *
+  * This is kinda tricky, but fortunately, Intel spelled it out for us cleanly:
+  *
+- * 1. Send IPI to do the following:
++ * 1. Queue work to do the following on all processors:
+  * 2. Disable Interrupts
+  * 3. Wait for all procs to do so
+  * 4. Enter no-fill cache mode
+@@ -215,14 +223,17 @@ static inline int types_compatible(mtrr_
+  * 15. Enable interrupts.
+  *
+  * What does that mean for us? Well, first we set data.count to the number
+- * of CPUs. As each CPU disables interrupts, it'll decrement it once. We wait
+- * until it hits 0 and proceed. We set the data.gate flag and reset data.count.
+- * Meanwhile, they are waiting for that flag to be set. Once it's set, each
++ * of CPUs. As each CPU announces that it started the rendezvous handler by
++ * decrementing the count, We reset data.count and set the data.gate flag
++ * allowing all the cpu's to proceed with the work. As each cpu disables
++ * interrupts, it'll decrement data.count once. We wait until it hits 0 and
++ * proceed. We clear the data.gate flag and reset data.count. Meanwhile, they
++ * are waiting for that flag to be cleared. Once it's cleared, each
+  * CPU goes through the transition of updating MTRRs.
+  * The CPU vendors may each do it differently,
+  * so we call mtrr_if->set() callback and let them take care of it.
+  * When they're done, they again decrement data->count and wait for data.gate
+- * to be reset.
++ * to be set.
+  * When we finish, we wait for data.count to hit 0 and toggle the data.gate flag
+  * Everyone then enables interrupts and we all continue on.
+  *
+@@ -234,6 +245,9 @@ set_mtrr(unsigned int reg, unsigned long
+ {
+       struct set_mtrr_data data;
+       unsigned long flags;
++      int cpu;
++
++      preempt_disable();
+       data.smp_reg = reg;
+       data.smp_base = base;
+@@ -246,10 +260,15 @@ set_mtrr(unsigned int reg, unsigned long
+       atomic_set(&data.gate, 0);
+       /* Start the ball rolling on other CPUs */
+-      if (smp_call_function(ipi_handler, &data, 0) != 0)
+-              panic("mtrr: timed out waiting for other CPUs\n");
++      for_each_online_cpu(cpu) {
++              struct cpu_stop_work *work = &per_cpu(mtrr_work, cpu);
++
++              if (cpu == smp_processor_id())
++                      continue;
++
++              stop_one_cpu_nowait(cpu, mtrr_work_handler, &data, work);
++      }
+-      local_irq_save(flags);
+       while (atomic_read(&data.count))
+               cpu_relax();
+@@ -259,6 +278,16 @@ set_mtrr(unsigned int reg, unsigned long
+       smp_wmb();
+       atomic_set(&data.gate, 1);
++      local_irq_save(flags);
++
++      while (atomic_read(&data.count))
++              cpu_relax();
++
++      /* Ok, reset count and toggle gate */
++      atomic_set(&data.count, num_booting_cpus() - 1);
++      smp_wmb();
++      atomic_set(&data.gate, 0);
++
+       /* Do our MTRR business */
+       /*
+@@ -279,7 +308,7 @@ set_mtrr(unsigned int reg, unsigned long
+       atomic_set(&data.count, num_booting_cpus() - 1);
+       smp_wmb();
+-      atomic_set(&data.gate, 0);
++      atomic_set(&data.gate, 1);
+       /*
+        * Wait here for everyone to have seen the gate change
+@@ -289,6 +318,7 @@ set_mtrr(unsigned int reg, unsigned long
+               cpu_relax();
+       local_irq_restore(flags);
++      preempt_enable();
+ }
+ /**
+--- a/arch/x86/kernel/smpboot.c
++++ b/arch/x86/kernel/smpboot.c
+@@ -816,6 +816,13 @@ do_rest:
+                       if (cpumask_test_cpu(cpu, cpu_callin_mask))
+                               break;  /* It has booted */
+                       udelay(100);
++                      /*
++                       * Allow other tasks to run while we wait for the
++                       * AP to come online. This also gives a chance
++                       * for the MTRR work(triggered by the AP coming online)
++                       * to be completed in the stop machine context.
++                       */
++                      schedule();
+               }
+               if (cpumask_test_cpu(cpu, cpu_callin_mask))