--- /dev/null
+--- linux-2.6.10.orig/fs/ext3/super.c 2004-12-24 22:35:28.000000000 +0100
++++ linux-2.6.10/fs/ext3/super.c 2005-01-18 12:27:51.896529310 +0100
+@@ -1787,6 +1787,33 @@
+ return NULL;
+ }
+
++#ifdef CONFIG_NUMA
++#include <linux/nodemask.h>
++#include <asm/topology.h>
++
++static int journal_node_affinity = 0;
++spinlock_t journal_node_affinity_lock = SPIN_LOCK_UNLOCKED;
++
++static void ext3_bind_journal_thread(journal_t *journal) {
++ int i, node;
++
++ spin_lock(&journal_node_affinity_lock);
++ for (i = 0; i < MAX_NUMNODES; i++) {
++ node = (journal_node_affinity + i) % MAX_NUMNODES;
++
++ if (!nr_cpus_node(node) || !node_online(node))
++ continue;
++
++ set_cpus_allowed(journal->j_task, node_to_cpumask(node));
++ journal_node_affinity = (node + 1) % MAX_NUMNODES;
++ break;
++ }
++ spin_unlock(&journal_node_affinity_lock);
++}
++#else
++#define ext3_bind_journal_thread(journal) do {} while (0)
++#endif
++
+ static int ext3_load_journal(struct super_block * sb,
+ struct ext3_super_block * es)
+ {
+@@ -1852,6 +1875,7 @@
+ return err;
+ }
+
++ ext3_bind_journal_thread(journal);
+ EXT3_SB(sb)->s_journal = journal;
+ ext3_clear_journal_err(sb, es);
+ return 0;
+@@ -1881,6 +1908,7 @@
+ return -EIO;
+ }
+
++ ext3_bind_journal_thread(journal);
+ EXT3_SB(sb)->s_journal = journal;
+
+ ext3_update_dynamic_rev(sb);