--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:15:36 2008
+From: Pavel Roskin <proski@gnu.org>
+Date: Wed, 30 Jul 2008 18:20:14 GMT
+Subject: ath5k: don't enable MSI, we cannot handle it yet
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807301820.m6UIKELK025900@hera.kernel.org>
+
+From: Pavel Roskin <proski@gnu.org>
+
+commit 256b152b005e319f985f50f2a910a75ba0def74f upstream
+
+MSI is a nice thing, but we cannot enable it without changing the
+interrupt handler. If we do it, we break MSI capable hardware,
+specifically AR5006 chipset.
+
+Signed-off-by: Pavel Roskin <proski@gnu.org>
+Acked-by: Nick Kossifidis <mickflemm@gmail.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/ath5k/base.c | 5 -----
+ 1 file changed, 5 deletions(-)
+
+--- a/drivers/net/wireless/ath5k/base.c
++++ b/drivers/net/wireless/ath5k/base.c
+@@ -484,9 +484,6 @@ ath5k_pci_probe(struct pci_dev *pdev,
+ /* Set private data */
+ pci_set_drvdata(pdev, hw);
+
+- /* Enable msi for devices that support it */
+- pci_enable_msi(pdev);
+-
+ /* Setup interrupt handler */
+ ret = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc);
+ if (ret) {
+@@ -553,7 +550,6 @@ err_ah:
+ err_irq:
+ free_irq(pdev->irq, sc);
+ err_free:
+- pci_disable_msi(pdev);
+ ieee80211_free_hw(hw);
+ err_map:
+ pci_iounmap(pdev, mem);
+@@ -575,7 +571,6 @@ ath5k_pci_remove(struct pci_dev *pdev)
+ ath5k_detach(pdev, hw);
+ ath5k_hw_detach(sc->ah);
+ free_irq(pdev->irq, sc);
+- pci_disable_msi(pdev);
+ pci_iounmap(pdev, sc->iobase);
+ pci_release_region(pdev, 0);
+ pci_disable_device(pdev);
--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:15:03 2008
+From: Julia Lawall <julia@diku.dk>
+Date: Wed, 30 Jul 2008 18:20:12 GMT
+Subject: b43legacy: Release mutex in error handling code
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807301820.m6UIKCFB025870@hera.kernel.org>
+
+From: Julia Lawall <julia@diku.dk>
+
+commit 4104863fb4a724723d1d5f3cba9d3c5084087e45 upstream
+
+The mutex is released on a successful return, so it would seem that it
+should be released on an error return as well.
+
+The semantic patch finds this problem is as follows:
+(http://www.emn.fr/x-info/coccinelle/)
+
+// <smpl>
+@@
+expression l;
+@@
+
+mutex_lock(l);
+.. when != mutex_unlock(l)
+ when any
+ when strict
+(
+if (...) { ... when != mutex_unlock(l)
++ mutex_unlock(l);
+ return ...;
+}
+|
+mutex_unlock(l);
+)
+// </smpl>
+
+Signed-off-by: Julia Lawall <julia@diku.dk>
+Signed-off-by: Michael Buesch <mb@bu3sch.de>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/b43legacy/main.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/b43legacy/main.c
++++ b/drivers/net/wireless/b43legacy/main.c
+@@ -3792,10 +3792,10 @@ static int b43legacy_resume(struct ssb_d
+ goto out;
+ }
+ }
+- mutex_unlock(&wl->mutex);
+
+ b43legacydbg(wl, "Device resumed.\n");
+ out:
++ mutex_unlock(&wl->mutex);
+ return err;
+ }
+
--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:14:28 2008
+From: Thomas Renninger <trenn@suse.de>
+Date: Wed, 30 Jul 2008 18:20:10 GMT
+Subject: cpufreq acpi: only call _PPC after cpufreq ACPI init funcs got called already
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807301820.m6UIKAtd025816@hera.kernel.org>
+
+From: Thomas Renninger <trenn@suse.de>
+
+commit a1531acd43310a7e4571d52e8846640667f4c74b upstream
+
+Ingo Molnar provided a fix to not call _PPC at processor driver
+initialization time in "[PATCH] ACPI: fix cpufreq regression" (git
+commit e4233dec749a3519069d9390561b5636a75c7579)
+
+But it can still happen that _PPC is called at processor driver
+initialization time.
+
+This patch should make sure that this is not possible anymore.
+
+Signed-off-by: Thomas Renninger <trenn@suse.de>
+Cc: Andi Kleen <andi@firstfloor.org>
+Cc: Len Brown <lenb@kernel.org>
+Cc: Dave Jones <davej@codemonkey.org.uk>
+Cc: Ingo Molnar <mingo@elte.hu>
+Cc: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c | 6 ++++++
+ drivers/acpi/processor_perflib.c | 15 +++++++++++++--
+ drivers/cpufreq/cpufreq.c | 3 +++
+ include/linux/cpufreq.h | 1 +
+ 4 files changed, 23 insertions(+), 2 deletions(-)
+
+--- a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
++++ b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
+@@ -96,6 +96,12 @@ static int pmi_notifier(struct notifier_
+ struct cpufreq_frequency_table *cbe_freqs;
+ u8 node;
+
++ /* Should this really be called for CPUFREQ_ADJUST, CPUFREQ_INCOMPATIBLE
++ * and CPUFREQ_NOTIFY policy events?)
++ */
++ if (event == CPUFREQ_START)
++ return 0;
++
+ cbe_freqs = cpufreq_frequency_get_table(policy->cpu);
+ node = cbe_cpu_to_node(policy->cpu);
+
+--- a/drivers/acpi/processor_perflib.c
++++ b/drivers/acpi/processor_perflib.c
+@@ -64,7 +64,13 @@ static DEFINE_MUTEX(performance_mutex);
+ * policy is adjusted accordingly.
+ */
+
+-static unsigned int ignore_ppc = 0;
++/* ignore_ppc:
++ * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
++ * ignore _PPC
++ * 0 -> cpufreq low level drivers initialized -> consider _PPC values
++ * 1 -> ignore _PPC totally -> forced by user through boot param
++ */
++static unsigned int ignore_ppc = -1;
+ module_param(ignore_ppc, uint, 0644);
+ MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \
+ "limited by BIOS, this should help");
+@@ -72,7 +78,7 @@ MODULE_PARM_DESC(ignore_ppc, "If the fre
+ #define PPC_REGISTERED 1
+ #define PPC_IN_USE 2
+
+-static int acpi_processor_ppc_status = 0;
++static int acpi_processor_ppc_status;
+
+ static int acpi_processor_ppc_notifier(struct notifier_block *nb,
+ unsigned long event, void *data)
+@@ -81,6 +87,11 @@ static int acpi_processor_ppc_notifier(s
+ struct acpi_processor *pr;
+ unsigned int ppc = 0;
+
++ if (event == CPUFREQ_START && ignore_ppc <= 0) {
++ ignore_ppc = 0;
++ return 0;
++ }
++
+ if (ignore_ppc)
+ return 0;
+
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -806,6 +806,9 @@ static int cpufreq_add_dev (struct sys_d
+ policy->user_policy.min = policy->cpuinfo.min_freq;
+ policy->user_policy.max = policy->cpuinfo.max_freq;
+
++ blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
++ CPUFREQ_START, policy);
++
+ #ifdef CONFIG_SMP
+
+ #ifdef CONFIG_HOTPLUG_CPU
+--- a/include/linux/cpufreq.h
++++ b/include/linux/cpufreq.h
+@@ -108,6 +108,7 @@ struct cpufreq_policy {
+ #define CPUFREQ_ADJUST (0)
+ #define CPUFREQ_INCOMPATIBLE (1)
+ #define CPUFREQ_NOTIFY (2)
++#define CPUFREQ_START (3)
+
+ #define CPUFREQ_SHARED_TYPE_NONE (0) /* None */
+ #define CPUFREQ_SHARED_TYPE_HW (1) /* HW does needed coordination */
--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:09:36 2008
+From: Eric Sandeen <sandeen@redhat.com>
+Date: Tue, 29 Jul 2008 02:50:12 GMT
+Subject: eCryptfs: use page_alloc not kmalloc to get a page of memory
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807290250.m6T2oCUK016734@hera.kernel.org>
+
+From: Eric Sandeen <sandeen@redhat.com>
+
+commit 7fcba054373d5dfc43d26e243a5c9b92069972ee upstream
+Date: Mon, 28 Jul 2008 15:46:39 -0700
+Subject: eCryptfs: use page_alloc not kmalloc to get a page of memory
+
+With SLUB debugging turned on in 2.6.26, I was getting memory corruption
+when testing eCryptfs. The root cause turned out to be that eCryptfs was
+doing kmalloc(PAGE_CACHE_SIZE); virt_to_page() and treating that as a nice
+page-aligned chunk of memory. But at least with SLUB debugging on, this
+is not always true, and the page we get from virt_to_page does not
+necessarily match the PAGE_CACHE_SIZE worth of memory we got from kmalloc.
+
+My simple testcase was 2 loops doing "rm -f fileX; cp /tmp/fileX ." for 2
+different multi-megabyte files. With this change I no longer see the
+corruption.
+
+Signed-off-by: Eric Sandeen <sandeen@redhat.com>
+Acked-by: Michael Halcrow <mhalcrow@us.ibm.com>
+Acked-by: Rik van Riel <riel@redhat.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/ecryptfs/crypto.c | 30 ++++++++++++++++++------------
+ 1 file changed, 18 insertions(+), 12 deletions(-)
+
+--- a/fs/ecryptfs/crypto.c
++++ b/fs/ecryptfs/crypto.c
+@@ -474,8 +474,8 @@ int ecryptfs_encrypt_page(struct page *p
+ {
+ struct inode *ecryptfs_inode;
+ struct ecryptfs_crypt_stat *crypt_stat;
+- char *enc_extent_virt = NULL;
+- struct page *enc_extent_page;
++ char *enc_extent_virt;
++ struct page *enc_extent_page = NULL;
+ loff_t extent_offset;
+ int rc = 0;
+
+@@ -491,14 +491,14 @@ int ecryptfs_encrypt_page(struct page *p
+ page->index);
+ goto out;
+ }
+- enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER);
+- if (!enc_extent_virt) {
++ enc_extent_page = alloc_page(GFP_USER);
++ if (!enc_extent_page) {
+ rc = -ENOMEM;
+ ecryptfs_printk(KERN_ERR, "Error allocating memory for "
+ "encrypted extent\n");
+ goto out;
+ }
+- enc_extent_page = virt_to_page(enc_extent_virt);
++ enc_extent_virt = kmap(enc_extent_page);
+ for (extent_offset = 0;
+ extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
+ extent_offset++) {
+@@ -526,7 +526,10 @@ int ecryptfs_encrypt_page(struct page *p
+ }
+ }
+ out:
+- kfree(enc_extent_virt);
++ if (enc_extent_page) {
++ kunmap(enc_extent_page);
++ __free_page(enc_extent_page);
++ }
+ return rc;
+ }
+
+@@ -608,8 +611,8 @@ int ecryptfs_decrypt_page(struct page *p
+ {
+ struct inode *ecryptfs_inode;
+ struct ecryptfs_crypt_stat *crypt_stat;
+- char *enc_extent_virt = NULL;
+- struct page *enc_extent_page;
++ char *enc_extent_virt;
++ struct page *enc_extent_page = NULL;
+ unsigned long extent_offset;
+ int rc = 0;
+
+@@ -626,14 +629,14 @@ int ecryptfs_decrypt_page(struct page *p
+ page->index);
+ goto out;
+ }
+- enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER);
+- if (!enc_extent_virt) {
++ enc_extent_page = alloc_page(GFP_USER);
++ if (!enc_extent_page) {
+ rc = -ENOMEM;
+ ecryptfs_printk(KERN_ERR, "Error allocating memory for "
+ "encrypted extent\n");
+ goto out;
+ }
+- enc_extent_page = virt_to_page(enc_extent_virt);
++ enc_extent_virt = kmap(enc_extent_page);
+ for (extent_offset = 0;
+ extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
+ extent_offset++) {
+@@ -661,7 +664,10 @@ int ecryptfs_decrypt_page(struct page *p
+ }
+ }
+ out:
+- kfree(enc_extent_virt);
++ if (enc_extent_page) {
++ kunmap(enc_extent_page);
++ __free_page(enc_extent_page);
++ }
+ return rc;
+ }
+
--- /dev/null
+From bb5d10ac8cc315d53306963001fe650d88a1cbb2 Mon Sep 17 00:00:00 2001
+From: Jesse Brandeburg <jesse.brandeburg@intel.com>
+Date: Fri, 11 Jul 2008 17:34:58 -0700
+Subject: [PATCH] ixgbe: remove device ID for unsupported device
+
+From: Jesse Brandeburg <jesse.brandeburg@intel.com>
+
+commit bb5d10ac8cc315d53306963001fe650d88a1cbb2 upstream
+
+The ixgbe driver was untested with device ID 8086:10c8 but still advertises
+support. Currently if this device is present in the system when the driver
+is loaded, the system will panic.
+Remove this device ID until full support can be tested with available
+hardware. This patch is necessary for 2.6.24, 2.6.25 and 2.6.26
+
+Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/ixgbe/ixgbe_main.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/net/ixgbe/ixgbe_main.c
++++ b/drivers/net/ixgbe/ixgbe_main.c
+@@ -70,8 +70,6 @@ static struct pci_device_id ixgbe_pci_tb
+ board_82598 },
+ {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT),
+ board_82598 },
+- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT_DUAL_PORT),
+- board_82598 },
+ {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4),
+ board_82598 },
+
--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:12:51 2008
+From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+Date: Wed, 30 Jul 2008 18:20:05 GMT
+Subject: markers: fix markers read barrier for multiple probes
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807301820.m6UIK5jD025768@hera.kernel.org>
+
+From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+
+commit 5def9a3a22e09c99717f41ab7f07ec9e1a1f3ec8 upstream
+
+Paul pointed out two incorrect read barriers in the marker handler code in
+the path where multiple probes are connected. Those are ordering reads of
+"ptype" (single or multi probe marker), "multi" array pointer, and "multi"
+array data access.
+
+It should be ordered like this :
+
+read ptype
+smp_rmb()
+read multi array pointer
+smp_read_barrier_depends()
+access data referenced by multi array pointer
+
+The code with a single probe connected (optimized case, does not have to
+allocate an array) has correct memory ordering.
+
+It applies to kernel 2.6.26.x, 2.6.25.x and linux-next.
+
+Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ kernel/marker.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+--- a/kernel/marker.c
++++ b/kernel/marker.c
+@@ -126,6 +126,11 @@ void marker_probe_cb(const struct marker
+ struct marker_probe_closure *multi;
+ int i;
+ /*
++ * Read mdata->ptype before mdata->multi.
++ */
++ smp_rmb();
++ multi = mdata->multi;
++ /*
+ * multi points to an array, therefore accessing the array
+ * depends on reading multi. However, even in this case,
+ * we must insure that the pointer is read _before_ the array
+@@ -133,7 +138,6 @@ void marker_probe_cb(const struct marker
+ * in the fast path, so put the explicit barrier here.
+ */
+ smp_read_barrier_depends();
+- multi = mdata->multi;
+ for (i = 0; multi[i].func; i++) {
+ va_start(args, fmt);
+ multi[i].func(multi[i].probe_private, call_private, fmt,
+@@ -176,6 +180,11 @@ void marker_probe_cb_noarg(const struct
+ struct marker_probe_closure *multi;
+ int i;
+ /*
++ * Read mdata->ptype before mdata->multi.
++ */
++ smp_rmb();
++ multi = mdata->multi;
++ /*
+ * multi points to an array, therefore accessing the array
+ * depends on reading multi. However, even in this case,
+ * we must insure that the pointer is read _before_ the array
+@@ -183,7 +192,6 @@ void marker_probe_cb_noarg(const struct
+ * in the fast path, so put the explicit barrier here.
+ */
+ smp_read_barrier_depends();
+- multi = mdata->multi;
+ for (i = 0; multi[i].func; i++)
+ multi[i].func(multi[i].probe_private, call_private, fmt,
+ &args);
--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:11:31 2008
+From: Luotao Fu <l.fu@pengutronix.de>
+Date: Tue, 29 Jul 2008 02:50:14 GMT
+Subject: mpc52xx_psc_spi: fix block transfer
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807290250.m6T2oEGC016751@hera.kernel.org>
+
+From: Luotao Fu <l.fu@pengutronix.de>
+
+commit 9a7867e1b34c3575e7e76a05c0c54c6edbdae2a4 upstream
+
+The block transfer routine in the mpc52xx psc spi driver misinterpret
+the datasheet. According to the processor datasheet the chipselect is
+held as long as the EOF is not written.
+
+Theoretically blocks of any sizes can be transferred in this way. The
+old routine however writes an EOF after every word, which has the size
+of size_of_word. This makes the transfer slow.
+
+Also fixed some duplicate code.
+
+Signed-off-by: Luotao Fu <l.fu@pengutronix.de>
+Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/spi/mpc52xx_psc_spi.c | 22 +++++++---------------
+ 1 file changed, 7 insertions(+), 15 deletions(-)
+
+--- a/drivers/spi/mpc52xx_psc_spi.c
++++ b/drivers/spi/mpc52xx_psc_spi.c
+@@ -148,7 +148,6 @@ static int mpc52xx_psc_spi_transfer_rxtx
+ unsigned rfalarm;
+ unsigned send_at_once = MPC52xx_PSC_BUFSIZE;
+ unsigned recv_at_once;
+- unsigned bpw = mps->bits_per_word / 8;
+
+ if (!t->tx_buf && !t->rx_buf && t->len)
+ return -EINVAL;
+@@ -164,22 +163,15 @@ static int mpc52xx_psc_spi_transfer_rxtx
+ }
+
+ dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once);
+- if (tx_buf) {
+- for (; send_at_once; sb++, send_at_once--) {
+- /* set EOF flag */
+- if (mps->bits_per_word
+- && (sb + 1) % bpw == 0)
+- out_8(&psc->ircr2, 0x01);
++ for (; send_at_once; sb++, send_at_once--) {
++ /* set EOF flag before the last word is sent */
++ if (send_at_once == 1)
++ out_8(&psc->ircr2, 0x01);
++
++ if (tx_buf)
+ out_8(&psc->mpc52xx_psc_buffer_8, tx_buf[sb]);
+- }
+- } else {
+- for (; send_at_once; sb++, send_at_once--) {
+- /* set EOF flag */
+- if (mps->bits_per_word
+- && ((sb + 1) % bpw) == 0)
+- out_8(&psc->ircr2, 0x01);
++ else
+ out_8(&psc->mpc52xx_psc_buffer_8, 0);
+- }
+ }
+
+
alsa-hda-fix-alc262_sony_unsol-hda_verb-array.patch
alsa-trident-pause-s-pdif-output.patch
ahci-retry-enabling-ahci-a-few-times-before-spitting-out-warn_on.patch
+x86-fix-kernel_physical_mapping_init-for-large-x86-systems.patch
+vfs-increase-pseudo-filesystem-block-size-to-page_size.patch
+tmpfs-fix-kernel-bug-in-shmem_delete_inode.patch
+mpc52xx_psc_spi-fix-block-transfer.patch
+markers-fix-markers-read-barrier-for-multiple-probes.patch
+ixgbe-remove-device-id-for-unsupported-device.patch
+ecryptfs-use-page_alloc-not-kmalloc-to-get-a-page-of-memory.patch
+cpufreq-acpi-only-call-_ppc-after-cpufreq-acpi-init-funcs-got-called-already.patch
+b43legacy-release-mutex-in-error-handling-code.patch
+ath5k-don-t-enable-msi-we-cannot-handle-it-yet.patch
--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:12:11 2008
+From: Hugh Dickins <hugh@veritas.com>
+Date: Tue, 29 Jul 2008 02:50:18 GMT
+Subject: tmpfs: fix kernel BUG in shmem_delete_inode
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807290250.m6T2oItN016780@hera.kernel.org>
+
+From: Hugh Dickins <hugh@veritas.com>
+
+commit 14fcc23fdc78e9d32372553ccf21758a9bd56fa1 upstream
+
+SuSE's insserve initscript ordering program hits kernel BUG at mm/shmem.c:814
+on 2.6.26. It's using posix_fadvise on directories, and the shmem_readpage
+method added in 2.6.23 is letting POSIX_FADV_WILLNEED allocate useless pages
+to a tmpfs directory, incrementing i_blocks count but never decrementing it.
+
+Fix this by assigning shmem_aops (pointing to readpage and writepage and
+set_page_dirty) only when it's needed, on a regular file or a long symlink.
+
+Many thanks to Kel for outstanding bugreport and steps to reproduce it.
+
+Reported-by: Kel Modderman <kel@otaku42.de>
+Tested-by: Kel Modderman <kel@otaku42.de>
+Signed-off-by: Hugh Dickins <hugh@veritas.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ mm/shmem.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/mm/shmem.c
++++ b/mm/shmem.c
+@@ -1559,7 +1559,6 @@ shmem_get_inode(struct super_block *sb,
+ inode->i_uid = current->fsuid;
+ inode->i_gid = current->fsgid;
+ inode->i_blocks = 0;
+- inode->i_mapping->a_ops = &shmem_aops;
+ inode->i_mapping->backing_dev_info = &shmem_backing_dev_info;
+ inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+ inode->i_generation = get_seconds();
+@@ -1574,6 +1573,7 @@ shmem_get_inode(struct super_block *sb,
+ init_special_inode(inode, mode, dev);
+ break;
+ case S_IFREG:
++ inode->i_mapping->a_ops = &shmem_aops;
+ inode->i_op = &shmem_inode_operations;
+ inode->i_fop = &shmem_file_operations;
+ mpol_shared_policy_init(&info->policy, sbinfo->policy,
+@@ -1964,6 +1964,7 @@ static int shmem_symlink(struct inode *d
+ return error;
+ }
+ unlock_page(page);
++ inode->i_mapping->a_ops = &shmem_aops;
+ inode->i_op = &shmem_symlink_inode_operations;
+ kaddr = kmap_atomic(page, KM_USER0);
+ memcpy(kaddr, symname, len);
--- /dev/null
+From jejb@kernel.org Wed Jul 30 14:13:33 2008
+From: Alex Nixon <alex.nixon@citrix.com>
+Date: Wed, 30 Jul 2008 18:20:08 GMT
+Subject: VFS: increase pseudo-filesystem block size to PAGE_SIZE
+To: jejb@kernel.org, stable@kernel.org
+Message-ID: <200807301820.m6UIK8W8025794@hera.kernel.org>
+
+From: Alex Nixon <alex.nixon@citrix.com>
+
+commit 3971e1a917548977cff71418a7c3575ffbc9571f upstream
+
+This commit:
+
+ commit ba52de123d454b57369f291348266d86f4b35070
+ Author: Theodore Ts'o <tytso@mit.edu>
+ Date: Wed Sep 27 01:50:49 2006 -0700
+
+ [PATCH] inode-diet: Eliminate i_blksize from the inode structure
+
+caused the block size used by pseudo-filesystems to decrease from
+PAGE_SIZE to 1024 leading to a doubling of the number of context switches
+during a kernbench run.
+
+Signed-off-by: Alex Nixon <Alex.Nixon@citrix.com>
+Cc: Andi Kleen <andi@firstfloor.org>
+Cc: Jeremy Fitzhardinge <jeremy@goop.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Ingo Molnar <mingo@elte.hu>
+Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>
+Cc: "Theodore Ts'o" <tytso@mit.edu>
+Cc: Alexander Viro <viro@zeniv.linux.org.uk>
+Cc: Hugh Dickins <hugh@veritas.com>
+Cc: Jens Axboe <jens.axboe@oracle.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/libfs.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/fs/libfs.c
++++ b/fs/libfs.c
+@@ -216,8 +216,8 @@ int get_sb_pseudo(struct file_system_typ
+
+ s->s_flags = MS_NOUSER;
+ s->s_maxbytes = ~0ULL;
+- s->s_blocksize = 1024;
+- s->s_blocksize_bits = 10;
++ s->s_blocksize = PAGE_SIZE;
++ s->s_blocksize_bits = PAGE_SHIFT;
+ s->s_magic = magic;
+ s->s_op = ops ? ops : &simple_super_operations;
+ s->s_time_gran = 1;
--- /dev/null
+From mingo@elte.hu Wed Jul 30 14:06:51 2008
+From: Ingo Molnar <mingo@elte.hu>
+Date: Sun, 20 Jul 2008 17:24:03 +0200
+Subject: x86: fix kernel_physical_mapping_init() for large x86 systems
+To: Oliver Pinter <oliver.pntr@gmail.com>
+Cc: linux-mm@kvack.org, Jack Steiner <steiner@sgi.com>, stable@kernel.org
+Message-ID: <20080720152403.GA8449@elte.hu>
+Content-Disposition: inline
+
+From: Ingo Molnar <mingo@elte.hu>
+
+based on e22146e610bb7aed63282148740ab1d1b91e1d90 upstream
+
+Fix bug in kernel_physical_mapping_init() that causes kernel
+page table to be built incorrectly for systems with greater
+than 512GB of memory.
+
+Signed-off-by: Jack Steiner <steiner@sgi.com>
+Cc: linux-mm@kvack.org
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Cc: Oliver Pinter <oliver.pntr@gmail.com>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/mm/init_64.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/x86/mm/init_64.c
++++ b/arch/x86/mm/init_64.c
+@@ -427,7 +427,7 @@ void __init_refok init_memory_mapping(un
+ else
+ pud = alloc_low_page(&pud_phys);
+
+- next = start + PGDIR_SIZE;
++ next = (start + PGDIR_SIZE) & PGDIR_MASK;
+ if (next > end)
+ next = end;
+ phys_pud_init(pud, __pa(start), __pa(next));