diff --git a/lnet/autoconf/lustre-lnet.m4 b/lnet/autoconf/lustre-lnet.m4
index bec57e5fba0b96156306e516d412373a63308b94..3ed69b48f3ad5215486eb1a824a9416ece40fa0d 100644
--- a/lnet/autoconf/lustre-lnet.m4
+++ b/lnet/autoconf/lustre-lnet.m4
@@ -1120,7 +1120,7 @@ LB_LINUX_TRY_COMPILE([
 
 # 2.6.21 api change. 'register_sysctl_table' use only one argument,
 # instead of more old which need two.
-AC_DEFUN([LL_2ARGS_REGISTER_SYSCTL],
+AC_DEFUN([LN_2ARGS_REGISTER_SYSCTL],
 [AC_MSG_CHECKING([check register_sysctl_table want 2 args])
 LB_LINUX_TRY_COMPILE([
         #include <linux/sysctl.h>
@@ -1135,6 +1135,29 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+# 2.6.21 uses struct kmem_cache instead of kmem_cache_s for
+# kmem_cache_t
+AC_DEFUN([LN_KMEM_CACHE_S],
+[AC_MSG_CHECKING([check kernel has struct kmem_cache_s])
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_LINUX_TRY_COMPILE([
+        #include <linux/slab.h>
+],[
+	struct kmem_cache_s *cachep = NULL;
+	
+	kmem_cache_free(cachep, NULL);
+
+],[
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_KMEM_CACHE_n, 1,
+                  [kernel has struct kmem_cache_s])
+],[
+        AC_MSG_RESULT(NO)
+])
+EXTRA_KCFLAGS="$tmp_flags"
+])
+
 #
 # LN_PROG_LINUX
 #
@@ -1170,7 +1193,8 @@ LN_ATOMIC_PANIC_NOTIFIER
 # 2.6.20
 LN_3ARGS_INIT_WORK
 # 2.6.21
-LL_2ARGS_REGISTER_SYSCTL
+LN_2ARGS_REGISTER_SYSCTL
+LN_KMEM_CACHE_S
 ])
 
 #
diff --git a/lnet/include/libcfs/linux/linux-mem.h b/lnet/include/libcfs/linux/linux-mem.h
index 7591213ffbe6d14a466447f7daf84f90e24af4ef..9a49dda33207cd35721713ff7a249368bd594404 100644
--- a/lnet/include/libcfs/linux/linux-mem.h
+++ b/lnet/include/libcfs/linux/linux-mem.h
@@ -97,7 +97,11 @@ extern void  cfs_free_large(void *addr);
  * SLAB allocator
  * XXX Liang: move these declare to public file
  */
-typedef kmem_cache_t    cfs_mem_cache_t;
+#ifdef HAVE_KMEM_CACHE_S
+typedef struct kmem_cache_s cfs_mem_cache_t;
+#else
+typedef struct kmem_cache cfs_mem_cache_t;
+#endif
 extern cfs_mem_cache_t * cfs_mem_cache_create (const char *, size_t, size_t, unsigned long);
 extern int cfs_mem_cache_destroy ( cfs_mem_cache_t * );
 extern void *cfs_mem_cache_alloc ( cfs_mem_cache_t *, int);