+# Kernel version 4.6 removed both struct task_struct and struct mm_struct
+# arguments to get_user_pages
+#
+AC_DEFUN([LIBCFS_GET_USER_PAGES_6ARG], [
+LB_CHECK_COMPILE([if 'get_user_pages()' takes 6 arguments],
+get_user_pages_6arg, [
+ #include <linux/mm.h>
+],[
+ int rc;
+
+ rc = get_user_pages(0, 0, 0, 0, NULL, NULL);
+],[
+ AC_DEFINE(HAVE_GET_USER_PAGES_6ARG, 1,
+ [get_user_pages takes 6 arguments])
+])
+]) # LIBCFS_GET_USER_PAGES_6ARG
+
+#
+# LIBCFS_STRINGHASH
+#
+# 4.6 kernel created stringhash.h which moved stuff out of dcache.h
+# commit f4bcbe792b8f434e32487cff9d9e30ab45a3ce02
+#
+AC_DEFUN([LIBCFS_STRINGHASH], [
+LB_CHECK_LINUX_HEADER([linux/stringhash.h], [
+ AC_DEFINE(HAVE_STRINGHASH, 1,
+ [stringhash.h is present])])
+]) # LIBCFS_STRINGHASH
+
+#
+# LIBCFS_RHASHTABLE_INSERT_FAST
+#
+# 4.7+ kernel commit 5ca8cc5bf11faed257c762018aea9106d529232f
+# changed __rhashtable_insert_fast to support the new function
+# rhashtable_lookup_get_insert_key().
+#
+AC_DEFUN([LIBCFS_RHASHTABLE_INSERT_FAST], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if internal '__rhashtable_insert_fast()' returns int],
+rhashtable_insert_fast, [
+ #include <linux/rhashtable.h>
+],[
+ const struct rhashtable_params params = { 0 };
+ int rc;
+
+ rc = __rhashtable_insert_fast(NULL, NULL, NULL, params);
+],[
+ AC_DEFINE(HAVE_HASHTABLE_INSERT_FAST_RETURN_INT, 1,
+ ['__rhashtable_insert_fast()' returns int])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_RHASHTABLE_INSERT_FAST
+
+#
+# Kernel version 4.8-rc6 commit ca26893f05e86497a86732768ec53cd38c0819ca
+# introduced rhashtable_lookup
+#
+AC_DEFUN([LIBCFS_RHASHTABLE_LOOKUP], [
+LB_CHECK_COMPILE([if 'rhashtable_lookup' exist],
+rhashtable_lookup, [
+ #include <linux/rhashtable.h>
+],[
+ const struct rhashtable_params params = { 0 };
+ void *ret;
+
+ ret = rhashtable_lookup(NULL, NULL, params);
+],[
+ AC_DEFINE(HAVE_RHASHTABLE_LOOKUP, 1,
+ [rhashtable_lookup() is available])
+])
+]) # LIBCFS_RHASHTABLE_LOOKUP
+
+#
+# LIBCFS_RHLTABLE
+# Kernel version 4.8-rc6 commit ca26893f05e86497a86732768ec53cd38c0819ca
+# created the rhlist interface to allow inserting duplicate objects
+# into the same table.
+#
+AC_DEFUN([LIBCFS_RHLTABLE], [
+LB_CHECK_COMPILE([does 'struct rhltable' exist],
+rhtable, [
+ #include <linux/rhashtable.h>
+],[
+ struct rhltable *hlt;
+
+ rhltable_destroy(hlt);
+],[
+ AC_DEFINE(HAVE_RHLTABLE, 1,
+ [struct rhltable exist])
+])
+]) # LIBCFS_RHLTABLE
+
+#
+# LIBCFS_STACKTRACE_OPS
+#
+# Kernel version 4.8 commit c8fe4609827aedc9c4b45de80e7cdc8ccfa8541b
+# removed both struct stacktrace_ops and dump_trace() function
+#
+AC_DEFUN([LIBCFS_STACKTRACE_OPS], [
+LB_CHECK_COMPILE([if 'struct stacktrace_ops' exists],
+stacktrace_ops, [
+ struct task_struct;
+ struct pt_regs;
+ #include <asm/stacktrace.h>
+],[
+ struct stacktrace_ops ops;
+ ops.stack = NULL;
+],[
+ AC_DEFINE(HAVE_STACKTRACE_OPS, 1,
+ [struct stacktrace_ops exists])
+])
+]) # LIBCFS_STACKTRACE_OPS
+
+#
+# Kernel version 4.9 commit 768ae309a96103ed02eb1e111e838c87854d8b51
+# mm: replace get_user_pages() write/force parameters with gup_flags
+#
+AC_DEFUN([LIBCFS_GET_USER_PAGES_GUP_FLAGS], [
+LB_CHECK_COMPILE([if 'get_user_pages()' takes gup_flags in arguments],
+get_user_pages_gup_flags, [
+ #include <linux/mm.h>
+],[
+ int rc;
+ rc = get_user_pages(0, 0, FOLL_WRITE, NULL, NULL);
+],[
+ AC_DEFINE(HAVE_GET_USER_PAGES_GUP_FLAGS, 1,
+ [get_user_pages takes gup_flags in arguments])
+])
+]) # LIBCFS_GET_USER_PAGES_GUP_FLAGS
+
+#
+# Kernel version 4.10 commit 7b737965b33188bd3dbb44e938535c4006d97fbb
+# libcfs: Convert to hotplug state machine
+#
+AC_DEFUN([LIBCFS_HOTPLUG_STATE_MACHINE], [
+LB_CHECK_COMPILE([if libcfs supports CPU hotplug state machine],
+cpu_hotplug_state_machine, [
+ #include <linux/cpuhotplug.h>
+],[
+ cpuhp_remove_state(CPUHP_LUSTRE_CFS_DEAD);
+],[
+ AC_DEFINE(HAVE_HOTPLUG_STATE_MACHINE, 1,
+ [hotplug state machine is supported])
+])
+]) # LIBCFS_HOTPLUG_STATE_MACHINE
+
+#
+# LIBCFS_SCHED_HEADERS
+#
+# 4.11 has broken up sched.h into more headers.
+#
+AC_DEFUN([LIBCFS_SCHED_HEADERS], [
+LB_CHECK_LINUX_HEADER([linux/sched/signal.h], [
+ AC_DEFINE(HAVE_SCHED_HEADERS, 1,
+ [linux/sched header directory exist])])
+]) # LIBCFS_SCHED_HEADERS
+
+#
+# Kernel version 4.11 commit f9fe1c12d126f9887441fa5bb165046f30ddd4b5
+# introduced rhashtable_lookup_get_insert_fast
+#
+AC_DEFUN([LIBCFS_RHASHTABLE_LOOKUP_GET_INSERT_FAST], [
+LB_CHECK_COMPILE([if 'rhashtable_lookup_get_insert_fast' exist],
+rhashtable_lookup_get_insert_fast, [
+ #include <linux/rhashtable.h>
+],[
+ const struct rhashtable_params params = { 0 };
+ void *ret;
+
+ ret = rhashtable_lookup_get_insert_fast(NULL, NULL, params);
+],[
+ AC_DEFINE(HAVE_RHASHTABLE_LOOKUP_GET_INSERT_FAST, 1,
+ [rhashtable_lookup_get_insert_fast() is available])
+])
+]) # LIBCFS_RHASHTABLE_LOOKUP_GET_INSERT_FAST
+
+#
+# Kernel version 4.12-rc3 f9727a17db9bab71ddae91f74f11a8a2f9a0ece6
+# renamed uuid_be to uuid_t
+#
+AC_DEFUN([LIBCFS_UUID_T], [
+LB_CHECK_COMPILE([if 'uuid_t' exist],
+uuid_t, [
+ #include <linux/uuid.h>
+],[
+ uuid_t uuid;
+
+ memset(uuid.b, 0, 16);
+],[
+ AC_DEFINE(HAVE_UUID_T, 1, ['uuid_t' exist])
+])
+]) # LIBCFS_UUID_T
+
+#
+# LIBCFS_WAIT_QUEUE_ENTRY
+#
+# Kernel version 4.13 ac6424b981bce1c4bc55675c6ce11bfe1bbfa64f
+# Rename wait_queue_t => wait_queue_entry_t
+#
+AC_DEFUN([LIBCFS_WAIT_QUEUE_ENTRY], [
+LB_CHECK_COMPILE([if 'wait_queue_entry_t' exists],
+wait_queue_entry, [
+ #include <linux/wait.h>
+],[
+ wait_queue_entry_t e;
+
+ e.flags = 0;
+],[
+ AC_DEFINE(HAVE_WAIT_QUEUE_ENTRY, 1,
+ ['wait_queue_entry_t' is available])
+])
+]) # LIBCFS_WAIT_QUEUE_ENTRY
+
+#
+# LIBCFS_NEW_KERNEL_WRITE
+#
+# Kernel version 4.14 e13ec939e96b13e664bb6cee361cc976a0ee621a
+# changed kernel_write prototype to make is plug compatible
+# with the unexported vfs_write()
+#
+AC_DEFUN([LIBCFS_NEW_KERNEL_WRITE], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if 'kernel_write' matches other read/write helpers],
+kernel_write_match, [
+ #include <linux/fs.h>
+],[
+ const void *buf = NULL;
+ loff_t pos = 0;
+ return kernel_write(NULL, buf, 0, &pos);
+],[
+ AC_DEFINE(HAVE_NEW_KERNEL_WRITE, 1,
+ ['kernel_write' aligns with read/write helpers])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LIBCFS_NEW_KERNEL_WRITE
+
+#
+# LIBCFS_DEFINE_TIMER
+#
+# Kernel version 4.14 commit 1d27e3e2252ba9d949ca82fbdb73cde102cb2067
+# remove expires and data arguments from DEFINE_TIMER. Also the callback
+# when from using unsigned long argument to using struct timer_list pointer.
+#
+AC_DEFUN([LIBCFS_DEFINE_TIMER], [
+LB_CHECK_COMPILE([if DEFINE_TIMER takes only 2 arguments],
+define_timer, [
+ #include <linux/timer.h>
+],[
+ static DEFINE_TIMER(my_timer, NULL);
+],[
+ AC_DEFINE(HAVE_NEW_DEFINE_TIMER, 1,
+ [DEFINE_TIMER uses only 2 arguements])
+])
+]) # LIBCFS_DEFINE_TIMER
+
+#
+# LIBCFS_TIMER_SETUP
+#
+# Kernel version 4.15 commit e99e88a9d2b067465adaa9c111ada99a041bef9a
+# setup_timer() was replaced by timer_setup(), where the callback
+# argument is the structure already holding the struct timer_list.
+#
+AC_DEFUN([LIBCFS_TIMER_SETUP], [
+LB_CHECK_COMPILE([if setup_timer has been replaced with timer_setup],
+timer_setup, [
+ #include <linux/timer.h>
+],[
+ timer_setup(NULL, NULL, 0);
+],[
+ AC_DEFINE(HAVE_TIMER_SETUP, 1,
+ [timer_setup has replaced setup_timer])
+])
+]) # LIBCFS_TIMER_SETUP
+
+#