]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
run backlog for 2.6.24
authorChris Wright <chrisw@sous-sol.org>
Thu, 17 Apr 2008 00:30:22 +0000 (17:30 -0700)
committerChris Wright <chrisw@sous-sol.org>
Thu, 17 Apr 2008 00:30:22 +0000 (17:30 -0700)
48 files changed:
queue-2.6.24/acpi-bus-check-once-more-for-an-empty-list-after-locking-it.patch [new file with mode: 0644]
queue-2.6.24/acpi-fix-buggy-bios-check-when-cpus-are-hot-removed.patch [new file with mode: 0644]
queue-2.6.24/ax25-ax25_out-check-skb-for-null-in-ax25_kick.patch [new file with mode: 0644]
queue-2.6.24/bluetooth-hci_core-defer-hci_unregister_sysfs.patch [new file with mode: 0644]
queue-2.6.24/crypto-xcbc-fix-crash-when-ipsec-uses-xcbc-mac-with-big-data-chunk.patch [new file with mode: 0644]
queue-2.6.24/dvb-tda10086-make-the-22khz-tone-for-diseqc-a-config-option.patch [new file with mode: 0644]
queue-2.6.24/fbdev-fix-proc-fb-oops-after-module-removal.patch [new file with mode: 0644]
queue-2.6.24/file-capabilities-remove-cap_task_kill.patch [new file with mode: 0644]
queue-2.6.24/fix-signal-trampoline-cache-flushing.patch [new file with mode: 0644]
queue-2.6.24/hfs-fix-unlink-of-links.patch [new file with mode: 0644]
queue-2.6.24/hwmon-fix-i-o-resource-conflict-with-pnp.patch [new file with mode: 0644]
queue-2.6.24/inet-inet_frag_evictor-must-run-with-bh-disabled.patch [new file with mode: 0644]
queue-2.6.24/ipmi-change-device-node-ordering-to-reflect-probe-order.patch [new file with mode: 0644]
queue-2.6.24/libata-assume-no-device-is-attached-if-both-identifys-are-aborted.patch [new file with mode: 0644]
queue-2.6.24/llc-restrict-llc-sockets-to-root.patch [new file with mode: 0644]
queue-2.6.24/macb-call-phy_disconnect-on-removing.patch [new file with mode: 0644]
queue-2.6.24/md-close-a-livelock-window-in-handle_parity_checks5.patch [new file with mode: 0644]
queue-2.6.24/mtd-fix-broken-state-in-cfi-driver-caused-by-fl_shutdown.patch [new file with mode: 0644]
queue-2.6.24/net-add-preemption-point-in-qdisc_run.patch [new file with mode: 0644]
queue-2.6.24/net-fix-multicast-device-ioctl-checks.patch [new file with mode: 0644]
queue-2.6.24/net-include-linux-types.h-into-linux-ethtool.h-for-__u-typedef.patch [new file with mode: 0644]
queue-2.6.24/netpoll-zap_completion_queue-adjust-skb-users-counter.patch [new file with mode: 0644]
queue-2.6.24/parisc-futex-special-case-cmpxchg-null-in-kernel-space.patch [new file with mode: 0644]
queue-2.6.24/parisc-pdc_console-fix-bizarre-panic-on-boot.patch [new file with mode: 0644]
queue-2.6.24/pci-revert-smbus-unhide-on-hp-compaq-nx6110.patch [new file with mode: 0644]
queue-2.6.24/plip-replace-spin_lock_irq-with-spin_lock_irqsave-in-irq-context.patch [new file with mode: 0644]
queue-2.6.24/pnpacpi-reduce-printk-severity-for-pnpacpi-exceeded-the-max-number-of.patch [new file with mode: 0644]
queue-2.6.24/powerpc-fix-build-of-modular-drivers-macintosh-apm_emu.c.patch [new file with mode: 0644]
queue-2.6.24/pppol2tp-fix-smp-issues-in-skb-reorder-queue-handling.patch [new file with mode: 0644]
queue-2.6.24/pppol2tp-make-locking-calls-softirq-safe.patch [new file with mode: 0644]
queue-2.6.24/sch_htb-fix-too-many-events-situation.patch [new file with mode: 0644]
queue-2.6.24/sctp-fix-local_addr-deletions-during-list-traversals.patch [new file with mode: 0644]
queue-2.6.24/series
queue-2.6.24/signalfd-fix-for-incorrect-si_queue-user-data-reporting.patch [new file with mode: 0644]
queue-2.6.24/sis190-read-the-mac-address-from-the-eeprom-first.patch [new file with mode: 0644]
queue-2.6.24/sparc64-fix-__get_cpu_var-in-preemption-enabled-area.patch [new file with mode: 0644]
queue-2.6.24/sparc64-fix-atomic-backoff-limit.patch [new file with mode: 0644]
queue-2.6.24/sparc64-fix-fpu-saving-in-64-bit-signal-handling.patch [new file with mode: 0644]
queue-2.6.24/sparc64-flush_ptrace_access-needs-preemption-disable.patch [new file with mode: 0644]
queue-2.6.24/sungem-fix-napi-assertion-failure.patch [new file with mode: 0644]
queue-2.6.24/sunrpc-fix-a-memory-leak-in-rpc_create.patch [new file with mode: 0644]
queue-2.6.24/tcp-fix-shrinking-windows-with-window-scaling.patch [new file with mode: 0644]
queue-2.6.24/tcp-let-skbs-grow-over-a-page-on-fast-peers.patch [new file with mode: 0644]
queue-2.6.24/usb-allow-initialization-of-broken-keyspan-serial-adapters.patch [new file with mode: 0644]
queue-2.6.24/usb-serial-fix-regression-in-visor-palm-os-module-for-kernels-2.6.24.patch [new file with mode: 0644]
queue-2.6.24/usb-serial-ti_usb_3410_5052-correct-tusb3410-endpoint-requirements.patch [new file with mode: 0644]
queue-2.6.24/vlan-don-t-copy-allmulti-promisc-flags-from-underlying-device.patch [new file with mode: 0644]
queue-2.6.24/vmcoreinfo-add-the-symbol-phys_base.patch [new file with mode: 0644]

diff --git a/queue-2.6.24/acpi-bus-check-once-more-for-an-empty-list-after-locking-it.patch b/queue-2.6.24/acpi-bus-check-once-more-for-an-empty-list-after-locking-it.patch
new file mode 100644 (file)
index 0000000..9e5e2ce
--- /dev/null
@@ -0,0 +1,43 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:54:06 2008
+Date: Wed, 16 Apr 2008 02:45:05 GMT
+Message-Id: <200804160245.m3G2j5nl012377@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: acpi: bus: check once more for an empty list after locking it
+
+From: Chuck Ebbert <cebbert@redhat.com>
+
+upstream commit: f0a37e008750ead1751b7d5e89d220a260a46147
+
+List could have become empty after the unlocked check that was made earlier,
+so check again inside the lock.
+
+Should fix https://bugzilla.redhat.com/show_bug.cgi?id=427765
+
+Signed-off-by: Chuck Ebbert <cebbert@redhat.com>
+Cc: <stable@kernel.org>
+Cc: Len Brown <lenb@kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/acpi/bus.c |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -350,10 +350,11 @@ int acpi_bus_receive_event(struct acpi_b
+       }
+       spin_lock_irqsave(&acpi_bus_event_lock, flags);
+-      entry =
+-          list_entry(acpi_bus_event_list.next, struct acpi_bus_event, node);
+-      if (entry)
++      if (!list_empty(&acpi_bus_event_list)) {
++              entry = list_entry(acpi_bus_event_list.next,
++                                 struct acpi_bus_event, node);
+               list_del(&entry->node);
++      }
+       spin_unlock_irqrestore(&acpi_bus_event_lock, flags);
+       if (!entry)
diff --git a/queue-2.6.24/acpi-fix-buggy-bios-check-when-cpus-are-hot-removed.patch b/queue-2.6.24/acpi-fix-buggy-bios-check-when-cpus-are-hot-removed.patch
new file mode 100644 (file)
index 0000000..9c7b9fe
--- /dev/null
@@ -0,0 +1,39 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:30:31 2008
+Date: Thu, 10 Apr 2008 01:50:05 GMT
+Message-Id: <200804100150.m3A1o5Xd032532@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: acpi: fix "buggy BIOS check" when CPUs are hot removed
+
+From: Alok Kataria <akataria@vmware.com>
+
+upstream commit: ba62b077871a5255e271f4fdae57167651839277
+
+Fixes a BUG in ACPI hotplugging.
+
+processor_device_array[pr->id] needs to be set to NULL when removing a CPU.
+Else the "buggy BIOS check" in acpi_processor_start mistakenly fires when a
+CPU is removed from the system and then later re-added.
+
+Signed-off-by: Alok N Kataria <akataria@vmware.com>
+Signed-off-by: Dan Arai <arai@vmware.com>
+Cc: Len Brown <lenb@kernel.org>
+Cc: <stable@kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/acpi/processor_core.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/acpi/processor_core.c
++++ b/drivers/acpi/processor_core.c
+@@ -792,7 +792,7 @@ static int acpi_processor_remove(struct 
+       acpi_processor_remove_fs(device);
+       processors[pr->id] = NULL;
+-
++      processor_device_array[pr->id] = NULL;
+       kfree(pr);
+       return 0;
diff --git a/queue-2.6.24/ax25-ax25_out-check-skb-for-null-in-ax25_kick.patch b/queue-2.6.24/ax25-ax25_out-check-skb-for-null-in-ax25_kick.patch
new file mode 100644 (file)
index 0000000..6c2beda
--- /dev/null
@@ -0,0 +1,60 @@
+From 490fb153b2a45b8b4aef52374a063a34061e2619 Mon Sep 17 00:00:00 2001
+From: Jarek Poplawski <jarkao2@gmail.com>
+Date: Sun, 6 Apr 2008 23:35:31 -0700
+Subject: AX25 ax25_out: check skb for NULL in ax25_kick()
+
+Upstream commit: f47b7257c7368698eabff6fd7b340071932af640
+
+According to some OOPS reports ax25_kick tries to clone NULL skbs
+sometimes. It looks like a race with ax25_clear_queues(). Probably
+there is no need to add more than a simple check for this yet.
+Another report suggested there are probably also cases where ax25
+->paclen == 0 can happen in ax25_output(); this wasn't confirmed
+during testing but let's leave this debugging check for some time.
+
+Reported-and-tested-by: Jann Traschewski <jann@gmx.de>
+Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/ax25/ax25_out.c |   13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+--- a/net/ax25/ax25_out.c
++++ b/net/ax25/ax25_out.c
+@@ -117,6 +117,12 @@ void ax25_output(ax25_cb *ax25, int pacl
+       unsigned char *p;
+       int frontlen, len, fragno, ka9qfrag, first = 1;
++      if (paclen < 16) {
++              WARN_ON_ONCE(1);
++              kfree_skb(skb);
++              return;
++      }
++
+       if ((skb->len - 1) > paclen) {
+               if (*skb->data == AX25_P_TEXT) {
+                       skb_pull(skb, 1); /* skip PID */
+@@ -251,8 +257,6 @@ void ax25_kick(ax25_cb *ax25)
+       if (start == end)
+               return;
+-      ax25->vs = start;
+-
+       /*
+        * Transmit data until either we're out of data to send or
+        * the window is full. Send a poll on the final I frame if
+@@ -261,8 +265,13 @@ void ax25_kick(ax25_cb *ax25)
+       /*
+        * Dequeue the frame and copy it.
++       * Check for race with ax25_clear_queues().
+        */
+       skb  = skb_dequeue(&ax25->write_queue);
++      if (!skb)
++              return;
++
++      ax25->vs = start;
+       do {
+               if ((skbn = skb_clone(skb, GFP_ATOMIC)) == NULL) {
diff --git a/queue-2.6.24/bluetooth-hci_core-defer-hci_unregister_sysfs.patch b/queue-2.6.24/bluetooth-hci_core-defer-hci_unregister_sysfs.patch
new file mode 100644 (file)
index 0000000..1cf6672
--- /dev/null
@@ -0,0 +1,116 @@
+From 147e2d59833e994cc99341806a88b9e59be41391 Mon Sep 17 00:00:00 2001
+From: Dave Young <hidave.darkstar@gmail.com>
+Date: Wed, 5 Mar 2008 18:45:59 -0800
+Message-ID: <47FA109D.2030203@gentoo.org>
+Subject: bluetooth: hci_core: defer hci_unregister_sysfs()
+
+upstream commit: 147e2d59833e994cc99341806a88b9e59be41391
+
+Alon Bar-Lev reports:
+
+ Feb 16 23:41:33 alon1 usb 3-1: configuration #1 chosen from 1 choice
+Feb 16 23:41:33 alon1 BUG: unable to handle kernel NULL pointer
+dereference at virtual address 00000008
+Feb 16 23:41:33 alon1 printing eip: c01b2db6 *pde = 00000000
+Feb 16 23:41:33 alon1 Oops: 0000 [#1] PREEMPT
+Feb 16 23:41:33 alon1 Modules linked in: ppp_deflate zlib_deflate
+zlib_inflate bsd_comp ppp_async rfcomm l2cap hci_usb vmnet(P)
+vmmon(P) tun radeon drm autofs4 ipv6 aes_generic crypto_algapi
+ieee80211_crypt_ccmp nf_nat_irc nf_nat_ftp nf_conntrack_irc
+nf_conntrack_ftp ipt_MASQUERADE iptable_nat nf_nat ipt_REJECT
+xt_tcpudp ipt_LOG xt_limit xt_state nf_conntrack_ipv4 nf_conntrack
+iptable_filter ip_tables x_tables snd_pcm_oss snd_mixer_oss
+snd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device
+bluetooth ppp_generic slhc ioatdma dca cfq_iosched cpufreq_powersave
+cpufreq_ondemand cpufreq_conservative acpi_cpufreq freq_table uinput
+fan af_packet nls_cp1255 nls_iso8859_1 nls_utf8 nls_base pcmcia
+snd_intel8x0 snd_ac97_codec ac97_bus snd_pcm nsc_ircc snd_timer
+ipw2200 thinkpad_acpi irda snd ehci_hcd yenta_socket uhci_hcd
+psmouse ieee80211 soundcore intel_agp hwmon rsrc_nonstatic pcspkr
+e1000 crc_ccitt snd_page_alloc i2c_i801 ieee80211_crypt pcmcia_core
+agpgart thermal bat!
+tery nvram rtc sr_mod ac sg firmware_class button processor cdrom
+unix usbcore evdev ext3 jbd ext2 mbcache loop ata_piix libata sd_mod
+scsi_mod
+Feb 16 23:41:33 alon1
+Feb 16 23:41:33 alon1 Pid: 4, comm: events/0 Tainted: P
+(2.6.24-gentoo-r2 #1)
+Feb 16 23:41:33 alon1 EIP: 0060:[<c01b2db6>] EFLAGS: 00010282 CPU: 0
+Feb 16 23:41:33 alon1 EIP is at sysfs_get_dentry+0x26/0x80
+Feb 16 23:41:33 alon1 EAX: 00000000 EBX: 00000000 ECX: 00000000 EDX:
+f48a2210
+Feb 16 23:41:33 alon1 ESI: f72eb900 EDI: f4803ae0 EBP: f4803ae0 ESP:
+f7c49efc
+Feb 16 23:41:33 alon1 hcid[7004]: HCI dev 0 registered
+Feb 16 23:41:33 alon1 DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068
+Feb 16 23:41:33 alon1 Process events/0 (pid: 4, ti=f7c48000
+task=f7c3efc0 task.ti=f7c48000)
+Feb 16 23:41:33 alon1 Stack: f7cb6140 f4822668 f7e71e10 c01b304d
+ffffffff ffffffff fffffffe c030ba9c
+Feb 16 23:41:33 alon1 f7cb6140 f4822668 f6da6720 f7cb6140 f4822668
+f6da6720 c030ba8e c01ce20b
+Feb 16 23:41:33 alon1 f6e9dd00 c030ba8e f6da6720 f6e9dd00 f6e9dd00
+00000000 f4822600 00000000
+Feb 16 23:41:33 alon1 Call Trace:
+Feb 16 23:41:33 alon1 [<c01b304d>] sysfs_move_dir+0x3d/0x1f0
+Feb 16 23:41:33 alon1 [<c01ce20b>] kobject_move+0x9b/0x120
+Feb 16 23:41:33 alon1 [<c0241711>] device_move+0x51/0x110
+Feb 16 23:41:33 alon1 [<f9aaed80>] del_conn+0x0/0x70 [bluetooth]
+Feb 16 23:41:33 alon1 [<f9aaed99>] del_conn+0x19/0x70 [bluetooth]
+Feb 16 23:41:33 alon1 [<c012c1a1>] run_workqueue+0x81/0x140
+Feb 16 23:41:33 alon1 [<c02c0c88>] schedule+0x168/0x2e0
+Feb 16 23:41:33 alon1 [<c012fc70>] autoremove_wake_function+0x0/0x50
+Feb 16 23:41:33 alon1 [<c012c9cb>] worker_thread+0x9b/0xf0
+Feb 16 23:41:33 alon1 [<c012fc70>] autoremove_wake_function+0x0/0x50
+Feb 16 23:41:33 alon1 [<c012c930>] worker_thread+0x0/0xf0
+Feb 16 23:41:33 alon1 [<c012f962>] kthread+0x42/0x70
+Feb 16 23:41:33 alon1 [<c012f920>] kthread+0x0/0x70
+Feb 16 23:41:33 alon1 [<c0104c2f>] kernel_thread_helper+0x7/0x18
+Feb 16 23:41:33 alon1 =======================
+Feb 16 23:41:33 alon1 Code: 26 00 00 00 00 57 89 c7 a1 50 1b 3a c0
+56 53 8b 70 38 85 f6 74 08 8b 0e 85 c9 74 58 ff 06 8b 56 50 39 fa 74
+47 89 fb eb 02 89 c3 <8b> 43 08 39 c2 75 f7 8b 46 08 83 c0 68 e8 98
+e7 10 00 8b 43 10
+Feb 16 23:41:33 alon1 EIP: [<c01b2db6>] sysfs_get_dentry+0x26/0x80
+SS:ESP 0068:f7c49efc
+Feb 16 23:41:33 alon1 ---[ end trace aae864e9592acc1d ]---
+
+Defer hci_unregister_sysfs because hci device could be destructed
+while hci conn devices still there.
+
+Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
+Tested-by: Stefan Seyfried <seife@suse.de>
+Acked-by: Alon Bar-Lev <alon.barlev@gmail.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Acked-by: Marcel Holtmann <marcel@holtmann.org>
+
+dsd@gentoo.org notes:
+
+This patch fixes http://bugs.gentoo.org/211179
+
+Cc: Daniel Drake <dsd@gentoo.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/bluetooth/hci_core.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/net/bluetooth/hci_core.c
++++ b/net/bluetooth/hci_core.c
+@@ -901,8 +901,6 @@ int hci_unregister_dev(struct hci_dev *h
+       BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type);
+-      hci_unregister_sysfs(hdev);
+-
+       write_lock_bh(&hci_dev_list_lock);
+       list_del(&hdev->list);
+       write_unlock_bh(&hci_dev_list_lock);
+@@ -914,6 +912,8 @@ int hci_unregister_dev(struct hci_dev *h
+       hci_notify(hdev, HCI_DEV_UNREG);
++      hci_unregister_sysfs(hdev);
++
+       __hci_dev_put(hdev);
+       return 0;
diff --git a/queue-2.6.24/crypto-xcbc-fix-crash-when-ipsec-uses-xcbc-mac-with-big-data-chunk.patch b/queue-2.6.24/crypto-xcbc-fix-crash-when-ipsec-uses-xcbc-mac-with-big-data-chunk.patch
new file mode 100644 (file)
index 0000000..410d9c9
--- /dev/null
@@ -0,0 +1,67 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 15:31:15 2008
+Date: Fri, 4 Apr 2008 20:05:02 +0800
+From: Herbert Xu <herbert@gondor.apana.org.au>
+To: stable@kernel.org
+Message-ID: <20080404120502.GA28868@gondor.apana.org.au>
+Subject: CRYPTO xcbc: Fix crash when ipsec uses xcbc-mac with big data chunk
+
+From: Joy Latten <latten@austin.ibm.com>
+
+upstream commit: 1edcf2e1ee2babb011cfca80ad9d202e9c491669
+
+The kernel crashes when ipsec passes a udp packet of about 14XX bytes
+of data to aes-xcbc-mac.
+
+It seems the first xxxx bytes of the data are in first sg entry,
+and remaining xx bytes are in next sg entry. But we don't
+check next sg entry to see if we need to go look the page up.
+
+I noticed in hmac.c, we do a scatterwalk_sg_next(), to do this check
+and possible lookup, thus xcbc.c needs to use this routine too.
+
+A 15-hour run of an ipsec stress test sending streams of tcp and
+udp packets of various sizes,  using this patch and
+aes-xcbc-mac completed successfully, so hopefully this fixes the
+problem.
+
+Signed-off-by: Joy Latten <latten@austin.ibm.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ crypto/xcbc.c |   17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+--- a/crypto/xcbc.c
++++ b/crypto/xcbc.c
+@@ -116,13 +116,11 @@ static int crypto_xcbc_digest_update2(st
+       struct crypto_xcbc_ctx *ctx = crypto_hash_ctx_aligned(parent);
+       struct crypto_cipher *tfm = ctx->child;
+       int bs = crypto_hash_blocksize(parent);
+-      unsigned int i = 0;
+-      do {
+-
+-              struct page *pg = sg_page(&sg[i]);
+-              unsigned int offset = sg[i].offset;
+-              unsigned int slen = sg[i].length;
++      for (;;) {
++              struct page *pg = sg_page(sg);
++              unsigned int offset = sg->offset;
++              unsigned int slen = sg->length;
+               if (unlikely(slen > nbytes))
+                       slen = nbytes;
+@@ -182,8 +180,11 @@ static int crypto_xcbc_digest_update2(st
+                       offset = 0;
+                       pg++;
+               }
+-              i++;
+-      } while (nbytes>0);
++
++              if (!nbytes)
++                      break;
++              sg = scatterwalk_sg_next(sg);
++      }
+       return 0;
+ }
diff --git a/queue-2.6.24/dvb-tda10086-make-the-22khz-tone-for-diseqc-a-config-option.patch b/queue-2.6.24/dvb-tda10086-make-the-22khz-tone-for-diseqc-a-config-option.patch
new file mode 100644 (file)
index 0000000..2fa9124
--- /dev/null
@@ -0,0 +1,167 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:24:17 2008
+Message-ID: <47FC1809.3000400@linuxtv.org>
+Date: Tue, 08 Apr 2008 21:12:41 -0400
+From: Michael Krufky <mkrufky@linuxtv.org>
+To: stable@kernel.org
+Cc: hartmut.hackmann@t-online.de, o.endriss@gmx.de, hermann-pitton@arcor.de, v4l-dvb-maintainer@linuxtv.org, mchehab@infradead.org
+Subject: DVB: tda10086: make the 22kHz tone for DISEQC a config option
+
+From: Hartmut Hackmann <hartmut.hackmann@t-online.de>
+
+(backported from commit ea75baf4b0f117564bd50827a49c4b14d61d24e9)
+
+Some cards need the diseqc signal modulated, while some just need
+the envelope to control the LNB supply.
+
+This fixes Bug 9887
+
+Signed-off-by: Hartmut Hackmann <hartmut.hackmann@t-online.de>
+Acked-by: Oliver Endriss <o.endriss@gmx.de>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
+Cc: Hermann Pitton <hermann-pitton@arcor.de>
+Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/media/dvb/dvb-usb/ttusb2.c        |    1 +
+ drivers/media/dvb/frontends/tda10086.c    |   28 ++++++++++++++++++++++------
+ drivers/media/dvb/frontends/tda10086.h    |    3 +++
+ drivers/media/dvb/ttpci/budget.c          |    1 +
+ drivers/media/video/saa7134/saa7134-dvb.c |    1 +
+ 5 files changed, 28 insertions(+), 6 deletions(-)
+
+--- a/drivers/media/dvb/dvb-usb/ttusb2.c
++++ b/drivers/media/dvb/dvb-usb/ttusb2.c
+@@ -144,6 +144,7 @@ static int ttusb2_power_ctrl(struct dvb_
+ static struct tda10086_config tda10086_config = {
+       .demod_address = 0x0e,
+       .invert = 0,
++      .diseqc_tone = 1,
+ };
+ static int ttusb2_frontend_attach(struct dvb_usb_adapter *adap)
+--- a/drivers/media/dvb/frontends/tda10086.c
++++ b/drivers/media/dvb/frontends/tda10086.c
+@@ -106,9 +106,12 @@ static int tda10086_write_mask(struct td
+ static int tda10086_init(struct dvb_frontend* fe)
+ {
+       struct tda10086_state* state = fe->demodulator_priv;
++      u8 t22k_off = 0x80;
+       dprintk ("%s\n", __FUNCTION__);
++      if (state->config->diseqc_tone)
++              t22k_off = 0;
+       // reset
+       tda10086_write_byte(state, 0x00, 0x00);
+       msleep(10);
+@@ -158,7 +161,7 @@ static int tda10086_init(struct dvb_fron
+       tda10086_write_byte(state, 0x3d, 0x80);
+       // setup SEC
+-      tda10086_write_byte(state, 0x36, 0x80); // all SEC off, no 22k tone
++      tda10086_write_byte(state, 0x36, t22k_off); // all SEC off, 22k tone
+       tda10086_write_byte(state, 0x34, (((1<<19) * (22000/1000)) / (SACLK/1000)));      // } tone frequency
+       tda10086_write_byte(state, 0x35, (((1<<19) * (22000/1000)) / (SACLK/1000)) >> 8); // }
+@@ -180,16 +183,20 @@ static void tda10086_diseqc_wait(struct 
+ static int tda10086_set_tone (struct dvb_frontend* fe, fe_sec_tone_mode_t tone)
+ {
+       struct tda10086_state* state = fe->demodulator_priv;
++      u8 t22k_off = 0x80;
+       dprintk ("%s\n", __FUNCTION__);
++      if (state->config->diseqc_tone)
++              t22k_off = 0;
++
+       switch (tone) {
+       case SEC_TONE_OFF:
+-              tda10086_write_byte(state, 0x36, 0x80);
++              tda10086_write_byte(state, 0x36, t22k_off);
+               break;
+       case SEC_TONE_ON:
+-              tda10086_write_byte(state, 0x36, 0x81);
++              tda10086_write_byte(state, 0x36, 0x01 + t22k_off);
+               break;
+       }
+@@ -202,9 +209,13 @@ static int tda10086_send_master_cmd (str
+       struct tda10086_state* state = fe->demodulator_priv;
+       int i;
+       u8 oldval;
++      u8 t22k_off = 0x80;
+       dprintk ("%s\n", __FUNCTION__);
++      if (state->config->diseqc_tone)
++              t22k_off = 0;
++
+       if (cmd->msg_len > 6)
+               return -EINVAL;
+       oldval = tda10086_read_byte(state, 0x36);
+@@ -212,7 +223,8 @@ static int tda10086_send_master_cmd (str
+       for(i=0; i< cmd->msg_len; i++) {
+               tda10086_write_byte(state, 0x48+i, cmd->msg[i]);
+       }
+-      tda10086_write_byte(state, 0x36, 0x88 | ((cmd->msg_len - 1) << 4));
++      tda10086_write_byte(state, 0x36, (0x08 + t22k_off)
++                                      | ((cmd->msg_len - 1) << 4));
+       tda10086_diseqc_wait(state);
+@@ -225,16 +237,20 @@ static int tda10086_send_burst (struct d
+ {
+       struct tda10086_state* state = fe->demodulator_priv;
+       u8 oldval = tda10086_read_byte(state, 0x36);
++      u8 t22k_off = 0x80;
+       dprintk ("%s\n", __FUNCTION__);
++      if (state->config->diseqc_tone)
++              t22k_off = 0;
++
+       switch(minicmd) {
+       case SEC_MINI_A:
+-              tda10086_write_byte(state, 0x36, 0x84);
++              tda10086_write_byte(state, 0x36, 0x04 + t22k_off);
+               break;
+       case SEC_MINI_B:
+-              tda10086_write_byte(state, 0x36, 0x86);
++              tda10086_write_byte(state, 0x36, 0x06 + t22k_off);
+               break;
+       }
+--- a/drivers/media/dvb/frontends/tda10086.h
++++ b/drivers/media/dvb/frontends/tda10086.h
+@@ -33,6 +33,9 @@ struct tda10086_config
+       /* does the "inversion" need inverted? */
+       u8 invert;
++
++      /* do we need the diseqc signal with carrier? */
++      u8 diseqc_tone;
+ };
+ #if defined(CONFIG_DVB_TDA10086) || (defined(CONFIG_DVB_TDA10086_MODULE) && defined(MODULE))
+--- a/drivers/media/dvb/ttpci/budget.c
++++ b/drivers/media/dvb/ttpci/budget.c
+@@ -351,6 +351,7 @@ static struct s5h1420_config s5h1420_con
+ static struct tda10086_config tda10086_config = {
+       .demod_address = 0x0e,
+       .invert = 0,
++      .diseqc_tone = 1,
+ };
+ static u8 read_pwm(struct budget* budget)
+--- a/drivers/media/video/saa7134/saa7134-dvb.c
++++ b/drivers/media/video/saa7134/saa7134-dvb.c
+@@ -826,6 +826,7 @@ static struct tda1004x_config ads_tech_d
+ static struct tda10086_config flydvbs = {
+       .demod_address = 0x0e,
+       .invert = 0,
++      .diseqc_tone = 0,
+ };
+ /* ==================================================================
diff --git a/queue-2.6.24/fbdev-fix-proc-fb-oops-after-module-removal.patch b/queue-2.6.24/fbdev-fix-proc-fb-oops-after-module-removal.patch
new file mode 100644 (file)
index 0000000..559842a
--- /dev/null
@@ -0,0 +1,90 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:54:46 2008
+Date: Wed, 16 Apr 2008 02:45:07 GMT
+Message-Id: <200804160245.m3G2j7fG012490@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: fbdev: fix /proc/fb oops after module removal
+
+From: Alexey Dobriyan <adobriyan@gmail.com>
+
+upstream commit: c43f89c2084f46e3ec59ddcbc52ecf4b1e9b015a
+
+/proc/fb is not removed during rmmod.
+
+Steps to reproduce:
+
+       modprobe fb
+       rmmod fb
+       ls /proc
+
+BUG: unable to handle kernel paging request at ffffffffa0094370
+IP: [<ffffffff802b92a1>] proc_get_inode+0x101/0x130
+PGD 203067 PUD 207063 PMD 17e758067 PTE 0
+Oops: 0000 [1] SMP
+last sysfs file: /sys/devices/pci0000:00/0000:00:1e.0/0000:05:02.0/resource
+CPU 1
+Modules linked in: nf_conntrack_irc xt_state iptable_filter ipt_MASQUERADE iptable_nat nf_nat nf_conntrack_ipv4 nf_conntrack ip_tables x_tables vfat fat usbhid ehci_hcd uhci_hcd usbcore sr_mod cdrom [last unloaded: fb]
+Pid: 21205, comm: ls Not tainted 2.6.25-rc8-mm2 #14
+RIP: 0010:[<ffffffff802b92a1>]  [<ffffffff802b92a1>] proc_get_inode+0x101/0x130
+RSP: 0018:ffff81017c4bfc78  EFLAGS: 00010246
+RAX: 0000000000008000 RBX: ffff8101787f5470 RCX: 0000000048011ccc
+RDX: ffffffffa0094320 RSI: ffff810006ad43b0 RDI: ffff81017fc2cc00
+RBP: ffff81017e450300 R08: 0000000000000002 R09: ffff81017c5d1000
+R10: 0000000000000000 R11: 0000000000000246 R12: ffff81016b903a28
+R13: ffff81017f822020 R14: ffff81017c4bfd58 R15: ffff81017f822020
+FS:  00007f08e71696f0(0000) GS:ffff81017fc06480(0000) knlGS:0000000000000000
+CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
+CR2: ffffffffa0094370 CR3: 000000017e54a000 CR4: 00000000000006e0
+DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
+DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
+Process ls (pid: 21205, threadinfo ffff81017c4be000, task ffff81017de48770)
+Stack:  ffff81017c5d1000 00000000ffffffea ffff81017e450300 ffffffff802bdd1e
+ ffff81017f802258 ffff81017c4bfe48 ffff81016b903a28 ffff81017f822020
+ ffff81017c4bfd48 ffffffff802b9ba0 ffff81016b903a28 ffff81017f802258
+Call Trace:
+ [<ffffffff802bdd1e>] ? proc_lookup_de+0x8e/0x100
+ [<ffffffff802b9ba0>] ? proc_root_lookup+0x20/0x60
+ [<ffffffff802882a7>] ? do_lookup+0x1b7/0x210
+ [<ffffffff8028883d>] ? __link_path_walk+0x53d/0x7f0
+ [<ffffffff80295eb8>] ? mntput_no_expire+0x28/0x130
+ [<ffffffff80288b4a>] ? path_walk+0x5a/0xc0
+ [<ffffffff80288dd3>] ? do_path_lookup+0x83/0x1c0
+ [<ffffffff80287785>] ? getname+0xe5/0x210
+ [<ffffffff80289adb>] ? __user_walk_fd+0x4b/0x80
+ [<ffffffff8028236c>] ? vfs_lstat_fd+0x2c/0x70
+ [<ffffffff8028bf1e>] ? filldir+0xae/0xf0
+ [<ffffffff802b92e9>] ? de_put+0x9/0x50
+ [<ffffffff8029633d>] ? mnt_want_write+0x2d/0x80
+ [<ffffffff8029339f>] ? touch_atime+0x1f/0x170
+ [<ffffffff802b9b1d>] ? proc_root_readdir+0x7d/0xa0
+ [<ffffffff802825e7>] ? sys_newlstat+0x27/0x50
+ [<ffffffff8028bffb>] ? vfs_readdir+0x9b/0xd0
+ [<ffffffff8028c0fe>] ? sys_getdents+0xce/0xe0
+ [<ffffffff8020b39b>] ? system_call_after_swapgs+0x7b/0x80
+
+Code: b7 83 b2 00 00 00 25 00 f0 00 00 3d 00 80 00 00 74 19 48 89 93 f0 00 00 00 48 89 df e8 39 9a fd ff 48 89 d8 48 83 c4 08 5b 5d c3 <48> 83 7a 50 00 48 c7 c0 60 16 45 80 48 c7 c2 40 17 45 80 48 0f
+RIP  [<ffffffff802b92a1>] proc_get_inode+0x101/0x130
+ RSP <ffff81017c4bfc78>
+CR2: ffffffffa0094370
+---[ end trace c71hiarjan8ab739 ]---
+
+Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
+"Antonino A. Daplas" <adaplas@pol.net>
+Cc: <stable@kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/video/fbmem.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/video/fbmem.c
++++ b/drivers/video/fbmem.c
+@@ -1521,6 +1521,7 @@ module_init(fbmem_init);
+ static void __exit
+ fbmem_exit(void)
+ {
++      remove_proc_entry("fb", NULL);
+       class_destroy(fb_class);
+       unregister_chrdev(FB_MAJOR, "fb");
+ }
diff --git a/queue-2.6.24/file-capabilities-remove-cap_task_kill.patch b/queue-2.6.24/file-capabilities-remove-cap_task_kill.patch
new file mode 100644 (file)
index 0000000..501ecec
--- /dev/null
@@ -0,0 +1,122 @@
+From aedb60a67c10a0861af179725d060765262ba0fb Mon Sep 17 00:00:00 2001
+From: Serge Hallyn <serge@hallyn.com>
+Date: Fri, 29 Feb 2008 15:14:57 +0000
+Subject: file capabilities: remove cap_task_kill()
+
+upstream commit: aedb60a67c10a0861af179725d060765262ba0fb
+
+The original justification for cap_task_kill() was as follows:
+
+       check_kill_permission() does appropriate uid equivalence checks.
+       However with file capabilities it becomes possible for an
+       unprivileged user to execute a file with file capabilities
+       resulting in a more privileged task with the same uid.
+
+However now that cap_task_kill() always returns 0 (permission
+granted) when p->uid==current->uid, the whole hook is worthless,
+and only likely to create more subtle problems in the corner cases
+where it might still be called but return -EPERM.  Those cases
+are basically when uids are different but euid/suid is equivalent
+as per the check in check_kill_permission().
+
+One example of a still-broken application is 'at' for non-root users.
+
+This patch removes cap_task_kill().
+
+Signed-off-by: Serge Hallyn <serge@hallyn.com>
+Acked-by: Andrew G. Morgan <morgan@kernel.org>
+Earlier-version-tested-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>
+Acked-by: Casey Schaufler <casey@schaufler-ca.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+[chrisw@sous-sol.org: backport to 2.6.24.4]
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ include/linux/security.h |    3 +--
+ security/capability.c    |    1 -
+ security/commoncap.c     |   39 ---------------------------------------
+ 3 files changed, 1 insertion(+), 42 deletions(-)
+
+--- a/include/linux/security.h
++++ b/include/linux/security.h
+@@ -62,7 +62,6 @@ extern int cap_inode_need_killpriv(struc
+ extern int cap_inode_killpriv(struct dentry *dentry);
+ extern int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags);
+ extern void cap_task_reparent_to_init (struct task_struct *p);
+-extern int cap_task_kill(struct task_struct *p, struct siginfo *info, int sig, u32 secid);
+ extern int cap_task_setscheduler (struct task_struct *p, int policy, struct sched_param *lp);
+ extern int cap_task_setioprio (struct task_struct *p, int ioprio);
+ extern int cap_task_setnice (struct task_struct *p, int nice);
+@@ -2112,7 +2111,7 @@ static inline int security_task_kill (st
+                                     struct siginfo *info, int sig,
+                                     u32 secid)
+ {
+-      return cap_task_kill(p, info, sig, secid);
++      return 0;
+ }
+ static inline int security_task_wait (struct task_struct *p)
+--- a/security/capability.c
++++ b/security/capability.c
+@@ -40,7 +40,6 @@ static struct security_operations capabi
+       .inode_need_killpriv =          cap_inode_need_killpriv,
+       .inode_killpriv =               cap_inode_killpriv,
+-      .task_kill =                    cap_task_kill,
+       .task_setscheduler =            cap_task_setscheduler,
+       .task_setioprio =               cap_task_setioprio,
+       .task_setnice =                 cap_task_setnice,
+--- a/security/commoncap.c
++++ b/security/commoncap.c
+@@ -527,40 +527,6 @@ int cap_task_setnice (struct task_struct
+       return cap_safe_nice(p);
+ }
+-int cap_task_kill(struct task_struct *p, struct siginfo *info,
+-                              int sig, u32 secid)
+-{
+-      if (info != SEND_SIG_NOINFO && (is_si_special(info) || SI_FROMKERNEL(info)))
+-              return 0;
+-
+-      /*
+-       * Running a setuid root program raises your capabilities.
+-       * Killing your own setuid root processes was previously
+-       * allowed.
+-       * We must preserve legacy signal behavior in this case.
+-       */
+-      if (p->uid == current->uid)
+-              return 0;
+-
+-      /* sigcont is permitted within same session */
+-      if (sig == SIGCONT && (task_session_nr(current) == task_session_nr(p)))
+-              return 0;
+-
+-      if (secid)
+-              /*
+-               * Signal sent as a particular user.
+-               * Capabilities are ignored.  May be wrong, but it's the
+-               * only thing we can do at the moment.
+-               * Used only by usb drivers?
+-               */
+-              return 0;
+-      if (cap_issubset(p->cap_permitted, current->cap_permitted))
+-              return 0;
+-      if (capable(CAP_KILL))
+-              return 0;
+-
+-      return -EPERM;
+-}
+ #else
+ int cap_task_setscheduler (struct task_struct *p, int policy,
+                          struct sched_param *lp)
+@@ -575,11 +541,6 @@ int cap_task_setnice (struct task_struct
+ {
+       return 0;
+ }
+-int cap_task_kill(struct task_struct *p, struct siginfo *info,
+-                              int sig, u32 secid)
+-{
+-      return 0;
+-}
+ #endif
+ void cap_task_reparent_to_init (struct task_struct *p)
diff --git a/queue-2.6.24/fix-signal-trampoline-cache-flushing.patch b/queue-2.6.24/fix-signal-trampoline-cache-flushing.patch
new file mode 100644 (file)
index 0000000..e86ce3e
--- /dev/null
@@ -0,0 +1,31 @@
+From cf39cc3b56bc4a562db6242d3069f65034ec7549 Mon Sep 17 00:00:00 2001
+From: Kyle McMartin <kyle@mcmartin.ca>
+Date: Tue, 15 Apr 2008 18:36:38 -0400
+Message-ID: <20080415223638.GD17646@phobos.i.cabal.ca>
+Subject: PARISC fix signal trampoline cache flushing
+
+upstream commit: cf39cc3b56bc4a562db6242d3069f65034ec7549
+
+The signal trampolines were accidently flushing the kernel I$ instead of
+the users.  Fix that up, and also add a missing user D$ flush while
+we're at it.
+
+Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ arch/parisc/kernel/signal.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/arch/parisc/kernel/signal.c
++++ b/arch/parisc/kernel/signal.c
+@@ -534,7 +534,8 @@ insert_restart_trampoline(struct pt_regs
+                * Flushing one cacheline is cheap.
+                * "sync" on bigger (> 4 way) boxes is not.
+                */
+-              flush_icache_range(regs->gr[30], regs->gr[30] + 4);
++              flush_user_dcache_range(regs->gr[30], regs->gr[30] + 4);
++              flush_user_icache_range(regs->gr[30], regs->gr[30] + 4);
+               regs->gr[31] = regs->gr[30] + 8;
+               /* Preserve original r28. */
diff --git a/queue-2.6.24/hfs-fix-unlink-of-links.patch b/queue-2.6.24/hfs-fix-unlink-of-links.patch
new file mode 100644 (file)
index 0000000..b3cd91f
--- /dev/null
@@ -0,0 +1,57 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:28:46 2008
+Date: Wed, 9 Apr 2008 17:44:07 +0200 (CEST)
+From: Roman Zippel <zippel@linux-m68k.org>
+To: Linus Torvalds <torvalds@linux-foundation.org>
+Message-ID: <Pine.LNX.4.64.0804091727200.8547@scrub.home>
+Cc: stable@kernel.org
+Subject: HFS+: fix unlink of links
+
+upstream commit: 76b0c26af2736b7e5b87e6ed7ab63901483d5736
+
+Some time ago while attempting to handle invalid link counts, I botched 
+the unlink of links itself, so this patch fixes this now correctly, so 
+that only the link count of nodes that don't point to links is ignored.
+Thanks to Vlado Plaga <rechner@vlado-do.de> to notify me of this 
+problem.
+
+Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ fs/hfsplus/dir.c |   23 +++++++++++++++--------
+ 1 file changed, 15 insertions(+), 8 deletions(-)
+
+--- a/fs/hfsplus/dir.c
++++ b/fs/hfsplus/dir.c
+@@ -340,16 +340,23 @@ static int hfsplus_unlink(struct inode *
+       if (inode->i_nlink > 0)
+               drop_nlink(inode);
+-      hfsplus_delete_inode(inode);
+-      if (inode->i_ino != cnid && !inode->i_nlink) {
+-              if (!atomic_read(&HFSPLUS_I(inode).opencnt)) {
+-                      res = hfsplus_delete_cat(inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL);
+-                      if (!res)
+-                              hfsplus_delete_inode(inode);
++      if (inode->i_ino == cnid)
++              clear_nlink(inode);
++      if (!inode->i_nlink) {
++              if (inode->i_ino != cnid) {
++                      HFSPLUS_SB(sb).file_count--;
++                      if (!atomic_read(&HFSPLUS_I(inode).opencnt)) {
++                              res = hfsplus_delete_cat(inode->i_ino,
++                                                       HFSPLUS_SB(sb).hidden_dir,
++                                                       NULL);
++                              if (!res)
++                                      hfsplus_delete_inode(inode);
++                      } else
++                              inode->i_flags |= S_DEAD;
+               } else
+-                      inode->i_flags |= S_DEAD;
++                      hfsplus_delete_inode(inode);
+       } else
+-              clear_nlink(inode);
++              HFSPLUS_SB(sb).file_count--;
+       inode->i_ctime = CURRENT_TIME_SEC;
+       mark_inode_dirty(inode);
diff --git a/queue-2.6.24/hwmon-fix-i-o-resource-conflict-with-pnp.patch b/queue-2.6.24/hwmon-fix-i-o-resource-conflict-with-pnp.patch
new file mode 100644 (file)
index 0000000..3adae05
--- /dev/null
@@ -0,0 +1,84 @@
+From 2961cb22ef02850d90e7a12c28a14d74e327df8d Mon Sep 17 00:00:00 2001
+From: Jean Delvare <khali@linux-fr.org>
+Date: Sun, 9 Mar 2008 13:34:28 +0100
+Message-ID: <20080402160609.292ae0db@hyperion.delvare>
+Subject: hwmon: (w83781d) Fix I/O resource conflict with PNP
+
+upstream commit: 2961cb22ef02850d90e7a12c28a14d74e327df8d
+
+Only request I/O ports 0x295-0x296 instead of the full I/O address
+range. This solves a conflict with PNP resources on a few motherboards.
+
+Also request the I/O ports in two parts (4 low ports, 4 high ports)
+during device detection, otherwise the PNP resource makes the request
+(and thus the detection) fail.
+
+This fixes lm-sensors ticket #2306:
+http://www.lm-sensors.org/ticket/2306
+
+Signed-off-by: Jean Delvare <khali@linux-fr.org>
+Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/hwmon/w83781d.c |   21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+--- a/drivers/hwmon/w83781d.c
++++ b/drivers/hwmon/w83781d.c
+@@ -1380,7 +1380,8 @@ w83781d_isa_probe(struct platform_device
+       /* Reserve the ISA region */
+       res = platform_get_resource(pdev, IORESOURCE_IO, 0);
+-      if (!request_region(res->start, W83781D_EXTENT, "w83781d")) {
++      if (!request_region(res->start + W83781D_ADDR_REG_OFFSET, 2,
++                          "w83781d")) {
+               err = -EBUSY;
+               goto exit;
+       }
+@@ -1432,7 +1433,7 @@ w83781d_isa_probe(struct platform_device
+       device_remove_file(&pdev->dev, &dev_attr_name);
+       kfree(data);
+  exit_release_region:
+-      release_region(res->start, W83781D_EXTENT);
++      release_region(res->start + W83781D_ADDR_REG_OFFSET, 2);
+  exit:
+       return err;
+ }
+@@ -1446,7 +1447,7 @@ w83781d_isa_remove(struct platform_devic
+       sysfs_remove_group(&pdev->dev.kobj, &w83781d_group);
+       sysfs_remove_group(&pdev->dev.kobj, &w83781d_group_opt);
+       device_remove_file(&pdev->dev, &dev_attr_name);
+-      release_region(data->client.addr, W83781D_EXTENT);
++      release_region(data->client.addr + W83781D_ADDR_REG_OFFSET, 2);
+       kfree(data);
+       return 0;
+@@ -1820,8 +1821,17 @@ w83781d_isa_found(unsigned short address
+ {
+       int val, save, found = 0;
+-      if (!request_region(address, W83781D_EXTENT, "w83781d"))
++      /* We have to request the region in two parts because some
++         boards declare base+4 to base+7 as a PNP device */
++      if (!request_region(address, 4, "w83781d")) {
++              pr_debug("w83781d: Failed to request low part of region\n");
+               return 0;
++      }
++      if (!request_region(address + 4, 4, "w83781d")) {
++              pr_debug("w83781d: Failed to request high part of region\n");
++              release_region(address, 4);
++              return 0;
++      }
+ #define REALLY_SLOW_IO
+       /* We need the timeouts for at least some W83781D-like
+@@ -1896,7 +1906,8 @@ w83781d_isa_found(unsigned short address
+                       val == 0x30 ? "W83782D" : "W83781D", (int)address);
+  release:
+-      release_region(address, W83781D_EXTENT);
++      release_region(address + 4, 4);
++      release_region(address, 4);
+       return found;
+ }
diff --git a/queue-2.6.24/inet-inet_frag_evictor-must-run-with-bh-disabled.patch b/queue-2.6.24/inet-inet_frag_evictor-must-run-with-bh-disabled.patch
new file mode 100644 (file)
index 0000000..6ca9d17
--- /dev/null
@@ -0,0 +1,27 @@
+From 3e037097fd10d7074693b12aaac84f368ee20136 Mon Sep 17 00:00:00 2001
+From: David S. Miller <davem@davemloft.net>
+Date: Sun, 6 Apr 2008 23:40:06 -0700
+Subject: INET: inet_frag_evictor() must run with BH disabled
+
+Part of upstream commit: e8e16b706e8406f1ab3bccab16932ebc513896d8
+
+Based upon a lockdep trace from Dave Jones.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/ipv6/netfilter/nf_conntrack_reasm.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
++++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
+@@ -147,7 +147,9 @@ static __inline__ void fq_kill(struct nf
+ static void nf_ct_frag6_evictor(void)
+ {
++      local_bh_disable();
+       inet_frag_evictor(&nf_frags);
++      local_bh_enable();
+ }
+ static void nf_ct_frag6_expire(unsigned long data)
diff --git a/queue-2.6.24/ipmi-change-device-node-ordering-to-reflect-probe-order.patch b/queue-2.6.24/ipmi-change-device-node-ordering-to-reflect-probe-order.patch
new file mode 100644 (file)
index 0000000..f295828
--- /dev/null
@@ -0,0 +1,44 @@
+From abd24df828f1a72971db29d1b74fefae104ea9e2 Mon Sep 17 00:00:00 2001
+From: Carol Hebert <cah@us.ibm.com>
+Date: Fri, 4 Apr 2008 14:30:03 -0700
+Subject: ipmi: change device node ordering to reflect probe order
+
+upstream commit: abd24df828f1a72971db29d1b74fefae104ea9e2
+
+In 2.6.14 a patch was merged which switching the order of the ipmi device
+naming from in-order-of-discovery over to reverse-order-of-discovery.
+
+So on systems with multiple BMC interfaces, the ipmi device names are being
+created in reverse order relative to how they are discovered on the system
+(e.g.  on an IBM x3950 multinode server with N nodes, the device name for the
+BMC in the first node is /dev/ipmiN-1 and the device name for the BMC in the
+last node is /dev/ipmi0, etc.).
+
+The problem is caused by the list handling routines chosen in dmi_scan.c.
+Using list_add() causes the multiple ipmi devices to be added to the device
+list using a stack-paradigm and so the ipmi driver subsequently pulls them off
+during initialization in LIFO order.  This patch changes the
+dmi_save_ipmi_device() list handling paradigm to a queue, thereby allowing the
+ipmi driver to build the ipmi device names in the order in which they are
+found on the system.
+
+Signed-off-by: Carol Hebert <cah@us.ibm.com>
+Signed-off-by: Corey Minyard <cminyard@mvista.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/firmware/dmi_scan.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/firmware/dmi_scan.c
++++ b/drivers/firmware/dmi_scan.c
+@@ -219,7 +219,7 @@ static void __init dmi_save_ipmi_device(
+       dev->name = "IPMI controller";
+       dev->device_data = data;
+-      list_add(&dev->list, &dmi_devices);
++      list_add_tail(&dev->list, &dmi_devices);
+ }
+ /*
diff --git a/queue-2.6.24/libata-assume-no-device-is-attached-if-both-identifys-are-aborted.patch b/queue-2.6.24/libata-assume-no-device-is-attached-if-both-identifys-are-aborted.patch
new file mode 100644 (file)
index 0000000..1782da2
--- /dev/null
@@ -0,0 +1,89 @@
+From 1ffc151fcddf524d0c76709d7e7a2af0255acb6b Mon Sep 17 00:00:00 2001
+From: Tejun Heo <htejun@gmail.com>
+Date: Sun, 23 Mar 2008 15:16:53 +0900
+Message-ID: <47FA0FF3.3060907@gentoo.org>
+Subject: libata: assume no device is attached if both IDENTIFYs are aborted
+
+upstream commit: 1ffc151fcddf524d0c76709d7e7a2af0255acb6b
+
+This is to fix bugzilla #10254.  QSI cdrom attached to pata_sis as
+secondary master appears as phantom device for the slave.
+Interestingly, instead of not setting DRQ after IDENTIFY which
+triggers NODEV_HINT, it aborts both IDENTIFY and IDENTIFY PACKET which
+makes EH retry.
+
+Modify EH such that it assumes no device is attached if both flavors
+of IDENTIFY are aborted by the device.  There really isn't much point
+in retrying when the device actively aborts the commands.
+
+While at it, convert NODEV detection message to ata_dev_printk() to
+help debugging obscure detection problems.
+
+This problem was reported by Jan Bücken.
+
+Signed-off-by: Tejun Heo <htejun@gmail.com>
+Cc: Jan Bücken <jb.faq@gmx.de>
+Acked-by: Alan Cox <alan@redhat.com>
+Signed-off-by: Jeff Garzik <jeff@garzik.org>
+
+dsd@gentoo.org notes:
+
+This patch fixes http://bugs.gentoo.org/211369
+
+Cc: Daniel Drake <dsd@gentoo.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/ata/libata-core.c |   38 ++++++++++++++++++++++++--------------
+ 1 file changed, 24 insertions(+), 14 deletions(-)
+
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -1936,24 +1936,34 @@ int ata_dev_read_id(struct ata_device *d
+                                    id, sizeof(id[0]) * ATA_ID_WORDS, 0);
+       if (err_mask) {
+               if (err_mask & AC_ERR_NODEV_HINT) {
+-                      DPRINTK("ata%u.%d: NODEV after polling detection\n",
+-                              ap->print_id, dev->devno);
++                      ata_dev_printk(dev, KERN_DEBUG,
++                                     "NODEV after polling detection\n");
+                       return -ENOENT;
+               }
+-              /* Device or controller might have reported the wrong
+-               * device class.  Give a shot at the other IDENTIFY if
+-               * the current one is aborted by the device.
+-               */
+-              if (may_fallback &&
+-                  (err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) {
+-                      may_fallback = 0;
++              if ((err_mask == AC_ERR_DEV) && (tf.feature & ATA_ABORTED)) {
++                      /* Device or controller might have reported
++                       * the wrong device class.  Give a shot at the
++                       * other IDENTIFY if the current one is
++                       * aborted by the device.
++                       */
++                      if (may_fallback) {
++                              may_fallback = 0;
+-                      if (class == ATA_DEV_ATA)
+-                              class = ATA_DEV_ATAPI;
+-                      else
+-                              class = ATA_DEV_ATA;
+-                      goto retry;
++                              if (class == ATA_DEV_ATA)
++                                      class = ATA_DEV_ATAPI;
++                              else
++                                      class = ATA_DEV_ATA;
++                              goto retry;
++                      }
++
++                      /* Control reaches here iff the device aborted
++                       * both flavors of IDENTIFYs which happens
++                       * sometimes with phantom devices.
++                       */
++                      ata_dev_printk(dev, KERN_DEBUG,
++                                     "both IDENTIFYs aborted, assuming NODEV\n");
++                      return -ENOENT;
+               }
+               rc = -EIO;
diff --git a/queue-2.6.24/llc-restrict-llc-sockets-to-root.patch b/queue-2.6.24/llc-restrict-llc-sockets-to-root.patch
new file mode 100644 (file)
index 0000000..ff08e35
--- /dev/null
@@ -0,0 +1,32 @@
+From 53db734abacd787a829661896c1cc044452c37de Mon Sep 17 00:00:00 2001
+From: Patrick McHardy <kaber@trash.net>
+Date: Sun, 6 Apr 2008 23:40:33 -0700
+Subject: LLC: Restrict LLC sockets to root
+
+Upstream commit: 3480c63bdf008e9289aab94418f43b9592978fff
+
+LLC currently allows users to inject raw frames, including IP packets
+encapsulated in SNAP. While Linux doesn't handle IP over SNAP, other
+systems do. Restrict LLC sockets to root similar to packet sockets.
+
+[ Modified Patrick's patch to use CAP_NEW_RAW --DaveM ]
+
+Signed-off-by: Patrick McHardy <kaber@trash.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/llc/af_llc.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/net/llc/af_llc.c
++++ b/net/llc/af_llc.c
+@@ -155,6 +155,9 @@ static int llc_ui_create(struct net *net
+       struct sock *sk;
+       int rc = -ESOCKTNOSUPPORT;
++      if (!capable(CAP_NET_RAW))
++              return -EPERM;
++
+       if (net != &init_net)
+               return -EAFNOSUPPORT;
diff --git a/queue-2.6.24/macb-call-phy_disconnect-on-removing.patch b/queue-2.6.24/macb-call-phy_disconnect-on-removing.patch
new file mode 100644 (file)
index 0000000..4000e3f
--- /dev/null
@@ -0,0 +1,30 @@
+From 84b7901f8d5a17536ef2df7fd628ab865df8fe3a Mon Sep 17 00:00:00 2001
+From: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
+Date: Thu, 10 Apr 2008 23:30:07 +0900
+Message-Id: <20080416.013520.74752756.anemo@mba.ocn.ne.jp>
+Subject: macb: Call phy_disconnect on removing
+
+upstream commit: 84b7901f8d5a17536ef2df7fd628ab865df8fe3a
+
+Call phy_disconnect() on remove routine.  Otherwise the phy timer
+causes a kernel crash when unloading.
+
+Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/net/macb.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/net/macb.c
++++ b/drivers/net/macb.c
+@@ -1257,6 +1257,8 @@ static int __devexit macb_remove(struct 
+       if (dev) {
+               bp = netdev_priv(dev);
++              if (bp->phy_dev)
++                      phy_disconnect(bp->phy_dev);
+               mdiobus_unregister(&bp->mii_bus);
+               kfree(bp->mii_bus.irq);
+               unregister_netdev(dev);
diff --git a/queue-2.6.24/md-close-a-livelock-window-in-handle_parity_checks5.patch b/queue-2.6.24/md-close-a-livelock-window-in-handle_parity_checks5.patch
new file mode 100644 (file)
index 0000000..4ac47d4
--- /dev/null
@@ -0,0 +1,110 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:37:52 2008
+Date: Fri, 11 Apr 2008 16:55:06 GMT
+Message-Id: <200804111655.m3BGt6ns031493@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: md: close a livelock window in handle_parity_checks5
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+upstream commit: bd2ab67030e9116f1e4aae1289220255412b37fd
+
+If a failure is detected after a parity check operation has been initiated,
+but before it completes handle_parity_checks5 will never quiesce operations on
+the stripe.
+
+Explicitly handle this case by "canceling" the parity check, i.e.  clear the
+STRIPE_OP_CHECK flags and queue the stripe on the handle list again to refresh
+any non-uptodate blocks.
+
+Kernel versions >= 2.6.23 are susceptible.
+
+Cc: <stable@kernel.org>
+Cc: NeilBrown <neilb@suse.de>
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/md/raid5.c |   53 ++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 30 insertions(+), 23 deletions(-)
+
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -2348,25 +2348,15 @@ static void handle_issuing_new_write_req
+ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
+                               struct stripe_head_state *s, int disks)
+ {
++      int canceled_check = 0;
++
+       set_bit(STRIPE_HANDLE, &sh->state);
+-      /* Take one of the following actions:
+-       * 1/ start a check parity operation if (uptodate == disks)
+-       * 2/ finish a check parity operation and act on the result
+-       * 3/ skip to the writeback section if we previously
+-       *    initiated a recovery operation
+-       */
+-      if (s->failed == 0 &&
+-          !test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
+-              if (!test_and_set_bit(STRIPE_OP_CHECK, &sh->ops.pending)) {
+-                      BUG_ON(s->uptodate != disks);
+-                      clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags);
+-                      sh->ops.count++;
+-                      s->uptodate--;
+-              } else if (
+-                     test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) {
+-                      clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
+-                      clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
++      /* complete a check operation */
++      if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) {
++          clear_bit(STRIPE_OP_CHECK, &sh->ops.ack);
++          clear_bit(STRIPE_OP_CHECK, &sh->ops.pending);
++              if (s->failed == 0) {
+                       if (sh->ops.zero_sum_result == 0)
+                               /* parity is correct (on disc,
+                                * not in buffer any more)
+@@ -2391,7 +2381,8 @@ static void handle_parity_checks5(raid5_
+                                       s->uptodate++;
+                               }
+                       }
+-              }
++              } else
++                      canceled_check = 1; /* STRIPE_INSYNC is not set */
+       }
+       /* check if we can clear a parity disk reconstruct */
+@@ -2404,12 +2395,28 @@ static void handle_parity_checks5(raid5_
+               clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending);
+       }
+-      /* Wait for check parity and compute block operations to complete
+-       * before write-back
++      /* start a new check operation if there are no failures, the stripe is
++       * not insync, and a repair is not in flight
+        */
+-      if (!test_bit(STRIPE_INSYNC, &sh->state) &&
+-              !test_bit(STRIPE_OP_CHECK, &sh->ops.pending) &&
+-              !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) {
++      if (s->failed == 0 &&
++          !test_bit(STRIPE_INSYNC, &sh->state) &&
++          !test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) {
++              if (!test_and_set_bit(STRIPE_OP_CHECK, &sh->ops.pending)) {
++                      BUG_ON(s->uptodate != disks);
++                      clear_bit(R5_UPTODATE, &sh->dev[sh->pd_idx].flags);
++                      sh->ops.count++;
++                      s->uptodate--;
++              }
++      }
++
++      /* Wait for check parity and compute block operations to complete
++       * before write-back.  If a failure occurred while the check operation
++       * was in flight we need to cycle this stripe through handle_stripe
++       * since the parity block may not be uptodate
++       */
++      if (!canceled_check && !test_bit(STRIPE_INSYNC, &sh->state) &&
++          !test_bit(STRIPE_OP_CHECK, &sh->ops.pending) &&
++          !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending)) {
+               struct r5dev *dev;
+               /* either failed parity check, or recovery is happening */
+               if (s->failed == 0)
diff --git a/queue-2.6.24/mtd-fix-broken-state-in-cfi-driver-caused-by-fl_shutdown.patch b/queue-2.6.24/mtd-fix-broken-state-in-cfi-driver-caused-by-fl_shutdown.patch
new file mode 100644 (file)
index 0000000..c912a7e
--- /dev/null
@@ -0,0 +1,62 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 15:32:12 2008
+Date: Fri, 4 Apr 2008 22:15:06 GMT
+Message-Id: <200804042215.m34MF6wx006768@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: mtd: fix broken state in CFI driver caused by FL_SHUTDOWN
+
+From: Alexey Korolev <akorolev@infradead.org>
+
+upstream commit: fb6d080c6f75dfd7e23d5a3575334785aa8738eb
+
+THe CFI driver in 2.6.24 kernel is broken.  Not so intensive read/write
+operations cause incomplete writes which lead to kernel panics in JFFS2.
+
+We investigated the issue - it is caused by bug in FL_SHUTDOWN parsing code.
+Sometimes chip returns -EIO as if it is in FL_SHUTDOWN state when it should
+wait in FL_PONT (error in order of conditions).
+
+The following patch fixes the bug in state parsing code of CFI.  Also I've
+added comments to notify developers if they want to add new case in future.
+
+Signed-off-by: Alexey Korolev <akorolev@infradead.org>
+Reviewed-by: Joern Engel <joern@logfs.org>
+Cc: David Woodhouse <dwmw2@infradead.org>
+Cc: <stable@kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/mtd/chips/cfi_cmdset_0001.c |   10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- a/drivers/mtd/chips/cfi_cmdset_0001.c
++++ b/drivers/mtd/chips/cfi_cmdset_0001.c
+@@ -669,7 +669,7 @@ static int chip_ready (struct map_info *
+                       /* Someone else might have been playing with it. */
+                       return -EAGAIN;
+               }
+-
++              /* Fall through */
+       case FL_READY:
+       case FL_CFI_QUERY:
+       case FL_JEDEC_QUERY:
+@@ -729,14 +729,14 @@ static int chip_ready (struct map_info *
+               chip->state = FL_READY;
+               return 0;
++      case FL_SHUTDOWN:
++              /* The machine is rebooting now,so no one can get chip anymore */
++              return -EIO;
+       case FL_POINT:
+               /* Only if there's no operation suspended... */
+               if (mode == FL_READY && chip->oldstate == FL_READY)
+                       return 0;
+-
+-      case FL_SHUTDOWN:
+-              /* The machine is rebooting now,so no one can get chip anymore */
+-              return -EIO;
++              /* Fall through */
+       default:
+       sleep:
+               set_current_state(TASK_UNINTERRUPTIBLE);
diff --git a/queue-2.6.24/net-add-preemption-point-in-qdisc_run.patch b/queue-2.6.24/net-add-preemption-point-in-qdisc_run.patch
new file mode 100644 (file)
index 0000000..31c3c4b
--- /dev/null
@@ -0,0 +1,52 @@
+From 0af48f0fd316f4c6388e4a202009a68096a80cdb Mon Sep 17 00:00:00 2001
+From: Herbert Xu <herbert@gondor.apana.org.au>
+Date: Sun, 6 Apr 2008 23:41:50 -0700
+Subject: NET: Add preemption point in qdisc_run
+
+Upstream commit: 2ba2506ca7ca62c56edaa334b0fe61eb5eab6ab0
+
+The qdisc_run loop is currently unbounded and runs entirely in a
+softirq.  This is bad as it may create an unbounded softirq run.
+
+This patch fixes this by calling need_resched and breaking out if
+necessary.
+
+It also adds a break out if the jiffies value changes since that would
+indicate we've been transmitting for too long which starves other
+softirqs.
+
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/sched/sch_generic.c |   18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+
+--- a/net/sched/sch_generic.c
++++ b/net/sched/sch_generic.c
+@@ -178,10 +178,22 @@ static inline int qdisc_restart(struct n
+ void __qdisc_run(struct net_device *dev)
+ {
+-      do {
+-              if (!qdisc_restart(dev))
++      unsigned long start_time = jiffies;
++
++      while (qdisc_restart(dev)) {
++              if (netif_queue_stopped(dev))
++                      break;
++
++              /*
++               * Postpone processing if
++               * 1. another process needs the CPU;
++               * 2. we've been doing it for too long.
++               */
++              if (need_resched() || jiffies != start_time) {
++                      netif_schedule(dev);
+                       break;
+-      } while (!netif_queue_stopped(dev));
++              }
++      }
+       clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state);
+ }
diff --git a/queue-2.6.24/net-fix-multicast-device-ioctl-checks.patch b/queue-2.6.24/net-fix-multicast-device-ioctl-checks.patch
new file mode 100644 (file)
index 0000000..9b78325
--- /dev/null
@@ -0,0 +1,41 @@
+From 256736e3a05d87048ed72b7ec87447f79fcac64b Mon Sep 17 00:00:00 2001
+From: Patrick McHardy <kaber@trash.net>
+Date: Sun, 6 Apr 2008 23:42:55 -0700
+Subject: NET: Fix multicast device ioctl checks
+
+Upstream commit: 61ee6bd487b9cc160e533034eb338f2085dc7922
+
+SIOCADDMULTI/SIOCDELMULTI check whether the driver has a set_multicast_list
+method to determine whether it supports multicast. Drivers implementing
+secondary unicast support use set_rx_mode however.
+
+Check for both dev->set_multicast_mode and dev->set_rx_mode to determine
+multicast capabilities.
+
+Signed-off-by: Patrick McHardy <kaber@trash.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/core/dev.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -3240,7 +3240,7 @@ static int dev_ifsioc(struct net *net, s
+                       return -EOPNOTSUPP;
+               case SIOCADDMULTI:
+-                      if (!dev->set_multicast_list ||
++                      if ((!dev->set_multicast_list && !dev->set_rx_mode) ||
+                           ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
+                               return -EINVAL;
+                       if (!netif_device_present(dev))
+@@ -3249,7 +3249,7 @@ static int dev_ifsioc(struct net *net, s
+                                         dev->addr_len, 1);
+               case SIOCDELMULTI:
+-                      if (!dev->set_multicast_list ||
++                      if ((!dev->set_multicast_list && !dev->set_rx_mode) ||
+                           ifr->ifr_hwaddr.sa_family != AF_UNSPEC)
+                               return -EINVAL;
+                       if (!netif_device_present(dev))
diff --git a/queue-2.6.24/net-include-linux-types.h-into-linux-ethtool.h-for-__u-typedef.patch b/queue-2.6.24/net-include-linux-types.h-into-linux-ethtool.h-for-__u-typedef.patch
new file mode 100644 (file)
index 0000000..f98d228
--- /dev/null
@@ -0,0 +1,24 @@
+From ed60bf506c63729b80f1d44b4834657bfe215a32 Mon Sep 17 00:00:00 2001
+From: Kirill A. Shutemov <k.shutemov@gmail.com>
+Date: Sun, 6 Apr 2008 23:35:53 -0700
+Subject: NET: include <linux/types.h> into linux/ethtool.h for __u* typedef
+
+Upstream commit: e621e69137b24fdbbe7ad28214e8d81e614c25b7
+
+Signed-off-by: Kirill A. Shutemov <k.shutemov@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ include/linux/ethtool.h |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/include/linux/ethtool.h
++++ b/include/linux/ethtool.h
+@@ -12,6 +12,7 @@
+ #ifndef _LINUX_ETHTOOL_H
+ #define _LINUX_ETHTOOL_H
++#include <linux/types.h>
+ /* This should work for both 32 and 64 bit userland. */
+ struct ethtool_cmd {
diff --git a/queue-2.6.24/netpoll-zap_completion_queue-adjust-skb-users-counter.patch b/queue-2.6.24/netpoll-zap_completion_queue-adjust-skb-users-counter.patch
new file mode 100644 (file)
index 0000000..eaed928
--- /dev/null
@@ -0,0 +1,37 @@
+From 2a2af65a6b7330f1291bfe446d29593b7833c81b Mon Sep 17 00:00:00 2001
+From: Jarek Poplawski <jarkao2@gmail.com>
+Date: Sun, 6 Apr 2008 23:40:53 -0700
+Subject: netpoll: zap_completion_queue: adjust skb->users counter
+
+Upstream commit: 8a455b087c9629b3ae3b521b4f1ed16672f978cc
+
+zap_completion_queue() retrieves skbs from completion_queue where they have
+zero skb->users counter.  Before dev_kfree_skb_any() it should be non-zero
+yet, so it's increased now.
+
+Reported-and-tested-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/core/netpoll.c |    6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/net/core/netpoll.c
++++ b/net/core/netpoll.c
+@@ -219,10 +219,12 @@ static void zap_completion_queue(void)
+               while (clist != NULL) {
+                       struct sk_buff *skb = clist;
+                       clist = clist->next;
+-                      if (skb->destructor)
++                      if (skb->destructor) {
++                              atomic_inc(&skb->users);
+                               dev_kfree_skb_any(skb); /* put this one back */
+-                      else
++                      } else {
+                               __kfree_skb(skb);
++                      }
+               }
+       }
diff --git a/queue-2.6.24/parisc-futex-special-case-cmpxchg-null-in-kernel-space.patch b/queue-2.6.24/parisc-futex-special-case-cmpxchg-null-in-kernel-space.patch
new file mode 100644 (file)
index 0000000..2e33214
--- /dev/null
@@ -0,0 +1,63 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:44:42 2008
+From: James Bottomley <James.Bottomley@HansenPartnership.com>
+To: stable@kernel.org
+Date: Tue, 15 Apr 2008 10:45:11 -0500
+Message-Id: <1208274312.3131.11.camel@localhost.localdomain>
+Cc: Parisc List <linux-parisc@vger.kernel.org>
+Subject: PARISC futex: special case cmpxchg NULL in kernel space
+
+From: Kyle McMartin <kyle@shortfin.cabal.ca>
+
+upstream commit: c20a84c91048c76c1379011c96b1a5cee5c7d9a0
+
+commit f9e77acd4060fefbb60a351cdb8d30fca27fe194
+Author: Thomas Gleixner <tglx@linutronix.de>
+Date:   Sun Feb 24 02:10:05 2008 +0000
+
+    futex: runtime enable pi and robust functionality
+
+which was backported to stable based on mainline Commit
+a0c1e9073ef7428a14309cba010633a6cd6719ea added code to futex.c
+to detect whether futex_atomic_cmpxchg_inatomic was implemented at run
+time:
+
++       curval = cmpxchg_futex_value_locked(NULL, 0, 0);
++       if (curval == -EFAULT)
++               futex_cmpxchg_enabled = 1;
+
+This is bogus on parisc, since page zero in kernel virtual space is the
+gateway page for syscall entry, and should not be read from the kernel.
+(That, and we really don't like the kernel faulting on its own address
+ space...)
+
+Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ include/asm-parisc/futex.h |   10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/include/asm-parisc/futex.h
++++ b/include/asm-parisc/futex.h
+@@ -56,6 +56,12 @@ futex_atomic_cmpxchg_inatomic(int __user
+       int err = 0;
+       int uval;
++      /* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is
++       * our gateway page, and causes no end of trouble...
++       */
++      if (segment_eq(KERNEL_DS, get_fs()) && !uaddr)
++              return -EFAULT;
++
+       if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
+               return -EFAULT;
+@@ -67,5 +73,5 @@ futex_atomic_cmpxchg_inatomic(int __user
+       return uval;
+ }
+-#endif
+-#endif
++#endif /*__KERNEL__*/
++#endif /*_ASM_PARISC_FUTEX_H*/
diff --git a/queue-2.6.24/parisc-pdc_console-fix-bizarre-panic-on-boot.patch b/queue-2.6.24/parisc-pdc_console-fix-bizarre-panic-on-boot.patch
new file mode 100644 (file)
index 0000000..06494d9
--- /dev/null
@@ -0,0 +1,158 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:51:47 2008
+From: James Bottomley <James.Bottomley@HansenPartnership.com>
+To: stable@kernel.org
+Date: Tue, 15 Apr 2008 11:46:03 -0500
+Message-Id: <1208277963.3131.18.camel@localhost.localdomain>
+Cc: Parisc List <linux-parisc@vger.kernel.org>
+Subject: PARISC pdc_console: fix bizarre panic on boot
+
+From: Kyle McMartin <kyle@shortfin.cabal.ca>
+
+upstream commit ef1afd4d79f0479960ff36bb5fe6ec6eba1ebff2
+
+commit 721fdf34167580ff98263c74cead8871d76936e6
+Author: Kyle McMartin <kyle@shortfin.cabal.ca>
+Date:   Thu Dec 6 09:32:15 2007 -0800
+
+    [PARISC] print more than one character at a time for pdc console
+
+introduced a subtle bug by accidentally removing the "static" from
+iodc_dbuf. This resulted in, what appeared to be, a trap without
+*current set to a task. Probably the result of a trap in real mode
+while calling firmware.
+
+Also do other misc clean ups. Since the only input from firmware is non
+blocking, share iodc_dbuf between input and output, and spinlock the
+only callers.
+
+[jejb: fixed up rejections against the stable tree]
+
+Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ arch/parisc/kernel/firmware.c |   27 +++++++++++++++++----------
+ arch/parisc/kernel/pdc_cons.c |   19 +++++++++++++++++--
+ include/asm-parisc/pdc.h      |    3 +--
+ 3 files changed, 35 insertions(+), 14 deletions(-)
+
+--- a/arch/parisc/kernel/firmware.c
++++ b/arch/parisc/kernel/firmware.c
+@@ -1080,6 +1080,9 @@ void pdc_io_reset_devices(void)
+       spin_unlock_irqrestore(&pdc_lock, flags);
+ }
++/* locked by pdc_console_lock */
++static int __attribute__((aligned(8)))   iodc_retbuf[32];
++static char __attribute__((aligned(64))) iodc_dbuf[4096];
+ /**
+  * pdc_iodc_print - Console print using IODC.
+@@ -1091,24 +1094,20 @@ void pdc_io_reset_devices(void)
+  * Since the HP console requires CR+LF to perform a 'newline', we translate
+  * "\n" to "\r\n".
+  */
+-int pdc_iodc_print(unsigned char *str, unsigned count)
++int pdc_iodc_print(const unsigned char *str, unsigned count)
+ {
+-      /* XXX Should we spinlock posx usage */
+       static int posx;        /* for simple TAB-Simulation... */
+-      int __attribute__((aligned(8)))   iodc_retbuf[32];
+-      char __attribute__((aligned(64))) iodc_dbuf[4096];
+       unsigned int i;
+       unsigned long flags;
+-      memset(iodc_dbuf, 0, 4096);
+-      for (i = 0; i < count && i < 2048;) {
++      for (i = 0; i < count && i < 79;) {
+               switch(str[i]) {
+               case '\n':
+                       iodc_dbuf[i+0] = '\r';
+                       iodc_dbuf[i+1] = '\n';
+                       i += 2;
+                       posx = 0;
+-                      break;
++                      goto print;
+               case '\t':
+                       while (posx & 7) {
+                               iodc_dbuf[i] = ' ';
+@@ -1124,6 +1123,16 @@ int pdc_iodc_print(unsigned char *str, u
+               }
+       }
++      /* if we're at the end of line, and not already inserting a newline,
++       * insert one anyway. iodc console doesn't claim to support >79 char
++       * lines. don't account for this in the return value.
++       */
++      if (i == 79 && iodc_dbuf[i-1] != '\n') {
++              iodc_dbuf[i+0] = '\r';
++              iodc_dbuf[i+1] = '\n';
++      }
++
++print:
+         spin_lock_irqsave(&pdc_lock, flags);
+         real32_call(PAGE0->mem_cons.iodc_io,
+                     (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
+@@ -1142,11 +1151,9 @@ int pdc_iodc_print(unsigned char *str, u
+  */
+ int pdc_iodc_getc(void)
+ {
+-      unsigned long flags;
+-        static int __attribute__((aligned(8)))   iodc_retbuf[32];
+-        static char __attribute__((aligned(64))) iodc_dbuf[4096];
+       int ch;
+       int status;
++      unsigned long flags;
+       /* Bail if no console input device. */
+       if (!PAGE0->mem_kbd.iodc_io)
+--- a/arch/parisc/kernel/pdc_cons.c
++++ b/arch/parisc/kernel/pdc_cons.c
+@@ -52,10 +52,18 @@
+ #include <linux/tty.h>
+ #include <asm/pdc.h>          /* for iodc_call() proto and friends */
++static spinlock_t pdc_console_lock = SPIN_LOCK_UNLOCKED;
+ static void pdc_console_write(struct console *co, const char *s, unsigned count)
+ {
+-      pdc_iodc_print(s, count);
++      int i = 0;
++      unsigned long flags;
++
++      spin_lock_irqsave(&pdc_console_lock, flags);
++      do {
++              i += pdc_iodc_print(s + i, count - i);
++      } while (i < count);
++      spin_unlock_irqrestore(&pdc_console_lock, flags);
+ }
+ void pdc_printf(const char *fmt, ...)
+@@ -73,7 +81,14 @@ void pdc_printf(const char *fmt, ...)
+ int pdc_console_poll_key(struct console *co)
+ {
+-      return pdc_iodc_getc();
++      int c;
++      unsigned long flags;
++
++      spin_lock_irqsave(&pdc_console_lock, flags);
++      c = pdc_iodc_getc();
++      spin_unlock_irqrestore(&pdc_console_lock, flags);
++
++      return c;
+ }
+ static int pdc_console_setup(struct console *co, char *options)
+--- a/include/asm-parisc/pdc.h
++++ b/include/asm-parisc/pdc.h
+@@ -645,8 +645,7 @@ int pdc_soft_power_button(int sw_control
+ void pdc_io_reset(void);
+ void pdc_io_reset_devices(void);
+ int pdc_iodc_getc(void);
+-int pdc_iodc_print(unsigned char *str, unsigned count);
+-void pdc_printf(const char *fmt, ...);
++int pdc_iodc_print(const unsigned char *str, unsigned count);
+ void pdc_emergency_unlock(void);
+ int pdc_sti_call(unsigned long func, unsigned long flags,
diff --git a/queue-2.6.24/pci-revert-smbus-unhide-on-hp-compaq-nx6110.patch b/queue-2.6.24/pci-revert-smbus-unhide-on-hp-compaq-nx6110.patch
new file mode 100644 (file)
index 0000000..86115f0
--- /dev/null
@@ -0,0 +1,59 @@
+From a99acc832de1104afaba02d7c2576fd9b9fd6422 Mon Sep 17 00:00:00 2001
+From: Jean Delvare <khali@linux-fr.org>
+Date: Fri, 28 Mar 2008 14:16:04 -0700
+Message-ID: <20080329222330.323d0404@hyperion.delvare>
+Subject: pci: revert SMBus unhide on HP Compaq nx6110
+
+upstream commit: a99acc832de1104afaba02d7c2576fd9b9fd6422
+
+This reverts commit 3c0a654e390d00fef9d8faed758f5e1e8078adb5 and
+fixes kernel bug #10245:
+
+       http://bugzilla.kernel.org/show_bug.cgi?id=10245
+
+The HP Compaq nc6120 has the same PCI sub-device ID as the nx6110, and the
+SMBus is used by ACPI for thermal management on the nc6120, so Linux should
+not attach a native driver to it.  This means that this quirk is unsafe and
+has to be removed.
+
+I also added a comment to help developers realize that adding new IDs to this
+SMBus unhiding quirk table should be done only with great care, and in
+particular only after checking that ACPI is not making use of the SMBus.
+
+Signed-off-by: Jean Delvare <khali@linux-fr.org>
+Cc: Tomasz Koprowski <tomek@koprowski.org>
+Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/pci/quirks.c |   11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -950,6 +950,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
+  * accesses to the SMBus registers, with potentially bad effects. Thus you
+  * should be very careful when adding new entries: if SMM is accessing the
+  * Intel SMBus, this is a very good reason to leave it hidden.
++ *
++ * Likewise, many recent laptops use ACPI for thermal management. If the
++ * ACPI DSDT code accesses the SMBus, then Linux should not access it
++ * natively, and keeping the SMBus hidden is the right thing to do. If you
++ * are about to add an entry in the table below, please first disassemble
++ * the DSDT and double-check that there is no code accessing the SMBus.
+  */
+ static int asus_hides_smbus;
+@@ -1022,11 +1028,6 @@ static void __init asus_hides_smbus_host
+                       case 0x12bd: /* HP D530 */
+                               asus_hides_smbus = 1;
+                       }
+-              else if (dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB)
+-                      switch (dev->subsystem_device) {
+-                      case 0x099c: /* HP Compaq nx6110 */
+-                              asus_hides_smbus = 1;
+-                      }
+        } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG)) {
+                if (dev->device ==  PCI_DEVICE_ID_INTEL_82855PM_HB)
+                        switch(dev->subsystem_device) {
diff --git a/queue-2.6.24/plip-replace-spin_lock_irq-with-spin_lock_irqsave-in-irq-context.patch b/queue-2.6.24/plip-replace-spin_lock_irq-with-spin_lock_irqsave-in-irq-context.patch
new file mode 100644 (file)
index 0000000..c3b476c
--- /dev/null
@@ -0,0 +1,56 @@
+From cabce28ec0a0ae3d0ddfa4461f0e8be94ade9e46 Mon Sep 17 00:00:00 2001
+From: Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
+Date: Tue, 1 Apr 2008 01:22:45 +0200
+Message-Id: <20080410094723.49f79c57.akpm@linux-foundation.org>
+Subject: plip: replace spin_lock_irq with spin_lock_irqsave in irq context
+
+upstream commit: cabce28ec0a0ae3d0ddfa4461f0e8be94ade9e46
+
+Plip uses spin_lock_irq/spin_unlock_irq in its IRQ handler (called from
+parport IRQ handler), the latter enables interrupts without parport
+subsystem IRQ handler expecting it.
+
+The bug can be seen if you compile kernel with lock dependency checking
+and use plip --- it produces a warning.
+
+This patch changes it to spin_lock_irqsave/spin_lock_irqrestore, so that
+it doesn't enable interrupts when already disabled.
+
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/net/plip.c |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/plip.c
++++ b/drivers/net/plip.c
+@@ -903,17 +903,18 @@ plip_interrupt(void *dev_id)
+       struct net_local *nl;
+       struct plip_local *rcv;
+       unsigned char c0;
++      unsigned long flags;
+       nl = netdev_priv(dev);
+       rcv = &nl->rcv_data;
+-      spin_lock_irq (&nl->lock);
++      spin_lock_irqsave (&nl->lock, flags);
+       c0 = read_status(dev);
+       if ((c0 & 0xf8) != 0xc0) {
+               if ((dev->irq != -1) && (net_debug > 1))
+                       printk(KERN_DEBUG "%s: spurious interrupt\n", dev->name);
+-              spin_unlock_irq (&nl->lock);
++              spin_unlock_irqrestore (&nl->lock, flags);
+               return;
+       }
+@@ -942,7 +943,7 @@ plip_interrupt(void *dev_id)
+               break;
+       }
+-      spin_unlock_irq(&nl->lock);
++      spin_unlock_irqrestore(&nl->lock, flags);
+ }
+ static int
diff --git a/queue-2.6.24/pnpacpi-reduce-printk-severity-for-pnpacpi-exceeded-the-max-number-of.patch b/queue-2.6.24/pnpacpi-reduce-printk-severity-for-pnpacpi-exceeded-the-max-number-of.patch
new file mode 100644 (file)
index 0000000..5c20bf8
--- /dev/null
@@ -0,0 +1,75 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:47:31 2008
+From: Len Brown <lenb@kernel.org>
+To: stable@kernel.org, Linux-acpi@vger.kernel.org
+Date: Tue, 15 Apr 2008 03:16:56 -0400
+Content-Disposition: inline
+Message-Id: <200804150316.56814.lenb@kernel.org>
+Subject:  pnpacpi: reduce printk severity for "pnpacpi: exceeded the max number of ..."
+
+From: Len Brown <len.brown@intel.com>
+
+upstream commit 33fd7afd66ffdc6addf1b085fe6403b6af532f8e 
+
+We have been printing these messages at KERN_ERR since 2.6.24,
+per http://bugzilla.kernel.org/show_bug.cgi?id=9535
+
+But KERN_ERR pops up on a console booted with "quiet"
+and causes users to get alarmed and file bugs
+about the message itself:
+https://bugzilla.redhat.com/show_bug.cgi?id=436589
+
+So reduce the severity of these messages to
+KERN_WARNING, which is not printed by "quiet".
+
+This message will still be seen without "quiet",
+but a lot of messages are printed in that mode
+and it will be less likely to cause undue alarm.
+
+We could go all the way to KERN_DEBUG, but this
+is a real warning after all, so it seems prudent
+not to require "debug" to see it.
+
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/pnp/pnpacpi/rsparser.c |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/pnp/pnpacpi/rsparser.c
++++ b/drivers/pnp/pnpacpi/rsparser.c
+@@ -85,7 +85,7 @@ static void pnpacpi_parse_allocated_irqr
+              i < PNP_MAX_IRQ)
+               i++;
+       if (i >= PNP_MAX_IRQ && !warned) {
+-              printk(KERN_ERR "pnpacpi: exceeded the max number of IRQ "
++              printk(KERN_WARNING "pnpacpi: exceeded the max number of IRQ "
+                               "resources: %d \n", PNP_MAX_IRQ);
+               warned = 1;
+               return;
+@@ -187,7 +187,7 @@ static void pnpacpi_parse_allocated_dmar
+               res->dma_resource[i].start = dma;
+               res->dma_resource[i].end = dma;
+       } else if (!warned) {
+-              printk(KERN_ERR "pnpacpi: exceeded the max number of DMA "
++              printk(KERN_WARNING "pnpacpi: exceeded the max number of DMA "
+                               "resources: %d \n", PNP_MAX_DMA);
+               warned = 1;
+       }
+@@ -213,7 +213,7 @@ static void pnpacpi_parse_allocated_iore
+               res->port_resource[i].start = io;
+               res->port_resource[i].end = io + len - 1;
+       } else if (!warned) {
+-              printk(KERN_ERR "pnpacpi: exceeded the max number of IO "
++              printk(KERN_WARNING "pnpacpi: exceeded the max number of IO "
+                               "resources: %d \n", PNP_MAX_PORT);
+               warned = 1;
+       }
+@@ -241,7 +241,7 @@ static void pnpacpi_parse_allocated_memr
+               res->mem_resource[i].start = mem;
+               res->mem_resource[i].end = mem + len - 1;
+       } else if (!warned) {
+-              printk(KERN_ERR "pnpacpi: exceeded the max number of mem "
++              printk(KERN_WARNING "pnpacpi: exceeded the max number of mem "
+                               "resources: %d\n", PNP_MAX_MEM);
+               warned = 1;
+       }
diff --git a/queue-2.6.24/powerpc-fix-build-of-modular-drivers-macintosh-apm_emu.c.patch b/queue-2.6.24/powerpc-fix-build-of-modular-drivers-macintosh-apm_emu.c.patch
new file mode 100644 (file)
index 0000000..9c9bc17
--- /dev/null
@@ -0,0 +1,47 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:40:02 2008
+Date: Tue, 15 Apr 2008 13:45:51 +0000
+From: Mike Pagano <mpagano@gentoo.org>
+To: stable@kernel.org
+Message-ID: <20080415134551.GA20351@woodpecker.gentoo.org>
+Cc: kernel@gentoo.org, agx@sigxcpu.org
+Subject: POWERPC: Fix build of modular drivers/macintosh/apm_emu.c
+
+From: Guido Guenther <agx@sigxcpu.org>
+
+upstream commit: 620a245978d007279bc5c7c64e15f5f63af9af98
+
+Currently, if drivers/macintosh/apm_emu is a module and the config
+doesn't have CONFIG_SUSPEND we get:
+
+ERROR: "pmu_batteries" [drivers/macintosh/apm_emu.ko] undefined!
+ERROR: "pmu_battery_count" [drivers/macintosh/apm_emu.ko] undefined!
+ERROR: "pmu_power_flags" [drivers/macintosh/apm_emu.ko] undefined!
+
+on PPC32.  The variables aren't wrapped in '#if defined(CONFIG_SUSPEND)'
+so we probably shouldn't wrap the exports either.  This removes the
+CONFIG_SUSPEND part of the export, which fixes compilation on ppc32.
+
+Signed-off-by: Guido Guenther <agx@sigxcpu.org>
+Signed-off-by: Paul Mackerras <paulus@samba.org>
+
+mpagano@gentoo.org notes:
+
+The details can be found at http://bugs.gentoo.org/show_bug.cgi?id=217629. 
+
+Cc: Mike Pagano <mpagano@gentoo.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/macintosh/via-pmu.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/macintosh/via-pmu.c
++++ b/drivers/macintosh/via-pmu.c
+@@ -2842,7 +2842,7 @@ EXPORT_SYMBOL(pmu_wait_complete);
+ EXPORT_SYMBOL(pmu_suspend);
+ EXPORT_SYMBOL(pmu_resume);
+ EXPORT_SYMBOL(pmu_unlock);
+-#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
++#if defined(CONFIG_PPC32)
+ EXPORT_SYMBOL(pmu_enable_irled);
+ EXPORT_SYMBOL(pmu_battery_count);
+ EXPORT_SYMBOL(pmu_batteries);
diff --git a/queue-2.6.24/pppol2tp-fix-smp-issues-in-skb-reorder-queue-handling.patch b/queue-2.6.24/pppol2tp-fix-smp-issues-in-skb-reorder-queue-handling.patch
new file mode 100644 (file)
index 0000000..a330a4c
--- /dev/null
@@ -0,0 +1,63 @@
+From d4249258c92e7f11c69f18e5f60c7f8298e1a3b4 Mon Sep 17 00:00:00 2001
+From: James Chapman <jchapman@katalix.com>
+Date: Sun, 6 Apr 2008 23:41:29 -0700
+Subject: PPPOL2TP: Fix SMP issues in skb reorder queue handling
+
+Upstream commit: e653181dd6b3ad38ce14904351b03a5388f4b0f7
+
+When walking a session's packet reorder queue, use
+skb_queue_walk_safe() since the list could be modified inside the
+loop.
+
+Rearrange the unlinking skbs from the reorder queue such that it is
+done while the queue lock is held in pppol2tp_recv_dequeue() when
+walking the skb list.
+
+A version of this patch was suggested by Jarek Poplawski.
+
+Signed-off-by: James Chapman <jchapman@katalix.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/net/pppol2tp.c |   11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/pppol2tp.c
++++ b/drivers/net/pppol2tp.c
+@@ -342,10 +342,11 @@ static struct pppol2tp_tunnel *pppol2tp_
+ static void pppol2tp_recv_queue_skb(struct pppol2tp_session *session, struct sk_buff *skb)
+ {
+       struct sk_buff *skbp;
++      struct sk_buff *tmp;
+       u16 ns = PPPOL2TP_SKB_CB(skb)->ns;
+       spin_lock_bh(&session->reorder_q.lock);
+-      skb_queue_walk(&session->reorder_q, skbp) {
++      skb_queue_walk_safe(&session->reorder_q, skbp, tmp) {
+               if (PPPOL2TP_SKB_CB(skbp)->ns > ns) {
+                       __skb_insert(skb, skbp->prev, skbp, &session->reorder_q);
+                       PRINTK(session->debug, PPPOL2TP_MSG_SEQ, KERN_DEBUG,
+@@ -371,10 +372,9 @@ static void pppol2tp_recv_dequeue_skb(st
+       int length = PPPOL2TP_SKB_CB(skb)->length;
+       struct sock *session_sock = NULL;
+-      /* We're about to requeue the skb, so unlink it and return resources
++      /* We're about to requeue the skb, so return resources
+        * to its current owner (a socket receive buffer).
+        */
+-      skb_unlink(skb, &session->reorder_q);
+       skb_orphan(skb);
+       tunnel->stats.rx_packets++;
+@@ -469,6 +469,11 @@ static void pppol2tp_recv_dequeue(struct
+                               goto out;
+                       }
+               }
++              __skb_unlink(skb, &session->reorder_q);
++
++              /* Process the skb. We release the queue lock while we
++               * do so to let other contexts process the queue.
++               */
+               spin_unlock_bh(&session->reorder_q.lock);
+               pppol2tp_recv_dequeue_skb(session, skb);
+               spin_lock_bh(&session->reorder_q.lock);
diff --git a/queue-2.6.24/pppol2tp-make-locking-calls-softirq-safe.patch b/queue-2.6.24/pppol2tp-make-locking-calls-softirq-safe.patch
new file mode 100644 (file)
index 0000000..7722050
--- /dev/null
@@ -0,0 +1,234 @@
+From 1d8a373e61bea33fe68a8edbad2e70fb34e63ffe Mon Sep 17 00:00:00 2001
+From: James Chapman <jchapman@katalix.com>
+Date: Sun, 6 Apr 2008 23:41:18 -0700
+Subject: PPPOL2TP: Make locking calls softirq-safe
+
+Upstream commit: cf3752e2d203bbbfc88d29e362e6938cef4339b3
+
+Fix locking issues in the pppol2tp driver which can cause a kernel
+crash on SMP boxes. There were two problems:-
+
+1. The driver was violating read_lock() and write_lock() scheduling
+   rules because it wasn't using softirq-safe locks in softirq
+   contexts. So we now consistently use the _bh variants of the lock
+   functions.
+
+2. The driver was calling sk_dst_get() in pppol2tp_xmit() which was
+   taking sk_dst_lock in softirq context. We now call __sk_dst_get().
+
+Signed-off-by: James Chapman <jchapman@katalix.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/net/pppol2tp.c |   58 ++++++++++++++++++++++++------------------------
+ 1 files changed, 29 insertions(+), 29 deletions(-)
+
+diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
+index a7556cd..ff4a94b 100644
+--- a/drivers/net/pppol2tp.c
++++ b/drivers/net/pppol2tp.c
+@@ -302,14 +302,14 @@ pppol2tp_session_find(struct pppol2tp_tunnel *tunnel, u16 session_id)
+       struct pppol2tp_session *session;
+       struct hlist_node *walk;
+-      read_lock(&tunnel->hlist_lock);
++      read_lock_bh(&tunnel->hlist_lock);
+       hlist_for_each_entry(session, walk, session_list, hlist) {
+               if (session->tunnel_addr.s_session == session_id) {
+-                      read_unlock(&tunnel->hlist_lock);
++                      read_unlock_bh(&tunnel->hlist_lock);
+                       return session;
+               }
+       }
+-      read_unlock(&tunnel->hlist_lock);
++      read_unlock_bh(&tunnel->hlist_lock);
+       return NULL;
+ }
+@@ -320,14 +320,14 @@ static struct pppol2tp_tunnel *pppol2tp_tunnel_find(u16 tunnel_id)
+ {
+       struct pppol2tp_tunnel *tunnel = NULL;
+-      read_lock(&pppol2tp_tunnel_list_lock);
++      read_lock_bh(&pppol2tp_tunnel_list_lock);
+       list_for_each_entry(tunnel, &pppol2tp_tunnel_list, list) {
+               if (tunnel->stats.tunnel_id == tunnel_id) {
+-                      read_unlock(&pppol2tp_tunnel_list_lock);
++                      read_unlock_bh(&pppol2tp_tunnel_list_lock);
+                       return tunnel;
+               }
+       }
+-      read_unlock(&pppol2tp_tunnel_list_lock);
++      read_unlock_bh(&pppol2tp_tunnel_list_lock);
+       return NULL;
+ }
+@@ -344,7 +344,7 @@ static void pppol2tp_recv_queue_skb(struct pppol2tp_session *session, struct sk_
+       struct sk_buff *skbp;
+       u16 ns = PPPOL2TP_SKB_CB(skb)->ns;
+-      spin_lock(&session->reorder_q.lock);
++      spin_lock_bh(&session->reorder_q.lock);
+       skb_queue_walk(&session->reorder_q, skbp) {
+               if (PPPOL2TP_SKB_CB(skbp)->ns > ns) {
+                       __skb_insert(skb, skbp->prev, skbp, &session->reorder_q);
+@@ -360,7 +360,7 @@ static void pppol2tp_recv_queue_skb(struct pppol2tp_session *session, struct sk_
+       __skb_queue_tail(&session->reorder_q, skb);
+ out:
+-      spin_unlock(&session->reorder_q.lock);
++      spin_unlock_bh(&session->reorder_q.lock);
+ }
+ /* Dequeue a single skb.
+@@ -442,7 +442,7 @@ static void pppol2tp_recv_dequeue(struct pppol2tp_session *session)
+        * expect to send up next, dequeue it and any other
+        * in-sequence packets behind it.
+        */
+-      spin_lock(&session->reorder_q.lock);
++      spin_lock_bh(&session->reorder_q.lock);
+       skb_queue_walk_safe(&session->reorder_q, skb, tmp) {
+               if (time_after(jiffies, PPPOL2TP_SKB_CB(skb)->expires)) {
+                       session->stats.rx_seq_discards++;
+@@ -469,13 +469,13 @@ static void pppol2tp_recv_dequeue(struct pppol2tp_session *session)
+                               goto out;
+                       }
+               }
+-              spin_unlock(&session->reorder_q.lock);
++              spin_unlock_bh(&session->reorder_q.lock);
+               pppol2tp_recv_dequeue_skb(session, skb);
+-              spin_lock(&session->reorder_q.lock);
++              spin_lock_bh(&session->reorder_q.lock);
+       }
+ out:
+-      spin_unlock(&session->reorder_q.lock);
++      spin_unlock_bh(&session->reorder_q.lock);
+ }
+ /* Internal receive frame. Do the real work of receiving an L2TP data frame
+@@ -1058,7 +1058,7 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
+       /* Get routing info from the tunnel socket */
+       dst_release(skb->dst);
+-      skb->dst = sk_dst_get(sk_tun);
++      skb->dst = dst_clone(__sk_dst_get(sk_tun));
+       skb_orphan(skb);
+       skb->sk = sk_tun;
+@@ -1106,7 +1106,7 @@ static void pppol2tp_tunnel_closeall(struct pppol2tp_tunnel *tunnel)
+       PRINTK(tunnel->debug, PPPOL2TP_MSG_CONTROL, KERN_INFO,
+              "%s: closing all sessions...\n", tunnel->name);
+-      write_lock(&tunnel->hlist_lock);
++      write_lock_bh(&tunnel->hlist_lock);
+       for (hash = 0; hash < PPPOL2TP_HASH_SIZE; hash++) {
+ again:
+               hlist_for_each_safe(walk, tmp, &tunnel->session_hlist[hash]) {
+@@ -1126,7 +1126,7 @@ again:
+                        * disappear as we're jumping between locks.
+                        */
+                       sock_hold(sk);
+-                      write_unlock(&tunnel->hlist_lock);
++                      write_unlock_bh(&tunnel->hlist_lock);
+                       lock_sock(sk);
+                       if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND)) {
+@@ -1148,11 +1148,11 @@ again:
+                        * list so we are guaranteed to make forward
+                        * progress.
+                        */
+-                      write_lock(&tunnel->hlist_lock);
++                      write_lock_bh(&tunnel->hlist_lock);
+                       goto again;
+               }
+       }
+-      write_unlock(&tunnel->hlist_lock);
++      write_unlock_bh(&tunnel->hlist_lock);
+ }
+ /* Really kill the tunnel.
+@@ -1161,9 +1161,9 @@ again:
+ static void pppol2tp_tunnel_free(struct pppol2tp_tunnel *tunnel)
+ {
+       /* Remove from socket list */
+-      write_lock(&pppol2tp_tunnel_list_lock);
++      write_lock_bh(&pppol2tp_tunnel_list_lock);
+       list_del_init(&tunnel->list);
+-      write_unlock(&pppol2tp_tunnel_list_lock);
++      write_unlock_bh(&pppol2tp_tunnel_list_lock);
+       atomic_dec(&pppol2tp_tunnel_count);
+       kfree(tunnel);
+@@ -1239,9 +1239,9 @@ static void pppol2tp_session_destruct(struct sock *sk)
+                               /* Delete the session socket from the
+                                * hash
+                                */
+-                              write_lock(&tunnel->hlist_lock);
++                              write_lock_bh(&tunnel->hlist_lock);
+                               hlist_del_init(&session->hlist);
+-                              write_unlock(&tunnel->hlist_lock);
++                              write_unlock_bh(&tunnel->hlist_lock);
+                               atomic_dec(&pppol2tp_session_count);
+                       }
+@@ -1386,9 +1386,9 @@ static struct sock *pppol2tp_prepare_tunnel_socket(int fd, u16 tunnel_id,
+       /* Add tunnel to our list */
+       INIT_LIST_HEAD(&tunnel->list);
+-      write_lock(&pppol2tp_tunnel_list_lock);
++      write_lock_bh(&pppol2tp_tunnel_list_lock);
+       list_add(&tunnel->list, &pppol2tp_tunnel_list);
+-      write_unlock(&pppol2tp_tunnel_list_lock);
++      write_unlock_bh(&pppol2tp_tunnel_list_lock);
+       atomic_inc(&pppol2tp_tunnel_count);
+       /* Bump the reference count. The tunnel context is deleted
+@@ -1593,11 +1593,11 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
+       sk->sk_user_data = session;
+       /* Add session to the tunnel's hash list */
+-      write_lock(&tunnel->hlist_lock);
++      write_lock_bh(&tunnel->hlist_lock);
+       hlist_add_head(&session->hlist,
+                      pppol2tp_session_id_hash(tunnel,
+                                               session->tunnel_addr.s_session));
+-      write_unlock(&tunnel->hlist_lock);
++      write_unlock_bh(&tunnel->hlist_lock);
+       atomic_inc(&pppol2tp_session_count);
+@@ -2199,7 +2199,7 @@ static struct pppol2tp_session *next_session(struct pppol2tp_tunnel *tunnel, str
+       int next = 0;
+       int i;
+-      read_lock(&tunnel->hlist_lock);
++      read_lock_bh(&tunnel->hlist_lock);
+       for (i = 0; i < PPPOL2TP_HASH_SIZE; i++) {
+               hlist_for_each_entry(session, walk, &tunnel->session_hlist[i], hlist) {
+                       if (curr == NULL) {
+@@ -2217,7 +2217,7 @@ static struct pppol2tp_session *next_session(struct pppol2tp_tunnel *tunnel, str
+               }
+       }
+ out:
+-      read_unlock(&tunnel->hlist_lock);
++      read_unlock_bh(&tunnel->hlist_lock);
+       if (!found)
+               session = NULL;
+@@ -2228,13 +2228,13 @@ static struct pppol2tp_tunnel *next_tunnel(struct pppol2tp_tunnel *curr)
+ {
+       struct pppol2tp_tunnel *tunnel = NULL;
+-      read_lock(&pppol2tp_tunnel_list_lock);
++      read_lock_bh(&pppol2tp_tunnel_list_lock);
+       if (list_is_last(&curr->list, &pppol2tp_tunnel_list)) {
+               goto out;
+       }
+       tunnel = list_entry(curr->list.next, struct pppol2tp_tunnel, list);
+ out:
+-      read_unlock(&pppol2tp_tunnel_list_lock);
++      read_unlock_bh(&pppol2tp_tunnel_list_lock);
+       return tunnel;
+ }
diff --git a/queue-2.6.24/sch_htb-fix-too-many-events-situation.patch b/queue-2.6.24/sch_htb-fix-too-many-events-situation.patch
new file mode 100644 (file)
index 0000000..933e5bc
--- /dev/null
@@ -0,0 +1,53 @@
+From d6438f325ab12948258eb485d03ec2d694f2c6e7 Mon Sep 17 00:00:00 2001
+From: Martin Devera <devik@cdi.cz>
+Date: Sun, 6 Apr 2008 23:42:10 -0700
+Subject: sch_htb: fix "too many events" situation
+
+Upstream commit: 8f3ea33a5078a09eba12bfe57424507809367756
+
+HTB is event driven algorithm and part of its work is to apply
+scheduled events at proper times. It tried to defend itself from
+livelock by processing only limited number of events per dequeue.
+Because of faster computers some users already hit this hardcoded
+limit.
+
+This patch limits processing up to 2 jiffies (why not 1 jiffie ?
+because it might stop prematurely when only fraction of jiffie
+remains).
+
+Signed-off-by: Martin Devera <devik@cdi.cz>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/sched/sch_htb.c |   13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+--- a/net/sched/sch_htb.c
++++ b/net/sched/sch_htb.c
+@@ -708,9 +708,11 @@ static void htb_charge_class(struct htb_
+  */
+ static psched_time_t htb_do_events(struct htb_sched *q, int level)
+ {
+-      int i;
+-
+-      for (i = 0; i < 500; i++) {
++      /* don't run for longer than 2 jiffies; 2 is used instead of
++         1 to simplify things when jiffy is going to be incremented
++         too soon */
++      unsigned long stop_at = jiffies + 2;
++      while (time_before(jiffies, stop_at)) {
+               struct htb_class *cl;
+               long diff;
+               struct rb_node *p = rb_first(&q->wait_pq[level]);
+@@ -728,9 +730,8 @@ static psched_time_t htb_do_events(struc
+               if (cl->cmode != HTB_CAN_SEND)
+                       htb_add_to_wait_tree(q, cl, diff);
+       }
+-      if (net_ratelimit())
+-              printk(KERN_WARNING "htb: too many events !\n");
+-      return q->now + PSCHED_TICKS_PER_SEC / 10;
++      /* too much load - let's continue on next jiffie */
++      return q->now + PSCHED_TICKS_PER_SEC / HZ;
+ }
+ /* Returns class->node+prio from id-tree where classe's id is >= id. NULL
diff --git a/queue-2.6.24/sctp-fix-local_addr-deletions-during-list-traversals.patch b/queue-2.6.24/sctp-fix-local_addr-deletions-during-list-traversals.patch
new file mode 100644 (file)
index 0000000..a82ba2f
--- /dev/null
@@ -0,0 +1,100 @@
+From 0f79c96ec23e987e71e550eb6aee6fbf667ae1ea Mon Sep 17 00:00:00 2001
+From: Chidambar 'ilLogict' Zinnoury <illogict@online.fr>
+Date: Sun, 6 Apr 2008 23:42:35 -0700
+Subject: SCTP: Fix local_addr deletions during list traversals.
+
+Upstream commit: 22626216c46f2ec86287e75ea86dd9ac3df54265
+
+Since the lists are circular, we need to explicitely tag
+the address to be deleted since we might end up freeing
+the list head instead.  This fixes some interesting SCTP
+crashes.
+
+Signed-off-by: Chidambar 'ilLogict' Zinnoury <illogict@online.fr>
+Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/sctp/bind_addr.c |    4 +++-
+ net/sctp/ipv6.c      |    4 +++-
+ net/sctp/protocol.c  |    4 +++-
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
+--- a/net/sctp/bind_addr.c
++++ b/net/sctp/bind_addr.c
+@@ -209,6 +209,7 @@ int sctp_add_bind_addr(struct sctp_bind_
+ int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr)
+ {
+       struct sctp_sockaddr_entry *addr, *temp;
++      int found = 0;
+       /* We hold the socket lock when calling this function,
+        * and that acts as a writer synchronizing lock.
+@@ -216,13 +217,14 @@ int sctp_del_bind_addr(struct sctp_bind_
+       list_for_each_entry_safe(addr, temp, &bp->address_list, list) {
+               if (sctp_cmp_addr_exact(&addr->a, del_addr)) {
+                       /* Found the exact match. */
++                      found = 1;
+                       addr->valid = 0;
+                       list_del_rcu(&addr->list);
+                       break;
+               }
+       }
+-      if (addr && !addr->valid) {
++      if (found) {
+               call_rcu(&addr->rcu, sctp_local_addr_free);
+               SCTP_DBG_OBJCNT_DEC(addr);
+               return 0;
+--- a/net/sctp/ipv6.c
++++ b/net/sctp/ipv6.c
+@@ -89,6 +89,7 @@ static int sctp_inet6addr_event(struct n
+       struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
+       struct sctp_sockaddr_entry *addr = NULL;
+       struct sctp_sockaddr_entry *temp;
++      int found = 0;
+       switch (ev) {
+       case NETDEV_UP:
+@@ -111,13 +112,14 @@ static int sctp_inet6addr_event(struct n
+                                       &sctp_local_addr_list, list) {
+                       if (ipv6_addr_equal(&addr->a.v6.sin6_addr,
+                                            &ifa->addr)) {
++                              found = 1;
+                               addr->valid = 0;
+                               list_del_rcu(&addr->list);
+                               break;
+                       }
+               }
+               spin_unlock_bh(&sctp_local_addr_lock);
+-              if (addr && !addr->valid)
++              if (found)
+                       call_rcu(&addr->rcu, sctp_local_addr_free);
+               break;
+       }
+--- a/net/sctp/protocol.c
++++ b/net/sctp/protocol.c
+@@ -626,6 +626,7 @@ static int sctp_inetaddr_event(struct no
+       struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
+       struct sctp_sockaddr_entry *addr = NULL;
+       struct sctp_sockaddr_entry *temp;
++      int found = 0;
+       switch (ev) {
+       case NETDEV_UP:
+@@ -645,13 +646,14 @@ static int sctp_inetaddr_event(struct no
+               list_for_each_entry_safe(addr, temp,
+                                       &sctp_local_addr_list, list) {
+                       if (addr->a.v4.sin_addr.s_addr == ifa->ifa_local) {
++                              found = 1;
+                               addr->valid = 0;
+                               list_del_rcu(&addr->list);
+                               break;
+                       }
+               }
+               spin_unlock_bh(&sctp_local_addr_lock);
+-              if (addr && !addr->valid)
++              if (found)
+                       call_rcu(&addr->rcu, sctp_local_addr_free);
+               break;
+       }
index c59484ebd807f8da33aa04b44161f57ac6dbf224..2f34cf326ef56a8827662cae4712db70dc4d1f5b 100644 (file)
@@ -16,3 +16,50 @@ xen-fix-up-setup-of-shared_info.patch
 percpu-__percpu_alloc_mask-can-dynamically-size-percpu_data-storage.patch
 alloc_percpu-fails-to-allocate-percpu-data.patch
 vfs-fix-data-leak-in-nobh_write_end.patch
+pci-revert-smbus-unhide-on-hp-compaq-nx6110.patch
+hwmon-fix-i-o-resource-conflict-with-pnp.patch
+vmcoreinfo-add-the-symbol-phys_base.patch
+usb-allow-initialization-of-broken-keyspan-serial-adapters.patch
+usb-serial-fix-regression-in-visor-palm-os-module-for-kernels-2.6.24.patch
+usb-serial-ti_usb_3410_5052-correct-tusb3410-endpoint-requirements.patch
+crypto-xcbc-fix-crash-when-ipsec-uses-xcbc-mac-with-big-data-chunk.patch
+mtd-fix-broken-state-in-cfi-driver-caused-by-fl_shutdown.patch
+ipmi-change-device-node-ordering-to-reflect-probe-order.patch
+ax25-ax25_out-check-skb-for-null-in-ax25_kick.patch
+net-include-linux-types.h-into-linux-ethtool.h-for-__u-typedef.patch
+sungem-fix-napi-assertion-failure.patch
+inet-inet_frag_evictor-must-run-with-bh-disabled.patch
+llc-restrict-llc-sockets-to-root.patch
+netpoll-zap_completion_queue-adjust-skb-users-counter.patch
+pppol2tp-make-locking-calls-softirq-safe.patch
+pppol2tp-fix-smp-issues-in-skb-reorder-queue-handling.patch
+net-add-preemption-point-in-qdisc_run.patch
+sch_htb-fix-too-many-events-situation.patch
+sctp-fix-local_addr-deletions-during-list-traversals.patch
+net-fix-multicast-device-ioctl-checks.patch
+tcp-fix-shrinking-windows-with-window-scaling.patch
+tcp-let-skbs-grow-over-a-page-on-fast-peers.patch
+vlan-don-t-copy-allmulti-promisc-flags-from-underlying-device.patch
+sparc64-fix-atomic-backoff-limit.patch
+sparc64-fix-__get_cpu_var-in-preemption-enabled-area.patch
+sparc64-flush_ptrace_access-needs-preemption-disable.patch
+libata-assume-no-device-is-attached-if-both-identifys-are-aborted.patch
+sis190-read-the-mac-address-from-the-eeprom-first.patch
+bluetooth-hci_core-defer-hci_unregister_sysfs.patch
+sparc64-fix-fpu-saving-in-64-bit-signal-handling.patch
+dvb-tda10086-make-the-22khz-tone-for-diseqc-a-config-option.patch
+sunrpc-fix-a-memory-leak-in-rpc_create.patch
+hfs-fix-unlink-of-links.patch
+acpi-fix-buggy-bios-check-when-cpus-are-hot-removed.patch
+plip-replace-spin_lock_irq-with-spin_lock_irqsave-in-irq-context.patch
+signalfd-fix-for-incorrect-si_queue-user-data-reporting.patch
+md-close-a-livelock-window-in-handle_parity_checks5.patch
+powerpc-fix-build-of-modular-drivers-macintosh-apm_emu.c.patch
+pnpacpi-reduce-printk-severity-for-pnpacpi-exceeded-the-max-number-of.patch
+parisc-futex-special-case-cmpxchg-null-in-kernel-space.patch
+parisc-pdc_console-fix-bizarre-panic-on-boot.patch
+fix-signal-trampoline-cache-flushing.patch
+acpi-bus-check-once-more-for-an-empty-list-after-locking-it.patch
+fbdev-fix-proc-fb-oops-after-module-removal.patch
+macb-call-phy_disconnect-on-removing.patch
+file-capabilities-remove-cap_task_kill.patch
diff --git a/queue-2.6.24/signalfd-fix-for-incorrect-si_queue-user-data-reporting.patch b/queue-2.6.24/signalfd-fix-for-incorrect-si_queue-user-data-reporting.patch
new file mode 100644 (file)
index 0000000..59f8b39
--- /dev/null
@@ -0,0 +1,47 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:37:09 2008
+Date: Fri, 11 Apr 2008 16:55:04 GMT
+Message-Id: <200804111655.m3BGt4mw031482@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: signalfd: fix for incorrect SI_QUEUE user data reporting
+
+From: Davide Libenzi <davidel@xmailserver.org>
+
+upstream commit: 0859ab59a8a48d2a96b9d2b7100889bcb6bb5818
+
+Michael Kerrisk found out that signalfd was not reporting back user data
+pushed using sigqueue:
+
+  http://groups.google.com/group/linux.kernel/msg/9397cab8551e3123
+
+The following patch makes signalfd report back the ssi_ptr and ssi_int members
+of the signalfd_siginfo structure.
+
+Signed-off-by: Davide Libenzi <davidel@xmailserver.org>
+Acked-by: Michael Kerrisk <mtk.manpages@googlemail.com>
+Cc: <stable@kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ fs/signalfd.c |    7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/fs/signalfd.c
++++ b/fs/signalfd.c
+@@ -110,9 +110,14 @@ static int signalfd_copyinfo(struct sign
+               err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
+               err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
+               break;
+-      default: /* this is just in case for now ... */
++      default:
++              /*
++               * This case catches also the signals queued by sigqueue().
++               */
+               err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
+               err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
++              err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
++              err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
+               break;
+       }
diff --git a/queue-2.6.24/sis190-read-the-mac-address-from-the-eeprom-first.patch b/queue-2.6.24/sis190-read-the-mac-address-from-the-eeprom-first.patch
new file mode 100644 (file)
index 0000000..41532b3
--- /dev/null
@@ -0,0 +1,52 @@
+From 563e0ae06ff18f0b280f11cf706ba0172255ce52 Mon Sep 17 00:00:00 2001
+From: Francois Romieu <romieu@fr.zoreil.com>
+Date: Mon, 18 Feb 2008 21:20:32 +0100
+Message-ID: <47FA112C.4040104@gentoo.org>
+Subject: sis190: read the mac address from the eeprom first
+
+upstream commit: 563e0ae06ff18f0b280f11cf706ba0172255ce52
+
+Reading a serie of zero from the cmos sram area do not work
+well with is_valid_ether_addr(). Let's read the mac address
+from the eeprom first as it seems more reliable.
+
+Fix for http://bugzilla.kernel.org/show_bug.cgi?id=9831
+
+Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
+Signed-off-by: Jeff Garzik <jeff@garzik.org>
+
+dsd@gentoo.org notes:
+This patch fixes http://bugs.gentoo.org/207706
+
+Cc: Daniel Drake <dsd@gentoo.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/net/sis190.c |   15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/sis190.c
++++ b/drivers/net/sis190.c
+@@ -1632,13 +1632,18 @@ static inline void sis190_init_rxfilter(
+ static int sis190_get_mac_addr(struct pci_dev *pdev, struct net_device *dev)
+ {
+-      u8 from;
++      int rc;
++
++      rc = sis190_get_mac_addr_from_eeprom(pdev, dev);
++      if (rc < 0) {
++              u8 reg;
+-      pci_read_config_byte(pdev, 0x73, &from);
++              pci_read_config_byte(pdev, 0x73, &reg);
+-      return (from & 0x00000001) ?
+-              sis190_get_mac_addr_from_apc(pdev, dev) :
+-              sis190_get_mac_addr_from_eeprom(pdev, dev);
++              if (reg & 0x00000001)
++                      rc = sis190_get_mac_addr_from_apc(pdev, dev);
++      }
++      return rc;
+ }
+ static void sis190_set_speed_auto(struct net_device *dev)
diff --git a/queue-2.6.24/sparc64-fix-__get_cpu_var-in-preemption-enabled-area.patch b/queue-2.6.24/sparc64-fix-__get_cpu_var-in-preemption-enabled-area.patch
new file mode 100644 (file)
index 0000000..7dd4a4e
--- /dev/null
@@ -0,0 +1,30 @@
+From 47cd0c4f35c6f71c794928f2c26b705144799b60 Mon Sep 17 00:00:00 2001
+From: David S. Miller <davem@davemloft.net>
+Date: Mon, 7 Apr 2008 00:25:35 -0700
+Subject: SPARC64: Fix __get_cpu_var in preemption-enabled area.
+
+Upstream commit: 69072f6e8e4bd4799d2a54e4ff8771d0657512c1
+
+Reported by Mariusz Kozlowski.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ arch/sparc64/mm/tlb.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/arch/sparc64/mm/tlb.c
++++ b/arch/sparc64/mm/tlb.c
+@@ -23,10 +23,11 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_ga
+ void flush_tlb_pending(void)
+ {
+-      struct mmu_gather *mp = &__get_cpu_var(mmu_gathers);
++      struct mmu_gather *mp;
+       preempt_disable();
++      mp = &__get_cpu_var(mmu_gathers);
+       if (mp->tlb_nr) {
+               flush_tsb_user(mp);
diff --git a/queue-2.6.24/sparc64-fix-atomic-backoff-limit.patch b/queue-2.6.24/sparc64-fix-atomic-backoff-limit.patch
new file mode 100644 (file)
index 0000000..47039f5
--- /dev/null
@@ -0,0 +1,29 @@
+From 8625edb5b721526702c287e51094ac55468377d8 Mon Sep 17 00:00:00 2001
+From: David S. Miller <davem@davemloft.net>
+Date: Mon, 7 Apr 2008 00:25:20 -0700
+Subject: SPARC64: Fix atomic backoff limit.
+
+Upstream commit: 4cfea5a7dfcc2766251e50ca30271a782d5004ad
+
+4096 will not fit into the immediate field of a compare instruction,
+in fact it will end up being -4096 causing the check to fail every
+time and thus disabling backoff.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ include/asm-sparc64/backoff.h |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/include/asm-sparc64/backoff.h
++++ b/include/asm-sparc64/backoff.h
+@@ -12,7 +12,8 @@
+       mov     reg, tmp; \
+ 88:   brnz,pt tmp, 88b; \
+        sub    tmp, 1, tmp; \
+-      cmp     reg, BACKOFF_LIMIT; \
++      set     BACKOFF_LIMIT, tmp; \
++      cmp     reg, tmp; \
+       bg,pn   %xcc, label; \
+        nop; \
+       ba,pt   %xcc, label; \
diff --git a/queue-2.6.24/sparc64-fix-fpu-saving-in-64-bit-signal-handling.patch b/queue-2.6.24/sparc64-fix-fpu-saving-in-64-bit-signal-handling.patch
new file mode 100644 (file)
index 0000000..14770bf
--- /dev/null
@@ -0,0 +1,33 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:21:19 2008
+Date: Mon, 07 Apr 2008 22:24:24 -0700 (PDT)
+Message-Id: <20080407.222424.115729676.davem@davemloft.net>
+To: stable@kernel.org
+From: David Miller <davem@davemloft.net>
+Subject: SPARC64: Fix FPU saving in 64-bit signal handling.
+
+From: David S. Miller <davem@davemloft.net>
+
+Upstream commit: 7c3cce978e4f933ac13758ec5d2554fc8d0927d2
+
+The calculation of the FPU reg save area pointer
+was wrong.
+
+Based upon an OOPS report from Tom Callaway.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ arch/sparc64/kernel/signal.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/sparc64/kernel/signal.c
++++ b/arch/sparc64/kernel/signal.c
+@@ -354,7 +354,7 @@ static int invalid_frame_pointer(void __
+ static inline int
+ save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
+ {
+-      unsigned long *fpregs = (unsigned long *)(regs+1);
++      unsigned long *fpregs = current_thread_info()->fpregs;
+       unsigned long fprs;
+       int err = 0;
+       
diff --git a/queue-2.6.24/sparc64-flush_ptrace_access-needs-preemption-disable.patch b/queue-2.6.24/sparc64-flush_ptrace_access-needs-preemption-disable.patch
new file mode 100644 (file)
index 0000000..c646326
--- /dev/null
@@ -0,0 +1,35 @@
+From 312302b69e3bdab30e1fe472d265d0ed08e21f18 Mon Sep 17 00:00:00 2001
+From: David S. Miller <davem@davemloft.net>
+Date: Mon, 7 Apr 2008 00:26:11 -0700
+Subject: SPARC64: flush_ptrace_access() needs preemption disable.
+
+Upstream commit: f6a843d939ade435e060d580f5c56d958464f8a5
+
+Based upon a report by Mariusz Kozlowski.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ arch/sparc64/kernel/ptrace.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/arch/sparc64/kernel/ptrace.c
++++ b/arch/sparc64/kernel/ptrace.c
+@@ -127,6 +127,8 @@ void flush_ptrace_access(struct vm_area_
+       if (tlb_type == hypervisor)
+               return;
++      preempt_disable();
++
+ #ifdef DCACHE_ALIASING_POSSIBLE
+       /* If bit 13 of the kernel address we used to access the
+        * user page is the same as the virtual address that page
+@@ -165,6 +167,8 @@ void flush_ptrace_access(struct vm_area_
+               for (; start < end; start += icache_line_size)
+                       flushi(start);
+       }
++
++      preempt_enable();
+ }
+ asmlinkage void do_ptrace(struct pt_regs *regs)
diff --git a/queue-2.6.24/sungem-fix-napi-assertion-failure.patch b/queue-2.6.24/sungem-fix-napi-assertion-failure.patch
new file mode 100644 (file)
index 0000000..2a8c071
--- /dev/null
@@ -0,0 +1,40 @@
+From e1eba625679bf859ab7f989f548f00fcea6c4c19 Mon Sep 17 00:00:00 2001
+From: David S. Miller <davem@davemloft.net>
+Date: Sun, 6 Apr 2008 23:37:08 -0700
+Subject: SUNGEM: Fix NAPI assertion failure.
+
+Upstream commit: da990a2402aeaee84837f29054c4628eb02f7493
+
+As reported by Johannes Berg:
+
+I started getting this warning with recent kernels:
+
+[  773.908927] ------------[ cut here ]------------
+[  773.908954] Badness at net/core/dev.c:2204
+ ...
+
+If we loop more than once in gem_poll(), we'll
+use more than the real budget in our gem_rx()
+calls, thus eventually trigger the caller's
+assertions in net_rx_action().
+
+Subtract "work_done" from "budget" for the second
+arg to gem_rx() to fix the bug.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/net/sungem.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/sungem.c
++++ b/drivers/net/sungem.c
+@@ -910,7 +910,7 @@ static int gem_poll(struct napi_struct *
+                * rx ring - must call napi_disable(), which
+                * schedule_timeout()'s if polling is already disabled.
+                */
+-              work_done += gem_rx(gp, budget);
++              work_done += gem_rx(gp, budget - work_done);
+               if (work_done >= budget)
+                       return work_done;
diff --git a/queue-2.6.24/sunrpc-fix-a-memory-leak-in-rpc_create.patch b/queue-2.6.24/sunrpc-fix-a-memory-leak-in-rpc_create.patch
new file mode 100644 (file)
index 0000000..f9329f7
--- /dev/null
@@ -0,0 +1,39 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 16:27:25 2008
+From: Trond Myklebust <Trond.Myklebust@netapp.com>
+To: stable@kernel.org
+Date: Tue, 08 Apr 2008 21:15:33 -0400
+Message-ID: <20080409011532.22409.87741.stgit@c-69-242-210-120.hsd1.mi.comcast.net>
+Cc: Chuck Lever <chuck.lever@oracle.com>
+Subject: SUNRPC: Fix a memory leak in rpc_create()
+
+From: Chuck Lever <chuck.lever@oracle.com>
+
+upstream commit: ed13c27e546667fb0967ae30f5070cd7f6455f90
+
+Commit 510deb0d was supposed to move the xprt_create_transport() call in
+rpc_create(), but neglected to remove the old call site.  This resulted in
+a transport leak after every rpc_create() call.
+
+This leak is present in 2.6.24 and 2.6.25.
+
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+
+ net/sunrpc/clnt.c |    4 ----
+ 1 file changed, 4 deletions(-)
+
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -249,10 +249,6 @@ struct rpc_clnt *rpc_create(struct rpc_c
+       };
+       char servername[20];
+-      xprt = xprt_create_transport(&xprtargs);
+-      if (IS_ERR(xprt))
+-              return (struct rpc_clnt *)xprt;
+-
+       /*
+        * If the caller chooses not to specify a hostname, whip
+        * up a string representation of the passed-in address.
diff --git a/queue-2.6.24/tcp-fix-shrinking-windows-with-window-scaling.patch b/queue-2.6.24/tcp-fix-shrinking-windows-with-window-scaling.patch
new file mode 100644 (file)
index 0000000..3dd47c7
--- /dev/null
@@ -0,0 +1,63 @@
+From 1cbc66860db5db06bcf7055326f3bdbabd86e013 Mon Sep 17 00:00:00 2001
+From: Patrick McHardy <kaber@trash.net>
+Date: Sun, 6 Apr 2008 23:43:18 -0700
+Subject: TCP: Fix shrinking windows with window scaling
+
+Upstream commit: 607bfbf2d55dd1cfe5368b41c2a81a8c9ccf4723
+
+When selecting a new window, tcp_select_window() tries not to shrink
+the offered window by using the maximum of the remaining offered window
+size and the newly calculated window size. The newly calculated window
+size is always a multiple of the window scaling factor, the remaining
+window size however might not be since it depends on rcv_wup/rcv_nxt.
+This means we're effectively shrinking the window when scaling it down.
+
+
+The dump below shows the problem (scaling factor 2^7):
+
+- Window size of 557 (71296) is advertised, up to 3111907257:
+
+IP 172.2.2.3.33000 > 172.2.2.2.33000: . ack 3111835961 win 557 <...>
+
+- New window size of 514 (65792) is advertised, up to 3111907217, 40 bytes
+  below the last end:
+
+IP 172.2.2.3.33000 > 172.2.2.2.33000: . 3113575668:3113577116(1448) ack 3111841425 win 514 <...>
+
+The number 40 results from downscaling the remaining window:
+
+3111907257 - 3111841425 = 65832
+65832 / 2^7 = 514
+65832 % 2^7 = 40
+
+If the sender uses up the entire window before it is shrunk, this can have
+chaotic effects on the connection. When sending ACKs, tcp_acceptable_seq()
+will notice that the window has been shrunk since tcp_wnd_end() is before
+tp->snd_nxt, which makes it choose tcp_wnd_end() as sequence number.
+This will fail the receivers checks in tcp_sequence() however since it
+is before it's tp->rcv_wup, making it respond with a dupack.
+
+If both sides are in this condition, this leads to a constant flood of
+ACKs until the connection times out.
+
+Make sure the window is never shrunk by aligning the remaining window to
+the window scaling factor.
+
+Signed-off-by: Patrick McHardy <kaber@trash.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/ipv4/tcp_output.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -258,7 +258,7 @@ static u16 tcp_select_window(struct sock
+                *
+                * Relax Will Robinson.
+                */
+-              new_win = cur_win;
++              new_win = ALIGN(cur_win, 1 << tp->rx_opt.rcv_wscale);
+       }
+       tp->rcv_wnd = new_win;
+       tp->rcv_wup = tp->rcv_nxt;
diff --git a/queue-2.6.24/tcp-let-skbs-grow-over-a-page-on-fast-peers.patch b/queue-2.6.24/tcp-let-skbs-grow-over-a-page-on-fast-peers.patch
new file mode 100644 (file)
index 0000000..339e9f6
--- /dev/null
@@ -0,0 +1,64 @@
+From 4006101b798187bf9e03c0991eba3ee8d88d7fe0 Mon Sep 17 00:00:00 2001
+From: Herbert Xu <herbert@gondor.apana.org.au>
+Date: Sun, 6 Apr 2008 23:43:38 -0700
+Subject: TCP: Let skbs grow over a page on fast peers
+
+Upstream commit: 69d1506731168d6845a76a303b2c45f7c05f3f2c
+
+While testing the virtio-net driver on KVM with TSO I noticed
+that TSO performance with a 1500 MTU is significantly worse
+compared to the performance of non-TSO with a 16436 MTU.  The
+packet dump shows that most of the packets sent are smaller
+than a page.
+
+Looking at the code this actually is quite obvious as it always
+stop extending the packet if it's the first packet yet to be
+sent and if it's larger than the MSS.  Since each extension is
+bound by the page size, this means that (given a 1500 MTU) we're
+very unlikely to construct packets greater than a page, provided
+that the receiver and the path is fast enough so that packets can
+always be sent immediately.
+
+The fix is also quite obvious.  The push calls inside the loop
+is just an optimisation so that we don't end up doing all the
+sending at the end of the loop.  Therefore there is no specific
+reason why it has to do so at MSS boundaries.  For TSO, the
+most natural extension of this optimisation is to do the pushing
+once the skb exceeds the TSO size goal.
+
+This is what the patch does and testing with KVM shows that the
+TSO performance with a 1500 MTU easily surpasses that of a 16436
+MTU and indeed the packet sizes sent are generally larger than
+16436.
+
+I don't see any obvious downsides for slower peers or connections,
+but it would be prudent to test this extensively to ensure that
+those cases don't regress.
+
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/ipv4/tcp.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -583,7 +583,7 @@ new_segment:
+               if (!(psize -= copy))
+                       goto out;
+-              if (skb->len < mss_now || (flags & MSG_OOB))
++              if (skb->len < size_goal || (flags & MSG_OOB))
+                       continue;
+               if (forced_push(tp)) {
+@@ -829,7 +829,7 @@ new_segment:
+                       if ((seglen -= copy) == 0 && iovlen == 0)
+                               goto out;
+-                      if (skb->len < mss_now || (flags & MSG_OOB))
++                      if (skb->len < size_goal || (flags & MSG_OOB))
+                               continue;
+                       if (forced_push(tp)) {
diff --git a/queue-2.6.24/usb-allow-initialization-of-broken-keyspan-serial-adapters.patch b/queue-2.6.24/usb-allow-initialization-of-broken-keyspan-serial-adapters.patch
new file mode 100644 (file)
index 0000000..bb2eca9
--- /dev/null
@@ -0,0 +1,64 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 15:29:10 2008
+Date: Wed, 2 Apr 2008 23:15:09 GMT
+Message-Id: <200804022315.m32NF9kx011042@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: USB: Allow initialization of broken keyspan serial adapters.
+
+From: Clark Rawlins <clark.rawlins@escient.com>
+
+upstream commit: 822470537d0fc1dee38a2a9c8b8c398bfbb332bb
+
+Fixes the keyspan driver after the addition of additional
+checking of driver requirements introduced in usb-serial.c
+commit 063a2da8f01806906f7d7b1a1424b9afddebc443.  The initialization
+of the keyspan usb_serial_driver structs were not initializing the
+num_interrupt_out field and the additional checking was rejecting
+the end point so the driver wouldn't finish initializing.
+
+This commit initializes the fields to NUM_DONT_CARE.
+It works for the keyspan USA-49WG and doesn't break the USA-19HS
+which are the two keyspan devices I have to test with.
+
+Signed-off-by: Clark Rawlins <clark.rawlins@escient.com>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/usb/serial/keyspan.h |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/drivers/usb/serial/keyspan.h
++++ b/drivers/usb/serial/keyspan.h
+@@ -637,6 +637,7 @@ static struct usb_serial_driver keyspan_
+       .description            = "Keyspan - (without firmware)",
+       .id_table               = keyspan_pre_ids,
+       .num_interrupt_in       = NUM_DONT_CARE,
++      .num_interrupt_out      = NUM_DONT_CARE,
+       .num_bulk_in            = NUM_DONT_CARE,
+       .num_bulk_out           = NUM_DONT_CARE,
+       .num_ports              = 1,
+@@ -651,6 +652,7 @@ static struct usb_serial_driver keyspan_
+       .description            = "Keyspan 1 port adapter",
+       .id_table               = keyspan_1port_ids,
+       .num_interrupt_in       = NUM_DONT_CARE,
++      .num_interrupt_out      = NUM_DONT_CARE,
+       .num_bulk_in            = NUM_DONT_CARE,
+       .num_bulk_out           = NUM_DONT_CARE,
+       .num_ports              = 1,
+@@ -678,6 +680,7 @@ static struct usb_serial_driver keyspan_
+       .description            = "Keyspan 2 port adapter",
+       .id_table               = keyspan_2port_ids,
+       .num_interrupt_in       = NUM_DONT_CARE,
++      .num_interrupt_out      = NUM_DONT_CARE,
+       .num_bulk_in            = NUM_DONT_CARE,
+       .num_bulk_out           = NUM_DONT_CARE,
+       .num_ports              = 2,
+@@ -705,6 +708,7 @@ static struct usb_serial_driver keyspan_
+       .description            = "Keyspan 4 port adapter",
+       .id_table               = keyspan_4port_ids,
+       .num_interrupt_in       = NUM_DONT_CARE,
++      .num_interrupt_out      = NUM_DONT_CARE,
+       .num_bulk_in            = NUM_DONT_CARE,
+       .num_bulk_out           = NUM_DONT_CARE,
+       .num_ports              = 4,
diff --git a/queue-2.6.24/usb-serial-fix-regression-in-visor-palm-os-module-for-kernels-2.6.24.patch b/queue-2.6.24/usb-serial-fix-regression-in-visor-palm-os-module-for-kernels-2.6.24.patch
new file mode 100644 (file)
index 0000000..7ca4a2c
--- /dev/null
@@ -0,0 +1,45 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 15:29:44 2008
+Date: Wed, 2 Apr 2008 23:15:13 GMT
+Message-Id: <200804022315.m32NFDiN011077@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: USB: serial: fix regression in Visor/Palm OS module for kernels >= 2.6.24
+
+From: Brad Sawatzky <brad+kernel@swatter.net>
+
+upstream commit: d04863e9e65767feff7807c8f693ac2719dd1944
+
+Fixes a bug/inconsistency revealed by the additional sanity checking in
+   commit 063a2da8f01806906f7d7b1a1424b9afddebc443
+introduced in the original 2.6.24 branch.
+
+The Handspring Visor / PalmOS 4 device structure defines .num_bulk_out=2
+but the usb-serial probe returns num_bulk_out=3, triggering the check in
+the above commit and forcing a bail out when the device (a Garmin iQue in
+my case) attempts to connect.  The patch bumps the expected number of
+endpoints to 3.
+
+FWIW, this patch will probably solve the following kernel bug report for
+Treo users (identical symptoms, different model PalmOS units):
+  <http://bugzilla.kernel.org/show_bug.cgi?id=10118>
+
+
+Signed-off-by: Brad Sawatzky <brad+kernel@swatter.net>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/usb/serial/visor.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/visor.c
++++ b/drivers/usb/serial/visor.c
+@@ -191,7 +191,7 @@ static struct usb_serial_driver handspri
+       .id_table =             id_table,
+       .num_interrupt_in =     NUM_DONT_CARE,
+       .num_bulk_in =          2,
+-      .num_bulk_out =         2,
++      .num_bulk_out =         NUM_DONT_CARE,
+       .num_ports =            2,
+       .open =                 visor_open,
+       .close =                visor_close,
diff --git a/queue-2.6.24/usb-serial-ti_usb_3410_5052-correct-tusb3410-endpoint-requirements.patch b/queue-2.6.24/usb-serial-ti_usb_3410_5052-correct-tusb3410-endpoint-requirements.patch
new file mode 100644 (file)
index 0000000..e3ec671
--- /dev/null
@@ -0,0 +1,46 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 15:30:20 2008
+Date: Wed, 2 Apr 2008 23:15:15 GMT
+Message-Id: <200804022315.m32NFFG1011103@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: USB: serial: ti_usb_3410_5052: Correct TUSB3410 endpoint requirements.
+
+From: Robert Spanton <rspanton@zepler.net>
+
+upstream commit: 1bfd6693cd66f1e79abce62d3e8c3647e1f59a55
+
+The changes introduced in commit
+063a2da8f01806906f7d7b1a1424b9afddebc443 changed the semantics of the
+num_interrupt_in, num_interrupt_out, num_bulk_in and num_bulk_out
+entries of the usb_serial_driver struct to be the number of endpoints
+the device has when probed.
+
+This patch changes the ti_1port_device usb_serial_driver struct to
+reflect this change.  The single port devices only have 1
+bulk_out endpoint in their initial configuration, and so this patch
+changes the number of other types to NUM_DONT_CARE.
+
+The same change probably needs doing to the ti_2port_device struct,
+but I don't have a two port device at hand.
+
+Signed-off-by: Robert Spanton <rspanton@zepler.net>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ drivers/usb/serial/ti_usb_3410_5052.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/usb/serial/ti_usb_3410_5052.c
++++ b/drivers/usb/serial/ti_usb_3410_5052.c
+@@ -264,8 +264,8 @@ static struct usb_serial_driver ti_1port
+       .description            = "TI USB 3410 1 port adapter",
+       .usb_driver             = &ti_usb_driver,
+       .id_table               = ti_id_table_3410,
+-      .num_interrupt_in       = 1,
+-      .num_bulk_in            = 1,
++      .num_interrupt_in       = NUM_DONT_CARE,
++      .num_bulk_in            = NUM_DONT_CARE,
+       .num_bulk_out           = 1,
+       .num_ports              = 1,
+       .attach                 = ti_startup,
diff --git a/queue-2.6.24/vlan-don-t-copy-allmulti-promisc-flags-from-underlying-device.patch b/queue-2.6.24/vlan-don-t-copy-allmulti-promisc-flags-from-underlying-device.patch
new file mode 100644 (file)
index 0000000..f5ce65f
--- /dev/null
@@ -0,0 +1,37 @@
+From 0dcd5859eed3c804cb05a68c921ac47fa8b2f04a Mon Sep 17 00:00:00 2001
+From: Patrick McHardy <kaber@trash.net>
+Date: Sun, 6 Apr 2008 23:46:45 -0700
+Subject: VLAN: Don't copy ALLMULTI/PROMISC flags from underlying device
+
+Upstream commit: 0ed21b321a13421e2dfeaa70a6c324e05e3e91e6
+
+Changing these flags requires to use dev_set_allmulti/dev_set_promiscuity
+or dev_change_flags. Setting it directly causes two unwanted effects:
+
+- the next dev_change_flags call will notice a difference between
+  dev->gflags and the actual flags, enable promisc/allmulti
+  mode and incorrectly update dev->gflags
+
+- this keeps the underlying device in promisc/allmulti mode until
+  the VLAN device is deleted
+
+[ Ported back to 2.6.24 VLAN code. -DaveM ]
+
+Signed-off-by: Patrick McHardy <kaber@trash.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ net/8021q/vlan.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/8021q/vlan.c
++++ b/net/8021q/vlan.c
+@@ -326,7 +326,7 @@ static int vlan_dev_init(struct net_devi
+       int subclass = 0;
+       /* IFF_BROADCAST|IFF_MULTICAST; ??? */
+-      dev->flags  = real_dev->flags & ~IFF_UP;
++      dev->flags  = real_dev->flags & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI);
+       dev->iflink = real_dev->ifindex;
+       dev->state  = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
+                                         (1<<__LINK_STATE_DORMANT))) |
diff --git a/queue-2.6.24/vmcoreinfo-add-the-symbol-phys_base.patch b/queue-2.6.24/vmcoreinfo-add-the-symbol-phys_base.patch
new file mode 100644 (file)
index 0000000..f811e32
--- /dev/null
@@ -0,0 +1,59 @@
+From stable-bounces@linux.kernel.org  Wed Apr 16 15:28:17 2008
+Date: Wed, 2 Apr 2008 23:15:03 GMT
+Message-Id: <200804022315.m32NF314010808@hera.kernel.org>
+From: jejb@kernel.org
+To: jejb@kernel.org, stable@kernel.org
+Subject: vmcoreinfo: add the symbol "phys_base"
+
+From: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
+
+upstream commit: 629c8b4cdb354518308663aff2f719e02f69ffbe
+
+Fix the problem that makedumpfile sometimes fails on x86_64 machine.
+
+This patch adds the symbol "phys_base" to a vmcoreinfo data.  The
+vmcoreinfo data has the minimum debugging information only for dump
+filtering.  makedumpfile (dump filtering command) gets it to distinguish
+unnecessary pages, and makedumpfile creates a small dumpfile.
+
+On x86_64 kernel which compiled with CONFIG_PHYSICAL_START=0x0 and
+CONFIG_RELOCATABLE=y, makedumpfile fails like the following:
+
+ # makedumpfile -d31 /proc/vmcore dumpfile
+ The kernel version is not supported.
+ The created dumpfile may be incomplete.
+ _exclude_free_page: Can't get next online node.
+
+ makedumpfile Failed.
+ #
+
+The cause is the lack of the symbol "phys_base" in a vmcoreinfo data.
+If the symbol "phys_base" does not exist, makedumpfile considers an
+x86_64 kernel as non relocatable.  As the result, makedumpfile
+misunderstands the physical address where the kernel is loaded, and it
+cannot translate a kernel virtual address to physical address correctly.
+
+To fix this problem, this patch adds the symbol "phys_base" to a
+vmcoreinfo data.
+
+Signed-off-by: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
+Cc: "Eric W. Biederman" <ebiederm@xmission.com>
+Cc: <stable@kernel.org>
+Acked-by: Vivek Goyal <vgoyal@redhat.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+ arch/x86/kernel/machine_kexec_64.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/x86/kernel/machine_kexec_64.c
++++ b/arch/x86/kernel/machine_kexec_64.c
+@@ -233,6 +233,7 @@ NORET_TYPE void machine_kexec(struct kim
+ void arch_crash_save_vmcoreinfo(void)
+ {
++      VMCOREINFO_SYMBOL(phys_base);
+       VMCOREINFO_SYMBOL(init_level4_pgt);
+ #ifdef CONFIG_ARCH_DISCONTIGMEM_ENABLE