+# check for struct blkcipher_desc
+#
+AC_DEFUN([LC_STRUCT_BLKCIPHER_DESC],
+[AC_MSG_CHECKING([if kernel has struct blkcipher_desc])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/err.h>
+ #include <linux/crypto.h>
+],[
+ struct blkcipher_desc foo;
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_STRUCT_BLKCIPHER_DESC, 1, [kernel has struct blkcipher_desc])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
+# 2.6.19 check for FS_RENAME_DOES_D_MOVE flag
+#
+AC_DEFUN([LC_FS_RENAME_DOES_D_MOVE],
+[AC_MSG_CHECKING([if kernel has FS_RENAME_DOES_D_MOVE flag])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ int v = FS_RENAME_DOES_D_MOVE;
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_FS_RENAME_DOES_D_MOVE, 1, [kernel has FS_RENAME_DOES_D_MOVE flag])
+],[
+ 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])
+])
+])
+
+# vfs_symlink seems to have started out with 3 args until 2.6.7 where a
+# "mode" argument was added, but then again, in some later version it was
+# removed
+AC_DEFUN([LC_4ARGS_VFS_SYMLINK],
+[AC_MSG_CHECKING([if vfs_symlink wants 4 args])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct inode *dir;
+ struct dentry *dentry;
+ const char *oldname = NULL;
+ int mode = 0;
+
+ vfs_symlink(dir, dentry, oldname, mode);
+],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_4ARGS_VFS_SYMLINK, 1,
+ [vfs_symlink wants 4 args])
+],[
+ AC_MSG_RESULT(no)
+])
+])
+
+# 2.6.23 has new shrinker API
+AC_DEFUN([LC_REGISTER_SHRINKER],
+[LB_CHECK_SYMBOL_EXPORT([register_shrinker],
+[mm/vmscan.c],[
+ AC_DEFINE(HAVE_REGISTER_SHRINKER, 1,
+ [kernel exports register_shrinker])
+],[
+])
+])
+
+#2.6.27
+AC_DEFUN([LC_INODE_PERMISION_2ARGS],
+[AC_MSG_CHECKING([inode_operations->permission has two args])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct inode *inode;
+
+ inode->i_op->permission(NULL,0);
+],[
+ AC_DEFINE(HAVE_INODE_PERMISION_2ARGS, 1,
+ [inode_operations->permission has two args])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 has file_remove_suid instead of remove_suid
+AC_DEFUN([LC_FILE_REMOVE_SUID],
+[AC_MSG_CHECKING([kernel has file_remove_suid])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ file_remove_suid(NULL);
+],[
+ AC_DEFINE(HAVE_FILE_REMOVE_SUID, 1,
+ [kernel have file_remove_suid])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 have new page locking API
+AC_DEFUN([LC_TRYLOCKPAGE],
+[AC_MSG_CHECKING([kernel uses trylock_page for page lock])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/pagemap.h>
+],[
+ trylock_page(NULL);
+],[
+ AC_DEFINE(HAVE_TRYLOCK_PAGE, 1,
+ [kernel uses trylock_page for page lock])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# vfs_symlink seems to have started out with 3 args until 2.6.7 where a
+# "mode" argument was added, but then again, in some later version it was
+# removed
+AC_DEFUN([LC_4ARGS_VFS_SYMLINK],
+[AC_MSG_CHECKING([if vfs_symlink wants 4 args])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct inode *dir;
+ struct dentry *dentry;
+ const char *oldname = NULL;
+ int mode = 0;
+
+ vfs_symlink(dir, dentry, oldname, mode);
+],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_4ARGS_VFS_SYMLINK, 1,
+ [vfs_symlink wants 4 args])
+],[
+ AC_MSG_RESULT(no)
+])
+])
+
+# 2.6.27 sles11 remove the bi_hw_segments
+AC_DEFUN([LC_BI_HW_SEGMENTS],
+[AC_MSG_CHECKING([struct bio has a bi_hw_segments field])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/bio.h>
+],[
+ struct bio io;
+ io.bi_hw_segments = 0;
+],[
+ AC_DEFINE(HAVE_BI_HW_SEGMENTS, 1,
+ [struct bio has a bi_hw_segments field])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 sles11 move the quotaio_v1.h to fs
+AC_DEFUN([LC_HAVE_QUOTAIO_V1_H],
+[LB_CHECK_FILE([$LINUX/include/linux/quotaio_v1.h],[
+ AC_DEFINE(HAVE_QUOTAIO_V1_H, 1,
+ [kernel has include/linux/quotaio_v1.h])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# sles10 sp2 need 5 parameter for vfs_symlink
+AC_DEFUN([LC_VFS_SYMLINK_5ARGS],
+[AC_MSG_CHECKING([vfs_symlink need 5 parameter])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct inode *dir = NULL;
+ struct dentry *dentry = NULL;
+ struct vfsmount *mnt = NULL;
+ const char * path = NULL;
+ vfs_symlink(dir, dentry, mnt, path, 0);
+],[
+ AC_DEFINE(HAVE_VFS_SYMLINK_5ARGS, 1,
+ [vfs_symlink need 5 parameteres])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 removed the read_inode from super_operations.
+AC_DEFUN([LC_READ_INODE_IN_SBOPS],
+[AC_MSG_CHECKING([super_operations has a read_inode field])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ struct super_operations *sop;
+ sop->read_inode(NULL);
+],[
+ AC_DEFINE(HAVE_READ_INODE_IN_SBOPS, 1,
+ [super_operations has a read_inode])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 sles11 has sb_any_quota_active
+AC_DEFUN([LC_SB_ANY_QUOTA_ACTIVE],
+[AC_MSG_CHECKING([Kernel has sb_any_quota_active])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/quotaops.h>
+],[
+ sb_any_quota_active(NULL);
+],[
+ AC_DEFINE(HAVE_SB_ANY_QUOTA_ACTIVE, 1,
+ [Kernel has a sb_any_quota_active])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 sles11 has sb_has_quota_active
+AC_DEFUN([LC_SB_HAS_QUOTA_ACTIVE],
+[AC_MSG_CHECKING([Kernel has sb_has_quota_active])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/quotaops.h>
+],[
+ sb_has_quota_active(NULL, 0);
+],[
+ AC_DEFINE(HAVE_SB_HAS_QUOTA_ACTIVE, 1,
+ [Kernel has a sb_has_quota_active])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 has inode_permission instead of permisson
+AC_DEFUN([LC_EXPORT_INODE_PERMISSION],
+[LB_CHECK_SYMBOL_EXPORT([inode_permission],
+[fs/namei.c],[
+AC_DEFINE(HAVE_EXPORT_INODE_PERMISSION, 1,
+ [inode_permission is exported by the kernel])
+],[
+])
+])
+
+# 2.6.27 use 5th parameter in quota_on for remount.
+AC_DEFUN([LC_QUOTA_ON_5ARGS],
+[AC_MSG_CHECKING([quota_on needs 5 parameters])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/quota.h>
+],[
+ struct quotactl_ops *qop;
+ qop->quota_on(NULL, 0, 0, NULL, 0);
+],[
+ AC_DEFINE(HAVE_QUOTA_ON_5ARGS, 1,
+ [quota_on needs 5 paramters])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 use 3th parameter in quota_off for remount.
+AC_DEFUN([LC_QUOTA_OFF_3ARGS],
+[AC_MSG_CHECKING([quota_off needs 3 parameters])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/quota.h>
+],[
+ struct quotactl_ops *qop;
+ qop->quota_off(NULL, 0, 0);
+],[
+ AC_DEFINE(HAVE_QUOTA_OFF_3ARGS, 1,
+ [quota_off needs 3 paramters])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+# 2.6.27 has vfs_dq_off inline function.
+AC_DEFUN([LC_VFS_DQ_OFF],
+[AC_MSG_CHECKING([vfs_dq_off is defined])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/quotaops.h>
+],[
+ vfs_dq_off(NULL, 0);
+],[
+ AC_DEFINE(HAVE_VFS_DQ_OFF, 1, [vfs_dq_off is defined])
+ AC_MSG_RESULT([yes])
+],[
+ AC_MSG_RESULT([no])
+])
+])
+
+#
+# LC_LINUX_FIEMAP_H
+#
+# If we have fiemap.h
+# after 2.6.27 use fiemap.h in include/linux
+#
+AC_DEFUN([LC_LINUX_FIEMAP_H],
+[LB_CHECK_FILE([$LINUX/include/linux/fiemap.h],[
+ AC_MSG_CHECKING([if fiemap.h can be compiled])
+ LB_LINUX_TRY_COMPILE([
+ #include <linux/types.h>
+ #include <linux/fiemap.h>
+ ],[],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_LINUX_FIEMAP_H, 1, [Kernel has fiemap.h])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+],
+[])
+])
+
+#
+# LC_PROG_LINUX
+#
+# Lustre linux kernel checks
+#
+AC_DEFUN([LC_PROG_LINUX],
+ [LC_LUSTRE_VERSION_H