diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index 6d7c5805124e80dafdff02b910a061b34f2e6a3b..fd0b928c99659652d7c84077d9e3760bae9ed05f 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -150,6 +150,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-10         Cluster File Systems, Inc. <info@clusterfs.com>
diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4
index be52ff9956d45eb399d723f04242a8203787ae65..e563887ff63e280439bc269ac81015c67f949adf 100644
--- a/lustre/autoconf/lustre-core.m4
+++ b/lustre/autoconf/lustre-core.m4
@@ -1093,6 +1093,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
 #
@@ -1134,10 +1157,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 f785edec8c4b3d0571695899baa8af0d78c03ae5..c81fbc45eac932496e4b17509b6a27efa72c70e1 100644
--- a/lustre/ptlrpc/service.c
+++ b/lustre/ptlrpc/service.c
@@ -965,7 +965,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) {