AC_DEFUN([SPL_AC_KERNEL], [ AC_ARG_WITH([linux], AS_HELP_STRING([--with-linux=PATH], [Path to kernel source]), [kernelsrc="$withval"; kernelbuild="$withval"]) AC_ARG_WITH([linux-obj], AS_HELP_STRING([--with-linux-obj=PATH], [Path to kernel build objects]), [kernelbuild="$withval"]) AC_MSG_CHECKING([kernel source directory]) if test -z "$kernelsrc"; then sourcelink=`ls -1d /usr/src/kernels/* /usr/src/linux-* \ 2>/dev/null | grep -v obj | tail -1` if test -e ${sourcelink}; then kernelsrc=`readlink -f ${sourcelink}` kernelbuild= else AC_MSG_RESULT([Not found]) AC_MSG_ERROR([ *** Please specify the location of the kernel source *** with the '--with-linux=PATH' option]) fi else if test "$kernelsrc" = "NONE"; then kernsrcver=NONE fi fi AC_MSG_RESULT([$kernelsrc]) AC_MSG_CHECKING([kernel build directory]) if test -z "$kernelbuild" && test -d ${kernelsrc}-obj; then kernelbuild=${kernelsrc}-obj/`arch`/`arch` else kernelbuild=${kernelsrc} fi AC_MSG_RESULT([$kernelbuild]) AC_MSG_CHECKING([kernel source version]) if test -r $kernelbuild/include/linux/version.h && fgrep -q UTS_RELEASE $kernelbuild/include/linux/version.h; then kernsrcver=`(echo "#include "; echo "kernsrcver=UTS_RELEASE") | cpp -I $kernelbuild/include | grep "^kernsrcver=" | cut -d \" -f 2` elif test -r $kernelbuild/include/linux/utsrelease.h && fgrep -q UTS_RELEASE $kernelbuild/include/linux/utsrelease.h; then kernsrcver=`(echo "#include "; echo "kernsrcver=UTS_RELEASE") | cpp -I $kernelbuild/include | grep "^kernsrcver=" | cut -d \" -f 2` fi if test -z "$kernsrcver"; then AC_MSG_RESULT([Not found]) AC_MSG_ERROR([ *** Cannot determine the version of the linux kernel source. *** Please prepare the kernel before running this script]) fi AC_MSG_RESULT([$kernsrcver]) LINUX=${kernelsrc} LINUX_OBJ=${kernelbuild} LINUX_VERSION=${kernsrcver} abs_srcdir=`readlink -f ${srcdir}` kerninclude="-I${abs_srcdir} -I${abs_srcdir}/include" kernwarn="-Wstrict-prototypes -Werror" if test "${LINUX_OBJ}" != "${LINUX}"; then kernobjs="O=$kernelbuild" fi KERNELCFLAGS= KERNELCPPFLAGS="${kerninclude} ${kernwarn}" KERNELMAKE_PARAMS="${kernobjs}" AC_SUBST(LINUX) AC_SUBST(LINUX_OBJ) AC_SUBST(LINUX_VERSION) AC_SUBST(KERNELMAKE_PARAMS) AC_SUBST(KERNELCPPFLAGS) AC_SUBST(KERNELCFLAGS) ]) AC_DEFUN([SPL_AC_LICENSE], [ AC_MSG_CHECKING([license]) AC_MSG_RESULT([GPL]) KERNELCPPFLAGS="${KERNELCPPFLAGS} -DHAVE_GPL_ONLY_SYMBOLS" ]) AC_DEFUN([SPL_AC_DEBUG], [ AC_MSG_CHECKING([whether debugging is enabled]) AC_ARG_ENABLE( [debug], AS_HELP_STRING([--enable-debug], [Enable generic debug support (default off)]), [ case "$enableval" in yes) spl_ac_debug=yes ;; no) spl_ac_debug=no ;; *) AC_MSG_RESULT([Error!]) AC_MSG_ERROR([Bad value "$enableval" for --enable-debug]) ;; esac ] ) if test "$spl_ac_debug" = yes; then AC_MSG_RESULT([yes]) KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG" else AC_MSG_RESULT([no]) KERNELCPPFLAGS="${KERNELCPPFLAGS} -DNDEBUG" fi ]) AC_DEFUN([SPL_AC_DEBUG_KMEM], [ AC_MSG_CHECKING([whether kmem debugging is enabled]) AC_ARG_ENABLE( [debug-kmem], AS_HELP_STRING([--enable-debug-kmem], [Enable kmem debug support (default off)]), [ case "$enableval" in yes) spl_ac_debug_kmem=yes ;; no) spl_ac_debug_kmem=no ;; *) AC_MSG_RESULT([Error!]) AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-kmem]) ;; esac ] ) if test "$spl_ac_debug_kmem" = yes; then AC_MSG_RESULT([yes]) AC_DEFINE([DEBUG_KMEM], [1], [Define to 1 to enable kmem debugging]) KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_KMEM" else AC_MSG_RESULT([no]) fi ]) AC_DEFUN([SPL_AC_DEBUG_MUTEX], [ AC_MSG_CHECKING([whether mutex debugging is enabled]) AC_ARG_ENABLE( [debug-mutex], AS_HELP_STRING([--enable-debug-mutex], [Enable mutex debug support (default off)]), [ case "$enableval" in yes) spl_ac_debug_mutex=yes ;; no) spl_ac_debug_mutex=no ;; *) AC_MSG_RESULT([Error!]) AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-mutex]) ;; esac ] ) if test "$spl_ac_debug_mutex" = yes; then AC_MSG_RESULT([yes]) AC_DEFINE([DEBUG_MUTEX], [1], [Define to 1 to enable mutex debugging]) KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_MUTEX" else AC_MSG_RESULT([no]) fi ]) AC_DEFUN([SPL_AC_DEBUG_KSTAT], [ AC_MSG_CHECKING([whether kstat debugging is enabled]) AC_ARG_ENABLE( [debug-kstat], AS_HELP_STRING([--enable-debug-kstat], [Enable kstat debug support (default off)]), [ case "$enableval" in yes) spl_ac_debug_kstat=yes ;; no) spl_ac_debug_kstat=no ;; *) AC_MSG_RESULT([Error!]) AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-kstat]) ;; esac ] ) if test "$spl_ac_debug_kstat" = yes; then AC_MSG_RESULT([yes]) AC_DEFINE([DEBUG_KSTAT], [1], [Define to 1 to enable kstat debugging]) KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_KSTAT" else AC_MSG_RESULT([no]) fi ]) AC_DEFUN([SPL_AC_DEBUG_CALLB], [ AC_MSG_CHECKING([whether callb debugging is enabled]) AC_ARG_ENABLE( [debug-callb], AS_HELP_STRING([--enable-debug-callb], [Enable callb debug support (default off)]), [ case "$enableval" in yes) spl_ac_debug_callb=yes ;; no) spl_ac_debug_callb=no ;; *) AC_MSG_RESULT([Error!]) AC_MSG_ERROR([Bad value "$enableval" for --enable-debug-callb]) ;; esac ] ) if test "$spl_ac_debug_callb" = yes; then AC_MSG_RESULT([yes]) AC_DEFINE([DEBUG_CALLB], [1], [Define to 1 to enable callb debugging]) KERNELCPPFLAGS="${KERNELCPPFLAGS} -DDEBUG_CALLB" else AC_MSG_RESULT([no]) fi ]) dnl # dnl # SPL_LINUX_CONFTEST dnl # AC_DEFUN([SPL_LINUX_CONFTEST], [ cat >conftest.c <<_ACEOF $1 _ACEOF ]) dnl # dnl # SPL_LANG_PROGRAM(C)([PROLOGUE], [BODY]) dnl # m4_define([SPL_LANG_PROGRAM], [ $1 int main (void) { dnl Do *not* indent the following line: there may be CPP directives. dnl Don't move the `;' right after for the same reason. $2 ; return 0; } ]) dnl # dnl # SPL_LINUX_COMPILE_IFELSE / like AC_COMPILE_IFELSE dnl # AC_DEFUN([SPL_LINUX_COMPILE_IFELSE], [ m4_ifvaln([$1], [SPL_LINUX_CONFTEST([$1])]) rm -Rf build && mkdir -p build echo "obj-m := conftest.o" >build/Makefile AS_IF( [AC_TRY_COMMAND(cp conftest.c build && make [$2] LINUXINCLUDE="-Iinclude -Iinclude2 -I$LINUX/include -include include/linux/autoconf.h" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])], [$4], [_AC_MSG_LOG_CONFTEST m4_ifvaln([$5],[$5])] ) rm -Rf build ]) dnl # dnl # SPL_LINUX_TRY_COMPILE like AC_TRY_COMPILE dnl # AC_DEFUN([SPL_LINUX_TRY_COMPILE], [SPL_LINUX_COMPILE_IFELSE( [AC_LANG_SOURCE([SPL_LANG_PROGRAM([[$1]], [[$2]])])], [modules], [test -s build/conftest.o], [$3], [$4]) ]) dnl # dnl # SPL_LINUX_CONFIG dnl # AC_DEFUN([SPL_LINUX_CONFIG], [AC_MSG_CHECKING([whether Linux was built with CONFIG_$1]) SPL_LINUX_TRY_COMPILE([ #ifndef AUTOCONF_INCLUDED #include #endif ],[ #ifndef CONFIG_$1 #error CONFIG_$1 not #defined #endif ],[ AC_MSG_RESULT([yes]) $2 ],[ AC_MSG_RESULT([no]) $3 ]) ]) dnl # dnl # SPL_CHECK_SYMBOL_EXPORT dnl # check symbol exported or not dnl # AC_DEFUN([SPL_CHECK_SYMBOL_EXPORT], [AC_MSG_CHECKING([whether symbol $1 is exported]) grep -q -E '[[[:space:]]]$1[[[:space:]]]' $LINUX_OBJ/Module.symvers 2>/dev/null rc=$? if test $rc -ne 0; then export=0 for file in $2; do grep -q -E "EXPORT_SYMBOL.*($1)" "$LINUX_OBJ/$file" 2>/dev/null rc=$? if test $rc -eq 0; then export=1 break; fi done if test $export -eq 0; then AC_MSG_RESULT([no]) $4 else AC_MSG_RESULT([yes]) $3 fi else AC_MSG_RESULT([yes]) $3 fi ]) dnl # dnl # SPL_CHECK_HEADER dnl # check whether header exists and define HAVE_$2_HEADER dnl # AC_DEFUN([SPL_CHECK_HEADER], [AC_MSG_CHECKING([whether header $1 exists]) SPL_LINUX_TRY_COMPILE([ #include <$1> ],[ return 0; ],[ AC_DEFINE(HAVE_$2_HEADER, 1, [$1 exists]) AC_MSG_RESULT(yes) $3 ],[ AC_MSG_RESULT(no) $4 ]) ]) dnl # dnl # 2.6.24 API change, dnl # check if uintptr_t typedef is defined dnl # AC_DEFUN([SPL_AC_TYPE_UINTPTR_T], [AC_MSG_CHECKING([whether kernel defines uintptr_t]) SPL_LINUX_TRY_COMPILE([ #include ],[ uintptr_t *ptr; ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_UINTPTR_T, 1, [kernel defines uintptr_t]) ],[ AC_MSG_RESULT([no]) ]) ]) dnl # dnl # 2.6.x API change, dnl # check if atomic64_t typedef is defined dnl # AC_DEFUN([SPL_AC_TYPE_ATOMIC64_T], [AC_MSG_CHECKING([whether kernel defines atomic64_t]) SPL_LINUX_TRY_COMPILE([ #include ],[ atomic64_t *ptr; ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_ATOMIC64_T, 1, [kernel defines atomic64_t]) ],[ AC_MSG_RESULT([no]) ]) ]) dnl # dnl # 2.6.20 API change, dnl # INIT_WORK use 2 args and not store data inside dnl # AC_DEFUN([SPL_AC_3ARGS_INIT_WORK], [AC_MSG_CHECKING([whether INIT_WORK wants 3 args]) SPL_LINUX_TRY_COMPILE([ #include ],[ struct work_struct work; INIT_WORK(&work, NULL, NULL); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_3ARGS_INIT_WORK, 1, [INIT_WORK wants 3 args]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.21 API change, dnl # 'register_sysctl_table' use only one argument instead of two dnl # AC_DEFUN([SPL_AC_2ARGS_REGISTER_SYSCTL], [AC_MSG_CHECKING([whether register_sysctl_table() wants 2 args]) SPL_LINUX_TRY_COMPILE([ #include ],[ return register_sysctl_table(NULL,0); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_2ARGS_REGISTER_SYSCTL, 1, [register_sysctl_table() wants 2 args]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.23 API change dnl # Old set_shrinker API replaced with register_shrinker dnl # AC_DEFUN([SPL_AC_SET_SHRINKER], [ AC_MSG_CHECKING([whether set_shrinker() available]) SPL_LINUX_TRY_COMPILE([ #include ],[ return set_shrinker(DEFAULT_SEEKS, NULL); ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_SET_SHRINKER, 1, [set_shrinker() available]) ],[ AC_MSG_RESULT([no]) ]) ]) dnl # dnl # 2.6.25 API change, dnl # struct path entry added to struct nameidata dnl # AC_DEFUN([SPL_AC_PATH_IN_NAMEIDATA], [AC_MSG_CHECKING([whether struct path used in struct nameidata]) SPL_LINUX_TRY_COMPILE([ #include ],[ struct nameidata nd; nd.path.mnt = NULL; nd.path.dentry = NULL; ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_PATH_IN_NAMEIDATA, 1, [struct path used in struct nameidata]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # Custom SPL patch may export this system it is not required dnl # AC_DEFUN([SPL_AC_TASK_CURR], [ SPL_CHECK_SYMBOL_EXPORT([task_curr], [kernel/sched.c], [AC_DEFINE(HAVE_TASK_CURR, 1, [task_curr() exported])], []) ]) dnl # dnl # 2.6.19 API change, dnl # Use CTL_UNNUMBERED when binary sysctl is not required dnl # AC_DEFUN([SPL_AC_CTL_UNNUMBERED], [AC_MSG_CHECKING([whether unnumbered sysctl support exists]) SPL_LINUX_TRY_COMPILE([ #include ],[ #ifndef CTL_UNNUMBERED #error CTL_UNNUMBERED undefined #endif ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_CTL_UNNUMBERED, 1, [unnumbered sysctl support exists]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.16 API change. dnl # Check if 'fls64()' is available dnl # AC_DEFUN([SPL_AC_FLS64], [AC_MSG_CHECKING([whether fls64() is available]) SPL_LINUX_TRY_COMPILE([ #include ],[ return fls64(0); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_FLS64, 1, [fls64() is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.18 API change, check whether device_create() is available. dnl # Device_create() was introduced in 2.6.18 and depricated dnl # class_device_create() which was fully removed in 2.6.26. dnl # AC_DEFUN([SPL_AC_DEVICE_CREATE], [ SPL_CHECK_SYMBOL_EXPORT( [device_create], [drivers/base/core.c], [AC_DEFINE(HAVE_DEVICE_CREATE, 1, [device_create() is available])], []) ]) dnl # dnl # 2.6.27 API change, dnl # device_create() uses 5 args, new 'drvdata' argument. dnl # AC_DEFUN([SPL_AC_5ARGS_DEVICE_CREATE], [ AC_MSG_CHECKING([whether device_create() wants 5 args]) tmp_flags="$EXTRA_KCFLAGS" EXTRA_KCFLAGS="-Werror" SPL_LINUX_TRY_COMPILE([ #include ],[ device_create(NULL, NULL, 0, NULL, "%d", 1); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_5ARGS_DEVICE_CREATE, 1, [device_create wants 5 args]) ],[ AC_MSG_RESULT(no) ]) EXTRA_KCFLAGS="$tmp_flags" ]) dnl # dnl # 2.6.13 API change, check whether class_device_create() is available. dnl # Class_device_create() was introduced in 2.6.13 and depricated dnl # class_simple_device_add() which was fully removed in 2.6.13. dnl # AC_DEFUN([SPL_AC_CLASS_DEVICE_CREATE], [ SPL_CHECK_SYMBOL_EXPORT( [class_device_create], [drivers/base/class.c], [AC_DEFINE(HAVE_CLASS_DEVICE_CREATE, 1, [class_device_create() is available])], []) ]) dnl # dnl # 2.6.26 API change, set_normalized_timespec() is exported. dnl # AC_DEFUN([SPL_AC_SET_NORMALIZED_TIMESPEC_EXPORT], [ SPL_CHECK_SYMBOL_EXPORT( [set_normalized_timespec], [kernel/time.c], [AC_DEFINE(HAVE_SET_NORMALIZED_TIMESPEC_EXPORT, 1, [set_normalized_timespec() is available as export])], []) ]) dnl # dnl # 2.6.16 API change, set_normalize_timespec() moved to time.c dnl # previously it was available in time.h as an inline. dnl # AC_DEFUN([SPL_AC_SET_NORMALIZED_TIMESPEC_INLINE], [ AC_MSG_CHECKING([whether set_normalized_timespec() is an inline]) SPL_LINUX_TRY_COMPILE([ #include void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec) { } ], [], [ AC_MSG_RESULT(no) ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_SET_NORMALIZED_TIMESPEC_INLINE, 1, [set_normalized_timespec() is available as inline]) ]) ]) dnl # dnl # 2.6.18 API change, dnl # timespec_sub() inline function available in linux/time.h dnl # AC_DEFUN([SPL_AC_TIMESPEC_SUB], [ AC_MSG_CHECKING([whether timespec_sub() is available]) SPL_LINUX_TRY_COMPILE([ #include ],[ struct timespec a, b, c = { 0 }; c = timespec_sub(a, b); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_TIMESPEC_SUB, 1, [timespec_sub() is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.19 API change, dnl # check if init_utsname() is available in linux/utsname.h dnl # AC_DEFUN([SPL_AC_INIT_UTSNAME], [ AC_MSG_CHECKING([whether init_utsname() is available]) SPL_LINUX_TRY_COMPILE([ #include ],[ struct new_utsname *a = init_utsname(); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_INIT_UTSNAME, 1, [init_utsname() is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.26 API change, dnl # definition of struct fdtable relocated to linux/fdtable.h dnl # AC_DEFUN([SPL_AC_FDTABLE_HEADER], [ SPL_CHECK_HEADER([linux/fdtable.h], [FDTABLE], [], []) ]) dnl # dnl # 2.6.14 API change, dnl # check whether 'files_fdtable()' exists dnl # AC_DEFUN([SPL_AC_FILES_FDTABLE], [ AC_MSG_CHECKING([whether files_fdtable() is available]) SPL_LINUX_TRY_COMPILE([ #include #include #ifdef HAVE_FDTABLE_HEADER #include #endif ],[ struct files_struct *files = current->files; struct fdtable *fdt = files_fdtable(files); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_FILES_FDTABLE, 1, [files_fdtable() is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.18 API change, dnl # added linux/uaccess.h dnl # AC_DEFUN([SPL_AC_UACCESS_HEADER], [ SPL_CHECK_HEADER([linux/uaccess.h], [UACCESS], [], []) ]) dnl # dnl # 2.6.12 API change, dnl # check whether 'kmalloc_node()' is available. dnl # AC_DEFUN([SPL_AC_KMALLOC_NODE], [ AC_MSG_CHECKING([whether kmalloc_node() is available]) SPL_LINUX_TRY_COMPILE([ #include ],[ void *a = kmalloc_node(1, GFP_KERNEL, 0); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_KMALLOC_NODE, 1, [kmalloc_node() is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.9 API change, dnl # check whether 'monotonic_clock()' is available it may dnl # be available for some archs but not others. dnl # AC_DEFUN([SPL_AC_MONOTONIC_CLOCK], [ SPL_CHECK_SYMBOL_EXPORT( [monotonic_clock], [], [AC_DEFINE(HAVE_MONOTONIC_CLOCK, 1, [monotonic_clock() is available])], []) ]) dnl # dnl # 2.6.16 API change, dnl # check whether 'struct inode' has i_mutex dnl # AC_DEFUN([SPL_AC_INODE_I_MUTEX], [ AC_MSG_CHECKING([whether struct inode has i_mutex]) SPL_LINUX_TRY_COMPILE([ #include #include ],[ struct inode i; mutex_init(&i.i_mutex); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_INODE_I_MUTEX, 1, [struct inode has i_mutex]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.18 API change, dnl # First introduced 'mutex_lock_nested()' in include/linux/mutex.h, dnl # as part of the mutex validator. Fallback to using 'mutex_lock()' dnl # if the mutex validator is disabled or otherwise unavailable. dnl # AC_DEFUN([SPL_AC_MUTEX_LOCK_NESTED], [ AC_MSG_CHECKING([whether mutex_lock_nested() is available]) SPL_LINUX_TRY_COMPILE([ #include ],[ struct mutex mutex; mutex_init(&mutex); mutex_lock_nested(&mutex, 0); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_MUTEX_LOCK_NESTED, 1, [mutex_lock_nested() is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.22 API change, dnl # First introduced 'div64_64()' in lib/div64.c dnl AC_DEFUN([SPL_AC_DIV64_64], [ SPL_CHECK_SYMBOL_EXPORT( [div64_64], [], [AC_DEFINE(HAVE_DIV64_64, 1, [div64_64() is available])], []) ]) dnl # dnl # 2.6.26 API change, dnl # Renamed 'div64_64()' to 'div64_u64' in lib/div64.c dnl # AC_DEFUN([SPL_AC_DIV64_U64], [ SPL_CHECK_SYMBOL_EXPORT( [div64_u64], [], [AC_DEFINE(HAVE_DIV64_U64, 1, [div64_u64() is available])], []) ]) dnl # dnl # 2.6.27 API change, dnl # on_each_cpu() uses 3 args, no 'retry' argument dnl # AC_DEFUN([SPL_AC_3ARGS_ON_EACH_CPU], [ AC_MSG_CHECKING([whether on_each_cpu() wants 3 args]) SPL_LINUX_TRY_COMPILE([ #include ],[ on_each_cpu(NULL, NULL, 0); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_3ARGS_ON_EACH_CPU, 1, [on_each_cpu wants 3 args]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.18 API change, dnl # kallsyms_lookup_name no longer exported dnl # AC_DEFUN([SPL_AC_KALLSYMS_LOOKUP_NAME], [ SPL_CHECK_SYMBOL_EXPORT( [kallsyms_lookup_name], [], [AC_DEFINE(HAVE_KALLSYMS_LOOKUP_NAME, 1, [kallsyms_lookup_name() is available])], []) ]) dnl # dnl # Proposed API change, dnl # This symbol is not available in stock kernels. You may build a dnl # custom kernel with the *-spl-export-symbols.patch which will export dnl # these symbols for use. If your already rolling a custom kernel for dnl # your environment this is recommended. dnl # AC_DEFUN([SPL_AC_GET_VMALLOC_INFO], [ SPL_CHECK_SYMBOL_EXPORT( [get_vmalloc_info], [], [AC_DEFINE(HAVE_GET_VMALLOC_INFO, 1, [get_vmalloc_info() is available])], []) ]) dnl # dnl # Proposed API change, dnl # This symbol is not available in stock kernels. You may build a dnl # custom kernel with the *-spl-export-symbols.patch which will export dnl # these symbols for use. If your already rolling a custom kernel for dnl # your environment this is recommended. dnl # AC_DEFUN([SPL_AC_FIRST_ONLINE_PGDAT], [ SPL_CHECK_SYMBOL_EXPORT( [first_online_pgdat], [], [AC_DEFINE(HAVE_FIRST_ONLINE_PGDAT, 1, [first_online_pgdat() is available])], []) ]) dnl # dnl # Proposed API change, dnl # This symbol is not available in stock kernels. You may build a dnl # custom kernel with the *-spl-export-symbols.patch which will export dnl # these symbols for use. If your already rolling a custom kernel for dnl # your environment this is recommended. dnl # AC_DEFUN([SPL_AC_NEXT_ONLINE_PGDAT], [ SPL_CHECK_SYMBOL_EXPORT( [next_online_pgdat], [], [AC_DEFINE(HAVE_NEXT_ONLINE_PGDAT, 1, [next_online_pgdat() is available])], []) ]) dnl # dnl # Proposed API change, dnl # This symbol is not available in stock kernels. You may build a dnl # custom kernel with the *-spl-export-symbols.patch which will export dnl # these symbols for use. If your already rolling a custom kernel for dnl # your environment this is recommended. dnl # AC_DEFUN([SPL_AC_NEXT_ZONE], [ SPL_CHECK_SYMBOL_EXPORT( [next_zone], [], [AC_DEFINE(HAVE_NEXT_ZONE, 1, [next_zone() is available])], []) ]) dnl # dnl # Proposed API change, dnl # This symbol is not available in stock kernels. You may build a dnl # custom kernel with the *-spl-export-symbols.patch which will export dnl # these symbols for use. If your already rolling a custom kernel for dnl # your environment this is recommended. dnl # AC_DEFUN([SPL_AC_GET_ZONE_COUNTS], [ SPL_CHECK_SYMBOL_EXPORT( [get_zone_counts], [], [AC_DEFINE(HAVE_GET_ZONE_COUNTS, 1, [get_zone_counts() is available])], []) ]) dnl # dnl # 2.6.18 API change, dnl # First introduced global_page_state() support as an inline. dnl # AC_DEFUN([SPL_AC_GLOBAL_PAGE_STATE], [ AC_MSG_CHECKING([whether global_page_state() is available]) SPL_LINUX_TRY_COMPILE([ #include ],[ unsigned long state; state = global_page_state(NR_FREE_PAGES); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_GLOBAL_PAGE_STATE, 1, [global_page_state() is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.21 API change, dnl # Public global zone stats now include free/inactive/active page dnl # counts. This replaced the priviate get_zone_counts() interface. dnl # AC_DEFUN([SPL_AC_ZONE_STAT_ITEM_FIA], [ AC_MSG_CHECKING([whether free/inactive/active page state is available]) SPL_LINUX_TRY_COMPILE([ #include ],[ enum zone_stat_item i1, i2, i3; i1 = NR_FREE_PAGES; i2 = NR_INACTIVE; i3 = NR_ACTIVE; ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_ZONE_STAT_ITEM_FIA, 1, [free/inactive/active page state is available]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # SLES API change, never adopted in mainline, dnl # Third 'struct vfsmount *' argument removed. dnl # AC_DEFUN([SPL_AC_2ARGS_VFS_UNLINK], [AC_MSG_CHECKING([whether vfs_unlink() wants 2 args]) SPL_LINUX_TRY_COMPILE([ #include ],[ vfs_unlink(NULL, NULL); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_2ARGS_VFS_UNLINK, 1, [vfs_unlink() wants 2 args]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # SLES API change, never adopted in mainline, dnl # Third and sixth 'struct vfsmount *' argument removed. dnl # AC_DEFUN([SPL_AC_4ARGS_VFS_RENAME], [AC_MSG_CHECKING([whether vfs_rename() wants 4 args]) SPL_LINUX_TRY_COMPILE([ #include ],[ vfs_rename(NULL, NULL, NULL, NULL); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_4ARGS_VFS_RENAME, 1, [vfs_rename() wants 4 args]) ],[ AC_MSG_RESULT(no) ]) ])