-AC_DEFUN([LINUX_INODE_SETATTR_RETURN_TYPE],[
-AC_MSG_CHECKING(for inode_setattr return type)
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="-I${LINUX_KERNEL_PATH}/include -I${LINUX_KERNEL_PATH}/include/asm/mach-${SUBARCH} -D__KERNEL__ $CPPFLAGS"
-AC_CACHE_VAL(ac_cv_linux_func_inode_setattr_returns_int,
-[
-AC_TRY_COMPILE(
-[#include <linux/fs.h>],
-[struct inode _inode;
-struct iattr _iattr;
-int i;
-i = inode_setattr(&_inode, &_iattr);],
-ac_cv_linux_func_inode_setattr_returns_int=yes,
-ac_cv_linux_func_inode_setattr_returns_int=no)])
-AC_MSG_RESULT($ac_cv_linux_func_inode_setattr_returns_int)
-CPPFLAGS="$save_CPPFLAGS"])
+# AC_TRY_KBUILD26([INCLUDES], [FUNCTION-BODY],
+# [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE])
+#
+AC_DEFUN([AC_TRY_KBUILD26],[ rm -fr conftest.dir
+ if test "x$ac_linux_kbuild_requires_extra_cflags" = "xyes" ; then
+ CFLAGS_PREFIX='EXTRA_'
+ fi
+ if mkdir conftest.dir &&
+ cat >conftest.dir/Makefile <<_ACEOF &&
+${CFLAGS_PREFIX}CFLAGS += $CPPFLAGS
-AC_DEFUN([LINUX_WRITE_INODE_RETURN_TYPE],[
-AC_MSG_CHECKING(for write_inode return type)
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="-I${LINUX_KERNEL_PATH}/include -I${LINUX_KERNEL_PATH}/include/asm/mach-${SUBARCH} -D__KERNEL__ $CPPFLAGS"
-AC_CACHE_VAL(ac_cv_linux_func_write_inode_returns_int,
-[
-AC_TRY_COMPILE(
-[#include <linux/fs.h>],
-[struct inode _inode;
-struct super_operations _sops;
-int i;
-i = _sops.write_inode(&_inode, 0);],
-ac_cv_linux_func_write_inode_returns_int=yes,
-ac_cv_linux_func_write_inode_returns_int=no)])
-AC_MSG_RESULT($ac_cv_linux_func_write_inode_returns_int)
-CPPFLAGS="$save_CPPFLAGS"])
+obj-m += conftest.o
+_ACEOF
+ cat >conftest.dir/conftest.c <<\_ACEOF &&
+/* confdefs.h */
+_ACEOF
+ cat confdefs.h >>conftest.dir/conftest.c &&
+ cat >>conftest.dir/conftest.c <<\_ACEOF &&
+/* end confdefs.h */
+#include <linux/module.h>
+$1
-AC_DEFUN([LINUX_IOP_NAMEIDATA],[
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="-I${LINUX_KERNEL_PATH}/include -I${LINUX_KERNEL_PATH}/include/asm/mach-${SUBARCH} -D__KERNEL__ $CPPFLAGS"
-AC_MSG_CHECKING(whether inode_operations.create takes a nameidata)
-AC_CACHE_VAL(ac_cv_linux_func_i_create_takes_nameidata,
-[
-AC_TRY_COMPILE(
-[#include <linux/fs.h>
-#include <linux/namei.h>],
-[struct inode _inode;
-struct dentry _dentry;
-struct nameidata _nameidata;
-(void)_inode.i_op->create(&_inode, &_dentry, 0, &_nameidata);],
-ac_cv_linux_func_i_create_takes_nameidata=yes,
-ac_cv_linux_func_i_create_takes_nameidata=no)])
-AC_MSG_RESULT($ac_cv_linux_func_i_create_takes_nameidata)
-if test "x$ac_cv_linux_func_i_create_takes_nameidata" = "xyes" ; then
-AC_DEFINE(IOP_CREATE_TAKES_NAMEIDATA, 1, [define if your iops.create takes a nameidata argument])
-fi
-AC_MSG_CHECKING(whether inode_operations.lookup takes a nameidata)
-AC_CACHE_VAL(ac_cv_linux_func_i_lookup_takes_nameidata,
-[
-AC_TRY_COMPILE(
-[#include <linux/fs.h>
-#include <linux/namei.h>],
-[struct inode _inode;
-struct dentry _dentry;
-struct nameidata _nameidata;
-(void)_inode.i_op->lookup(&_inode, &_dentry, &_nameidata);],
-ac_cv_linux_func_i_lookup_takes_nameidata=yes,
-ac_cv_linux_func_i_lookup_takes_nameidata=no)])
-AC_MSG_RESULT($ac_cv_linux_func_i_lookup_takes_nameidata)
-if test "x$ac_cv_linux_func_i_lookup_takes_nameidata" = "xyes" ; then
-AC_DEFINE(IOP_LOOKUP_TAKES_NAMEIDATA, 1, [define if your iops.lookup takes a nameidata argument])
-fi
-AC_MSG_CHECKING(whether inode_operations.permission takes a nameidata)
-AC_CACHE_VAL(ac_cv_linux_func_i_permission_takes_nameidata,
-[
-AC_TRY_COMPILE(
-[#include <linux/fs.h>
-#include <linux/namei.h>],
-[struct inode _inode;
-struct nameidata _nameidata;
-(void)_inode.i_op->permission(&_inode, 0, &_nameidata);],
-ac_cv_linux_func_i_permission_takes_nameidata=yes,
-ac_cv_linux_func_i_permission_takes_nameidata=no)])
-AC_MSG_RESULT($ac_cv_linux_func_i_permission_takes_nameidata)
-if test "x$ac_cv_linux_func_i_permission_takes_nameidata" = "xyes" ; then
-AC_DEFINE(IOP_PERMISSION_TAKES_NAMEIDATA, 1, [define if your iops.permission takes a nameidata argument])
-fi
-AC_MSG_CHECKING(whether dentry_operations.d_revalidate takes a nameidata)
-CPPFLAGS="$CPPFLAGS -Werror"
-AC_CACHE_VAL(ac_cv_linux_func_d_revalidate_takes_nameidata,
-[
-AC_TRY_COMPILE(
-[#include <linux/fs.h>
-#include <linux/namei.h>],
-[struct dentry _dentry;
-struct nameidata _nameidata;
-(void)_dentry.d_op->d_revalidate(&_dentry, &_nameidata);],
-ac_cv_linux_func_d_revalidate_takes_nameidata=yes,
-ac_cv_linux_func_d_revalidate_takes_nameidata=no)])
-AC_MSG_RESULT($ac_cv_linux_func_d_revalidate_takes_nameidata)
-if test "x$ac_cv_linux_func_d_revalidate_takes_nameidata" = "xyes" ; then
- AC_DEFINE(DOP_REVALIDATE_TAKES_NAMEIDATA, 1, [define if your dops.d_revalidate takes a nameidata argument])
-fi
-CPPFLAGS="$save_CPPFLAGS"])
+void conftest(void)
+{
+$2
+}
-AC_DEFUN([LINUX_AOP_WRITEBACK_CONTROL],[
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="-I${LINUX_KERNEL_PATH}/include -I${LINUX_KERNEL_PATH}/include/asm/mach-${SUBARCH} -D__KERNEL__ $CPPFLAGS"
-AC_MSG_CHECKING(whether address_space_operations.writepage takes a writeback_control)
-AC_CACHE_VAL(ac_cv_linux_func_a_writepage_takes_writeback_control,
-[
-AC_TRY_COMPILE(
-[#include <linux/fs.h>
-#include <linux/mm.h>
-#include <linux/writeback.h>],
-[struct address_space_operations _aops;
-struct page _page;
-struct writeback_control _writeback_control;
-(void)_aops.writepage(&_page, &_writeback_control);],
-ac_cv_linux_func_a_writepage_takes_writeback_control=yes,
-ac_cv_linux_func_a_writepage_takes_writeback_control=no)])
-AC_MSG_RESULT($ac_cv_linux_func_a_writepage_takes_writeback_control)
-if test "x$ac_cv_linux_func_a_writepage_takes_writeback_control" = "xyes" ; then
-AC_DEFINE(AOP_WRITEPAGE_TAKES_WRITEBACK_CONTROL, 1, [define if your aops.writepage takes a struct writeback_control argument])
-fi
-CPPFLAGS="$save_CPPFLAGS"])
+MODULE_LICENSE("http://www.openafs.org/dl/license10.html");
+_ACEOF
+ echo make -C $LINUX_KERNEL_BUILD M=$SRCDIR_PARENT/conftest.dir modules KBUILD_VERBOSE=1 >&AS_MESSAGE_LOG_FD &&
+ make -C $LINUX_KERNEL_BUILD M=$SRCDIR_PARENT/conftest.dir modules KBUILD_VERBOSE=1 >&AS_MESSAGE_LOG_FD 2>conftest.err &&
+ ! grep -i "WARNING: .* undefined!$" conftest.err >/dev/null 2>&1
+ then [$3]
+ else
+ sed '/^ *+/d' conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me: failed using Makefile:" >&AS_MESSAGE_LOG_FD
+ sed 's/^/| /' conftest.dir/Makefile >&AS_MESSAGE_LOG_FD
+ echo "$as_me: and program was:" >&AS_MESSAGE_LOG_FD
+ sed 's/^/| /' conftest.dir/conftest.c >&AS_MESSAGE_LOG_FD
+ [$4]
+ fi; rm -fr conftest.err conftest.dir])
-AC_DEFUN([LINUX_REFRIGERATOR],[
-save_CPPFLAGS="$CPPFLAGS"
-CPPFLAGS="-I${LINUX_KERNEL_PATH}/include -I${LINUX_KERNEL_PATH}/include/asm/mach-${SUBARCH} -D__KERNEL__ $CPPFLAGS"
-AC_MSG_CHECKING(whether refrigerator takes PF_FREEZE)
-AC_CACHE_VAL(ac_cv_linux_func_refrigerator_takes_pf_freeze,
-[
-AC_TRY_COMPILE(
-[#include <linux/sched.h>],
-[
-refrigerator(PF_FREEZE);
-],
-ac_cv_linux_func_refrigerator_takes_pf_freeze=yes,
-ac_cv_linux_func_refrigerator_takes_pf_freeze=no)])
-AC_MSG_RESULT($ac_cv_linux_func_refrigerator_takes_pf_freeze)
-if test "x$ac_cv_linux_func_refrigerator_takes_pf_freeze" = "xyes" ; then
-AC_DEFINE(LINUX_REFRIGERATOR_TAKES_PF_FREEZE, 1, [define if your refrigerator takes PF_FREEZE])
-fi
-CPPFLAGS="$save_CPPFLAGS"])
+
+# AC_TRY_KBUILD24([INCLUDES], [FUNCTION-BODY],
+# [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE])
+#
+AC_DEFUN([AC_TRY_KBUILD24], [
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="-I$LINUX_KERNEL_PATH/include -D__KERNEL__ -Werror-implicit-function-declaration $CPPFLAGS"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <linux/kernel.h>
+$1]], [[$2]])],[$3],[$4])
+ CPPFLAGS="$ac_save_CPPFLAGS"])
+
+
+# AC_TRY_KBUILD([INCLUDES], [FUNCTION-BODY],
+# [ACTION-IF-SUCCESS], [ACTION-IF-FAILURE])
+#
+AC_DEFUN([AC_TRY_KBUILD], [
+ if test $AFS_SYSKVERS -ge 26 ; then
+ AC_TRY_KBUILD26([$1], [$2], [$3], [$4])
+ else
+ AC_TRY_KBUILD24([$1], [$2], [$3], [$4])
+ fi])
+
+AC_DEFUN([LINUX_KERNEL_COMPILE_WORKS], [
+ AC_MSG_CHECKING([if linux kernel module build works])
+ AC_TRY_KBUILD(
+[#include <linux/sched.h>
+#include <linux/fs.h>],
+ [],:,AC_MSG_RESULT(no)
+ AC_MSG_FAILURE([Fix problem or use --disable-kernel-module...]))
+ AC_MSG_RESULT(yes)])
+
+AC_DEFUN([LINUX_KBUILD_USES_EXTRA_CFLAGS], [
+ AC_MSG_CHECKING([if linux kbuild requires EXTRA_CFLAGS])
+ save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS=-Wall
+ AC_TRY_KBUILD(
+[#include <linux/sched.h>
+#include <linux/fs.h>],
+ [],
+ ac_linux_kbuild_requires_extra_cflags=no,
+ ac_linux_kbuild_requires_extra_cflags=yes)
+ CPPFLAGS="$save_CPPFLAGS"
+ AC_MSG_RESULT($ac_linux_kbuild_requires_extra_cflags)])
+
+dnl AC_CHECK_LINUX_BUILD([msg], [var], [includes], [code], [define], [CFLAGS])
+AC_DEFUN([AC_CHECK_LINUX_BUILD],
+ [AS_VAR_PUSHDEF([ac_linux_build], [$2])dnl
+ AC_CACHE_CHECK([$1], [ac_linux_build],
+ [save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $7"
+ AC_TRY_KBUILD([$3], [$4],
+ AS_VAR_SET([ac_linux_build], [yes]),
+ AS_VAR_SET([ac_linux_build], [no]))
+ CPPFLAGS="$save_CPPFLAGS"
+ ])
+ AS_IF([test AS_VAR_GET([ac_linux_build]) = yes],
+ [AC_DEFINE([$5],1,[$6])])
+ ])
+
+dnl AC_CHECK_LINUX_HEADER(header)
+AC_DEFUN([AC_CHECK_LINUX_HEADER],
+ [AC_CHECK_LINUX_BUILD([for linux/$1], [ac_cv_linux_header_$1],
+ [#include <linux/$1>],
+ [return;],
+ AS_TR_CPP(HAVE_LINUX_$1),
+ [Define if your kernel has linux/$1])
+ ])
+
+dnl AC_CHECK_LINUX_FUNC([function], [includes], [code])
+AC_DEFUN([AC_CHECK_LINUX_FUNC],
+ [AS_VAR_PUSHDEF([ac_linux_func], [ac_cv_linux_func_$1])dnl
+ AC_CACHE_CHECK([for $1], [ac_linux_func],
+ [save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -Werror-implicit-function-declaration"
+ AC_TRY_KBUILD([$2], [$3],
+ AS_VAR_SET([ac_linux_func], [yes]),
+ AS_VAR_SET([ac_linux_func], [no]))
+ CPPFLAGS="$save_CPPFLAGS"
+ ])
+ AS_IF([test AS_VAR_GET([ac_linux_func]) = yes],
+ [AC_DEFINE(AS_TR_CPP(HAVE_LINUX_$1), 1,
+ [Define if your kernel has the $1 function])])
+ ])
+
+dnl AC_CHECK_LINUX_TYPE([type], [includes])
+AC_DEFUN([AC_CHECK_LINUX_TYPE],
+ [AC_CHECK_LINUX_BUILD([for $1],
+ [ac_cv_linux_type_$1_exists],
+ [#include <linux/$2>],
+ [$1 _test; ],
+ AS_TR_CPP(HAVE_LINUX_$1),
+ [Define if kernel defines $1])
+ ])
+
+dnl AC_CHECK_LINUX_STRUCT([structure], [element], [includes])
+AC_DEFUN([AC_CHECK_LINUX_STRUCT],
+ [AC_CHECK_LINUX_TYPED_STRUCT([struct $1], [$2], [$3])
+ ])
+
+dnl AC_CHECK_LINUX_TYPED_STRUCT([structure], [element], [includes])
+AC_DEFUN([AC_CHECK_LINUX_TYPED_STRUCT],
+ [AC_CHECK_LINUX_BUILD([for $2 in $1],
+ [ac_cv_linux_$1_has_$2],
+ [#include <linux/$3>],
+ [$1 _test; printk("%x\n", &_test.$2); ],
+ AS_TR_CPP($1_HAS_$2),
+ [Define if kernel $1 has the $2 element])
+ ])
+
+dnl AC_CHECK_LINUX_OPERATION([structure], [operation], [label], [includes], [return_type], [args])
+AC_DEFUN([AC_CHECK_LINUX_OPERATION],
+ [AS_VAR_PUSHDEF([ac_linux_operation], [ac_cv_linux_operation_$1_$2_$3])
+ AC_CACHE_CHECK([operation $2 in $1], [ac_linux_operation],
+ [save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS -Werror"
+ AC_TRY_KBUILD([$4], [struct $1 ops; $5 op($6) { return ($5)0; }; ops.$2 = op;],
+ AS_VAR_SET([ac_linux_operation], [yes]),
+ AS_VAR_SET([ac_linux_operation], [no]))
+ CPPFLAGS="$save_CPPFLAGS"
+ ])
+ AS_IF([test AS_VAR_GET([ac_linux_operation]) = yes],
+ [AC_DEFINE(AS_TR_CPP(HAVE_LINUX_$1_$2_$3), 1,
+ [Define if $1 has $2 operation of form $6])])
+ ])