diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index 75474feeee2c78438afa172edf305ba68ec78b5f..8e3a2738e22b85791ff121b371c2eddf601c5289 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -79,6 +79,13 @@ Description: mds_obd_create error creating tmp object
 Details    : When the user sets quota on root, llog will be affected and can't 
              create files and write files.
 
+Severity   : normal
+Frequency  : Always on ia64 patchless client, and possibly others.
+Bugzilla   : 12826
+Description: Add EXPORT_SYMBOL check for node_to_cpumask symbol.
+Details    : This allows the patchless client to be loaded on architectures
+             without this export.
+
 --------------------------------------------------------------------------------
 
 2007-08-27         Cluster File Systems, Inc. <info@clusterfs.com>
diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4
index 068a8acb057daa5d1b555358d57a89bf9327678d..c05b94a5886f3ac6530f3690f65464e01bef6cb8 100644
--- a/lustre/autoconf/lustre-core.m4
+++ b/lustre/autoconf/lustre-core.m4
@@ -1074,6 +1074,29 @@ AC_DEFINE(HAVE___D_REHASH, 1,
 ])
 ])
 
+# The actual symbol exported varies among architectures, so we need
+# to check many symbols (but only in the current architecture.)  No
+# matter what symbol is exported, the kernel #defines node_to_cpumask
+# to the appropriate function and that's what we use.
+AC_DEFUN([LC_EXPORT_NODE_TO_CPUMASK],
+         [LB_LINUX_ARCH
+          LB_CHECK_SYMBOL_EXPORT([node_to_cpumask],
+                                 [arch/$LINUX_ARCH/mm/numa.c],
+                                 [AC_DEFINE(HAVE_NODE_TO_CPUMASK, 1,
+                                            [node_to_cpumask is exported by
+                                             the kernel])]) # x86_64
+          LB_CHECK_SYMBOL_EXPORT([node_to_cpu_mask],
+                                 [arch/$LINUX_ARCH/kernel/smpboot.c],
+                                 [AC_DEFINE(HAVE_NODE_TO_CPUMASK, 1,
+                                            [node_to_cpumask is exported by
+                                             the kernel])]) # ia64
+          LB_CHECK_SYMBOL_EXPORT([node_2_cpu_mask],
+                                 [arch/$LINUX_ARCH/kernel/smpboot.c],
+                                 [AC_DEFINE(HAVE_NODE_TO_CPUMASK, 1,
+                                            [node_to_cpumask is exported by
+                                             the kernel])]) # i386
+          ])
+
 #
 # LC_VFS_INTENT_PATCHES
 #
@@ -1115,10 +1138,11 @@ LC_CONFIG_QUOTA
 LC_CONFIG_HEALTH_CHECK_WRITE
 
 LC_TASK_PPTR
-# RHEL4 pachess
+# RHEL4 patches
 LC_EXPORT_TRUNCATE_COMPLETE
 LC_EXPORT_D_REHASH_COND
 LC_EXPORT___D_REHASH
+LC_EXPORT_NODE_TO_CPUMASK
 
 LC_STRUCT_KIOBUF
 LC_FUNC_COND_RESCHED
diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c
index 32380b3c603ad4f1827077a05b66f3c2da2c6d50..af8ffbf327aa876067fcb6d16bbcdfcd2d55f3e7 100644
--- a/lustre/ptlrpc/service.c
+++ b/lustre/ptlrpc/service.c
@@ -887,7 +887,7 @@ static int ptlrpc_main(void *arg)
 
         ptlrpc_daemonize(data->name);
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9) && defined(CONFIG_NUMA)
+#if defined(HAVE_NODE_TO_CPUMASK) && defined(CONFIG_NUMA)
         /* we need to do this before any per-thread allocation is done so that
          * we get the per-thread allocations on local node.  bug 7342 */
         if (svc->srv_cpu_affinity) {