+# LC_STRUCT_STATFS
+#
+# AIX does not have statfs.f_namelen
+#
+AC_DEFUN([LC_STRUCT_STATFS],
+[AC_MSG_CHECKING([if struct statfs has a f_namelen field])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/vfs.h>
+],[
+ struct statfs sfs;
+ sfs.f_namelen = 1;
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_STATFS_NAMELEN, 1, [struct statfs has a namelen field])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
+# LC_READLINK_SSIZE_T
+#
+AC_DEFUN([LC_READLINK_SSIZE_T],
+[AC_MSG_CHECKING([if readlink returns ssize_t])
+AC_TRY_COMPILE([
+ #include <unistd.h>
+],[
+ ssize_t readlink(const char *, char *, size_t);
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_POSIX_1003_READLINK, 1, [readlink returns ssize_t])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+AC_DEFUN([LC_FUNC_PAGE_MAPPED],
+[AC_MSG_CHECKING([if kernel offers page_mapped])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/mm.h>
+],[
+ page_mapped(NULL);
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_PAGE_MAPPED, 1, [page_mapped found])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+AC_DEFUN([LC_STRUCT_FILE_OPS_UNLOCKED_IOCTL],
+[AC_MSG_CHECKING([if struct file_operations has an unlocked_ioctl field])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct file_operations fops;
+ &fops.unlocked_ioctl;
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_UNLOCKED_IOCTL, 1, [struct file_operations has an unlock ed_ioctl field])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+AC_DEFUN([LC_FILEMAP_POPULATE],
+[AC_MSG_CHECKING([for exported filemap_populate])
+LB_LINUX_TRY_COMPILE([
+ #include <asm/page.h>
+ #include <linux/mm.h>
+],[
+ filemap_populate(NULL, 0, 0, __pgprot(0), 0, 0);
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_FILEMAP_POPULATE, 1, [Kernel exports filemap_populate])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+AC_DEFUN([LC_D_ADD_UNIQUE],
+[AC_MSG_CHECKING([for d_add_unique])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/dcache.h>
+],[
+ d_add_unique(NULL, NULL);
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_D_ADD_UNIQUE, 1, [Kernel has d_add_unique])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+AC_DEFUN([LC_BIT_SPINLOCK_H],
+[LB_CHECK_FILE([$LINUX/include/linux/bit_spinlock.h],[
+ AC_MSG_CHECKING([if bit_spinlock.h can be compiled])
+ LB_LINUX_TRY_COMPILE([
+ #include <asm/processor.h>
+ #include <linux/spinlock.h>
+ #include <linux/bit_spinlock.h>
+ ],[],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_BIT_SPINLOCK_H, 1, [Kernel has bit_spinlock.h])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+],
+[])
+])
+
+#
+# LC_POSIX_ACL_XATTR
+#
+# If we have xattr_acl.h
+#
+AC_DEFUN([LC_XATTR_ACL],
+[LB_CHECK_FILE([$LINUX/include/linux/xattr_acl.h],[
+ AC_MSG_CHECKING([if xattr_acl.h can be compiled])
+ LB_LINUX_TRY_COMPILE([
+ #include <linux/xattr_acl.h>
+ ],[],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_XATTR_ACL, 1, [Kernel has xattr_acl])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+],
+[])
+])
+
+AC_DEFUN([LC_STRUCT_INTENT_FILE],
+[AC_MSG_CHECKING([if struct open_intent has a file field])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ #include <linux/namei.h>
+],[
+ struct open_intent intent;
+ &intent.file;
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_FILE_IN_STRUCT_INTENT, 1, [struct open_intent has a file field])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+
+AC_DEFUN([LC_POSIX_ACL_XATTR_H],
+[LB_CHECK_FILE([$LINUX/include/linux/posix_acl_xattr.h],[
+ AC_MSG_CHECKING([if linux/posix_acl_xattr.h can be compiled])
+ LB_LINUX_TRY_COMPILE([
+ #include <linux/posix_acl_xattr.h>
+ ],[],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_LINUX_POSIX_ACL_XATTR_H, 1, [linux/posix_acl_xattr.h found])
+
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+$1
+],[
+AC_MSG_RESULT([no])
+])
+])
+
+#
+# LC_EXPORT___IGET
+# starting from 2.6.19 linux kernel exports __iget()
+#
+AC_DEFUN([LC_EXPORT___IGET],
+[LB_CHECK_SYMBOL_EXPORT([__iget],
+[fs/inode.c],[
+ AC_DEFINE(HAVE_EXPORT___IGET, 1, [kernel exports __iget])
+],[
+])
+])
+
+
+AC_DEFUN([LC_LUSTRE_VERSION_H],
+[LB_CHECK_FILE([$LINUX/include/linux/lustre_version.h],[
+ rm -f "$LUSTRE/include/linux/lustre_version.h"
+],[
+ touch "$LUSTRE/include/linux/lustre_version.h"
+ if test x$enable_server = xyes ; then
+ AC_MSG_WARN([Unpatched kernel detected.])
+ AC_MSG_WARN([Lustre servers cannot be built with an unpatched kernel;])
+ AC_MSG_WARN([disabling server build])
+ enable_server='no'
+ fi
+])
+])
+
+AC_DEFUN([LC_FUNC_SET_FS_PWD],
+[LB_CHECK_SYMBOL_EXPORT([set_fs_pwd],
+[fs/namespace.c],[
+ AC_DEFINE(HAVE_SET_FS_PWD, 1, [set_fs_pwd is exported])
+],[
+])
+])
+
+#
+# LC_CAPA_CRYPTO
+#
+AC_DEFUN([LC_CAPA_CRYPTO],
+[LB_LINUX_CONFIG_IM([CRYPTO],[],[
+ AC_MSG_ERROR([Lustre capability require that CONFIG_CRYPTO is enabled in your kernel.])
+])
+LB_LINUX_CONFIG_IM([CRYPTO_HMAC],[],[
+ AC_MSG_ERROR([Lustre capability require that CONFIG_CRYPTO_HMAC is enabled in your kernel.])
+])
+LB_LINUX_CONFIG_IM([CRYPTO_SHA1],[],[
+ AC_MSG_ERROR([Lustre capability require that CONFIG_CRYPTO_SHA1 is enabled in your kernel.])
+])
+])
+
+#
+# LC_CONFIG_GSS_KEYRING (default enabled, if gss is enabled)
+#
+AC_DEFUN([LC_CONFIG_GSS_KEYRING],
+[AC_MSG_CHECKING([whether to enable gss keyring backend])
+ AC_ARG_ENABLE([gss_keyring],
+ [AC_HELP_STRING([--disable-gss-keyring],
+ [disable gss keyring backend])],
+ [],[enable_gss_keyring='yes'])
+ AC_MSG_RESULT([$enable_gss_keyring])
+
+ if test x$enable_gss_keyring != xno; then
+ LB_LINUX_CONFIG_IM([KEYS],[],
+ [AC_MSG_ERROR([GSS keyring backend require that CONFIG_KEYS be enabled in your kernel.])])
+
+ AC_CHECK_LIB([keyutils], [keyctl_search], [],
+ [AC_MSG_ERROR([libkeyutils is not found, which is required by gss keyring backend])],)
+
+ AC_DEFINE([HAVE_GSS_KEYRING], [1],
+ [Define this if you enable gss keyring backend])
+ fi
+])
+
+m4_pattern_allow(AC_KERBEROS_V5)
+
+#
+# LC_CONFIG_GSS (default disabled)
+#
+# Build gss and related tools of Lustre. Currently both kernel and user space
+# parts are depend on linux platform.
+#
+AC_DEFUN([LC_CONFIG_GSS],
+[AC_MSG_CHECKING([whether to enable gss/krb5 support])
+ AC_ARG_ENABLE([gss],
+ [AC_HELP_STRING([--enable-gss], [enable gss/krb5 support])],
+ [],[enable_gss='no'])
+ AC_MSG_RESULT([$enable_gss])
+
+ if test x$enable_gss == xyes; then
+ LC_CONFIG_GSS_KEYRING
+
+ LB_LINUX_CONFIG_IM([CRYPTO_DES],[],
+ [AC_MSG_WARN([kernel DES support is recommended by using GSS.])])
+ LB_LINUX_CONFIG_IM([CRYPTO_MD5],[],
+ [AC_MSG_WARN([kernel MD5 support is recommended by using GSS.])])
+ LB_LINUX_CONFIG_IM([CRYPTO_SHA256],[],
+ [AC_MSG_WARN([kernel SHA256 support is recommended by using GSS.])])
+ LB_LINUX_CONFIG_IM([CRYPTO_SHA512],[],
+ [AC_MSG_WARN([kernel SHA512 support is recommended by using GSS.])])
+ LB_LINUX_CONFIG_IM([CRYPTO_ARC4],[],
+ [AC_MSG_WARN([kernel ARC4 support is recommended by using GSS.])])
+
+ dnl FIXME
+ dnl the AES symbol usually tied with arch, e.g. CRYPTO_AES_586
+ dnl FIXME
+ LB_LINUX_CONFIG_IM([CRYPTO_AES],[],
+ [AC_MSG_WARN([kernel AES support is recommended by using GSS.])])
+
+ AC_CHECK_LIB([gssapi], [gss_init_sec_context],
+ [GSSAPI_LIBS="$GSSAPI_LDFLAGS -lgssapi"],
+ [AC_MSG_ERROR([libgssapi is not found, which is required by GSS.])],)
+
+ AC_SUBST(GSSAPI_LIBS)
+
+ AC_KERBEROS_V5
+ fi
+])
+
+# LC_FUNC_MS_FLOCK_LOCK
+#
+# SLES9 kernel has MS_FLOCK_LOCK sb flag
+#
+AC_DEFUN([LC_FUNC_MS_FLOCK_LOCK],
+[AC_MSG_CHECKING([if kernel has MS_FLOCK_LOCK sb flag])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ int flags = MS_FLOCK_LOCK;
+],[
+ AC_DEFINE(HAVE_MS_FLOCK_LOCK, 1,
+ [kernel has MS_FLOCK_LOCK flag])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
+# LC_FUNC_HAVE_CAN_SLEEP_ARG
+#
+# SLES9 kernel has third arg can_sleep
+# in fs/locks.c: flock_lock_file_wait()
+#
+AC_DEFUN([LC_FUNC_HAVE_CAN_SLEEP_ARG],
+[AC_MSG_CHECKING([if kernel has third arg can_sleep in fs/locks.c: flock_lock_file_wait()])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ int cansleep;
+ struct file *file;
+ struct file_lock *file_lock;
+ flock_lock_file_wait(file, file_lock, cansleep);
+],[
+ AC_DEFINE(HAVE_CAN_SLEEP_ARG, 1,
+ [kernel has third arg can_sleep in fs/locks.c: flock_lock_file_wait()])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
+# LC_FUNC_F_OP_FLOCK
+#
+# rhel4.2 kernel has f_op->flock field
+#
+AC_DEFUN([LC_FUNC_F_OP_FLOCK],
+[AC_MSG_CHECKING([if struct file_operations has flock field])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct file_operations ll_file_operations_flock;
+ ll_file_operations_flock.flock = NULL;
+],[
+ AC_DEFINE(HAVE_F_OP_FLOCK, 1,
+ [struct file_operations has flock field])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
+# LC_TASK_PPTR
+#
+# task struct has p_pptr instead of parent
+#
+AC_DEFUN([LC_TASK_PPTR],
+[AC_MSG_CHECKING([task p_pptr found])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/sched.h>
+],[
+ struct task_struct *p;
+
+ p = p->p_pptr;
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_TASK_PPTR, 1, [task p_pptr found])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
+# LC_FUNC_F_OP_FLOCK
+#
+# rhel4.2 kernel has f_op->flock field
+#
+AC_DEFUN([LC_FUNC_F_OP_FLOCK],
+[AC_MSG_CHECKING([if struct file_operations has flock field])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct file_operations ll_file_operations_flock;
+ ll_file_operations_flock.flock = NULL;
+],[
+ AC_DEFINE(HAVE_F_OP_FLOCK, 1,
+ [struct file_operations has flock field])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# LC_INODE_I_MUTEX
+# after 2.6.15 inode have i_mutex intead of i_sem
+AC_DEFUN([LC_INODE_I_MUTEX],
+[AC_MSG_CHECKING([use inode have i_mutex ])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/mutex.h>
+ #include <linux/fs.h>
+],[
+ struct inode i;
+
+ mutex_unlock(&i.i_mutex);
+],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_INODE_I_MUTEX, 1,
+ [after 2.6.15 inode have i_mutex intead of i_sem])
+],[
+ AC_MSG_RESULT(NO)
+])
+])
+
+
+# LC_DQUOTOFF_MUTEX
+# after 2.6.17 dquote use mutex instead if semaphore
+AC_DEFUN([LC_DQUOTOFF_MUTEX],
+[AC_MSG_CHECKING([use dqonoff_mutex])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/mutex.h>
+ #include <linux/fs.h>
+ #include <linux/quota.h>
+],[
+ struct quota_info dq;
+
+ mutex_unlock(&dq.dqonoff_mutex);
+],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_DQUOTOFF_MUTEX, 1,
+ [after 2.6.17 dquote use mutex instead if semaphore])
+],[
+ AC_MSG_RESULT(NO)
+])
+])
+
+#
+# LC_STATFS_DENTRY_PARAM
+# starting from 2.6.18 linux kernel uses dentry instead of
+# super_block for first vfs_statfs argument