+# LIBCFS_WAIT_VAR_EVENT
+#
+# Kernel version 4.16-rc4 commit 6b2bb7265f0b62605e8caee3613449ed0db270b9
+# added wait_var_event()
+#
+AC_DEFUN([LIBCFS_WAIT_VAR_EVENT], [
+LB_CHECK_COMPILE([if 'wait_var_event' exist],
+wait_var_event, [
+ #ifdef HAVE_WAIT_BIT_HEADER_H
+ #include <linux/wait_bit.h>
+ #endif
+ #include <linux/wait.h>
+],[
+ wake_up_var(NULL);
+],[
+ AC_DEFINE(HAVE_WAIT_VAR_EVENT, 1,
+ ['wait_var_event' is available])
+])
+]) # LIBCFS_WAIT_VAR_EVENT
+
+#
+# LIBCFS_BITMAP_ALLOC
+#
+# Kernel version 4.17 commit c42b65e363ce97a828f81b59033c3558f8fa7f70
+# added bitmap memory allocation handling.
+#
+AC_DEFUN([LIBCFS_BITMAP_ALLOC], [
+LB_CHECK_COMPILE([if Linux bitmap memory management exist],
+bitmap_alloc, [
+ #include <linux/bitmap.h>
+],[
+ unsigned long *map = bitmap_alloc(1, GFP_KERNEL);
+],[
+ AC_DEFINE(HAVE_BITMAP_ALLOC, 1,
+ [Linux bitmap can be allocated])
+])
+]) # LIBCFS_BITMAP_ALLOC
+
+#
+# LIBCFS_CLEAR_AND_WAKE_UP_BIT
+#
+# Kernel version 4.17-rc2 commit 8236b0ae31c837d2b3a2565c5f8d77f637e824cc
+# added clear_and_wake_up_bit()
+#
+AC_DEFUN([LIBCFS_CLEAR_AND_WAKE_UP_BIT], [
+LB_CHECK_COMPILE([if 'clear_and_wake_up_bit' exist],
+clear_and_wake_up_bit, [
+ #ifdef HAVE_WAIT_BIT_HEADER_H
+ #include <linux/wait_bit.h>
+ #endif
+ #include <linux/wait.h>
+],[
+ clear_and_wake_up_bit(0, NULL);
+],[
+ AC_DEFINE(HAVE_CLEAR_AND_WAKE_UP_BIT, 1,
+ ['clear_and_wake_up_bit' is available])
+])
+]) # LIBCFS_CLEAR_AND_WAKE_UP_BIT
+
+#
+# LIBCFS_XARRAY_SUPPORT
+#
+# 4.19-rc5 kernel commit 3159f943aafdbacb2f94c38fdaadabf2bbde2a14
+# replaced the radix tree implementation with Xarrays. This change
+# introduced functionaly needed for general Xarray support
+#
+AC_DEFUN([LIBCFS_XARRAY_SUPPORT], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if page cache uses Xarray],
+xarray_support, [
+ #include <linux/xarray.h>
+],[
+ xa_is_value(NULL);
+],[
+ AC_DEFINE(HAVE_XARRAY_SUPPORT, 1,
+ [kernel Xarray implementation lacks 'xa_is_value'])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_XARRAY_SUPPORT
+
+#
+# LIBCFS_HAVE_IOV_ITER_TYPE
+#
+# kernel 4.20 commit 00e23707442a75b404392cef1405ab4fd498de6b
+# iov_iter: Use accessor functions to access an iterator's type and direction.
+#
+AC_DEFUN([LIBCFS_HAVE_IOV_ITER_TYPE], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if iov_iter_type exists],
+macro_iov_iter_type_exists, [
+ #include <linux/uio.h>
+],[
+ struct iov_iter iter = { .type = ITER_KVEC };
+ enum iter_type type = iov_iter_type(&iter);
+ (void)type;
+],[
+ AC_DEFINE(HAVE_IOV_ITER_TYPE, 1,
+ [if iov_iter_type exists])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_HAVE_IOV_ITER_TYPE
+
+#
+# LIBCFS_GET_REQUEST_KEY_AUTH
+#
+# kernel 5.0 commit 822ad64d7e46a8e2c8b8a796738d7b657cbb146d
+# keys: Fix dependency loop between construction record and auth key
+#
+# Added <keys/request_key_auth-type.h> and get_request_key_auth()
+# which was propagated to stable
+#
+AC_DEFUN([LIBCFS_GET_REQUEST_KEY_AUTH], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if get_request_key_auth() is available],
+get_request_key_auth_exported, [
+ #include <linux/key.h>
+ #include <linux/keyctl.h>
+ #include <keys/request_key_auth-type.h>
+],[
+ struct key *ring;
+ const struct key *key = NULL;
+ struct request_key_auth *rka = get_request_key_auth(key);
+
+ ring = key_get(rka->dest_keyring);
+],[
+ AC_DEFINE(HAVE_GET_REQUEST_KEY_AUTH, 1,
+ [get_request_key_auth() is available])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_GET_REQUEST_KEY_AUTH
+
+#
+# LIBCFS_LOOKUP_USER_KEY
+#
+# kernel 5.3 commit 3cf5d076fb4d48979f382bc9452765bf8b79e740
+# signal: Remove task parameter from force_sig
+#
+AC_DEFUN([LIBCFS_LOOKUP_USER_KEY], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if lookup_user_key() is available],
+lookup_user_key_exported, [
+ #include <linux/key.h>
+ #include <linux/keyctl.h>
+],[
+ lookup_user_key(KEY_SPEC_USER_KEYRING, 0, 0);
+],[
+ AC_DEFINE(HAVE_LOOKUP_USER_KEY, 1,
+ [lookup_user_key() is available])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_LOOKUP_USER_KEY
+
+#
+# LIBCFS_FORCE_SIG_WITH_TASK
+#
+# kernel 5.3 commit 3cf5d076fb4d48979f382bc9452765bf8b79e740
+# signal: Remove task parameter from force_sig
+#
+AC_DEFUN([LIBCFS_FORCE_SIG_WITH_TASK], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if force_sig has task parameter],
+force_sig_with_task, [
+ #include <linux/sched/signal.h>
+],[
+ force_sig(SIGINT, NULL);
+],[
+ AC_DEFINE(HAVE_FORCE_SIG_WITH_TASK, 1,
+ [force_sig() has task parameter])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_FORCE_SIG_WITH_TASK
+
+#
+# LIBCFS_CACHE_DETAIL_WRITERS
+#
+# kernel v5.3-rc2-1-g64a38e840ce5
+# SUNRPC: Track writers of the 'channel' file to improve cache_listeners_exist
+#
+AC_DEFUN([LIBCFS_CACHE_DETAIL_WRITERS], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if struct cache_detail has writers],
+cache_detail_writers_atomic, [
+ #include <linux/sunrpc/cache.h>
+
+ static struct cache_detail rsi_cache;
+],[
+ atomic_set(&rsi_cache.writers, 0);
+],[
+ AC_DEFINE(HAVE_CACHE_DETAIL_WRITERS, 1,
+ [struct cache_detail has writers])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_CACHE_DETAIL_WRITERS
+
+#
+# LIBCFS_HAVE_NR_UNSTABLE_NFS
+#
+# kernel v5.8-rc1~201^2~75
+# mm/writeback: discard NR_UNSTABLE_NFS, use NR_WRITEBACK instead
+#
+AC_DEFUN([LIBCFS_HAVE_NR_UNSTABLE_NFS], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if NR_UNSTABLE_NFS still in use],
+nr_unstable_nfs_exists, [
+ #include <linux/mm.h>
+
+ int i;
+],[
+ i = NR_UNSTABLE_NFS;
+],[
+ AC_DEFINE(HAVE_NR_UNSTABLE_NFS, 1,
+ [NR_UNSTABLE_NFS is still in use.])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_HAVE_NR_UNSTABLE_NFS
+
+AC_DEFUN([LIBCFS_PROG_LINUX_SRC], [] )
+AC_DEFUN([LIBCFS_PROG_LINUX_RESULTS], [])
+
+#