+# LC_HAVE_LOOP_CTL_GET_FREE
+#
+# 4.x kernel have moved userspace APIs to
+# the separate directory and all of them
+# support LOOP_CTL_GET_FREE
+#
+AC_DEFUN([LC_HAVE_LOOP_CTL_GET_FREE], [
+LB_CHECK_FILE([$LINUX/include/linux/loop.h], [
+ LB_CHECK_COMPILE([if have 'HAVE_LOOP_CTL_GET_FREE'],
+ LOOP_CTL_GET_FREE, [
+ #include <linux/loop.h>
+ ],[
+ int i;
+
+ i = LOOP_CTL_GET_FREE;
+ ],[
+ AC_DEFINE(HAVE_LOOP_CTL_GET_FREE, 1,
+ [LOOP_CTL_GET_FREE exist])
+ ])
+],[
+ AC_DEFINE(HAVE_LOOP_CTL_GET_FREE, 1,
+ [kernel has LOOP_CTL_GET_FREE])
+])
+]) # LC_HAVE_LOOP_CTL_GET_FREE
+
+#
+# LC_HAVE_CACHE_HEAD_HLIST
+#
+# 4.3 kernel swiched to hlist for cache_head
+#
+AC_DEFUN([LC_HAVE_CACHE_HEAD_HLIST], [
+LB_CHECK_COMPILE([if 'struct cache_head' has 'cache_list' field],
+cache_head_has_hlist, [
+ #include <linux/sunrpc/cache.h>
+],[
+ do {} while(sizeof(((struct cache_head *)0)->cache_list));
+],[
+ AC_DEFINE(HAVE_CACHE_HEAD_HLIST, 1,
+ [cache_head has hlist cache_list])
+])
+]) # LC_HAVE_CACHE_HEAD_HLIST
+
+#
+# LC_HAVE_LOCKS_LOCK_FILE_WAIT
+#
+# 4.4 kernel have moved locks API users to
+# locks_lock_inode_wait()
+#
+AC_DEFUN([LC_HAVE_LOCKS_LOCK_FILE_WAIT], [
+LB_CHECK_COMPILE([if 'locks_lock_file_wait' exists],
+locks_lock_file_wait, [
+ #include <linux/fs.h>
+],[
+ locks_lock_file_wait(NULL, NULL);
+],[
+ AC_DEFINE(HAVE_LOCKS_LOCK_FILE_WAIT, 1,
+ [kernel has locks_lock_file_wait])
+])
+]) # LC_HAVE_LOCKS_LOCK_FILE_WAIT
+
+#
+# LC_HAVE_QC_MAKE_REQUEST_FN
+#
+# 4.4 request_queue.make_request_fn defined as function returns with blk_qc_t
+# see kernel commit dece16353ef47d8d33f5302bc158072a9d65e26f
+#
+AC_DEFUN([LC_HAVE_QC_MAKE_REQUEST_FN], [
+LB_CHECK_COMPILE([if 'request_queue.make_request_fn' returns blk_qc_t],
+make_request_fn_blk_qc_t, [
+ #include <linux/blkdev.h>
+],[
+ blk_qc_t ret;
+ make_request_fn *mrf;
+ ret = mrf(NULL, NULL);
+],[
+ AC_DEFINE(HAVE_QC_MAKE_REQUEST_FN, 1,
+ [request_queue.make_request_fn returns blk_qc_t])
+])
+]) # LC_HAVE_QC_MAKE_REQUEST_FN
+
+#
+# LC_HAVE_KEY_PAYLOAD_DATA_ARRAY
+#
+# 4.4 kernel merged type-specific data with the payload data for keys
+#
+AC_DEFUN([LC_HAVE_KEY_PAYLOAD_DATA_ARRAY], [
+LB_CHECK_COMPILE([if 'struct key' has 'payload.data' as an array],
+key_payload_data_array, [
+ #include <linux/key.h>
+],[
+ ((struct key *)0)->payload.data[0] = NULL;
+],[
+ AC_DEFINE(HAVE_KEY_PAYLOAD_DATA_ARRAY, 1, [payload.data is an array])
+])
+]) #LC_HAVE_KEY_PAYLOAD_DATA_ARRAY
+
+#
+# LC_HAVE_FILE_DENTRY
+#
+# 4.5 adds wrapper file_dentry
+#
+AC_DEFUN([LC_HAVE_FILE_DENTRY], [
+LB_CHECK_COMPILE([if Linux kernel has 'file_dentry'],
+file_dentry, [
+ #include <linux/fs.h>
+],[
+ file_dentry(NULL);
+], [
+ AC_DEFINE(HAVE_FILE_DENTRY, 1,
+ [kernel has file_dentry])
+])
+]) # LC_HAVE_FILE_DENTRY
+
+#
+# LC_HAVE_INODE_LOCK
+#
+# 4.5 introduced inode_lock
+#
+AC_DEFUN([LC_HAVE_INODE_LOCK], [
+LB_CHECK_COMPILE([if 'inode_lock' is defined],
+inode_lock, [
+ #include <linux/fs.h>
+],[
+ inode_lock(NULL);
+], [
+ AC_DEFINE(HAVE_INODE_LOCK, 1,
+ [inode_lock is defined])
+])
+]) # LC_HAVE_INODE_LOCK
+
+#
+# LC_HAVE_IOP_GET_LINK
+#
+# 4.5 vfs replaced iop->follow_link with
+# iop->get_link
+#
+AC_DEFUN([LC_HAVE_IOP_GET_LINK], [
+LB_CHECK_COMPILE([if 'iop' has 'get_link'],
+inode_ops_get_link, [
+ #include <linux/fs.h>
+],[
+ struct inode_operations iop;
+ iop.get_link = NULL;
+],[
+ AC_DEFINE(HAVE_IOP_GET_LINK, 1,
+ [have iop get_link])
+])
+]) # LC_HAVE_IOP_GET_LINK
+
+#
+# LC_HAVE_IN_COMPAT_SYSCALL
+#
+# 4.6 renamed is_compat_task to in_compat_syscall
+#
+AC_DEFUN([LC_HAVE_IN_COMPAT_SYSCALL], [
+LB_CHECK_COMPILE([if 'in_compat_syscall' is defined],
+in_compat_syscall, [
+ #include <linux/compat.h>
+],[
+ in_compat_syscall();
+],[
+ AC_DEFINE(HAVE_IN_COMPAT_SYSCALL, 1,
+ [have in_compat_syscall])
+])
+]) # LC_HAVE_IN_COMPAT_SYSCALL
+
+#