+]) # LC_HAVE_FILE_OPERATIONS_READ_WRITE_ITER
+
+#
+# LC_KEY_MATCH_DATA
+#
+# 3.17 replaces key_type::match with match_preparse
+# and has new struct key_match_data
+#
+AC_DEFUN([LC_KEY_MATCH_DATA], [
+LB_CHECK_COMPILE([if struct key_match field exist],
+key_match, [
+ #include <linux/key-type.h>
+],[
+ struct key_match_data data;
+],[
+ AC_DEFINE(HAVE_KEY_MATCH_DATA, 1,
+ [struct key_match_data exist])
+])
+]) # LC_KEY_MATCH_DATA
+
+#
+# LC_NFS_FILLDIR_USE_CTX
+#
+# 3.18 kernel moved from void cookie to struct dir_context
+#
+AC_DEFUN([LC_NFS_FILLDIR_USE_CTX], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if filldir_t uses struct dir_context],
+filldir_ctx, [
+ #include <linux/fs.h>
+],[
+ int filldir(struct dir_context *ctx, const char* name,
+ int i, loff_t off, u64 tmp, unsigned temp)
+ {
+ return 0;
+ }
+
+ struct dir_context ctx = {
+ .actor = filldir,
+ };
+
+ ctx.actor(NULL, "test", 0, (loff_t) 0, 0, 0);
+],[
+ AC_DEFINE(HAVE_FILLDIR_USE_CTX, 1,
+ [filldir_t needs struct dir_context as argument])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LC_NFS_FILLDIR_USE_CTX
+
+#
+# LC_KIOCB_HAS_NBYTES
+#
+# 3.19 kernel removed ki_nbytes from struct kiocb
+#
+AC_DEFUN([LC_KIOCB_HAS_NBYTES], [
+LB_CHECK_COMPILE([if struct kiocb has ki_nbytes field],
+ki_nbytes, [
+ #include <linux/fs.h>
+],[
+ struct kiocb iocb;
+
+ iocb.ki_nbytes = 0;
+],[
+ AC_DEFINE(HAVE_KI_NBYTES, 1, [ki_nbytes field exist])
+])
+]) # LC_KIOCB_HAS_NBYTES
+
+#
+# LC_CANCEL_DIRTY_PAGE
+#
+# 4.0.0 kernel removed cancle_dirty_page
+#
+AC_DEFUN([LC_CANCEL_DIRTY_PAGE], [
+LB_CHECK_COMPILE([if cancel_dirty_page still exist],
+cancel_dirty_page, [
+ #include <linux/mm.h>
+],[
+ cancel_dirty_page(NULL, PAGE_SIZE);
+],[
+ AC_DEFINE(HAVE_CANCEL_DIRTY_PAGE, 1,
+ [cancel_dirty_page is still available])
+])
+]) # LC_CANCEL_DIRTY_PAGE
+
+#
+# LC_IOV_ITER_RW
+#
+# 4.1 kernel has iov_iter_rw
+#
+AC_DEFUN([LC_IOV_ITER_RW], [
+LB_CHECK_COMPILE([if iov_iter_rw exist],
+iov_iter_rw, [
+ #include <linux/fs.h>
+ #include <linux/uio.h>
+],[
+ struct iov_iter *iter = NULL;
+
+ iov_iter_rw(iter);
+],[
+ AC_DEFINE(HAVE_IOV_ITER_RW, 1,
+ [iov_iter_rw exist])
+])
+]) # LC_IOV_ITER_RW
+
+#
+# LC_PROG_LINUX
+#
+# Lustre linux kernel checks
+#
+AC_DEFUN([LC_PROG_LINUX], [
+ AC_MSG_NOTICE([Lustre kernel checks
+==============================================================================])
+
+ LC_CONFIG_PINGER
+ LC_CONFIG_CHECKSUM
+ LC_CONFIG_HEALTH_CHECK_WRITE
+ LC_CONFIG_LRU_RESIZE
+ LC_LLITE_LLOOP_MODULE
+
+ LC_GLIBC_SUPPORT_FHANDLES
+ LC_CONFIG_RMTCLIENT
+ LC_CONFIG_GSS
+
+ # 2.6.32
+ LC_BLK_QUEUE_MAX_SEGMENTS
+
+ # 2.6.34
+ LC_HAVE_DQUOT_FS_DISK_QUOTA
+ LC_HAVE_DQUOT_SUSPEND
+ LC_HAVE_ADD_WAIT_QUEUE_EXCLUSIVE
+
+ # 2.6.35, 3.0.0
+ LC_FILE_FSYNC
+ LC_EXPORT_SIMPLE_SETATTR
+ LC_EXPORT_TRUNCATE_COMPLETE_PAGE
+
+ # 2.6.36
+ LC_FS_STRUCT_RWLOCK
+ LC_SBOPS_EVICT_INODE
+
+ # 2.6.37
+ LC_KERNEL_LOCKED
+
+ # 2.6.38
+ LC_BLKDEV_GET_BY_DEV
+ LC_GENERIC_PERMISSION
+ LC_DCACHE_LOCK
+ LC_INODE_I_RCU
+ LC_D_COMPARE_7ARGS
+ LC_D_DELETE_CONST
+
+ # 2.6.39
+ LC_REQUEST_QUEUE_UNPLUG_FN
+ LC_HAVE_FHANDLE_SYSCALLS
+ LC_HAVE_FSTYPE_MOUNT
+ LC_IOP_TRUNCATE
+ LC_HAVE_INODE_OWNER_OR_CAPABLE
+ LC_HAVE_SECURITY_IINITSEC
+
+ # 3.0
+ LC_DIRTY_INODE_WITH_FLAG
+
+ # 3.1
+ LC_LM_XXX_LOCK_MANAGER_OPS
+ LC_INODE_DIO_WAIT
+ LC_IOP_GET_ACL
+ LC_FILE_LLSEEK_SIZE
+ LC_INODE_PERMISION_2ARGS
+ LC_RADIX_EXCEPTION_ENTRY
+
+ # 3.2
+ LC_HAVE_VOID_MAKE_REQUEST_FN
+ LC_HAVE_PROTECT_I_NLINK
+
+ # 3.3
+ LC_HAVE_MIGRATE_HEADER
+ LC_MIGRATEPAGE_4ARGS
+ LC_SUPEROPS_USE_DENTRY
+ LC_INODEOPS_USE_UMODE_T
+ LC_HAVE_CACHE_REGISTER
+
+ # 3.4
+ LC_HAVE_D_MAKE_ROOT
+ LC_KMAP_ATOMIC_HAS_1ARG
+
+ # 3.5
+ LC_HAVE_CLEAR_INODE
+ LC_HAVE_ENCODE_FH_PARENT
+ LC_FILE_LLSEEK_SIZE_5ARG
+
+ # 3.6
+ LC_DATA_FOR_LLITE_IS_LIST
+ LC_DENTRY_OPEN_USE_PATH
+ LC_HAVE_IOP_ATOMIC_OPEN
+
+ # 3.7
+ LC_HAVE_POSIXACL_USER_NS
+
+ # 3.8
+ LC_HAVE_FILE_F_INODE
+ LC_HAVE_SUNRPC_UPCALL_HAS_3ARGS
+
+ # 3.9
+ LC_HAVE_HLIST_FOR_EACH_3ARG
+ LC_HAVE_BIO_END_SECTOR
+
+ # 3.10
+ LC_BLKDEV_RELEASE_RETURN_INT
+ LC_HAVE_REMOVE_PROC_SUBTREE
+ LC_HAVE_PROC_REMOVE
+
+ # 3.11
+ LC_INVALIDATE_RANGE
+ LC_HAVE_DIR_CONTEXT
+ LC_D_COMPARE_5ARGS
+ LC_HAVE_DCOUNT
+ LC_HAVE_DENTRY_D_U_D_ALIAS
+ LC_HAVE_DENTRY_D_CHILD
+
+ # 3.12
+ LC_OLDSIZE_TRUNCATE_PAGECACHE
+ LC_KIOCB_KI_LEFT
+
+ # 3.13
+ LC_VFS_RENAME_5ARGS
+ LC_VFS_UNLINK_3ARGS
+
+ # 3.14
+ LC_HAVE_BVEC_ITER
+ LC_HAVE_TRUNCATE_IPAGES_FINAL
+
+ # 3.15
+ LC_VFS_RENAME_6ARGS
+
+ # 3.16
+ LC_DIRECTIO_USE_ITER
+ LC_HAVE_IOV_ITER_INIT_DIRECTION
+ LC_HAVE_FILE_OPERATIONS_READ_WRITE_ITER
+
+ # 3.17
+ LC_KEY_MATCH_DATA
+
+ # 3.18
+ LC_NFS_FILLDIR_USE_CTX
+
+ # 3.19
+ LC_KIOCB_HAS_NBYTES
+
+ # 4.0.0
+ LC_CANCEL_DIRTY_PAGE
+
+ # 4.1.0
+ LC_IOV_ITER_RW
+
+ #
+ AS_IF([test "x$enable_server" != xno], [
+ LC_FUNC_DEV_SET_RDONLY
+ LC_STACK_SIZE
+ LC_QUOTA64
+ LC_QUOTA_CONFIG
+ ])
+]) # LC_PROG_LINUX
+
+#
+# LC_CONFIG_CLIENT
+#
+# Check whether to build the client side of Lustre
+#
+AC_DEFUN([LC_CONFIG_CLIENT], [
+AC_MSG_CHECKING([whether to build Lustre client support])
+AC_ARG_ENABLE([client],
+ AC_HELP_STRING([--disable-client],
+ [disable Lustre client support]),
+ [], [enable_client="yes"])
+AC_MSG_RESULT([$enable_client])
+]) # LC_CONFIG_CLIENT
+
+#
+# --enable-mpitests
+#
+AC_DEFUN([LB_CONFIG_MPITESTS], [
+AC_ARG_ENABLE([mpitests],
+ AC_HELP_STRING([--enable-mpitests=<yes|no|mpicc wrapper>],
+ [include mpi tests]), [
+ enable_mpitests="yes"
+ case $enableval in
+ yes)
+ MPICC_WRAPPER="mpicc"
+ ;;
+ no)
+ enable_mpitests="no"
+ ;;
+ *)
+ MPICC_WRAPPER=$enableval
+ ;;
+ esac
+ ], [
+ enable_mpitests="yes"
+ MPICC_WRAPPER="mpicc"
+ ])
+
+ if test "x$enable_mpitests" != "xno"; then
+ oldcc=$CC
+ CC=$MPICC_WRAPPER
+ AC_CACHE_CHECK([whether mpitests can be built],
+ lb_cv_mpi_tests, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+ #include <mpi.h>
+ int main(void) {
+ int flag;
+ MPI_Initialized(&flag);
+ return 0;
+ }
+ ])], [lb_cv_mpi_tests="yes"], [lb_cv_mpi_tests="no"])
+ ])
+ enable_mpitests=$lb_cv_mpi_tests
+ CC=$oldcc
+ fi
+ AC_SUBST(MPICC_WRAPPER)
+]) # LB_CONFIG_MPITESTS