--- /dev/null
+From stable-bounces@linux.kernel.org Sun Feb 3 14:44:14 2008
+From: Len Brown <lenb@kernel.org>
+Date: Sun, 3 Feb 2008 17:43:57 -0500
+Subject: ACPI: update ACPI blacklist
+To: stable@kernel.org
+Message-ID: <200802031743.57309.lenb@kernel.org>
+Content-Disposition: inline
+
+
+From: Len Brown <len.brown@intel.com>
+
+These minor changes sync the latest ACPI blacklist into 2.6.24.
+The main benefit of this patch is to make any future
+changes easier to apply. The immediate benefit is one less
+dmesg line on Acer systems.
+
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/blacklist.c | 23 ++++++++++++++---------
+ drivers/acpi/osl.c | 16 ++++++++--------
+ drivers/firmware/dmi_scan.c | 9 ---------
+ include/linux/dmi.h | 2 --
+ 4 files changed, 22 insertions(+), 28 deletions(-)
+
+--- a/drivers/acpi/blacklist.c
++++ b/drivers/acpi/blacklist.c
+@@ -208,24 +208,24 @@ static struct dmi_system_id acpi_osi_dmi
+ * Disable OSI(Linux) warnings on all "Acer, inc."
+ *
+ * _OSI(Linux) disables the latest Windows BIOS code:
++ * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
+ * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
++ * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
+ * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
+ * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
+ * _OSI(Linux) effect unknown:
+ * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
+ */
+- {
+- .callback = dmi_disable_osi_linux,
+- .ident = "Acer, inc.",
+- .matches = {
+- DMI_MATCH(DMI_SYS_VENDOR, "Acer, inc."),
+- },
+- },
++ /*
++ * note that dmi_check_system() uses strstr()
++ * to match sub-strings rather than !strcmp(),
++ * so "Acer" below matches "Acer, inc." above.
++ */
+ /*
+ * Disable OSI(Linux) warnings on all "Acer"
+ *
+ * _OSI(Linux) effect unknown:
+- * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
++ * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
+ * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
+ * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
+ * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
+@@ -300,7 +300,7 @@ static struct dmi_system_id acpi_osi_dmi
+ DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
+ },
+ },
+- { /* OSI(Linux) touches USB, breaks suspend to disk */
++ { /* OSI(Linux) touches USB, unknown side-effect */
+ .callback = dmi_disable_osi_linux,
+ .ident = "Dell Dimension 5150",
+ .matches = {
+@@ -474,6 +474,11 @@ static struct dmi_system_id acpi_osi_dmi
+ *
+ * _OSI(Linux) confirmed to be a NOP:
+ * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
++ * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
++ *
++ * unknown:
++ * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"),
++ * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
+ */
+ {
+ .callback = dmi_disable_osi_linux,
+--- a/drivers/acpi/osl.c
++++ b/drivers/acpi/osl.c
+@@ -120,7 +120,7 @@ static char osi_additional_string[OSI_ST
+ */
+ #define OSI_LINUX_ENABLE 0
+
+-struct osi_linux {
++static struct osi_linux {
+ unsigned int enable:1;
+ unsigned int dmi:1;
+ unsigned int cmdline:1;
+@@ -1213,24 +1213,24 @@ acpi_status acpi_os_release_object(acpi_
+ *
+ * Returns 0 on success
+ */
+-int acpi_dmi_dump(void)
++static int acpi_dmi_dump(void)
+ {
+
+ if (!dmi_available)
+ return -1;
+
+ printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
+- dmi_get_slot(DMI_SYS_VENDOR));
++ dmi_get_system_info(DMI_SYS_VENDOR));
+ printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
+- dmi_get_slot(DMI_PRODUCT_NAME));
++ dmi_get_system_info(DMI_PRODUCT_NAME));
+ printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
+- dmi_get_slot(DMI_PRODUCT_VERSION));
++ dmi_get_system_info(DMI_PRODUCT_VERSION));
+ printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
+- dmi_get_slot(DMI_BOARD_NAME));
++ dmi_get_system_info(DMI_BOARD_NAME));
+ printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
+- dmi_get_slot(DMI_BIOS_VENDOR));
++ dmi_get_system_info(DMI_BIOS_VENDOR));
+ printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
+- dmi_get_slot(DMI_BIOS_DATE));
++ dmi_get_system_info(DMI_BIOS_DATE));
+
+ return 0;
+ }
+--- a/drivers/firmware/dmi_scan.c
++++ b/drivers/firmware/dmi_scan.c
+@@ -469,12 +469,3 @@ int dmi_get_year(int field)
+
+ return year;
+ }
+-
+-/**
+- * dmi_get_slot - return dmi_ident[slot]
+- * @slot: index into dmi_ident[]
+- */
+-char *dmi_get_slot(int slot)
+-{
+- return(dmi_ident[slot]);
+-}
+--- a/include/linux/dmi.h
++++ b/include/linux/dmi.h
+@@ -79,7 +79,6 @@ extern void dmi_scan_machine(void);
+ extern int dmi_get_year(int field);
+ extern int dmi_name_in_vendors(const char *str);
+ extern int dmi_available;
+-extern char *dmi_get_slot(int slot);
+
+ #else
+
+@@ -90,7 +89,6 @@ static inline const struct dmi_device *
+ static inline int dmi_get_year(int year) { return 0; }
+ static inline int dmi_name_in_vendors(const char *s) { return 0; }
+ #define dmi_available 0
+-static inline char *dmi_get_slot(int slot) { return NULL; }
+
+ #endif
+
--- /dev/null
+From stable-bounces@linux.kernel.org Mon Feb 4 22:27:35 2008
+From: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Date: Mon, 04 Feb 2008 22:27:20 -0800
+Subject: lockdep: annotate epoll
+To: torvalds@linux-foundation.org
+Cc: akpm@linux-foundation.org, stefanr@s5r6.in-berlin.de, a.p.zijlstra@chello.nl, davidel@xmailserver.org, stable@kernel.org
+Message-ID: <200802050627.m156R10c006376@imap1.linux-foundation.org>
+
+
+From: Peter Zijlstra <a.p.zijlstra@chello.nl>
+
+patch 0ccf831cbee94df9c5006dd46248c0f07847dd7c in mainline.
+
+On Sat, 2008-01-05 at 13:35 -0800, Davide Libenzi wrote:
+
+> I remember I talked with Arjan about this time ago. Basically, since 1)
+> you can drop an epoll fd inside another epoll fd 2) callback-based wakeups
+> are used, you can see a wake_up() from inside another wake_up(), but they
+> will never refer to the same lock instance.
+> Think about:
+>
+> dfd = socket(...);
+> efd1 = epoll_create();
+> efd2 = epoll_create();
+> epoll_ctl(efd1, EPOLL_CTL_ADD, dfd, ...);
+> epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
+>
+> When a packet arrives to the device underneath "dfd", the net code will
+> issue a wake_up() on its poll wake list. Epoll (efd1) has installed a
+> callback wakeup entry on that queue, and the wake_up() performed by the
+> "dfd" net code will end up in ep_poll_callback(). At this point epoll
+> (efd1) notices that it may have some event ready, so it needs to wake up
+> the waiters on its poll wait list (efd2). So it calls ep_poll_safewake()
+> that ends up in another wake_up(), after having checked about the
+> recursion constraints. That are, no more than EP_MAX_POLLWAKE_NESTS, to
+> avoid stack blasting. Never hit the same queue, to avoid loops like:
+>
+> epoll_ctl(efd2, EPOLL_CTL_ADD, efd1, ...);
+> epoll_ctl(efd3, EPOLL_CTL_ADD, efd2, ...);
+> epoll_ctl(efd4, EPOLL_CTL_ADD, efd3, ...);
+> epoll_ctl(efd1, EPOLL_CTL_ADD, efd4, ...);
+>
+> The code "if (tncur->wq == wq || ..." prevents re-entering the same
+> queue/lock.
+
+Since the epoll code is very careful to not nest same instance locks
+allow the recursion.
+
+Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Tested-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
+Acked-by: Davide Libenzi <davidel@xmailserver.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/eventpoll.c | 2 +-
+ include/linux/wait.h | 16 ++++++++++++++++
+ 2 files changed, 17 insertions(+), 1 deletion(-)
+
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -353,7 +353,7 @@ static void ep_poll_safewake(struct poll
+ spin_unlock_irqrestore(&psw->lock, flags);
+
+ /* Do really wake up now */
+- wake_up(wq);
++ wake_up_nested(wq, 1 + wake_nests);
+
+ /* Remove the current task from the list */
+ spin_lock_irqsave(&psw->lock, flags);
+--- a/include/linux/wait.h
++++ b/include/linux/wait.h
+@@ -161,6 +161,22 @@ wait_queue_head_t *FASTCALL(bit_waitqueu
+ #define wake_up_locked(x) __wake_up_locked((x), TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE)
+ #define wake_up_interruptible_sync(x) __wake_up_sync((x),TASK_INTERRUPTIBLE, 1)
+
++#ifdef CONFIG_DEBUG_LOCK_ALLOC
++/*
++ * macro to avoid include hell
++ */
++#define wake_up_nested(x, s) \
++do { \
++ unsigned long flags; \
++ \
++ spin_lock_irqsave_nested(&(x)->lock, flags, (s)); \
++ wake_up_locked(x); \
++ spin_unlock_irqrestore(&(x)->lock, flags); \
++} while (0)
++#else
++#define wake_up_nested(x, s) wake_up(x)
++#endif
++
+ #define __wait_event(wq, condition) \
+ do { \
+ DEFINE_WAIT(__wait); \
--- /dev/null
+From stable-bounces@linux.kernel.org Mon Feb 4 06:11:08 2008
+From: Ian Abbott <abbotti@mev.co.uk>
+Date: Mon, 04 Feb 2008 13:43:13 +0000
+Subject: PCI: Fix fakephp deadlock
+To: stable@kernel.org
+Cc: linux-pci@atrey.karlin.mff.cuni.cz, linux-kernel@vger.kernel.org
+Message-ID: <47A71671.7080306@mev.co.uk>
+
+
+From: Ian Abbott <abbotti@mev.co.uk>
+
+This patch works around a problem in the fakephp driver when a process
+writing "0" to a "power" sysfs file to fake removal of a PCI device ends
+up deadlocking itself in the sysfs code.
+
+The patch was recently accepted into Linus' tree after the 2.6.24 release:
+http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=5c796ae7a7ebe56967ed9b9963d7c16d733635ff
+
+Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/pci/hotplug/fakephp.c | 39 +++++++++++++++++++++++++++++++++++----
+ 1 file changed, 35 insertions(+), 4 deletions(-)
+
+--- a/drivers/pci/hotplug/fakephp.c
++++ b/drivers/pci/hotplug/fakephp.c
+@@ -39,6 +39,7 @@
+ #include <linux/init.h>
+ #include <linux/string.h>
+ #include <linux/slab.h>
++#include <linux/workqueue.h>
+ #include "../pci.h"
+
+ #if !defined(MODULE)
+@@ -63,10 +64,16 @@ struct dummy_slot {
+ struct list_head node;
+ struct hotplug_slot *slot;
+ struct pci_dev *dev;
++ struct work_struct remove_work;
++ unsigned long removed;
+ };
+
+ static int debug;
+ static LIST_HEAD(slot_list);
++static struct workqueue_struct *dummyphp_wq;
++
++static void pci_rescan_worker(struct work_struct *work);
++static DECLARE_WORK(pci_rescan_work, pci_rescan_worker);
+
+ static int enable_slot (struct hotplug_slot *slot);
+ static int disable_slot (struct hotplug_slot *slot);
+@@ -109,7 +116,7 @@ static int add_slot(struct pci_dev *dev)
+ slot->name = &dev->dev.bus_id[0];
+ dbg("slot->name = %s\n", slot->name);
+
+- dslot = kmalloc(sizeof(struct dummy_slot), GFP_KERNEL);
++ dslot = kzalloc(sizeof(struct dummy_slot), GFP_KERNEL);
+ if (!dslot)
+ goto error_info;
+
+@@ -164,6 +171,14 @@ static void remove_slot(struct dummy_slo
+ err("Problem unregistering a slot %s\n", dslot->slot->name);
+ }
+
++/* called from the single-threaded workqueue handler to remove a slot */
++static void remove_slot_worker(struct work_struct *work)
++{
++ struct dummy_slot *dslot =
++ container_of(work, struct dummy_slot, remove_work);
++ remove_slot(dslot);
++}
++
+ /**
+ * pci_rescan_slot - Rescan slot
+ * @temp: Device template. Should be set: bus and devfn.
+@@ -267,11 +282,17 @@ static inline void pci_rescan(void) {
+ pci_rescan_buses(&pci_root_buses);
+ }
+
++/* called from the single-threaded workqueue handler to rescan all pci buses */
++static void pci_rescan_worker(struct work_struct *work)
++{
++ pci_rescan();
++}
+
+ static int enable_slot(struct hotplug_slot *hotplug_slot)
+ {
+ /* mis-use enable_slot for rescanning of the pci bus */
+- pci_rescan();
++ cancel_work_sync(&pci_rescan_work);
++ queue_work(dummyphp_wq, &pci_rescan_work);
+ return -ENODEV;
+ }
+
+@@ -306,6 +327,10 @@ static int disable_slot(struct hotplug_s
+ err("Can't remove PCI devices with other PCI devices behind it yet.\n");
+ return -ENODEV;
+ }
++ if (test_and_set_bit(0, &dslot->removed)) {
++ dbg("Slot already scheduled for removal\n");
++ return -ENODEV;
++ }
+ /* search for subfunctions and disable them first */
+ if (!(dslot->dev->devfn & 7)) {
+ for (func = 1; func < 8; func++) {
+@@ -328,8 +353,9 @@ static int disable_slot(struct hotplug_s
+ /* remove the device from the pci core */
+ pci_remove_bus_device(dslot->dev);
+
+- /* blow away this sysfs entry and other parts. */
+- remove_slot(dslot);
++ /* queue work item to blow away this sysfs entry and other parts. */
++ INIT_WORK(&dslot->remove_work, remove_slot_worker);
++ queue_work(dummyphp_wq, &dslot->remove_work);
+
+ return 0;
+ }
+@@ -340,6 +366,7 @@ static void cleanup_slots (void)
+ struct list_head *next;
+ struct dummy_slot *dslot;
+
++ destroy_workqueue(dummyphp_wq);
+ list_for_each_safe (tmp, next, &slot_list) {
+ dslot = list_entry (tmp, struct dummy_slot, node);
+ remove_slot(dslot);
+@@ -351,6 +378,10 @@ static int __init dummyphp_init(void)
+ {
+ info(DRIVER_DESC "\n");
+
++ dummyphp_wq = create_singlethread_workqueue(MY_NAME);
++ if (!dummyphp_wq)
++ return -ENOMEM;
++
+ return pci_scan_buses();
+ }
+
usb-handle-idvendor-of-0x0000.patch
usb-fix-usb_serial_driver-structure-for-kobil-cardreader-driver.patch
forcedeth-mac-address-mcp77-79.patch
+lockdep-annotate-epoll.patch
+sys_remap_file_pages-fix-vm_file-accounting.patch
+pci-fix-fakephp-deadlock.patch
+acpi-update-acpi-blacklist.patch
--- /dev/null
+From stable-bounces@linux.kernel.org Mon Feb 4 22:27:28 2008
+From: Oleg Nesterov <oleg@tv-sign.ru>
+Date: Mon, 04 Feb 2008 22:27:18 -0800
+Subject: sys_remap_file_pages: fix ->vm_file accounting
+To: torvalds@linux-foundation.org
+Cc: akpm@linux-foundation.org, mszeredi@suse.cz, oleg@tv-sign.ru, stable@kernel.org
+Message-ID: <200802050627.m156R0c2006368@imap1.linux-foundation.org>
+
+
+From: Oleg Nesterov <oleg@tv-sign.ru>
+
+patch 8a459e44ad837018ea5c34a9efe8eb4ad27ded26 in mainline.
+
+Fix ->vm_file accounting, mmap_region() may do do_munmap().
+
+Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
+Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
+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/fremap.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/mm/fremap.c
++++ b/mm/fremap.c
+@@ -190,10 +190,13 @@ asmlinkage long sys_remap_file_pages(uns
+ */
+ if (mapping_cap_account_dirty(mapping)) {
+ unsigned long addr;
++ struct file *file = vma->vm_file;
+
+ flags &= MAP_NONBLOCK;
+- addr = mmap_region(vma->vm_file, start, size,
++ get_file(file);
++ addr = mmap_region(file, start, size,
+ flags, vma->vm_flags, pgoff, 1);
++ fput(file);
+ if (IS_ERR_VALUE(addr)) {
+ err = addr;
+ } else {