Viewing: lustre-libcfs.m4

# SPDX-License-Identifier: GPL-2.0

#
# This file is part of Lustre, http://www.lustre.org/
#

#
# LIBCFS_CONFIG_CDEBUG
#
# whether to enable various libcfs debugs (CDEBUG, ENTRY/EXIT, LASSERT, etc.)
#
AC_DEFUN([LIBCFS_CONFIG_CDEBUG], [
AC_MSG_CHECKING([whether to enable CDEBUG, CWARN])
AC_ARG_ENABLE([libcfs_cdebug],
	AS_HELP_STRING([--disable-libcfs-cdebug],
		[disable libcfs CDEBUG, CWARN]),
	[], [enable_libcfs_cdebug="yes"])
AC_MSG_RESULT([$enable_libcfs_cdebug])
AS_IF([test "x$enable_libcfs_cdebug" = xyes], [
	AC_DEFINE(CDEBUG_ENABLED, 1, [enable libcfs CDEBUG, CWARN])
	AC_SUBST(ENABLE_LIBCFS_CDEBUG, yes)
], [
	AC_SUBST(ENABLE_LIBCFS_CDEBUG, no)
])

AC_MSG_CHECKING([whether to enable ENTRY/EXIT])
AC_ARG_ENABLE([libcfs_trace],
	AS_HELP_STRING([--disable-libcfs-trace],
		[disable libcfs ENTRY/EXIT]),
	[], [enable_libcfs_trace="yes"])
AC_MSG_RESULT([$enable_libcfs_trace])
AS_IF([test "x$enable_libcfs_trace" = xyes], [
	AC_DEFINE(CDEBUG_ENTRY_EXIT, 1, [enable libcfs ENTRY/EXIT])
	AC_SUBST(ENABLE_LIBCFS_TRACE, yes)
], [
	AC_SUBST(ENABLE_LIBCFS_TRACE, no)
])

AC_MSG_CHECKING([whether to enable LASSERT, LASSERTF])
AC_ARG_ENABLE([libcfs_assert],
	AS_HELP_STRING([--disable-libcfs-assert],
		[disable libcfs LASSERT, LASSERTF]),
	[], [enable_libcfs_assert="yes"])
AC_MSG_RESULT([$enable_libcfs_assert])
AS_IF([test x$enable_libcfs_assert = xyes], [
	AC_DEFINE(LIBCFS_DEBUG, 1, [enable libcfs LASSERT, LASSERTF])
	AC_SUBST(ENABLE_LIBCFS_ASSERT, yes)
], [
	AC_SUBST(ENABLE_LIBCFS_ASSERT, no)
])
]) # LIBCFS_CONFIG_CDEBUG

#
# LIBCFS_CONFIG_PANIC_DUMPLOG
#
# check if tunable panic_dumplog is wanted
#
AC_DEFUN([LIBCFS_CONFIG_PANIC_DUMPLOG], [
AC_MSG_CHECKING([whether to use tunable 'panic_dumplog' support])
AC_ARG_ENABLE([panic_dumplog],
	AS_HELP_STRING([--enable-panic_dumplog],
		[enable panic_dumplog]),
	[], [enable_panic_dumplog="no"])
AC_MSG_RESULT([$enable_panic_dumplog])
AS_IF([test "x$enable_panic_dumplog" = xyes], [
	AC_DEFINE(LNET_DUMP_ON_PANIC, 1, [use dumplog on panic])
	AC_SUBST(ENABLE_PANIC_DUMPLOG, yes)
], [
	AC_SUBST(ENABLE_PANIC_DUMPLOG, no)
])
]) # LIBCFS_CONFIG_PANIC_DUMPLOG

#
# LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS
#
# Linux commit v5.1-rc3-29-gaa30f47cf666
#    kobject: Add support for default attribute groups to kobj_type
# Linux commit v5.18-rc1-2-gcdb4f26a63c3
#    kobject: kobj_type: remove default_attrs
#
AC_DEFUN([LIBCFS_SRC_KOBJ_TYPE_DEFAULT_GROUPS],[
	LB2_LINUX_TEST_SRC([kobj_type_default_groups], [
		#include <linux/kobject.h>
	],[
		struct kobj_type *kobj_type = NULL;
		void *has = kobj_type->default_groups;
		(void) has;
	])
])
AC_DEFUN([LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS],[
	LB2_MSG_LINUX_TEST_RESULT([if struct kobj_type have 'default_groups' member],
	[kobj_type_default_groups], [
		AC_DEFINE(HAVE_KOBJ_TYPE_DEFAULT_GROUPS, 1,
			[struct kobj_type has 'default_groups' member])
	])
]) # LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS

#
# LIBCFS_LOOKUP_USER_KEY
#
# kernel 5.3 commit 3cf5d076fb4d48979f382bc9452765bf8b79e740
# signal: Remove task parameter from force_sig
#
AC_DEFUN([LIBCFS_SRC_LOOKUP_USER_KEY], [
	LB2_LINUX_TEST_SRC([lookup_user_key_exported], [
		#include <linux/key.h>
		#include <linux/keyctl.h>
	],[
		lookup_user_key(KEY_SPEC_USER_KEYRING, 0, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_LOOKUP_USER_KEY], [
	LB2_MSG_LINUX_TEST_RESULT([if lookup_user_key() is available],
	[lookup_user_key_exported], [
		AC_DEFINE(HAVE_LOOKUP_USER_KEY, 1,
			[lookup_user_key() is available])
	])
]) # LIBCFS_LOOKUP_USER_KEY

#
# 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_SRC_CACHE_DETAIL_WRITERS], [
	LB2_LINUX_TEST_SRC([cache_detail_writers_atomic], [
		#include <linux/sunrpc/cache.h>

		static struct cache_detail rsi_cache;
	],[
		atomic_set(&rsi_cache.writers, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_CACHE_DETAIL_WRITERS], [
	LB2_MSG_LINUX_TEST_RESULT([if struct cache_detail has writers],
	[cache_detail_writers_atomic], [
		AC_DEFINE(HAVE_CACHE_DETAIL_WRITERS, 1,
			[struct cache_detail has writers])
	])
]) # LIBCFS_CACHE_DETAIL_WRITERS

#
# LIBCFS_GENL_DUMPIT_INFO_FAMILY
#
# kernel v5.4-rc1 commit bf813b0afeae2f012f0e527a526c1b78ca21ad82
# expanded struct genl_dumpit_info to include struct genl_family.
#
# kernel v6.5-rc5 commit 5c670a010de46 moved genl_family from
# struct genl_dumpit_info to struct genl_info.
#
# Note RHEL8 while earlier than 5.4 does have family info in
# struct genl_dumpit_info
#
AC_DEFUN([LIBCFS_SRC_GENL_DUMPIT_INFO_FAMILY], [
	LB2_LINUX_TEST_SRC([genl_dumpit_info_family], [
		#include <net/genetlink.h>
	],[
		static struct genl_dumpit_info info;

		info.family = NULL;
	],[-Werror])
])
AC_DEFUN([LIBCFS_GENL_DUMPIT_INFO_FAMILY], [
	LB2_MSG_LINUX_TEST_RESULT([if struct genl_dumpit_info has family field],
	[genl_dumpit_info_family], [
		AC_DEFINE(HAVE_GENL_DUMPIT_INFO_FAMILY, 1,
			[struct genl_dumpit_info has family field])
	])
]) # LIBCFS_GENL_DUMPIT_INFO_FAMILY

#
# LIBCFS_KALLSYMS_LOOKUP
#
# kernel v5.6-11591-g0bd476e6c671
# kallsyms: unexport kallsyms_lookup_name() and kallsyms_on_each_symbol()
AC_DEFUN([LIBCFS_KALLSYMS_LOOKUP], [
LB_CHECK_EXPORT([kallsyms_lookup_name], [kernel/kallsyms.c],
	[AC_DEFINE(HAVE_KALLSYMS_LOOKUP_NAME, 1,
		[kallsyms_lookup_name is exported by kernel])])
]) # LIBCFS_KALLSYMS_LOOKUP

#
# v5.5-8862-gd56c0d45f0e2
# proc: decouple proc from VFS with "struct proc_ops"
#
AC_DEFUN([LIBCFS_SRC_HAVE_PROC_OPS], [
	LB2_LINUX_TEST_SRC([proc_ops], [
		#include <linux/proc_fs.h>

		static struct proc_ops *my_proc;
	],[
		my_proc->proc_lseek = NULL;
	],[-Werror])
]) # LIBCFS_SRC_HAVE_PROC_OPS
AC_DEFUN([LIBCFS_HAVE_PROC_OPS], [
	LB2_MSG_LINUX_TEST_RESULT([if struct proc_ops exists],
	[proc_ops], [
		AC_DEFINE(HAVE_PROC_OPS, 1,
			[struct proc_ops exists])
	])
]) # LIBCFS_HAVE_PROC_OPS

#
# LIBCFS_TCP_SOCK_SET_QUICKACK
# kernel v5.7-rc6-2504-gddd061b8daed
#   tcp: add tcp_sock_set_quickack
#
AC_DEFUN([LIBCFS_SRC_TCP_SOCK_SET_QUICKACK], [
	LB2_LINUX_TEST_SRC([tcp_sock_set_quickack_exists], [
		#include <linux/tcp.h>
	],[
		tcp_sock_set_quickack(NULL, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_TCP_SOCK_SET_QUICKACK], [
	LB2_MSG_LINUX_TEST_RESULT([if 'tcp_sock_set_quickack()' exists],
	[tcp_sock_set_quickack_exists], [
		AC_DEFINE(HAVE_TCP_SOCK_SET_QUICKACK, 1,
			['tcp_sock_set_quickack()' exists])
	])
]) # LIBCFS_TCP_SOCK_SET_QUICKACK

#
# LIBCFS_TCP_SOCK_SET_KEEPINTVL
# v5.7-rc6-2508-gd41ecaac903c
# tcp: add tcp_sock_set_keepintvl
#
AC_DEFUN([LIBCFS_SRC_TCP_SOCK_SET_KEEPINTVL], [
	LB2_LINUX_TEST_SRC([tcp_sock_set_keepintvl_exists], [
		#include <linux/tcp.h>
	],[
		tcp_sock_set_keepintvl(NULL, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_TCP_SOCK_SET_KEEPINTVL], [
	LB2_MSG_LINUX_TEST_RESULT([if 'tcp_sock_set_keepintvl()' exists],
	[tcp_sock_set_keepintvl_exists], [
		AC_DEFINE(HAVE_TCP_SOCK_SET_KEEPINTVL, 1,
			['tcp_sock_set_keepintvl()' exists])
	])
]) # LIBCFS_TCP_SOCK_SET_KEEPINTVL

#
# LIBCFS_TCP_SOCK_SET_KEEPCNT
# v5.7-rc6-2509-g480aeb9639d6
# tcp: add tcp_sock_set_keepcnt
#
AC_DEFUN([LIBCFS_SRC_TCP_SOCK_SET_KEEPCNT], [
	LB2_LINUX_TEST_SRC([tcp_sock_set_keepcnt_exists], [
		#include <linux/tcp.h>
	],[
		tcp_sock_set_keepcnt(NULL, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_TCP_SOCK_SET_KEEPCNT], [
	LB2_MSG_LINUX_TEST_RESULT([if 'tcp_sock_set_keepcnt()' exists],
	[tcp_sock_set_keepcnt_exists], [
		AC_DEFINE(HAVE_TCP_SOCK_SET_KEEPCNT, 1,
			['tcp_sock_set_keepcnt()' exists])
	])
]) # LIBCFS_TCP_SOCK_SET_KEEPCNT

#
# LIBCFS_IP6_SET_PREF
#
# kernel v5.8-rc1~165^2~71^2~3 commit 18d5ad62327576cbb1e5b9938a59d63ac0c15832
# ipv6: add ip6_sock_set_addr_preferences
#
AC_DEFUN([LIBCFS_SRC_IP6_SET_PREF], [
	LB2_LINUX_TEST_SRC([ip6_set_pref_test], [
		#include <net/ipv6.h>
	],[
		ip6_sock_set_addr_preferences(NULL, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_IP6_SET_PREF], [
	LB2_MSG_LINUX_TEST_RESULT([if ip6_sock_set_addr_preferences() exists],
	[ip6_set_pref_test], [
		AC_DEFINE(HAVE_IP6_SET_PREF, 1,
			[if ip6_sock_set_addr_preferences exists])
	])
]) # LIBCFS_IP6_SET_PREF

#
# LIBCFS_IP_SET_TOS
#
# kernel v5.8-rc1~165^2~71^2~3 commit 6ebf71bab9fb476fc8132be4c12b88201278f0ca
# ipv4: add ip_sock_set_tos
#
AC_DEFUN([LIBCFS_SRC_IP_SET_TOS], [
	LB2_LINUX_TEST_SRC([ip_set_tos_test], [
		#include <net/ip.h>
	],[
		ip_sock_set_tos(NULL, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_IP_SET_TOS], [
	LB2_MSG_LINUX_TEST_RESULT([if ip_sock_set_tos() exists],
	[ip_set_tos_test], [
		AC_DEFINE(HAVE_IP_SET_TOS, 1,
			[if ip_sock_set_tos exists])
	])
]) # LIBCFS_IP_SET_TOS

#
# LIBCFS_VMALLOC_2ARGS
#
# kernel v5.8-rc1~201^2~19
# mm: remove the pgprot argument to __vmalloc
AC_DEFUN([LIBCFS_SRC_VMALLOC_2ARGS], [
	LB2_LINUX_TEST_SRC([vmalloc_2args], [
		#include <linux/vmalloc.h>
	],[
		__vmalloc(0, 0);
	],[])
])
AC_DEFUN([LIBCFS_VMALLOC_2ARGS], [
	LB2_MSG_LINUX_TEST_RESULT([if __vmalloc has 2 args],
	[vmalloc_2args], [
		AC_DEFINE(HAVE_VMALLOC_2ARGS, 1,
			[__vmalloc only takes 2 args.])
	])
]) # LIBCFS_VMALLOC_2ARGS

#
# 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_SRC_HAVE_NR_UNSTABLE_NFS], [
	LB2_LINUX_TEST_SRC([nr_unstable_nfs_exists], [
		#include <linux/mm.h>

		int i;
	],[
		i = NR_UNSTABLE_NFS;
	],[-Werror])
])
AC_DEFUN([LIBCFS_HAVE_NR_UNSTABLE_NFS], [
	LB2_MSG_LINUX_TEST_RESULT([if NR_UNSTABLE_NFS still in use],
	[nr_unstable_nfs_exists], [
		AC_DEFINE(HAVE_NR_UNSTABLE_NFS, 1,
			[NR_UNSTABLE_NFS is still in use.])
	])
]) # LIBCFS_HAVE_NR_UNSTABLE_NFS

#
# LIBCFS_NR_UNSTABLE_NFS_DEPRECATED
#
# SLES15 still defines NR_UNSTABLE_NFS, but DEPRECATED it
#
AC_DEFUN([LIBCFS_NR_UNSTABLE_NFS_DEPRECATED], [
	AC_MSG_CHECKING([if NR_UNSTABLE_NFS is defined but DEPRECATED])
	AS_IF([grep -q -E "NFS unstable pages - DEPRECATED DO NOT USE" "$LINUX/include/linux/mmzone.h" 2>/dev/null], [
		AC_DEFINE([HAVE_NR_UNSTABLE_NFS_DEPRECATED], 1,
			  [NR_UNSTABLE_NFS is defined but deprecated])
		AC_MSG_RESULT(yes)
	],[
		AC_MSG_RESULT(no)
	])
]) # LIBCFS_NR_UNSTABLE_NFS_DEPRECATED

#
# LIBCFS_HAVE_MMAP_LOCK
#
# kernel v5.8-rc1~83^2~24
# mmap locking API: rename mmap_sem to mmap_lock
#
AC_DEFUN([LIBCFS_SRC_HAVE_MMAP_LOCK], [
	LB2_LINUX_TEST_SRC([mmap_write_lock], [
		#include <linux/mm.h>
	],[
		mmap_write_lock(NULL);
	],[])
])
AC_DEFUN([LIBCFS_HAVE_MMAP_LOCK], [
	LB2_MSG_LINUX_TEST_RESULT([if mmap_lock API is available],
	[mmap_write_lock], [
		AC_DEFINE(HAVE_MMAP_LOCK, 1,
			[mmap_lock API is available.])
	])
]) # LIBCFS_HAVE_MMAP_LOCK

#
# LIBCFS_KERNEL_SETSOCKOPT
#
# kernel v5.8-rc1~165^2~59^2
# net: remove kernel_setsockopt
AC_DEFUN([LIBCFS_SRC_KERNEL_SETSOCKOPT], [
	LB2_LINUX_TEST_SRC([kernel_setsockopt_exists], [
		#include <linux/net.h>
	],[
		kernel_setsockopt(NULL, 0, 0, NULL, 0);
	],[-Werror])
])
AC_DEFUN([LIBCFS_KERNEL_SETSOCKOPT], [
	LB2_MSG_LINUX_TEST_RESULT([if kernel_setsockopt still in use],
	[kernel_setsockopt_exists], [
	AC_DEFINE(HAVE_KERNEL_SETSOCKOPT, 1,
		[kernel_setsockopt still in use])
	])
]) # LIBCFS_KERNEL_SETSOCKOPT

#
# LIBCFS_USER_UID_KEYRING
#
# kernel 5.2 commit 0f44e4d976f9 removed uid_keyring
# from the user_struct struct
#
AC_DEFUN([LIBCFS_SRC_USER_UID_KEYRING], [
	LB2_LINUX_TEST_SRC([user_uid_keyring_exists], [
		#include <linux/sched/user.h>
	],[
		((struct user_struct *)0)->uid_keyring = NULL;
	],[-Werror])
])
AC_DEFUN([LIBCFS_USER_UID_KEYRING], [
	AC_MSG_CHECKING([if uid_keyring exists])
	LB2_LINUX_TEST_RESULT([user_uid_keyring_exists], [
		AC_DEFINE(HAVE_USER_UID_KEYRING, 1,
			[uid_keyring exists])
	])
]) # LIBCFS_USER_UID_KEYRING

#
# LIBCFS_KEY_NEED_UNLINK
#
# kernel 5.8 commit 8c0637e950d68933a67f7438f779d79b049b5e5c
# keys: Make the KEY_NEED_* perms an enum rather than a mask
#
AC_DEFUN([LIBCFS_SRC_KEY_NEED_UNLINK], [
	LB2_LINUX_TEST_SRC([key_need_unlink_exists], [
		#include <linux/key.h>
		#include <linux/keyctl.h>
	],[
		lookup_user_key(0, 0, KEY_NEED_UNLINK);
	],[-Werror])
])
AC_DEFUN([LIBCFS_KEY_NEED_UNLINK], [
	LB2_MSG_LINUX_TEST_RESULT([if KEY_NEED_UNLINK exists],
	[key_need_unlink_exists], [
		AC_DEFINE(HAVE_KEY_NEED_UNLINK, 1,
			[KEY_NEED_UNLINK exists])
	])
]) # LIBCFS_KEY_NEED_UNLINK

#
# LIBCFS_SEC_RELEASE_SECCTX
#
# kernel linux-hwe-5.8 (5.8.0-22.23~20.04.1)
# LSM: Use lsmcontext in security_release_secctx
AC_DEFUN([LIBCFS_SRC_SEC_RELEASE_SECCTX], [
	LB2_LINUX_TEST_SRC([security_release_secctx_1arg], [
		#include <linux/security.h>
	],[
		security_release_secctx(NULL);
	],[])
])
AC_DEFUN([LIBCFS_SEC_RELEASE_SECCTX], [
	LB2_MSG_LINUX_TEST_RESULT([if security_release_secctx has 1 arg],
	[security_release_secctx_1arg], [
		AC_DEFINE(HAVE_SEC_RELEASE_SECCTX_1ARG, 1,
			[security_release_secctx has 1 arg.])
	])
]) # LIBCFS_SEC_RELEASE_SECCTX

#
# LIBCFS_HAVE_KMAP_LOCAL
#
# Linux commit v5.10-rc2-80-gf3ba3c710ac5
#   mm/highmem: Provide kmap_local*
#
AC_DEFUN([LIBCFS_SRC_HAVE_KMAP_LOCAL], [
	LB2_LINUX_TEST_SRC([kmap_local_page], [
		#include <linux/highmem.h>
	],[
		struct page *pg = NULL;
		void *kaddr = kmap_local_page(pg);

		kunmap_local(kaddr);
	],[-Werror])
])
AC_DEFUN([LIBCFS_HAVE_KMAP_LOCAL], [
	LB2_MSG_LINUX_TEST_RESULT([if 'kmap_local*' are available],
	[kmap_local_page], [
		AC_DEFINE(HAVE_KMAP_LOCAL, 1,
			[kmap_local_* functions are available])
	],[
		## Map kmap_local_page to kmap_atomic for older kernels
		AC_DEFINE([kmap_local_page(p)], [kmap_atomic(p)],
			  [need kmap_local_page map to atomic])
		AC_DEFINE([kunmap_local(kaddr)], [kunmap_atomic((kaddr))],
			  [need kunmap_local map to atomic])
	])
]) # LIBCFS_HAVE_KMAP_LOCAL

#
# LIBCFS_HAVE_KFREE_SENSITIVE
#
# kernel v5.10-rc1~3
# mm: remove kzfree() compatibility definition
#
AC_DEFUN([LIBCFS_SRC_HAVE_KFREE_SENSITIVE], [
	LB2_LINUX_TEST_SRC([kfree_sensitive_exists], [
		#include <linux/slab.h>
	],[
		kfree_sensitive(NULL);
	], [-Werror])
])
AC_DEFUN([LIBCFS_HAVE_KFREE_SENSITIVE], [
	LB2_MSG_LINUX_TEST_RESULT([if kfree_sensitive() is available],
	[kfree_sensitive_exists], [
		AC_DEFINE(HAVE_KFREE_SENSITIVE, 1,
			[kfree_sensitive() is available.])
	])
]) # LIBCFS_HAVE_KFREE_SENSITIVE

#
# LIBCFS_HAVE_CRYPTO_SHA2_HEADER
#
# Kernel v5.10-rc1-114-ga24d22b225ce
# crypto: sha - split sha.h into sha1.h and sha2.h
#
AC_DEFUN([LIBCFS_SRC_HAVE_CRYPTO_SHA2_HEADER], [
	LB2_CHECK_LINUX_HEADER_SRC([crypto/sha2.h], [-Werror])
])
AC_DEFUN([LIBCFS_HAVE_CRYPTO_SHA2_HEADER], [
	LB2_CHECK_LINUX_HEADER_RESULT([crypto/sha2.h], [
		AC_DEFINE(HAVE_CRYPTO_SHA2_HEADER, 1,
			[crypto/sha2.h is present])
	])
]) # LIBCFS_HAVE_CRYPTO_SHA2_HEADER

#
# LIBCFS_HAVE_LIST_CMP_FUNC_T
#
# kernel 5.10.70 commit 4f0f586bf0c898233d8f316f471a21db2abd522d
# treewide: Change list_sort to use const pointers
AC_DEFUN([LIBCFS_SRC_HAVE_LIST_CMP_FUNC_T], [
	LB2_LINUX_TEST_SRC([list_cmp_func_t_exists], [
		#include <linux/list_sort.h>
	],[
		list_cmp_func_t cmp;
		(void)cmp;
	], [-Werror])
])
AC_DEFUN([LIBCFS_HAVE_LIST_CMP_FUNC_T], [
	LB2_MSG_LINUX_TEST_RESULT([if list_cmp_func_t type is defined],
	[list_cmp_func_t_exists], [
		AC_DEFINE(HAVE_LIST_CMP_FUNC_T, 1,
			[list_cmp_func_t type is defined])
	])
]) # LIBCFS_HAVE_LIST_CMP_FUNC_T

#
# LIBCFS_NLA_STRLCPY
#
# Kernel version 5.10-rc3 commit 872f690341948b502c93318f806d821c56772c42
# replaced nla_strlcpy() with nla_strscpy().
#
AC_DEFUN([LIBCFS_SRC_NLA_STRLCPY], [
	LB2_LINUX_TEST_SRC([nla_strlcpy], [
		#include <net/netlink.h>
	],[
		if (nla_strlcpy(NULL, NULL, 0) == 0)
			return -EINVAL;
	])
])
AC_DEFUN([LIBCFS_NLA_STRLCPY], [
	LB2_MSG_LINUX_TEST_RESULT([if 'nla_strlcpy()' still exists],
	[nla_strlcpy], [
		AC_DEFINE(HAVE_NLA_STRLCPY, 1,
			['nla_strlcpy' is available])
	])
]) # LIBCFS_NLA_STRLCPY

#
# LIBCFS_RB_FIND
#
# Kernel v5.11-20-g2d24dd5798d0
#   rbtree: Add generic add and find helpers
#
AC_DEFUN([LIBCFS_SRC_RB_FIND], [
	LB2_LINUX_TEST_SRC([rb_find], [
		#include <linux/rbtree.h>
		static int cmp(const void *key, const struct rb_node *node)
		{
			return 0;
		}
	],[
		void *key = NULL;
		struct rb_root *tree = NULL;
		struct rb_node *node __maybe_unused = rb_find(key, tree, cmp);
	])
])
AC_DEFUN([LIBCFS_RB_FIND], [
	LB2_MSG_LINUX_TEST_RESULT([if 'rb_find()' is available],
	[rb_find], [
		AC_DEFINE(HAVE_RB_FIND, 1,
			['rb_find()' is available])
	])
]) # LIBCFS_RB_FIND

#
# LIBCFS_LINUX_FORTIFY_STRING_HEADER
#
# Linux v5.11-11104-ga28a6e860c6c
#  string.h: move fortified functions definitions in a dedicated header.
#
AC_DEFUN([LIBCFS_SRC_LINUX_FORTIFY_STRING_HEADER],[
	LB2_LINUX_TEST_SRC([linux_fortify_string_header], [
		#include <linux/fortify-string.h>
	],[
	],[])
])
AC_DEFUN([LIBCFS_LINUX_FORTIFY_STRING_HEADER],[
	LB2_MSG_LINUX_TEST_RESULT([if linux/fortify-string.h header available],
	[linux_fortify_string_header], [
		AC_DEFINE(HAVE_LINUX_FORTIFY_STRING_HEADER, 1,
			[linux/fortify-string.h header available])
	])
]) # LIBCFS_LINUX_FORTIFY_STRING_HEADER

#
# LIBCFS_HAVE_CIPHER_HEADER
#
# Kernel 5.12 commit 0eb76ba29d16df2951d37c54ca279c4e5630b071
# crypto: remove cipher routines from public crypto API
#
AC_DEFUN([LIBCFS_SRC_HAVE_CIPHER_HEADER], [
	LB2_CHECK_LINUX_HEADER_SRC([crypto/internal/cipher.h], [-Werror])
])
AC_DEFUN([LIBCFS_HAVE_CIPHER_HEADER], [
	LB2_CHECK_LINUX_HEADER_RESULT([crypto/internal/cipher.h], [
		AC_DEFINE(HAVE_CIPHER_H, 1,
			[crypto/internal/cipher.h is present])
	])
]) # LIBCFS_HAVE_CIPHER_HEADER

#
# LIBCFS_HAVE_TASK_RUNNING
#
# Kernel 5.13-rc6 commit b03fbd4ff24c5f075e58eb19261d5f8b3e40d
# introduced task_is_running() macro.
#
AC_DEFUN([LIBCFS_SRC_HAVE_TASK_IS_RUNNING], [
	LB2_LINUX_TEST_SRC([task_is_running], [
		#include <linux/sched.h>
	],[
		if (task_is_running(current))
			schedule();
	], [-Werror])
])
AC_DEFUN([LIBCFS_HAVE_TASK_IS_RUNNING], [
	LB2_MSG_LINUX_TEST_RESULT([if task_is_running() is defined],
	[task_is_running], [
		AC_DEFINE(HAVE_TASK_IS_RUNNING, 1,
			[task_is_running() is defined])
	])
]) # LIBCFS_HAVE_TASK_IS_RUNNING

#
# LIBCFS_LINUX_STDARG_HEADER
#
# Kernel 5.14-rc5 commit c0891ac15f0428ffa81b2e818d416bdf3cb74ab6
# isystem: ship and use stdarg.h
#
AC_DEFUN([LIBCFS_SRC_LINUX_STDARG_HEADER], [
	LB2_CHECK_LINUX_HEADER_SRC([linux/stdarg.h], [-Werror])
])
AC_DEFUN([LIBCFS_LINUX_STDARG_HEADER], [
	LB2_CHECK_LINUX_HEADER_RESULT([linux/stdarg.h], [
		AC_DEFINE(HAVE_LINUX_STDARG_HEADER, 1,
			[linux/stdarg.h is present])
	])
]) # LIBCFS_LINUX_STDARG_HEADER

#
# LIBCFS_HAVE_PANIC_NOTIFIER_HEADER
#
# Kernel 5.14 commit f39650de687e35766572ac89dbcd16a5911e2f0a
# kernel.h: split out panic and oops helpers
#
AC_DEFUN([LIBCFS_SRC_HAVE_PANIC_NOTIFIER_HEADER], [
	LB2_CHECK_LINUX_HEADER_SRC([linux/panic_notifier.h], [-Werror])
])
AC_DEFUN([LIBCFS_HAVE_PANIC_NOTIFIER_HEADER], [
	LB2_CHECK_LINUX_HEADER_RESULT([linux/panic_notifier.h], [
		AC_DEFINE(HAVE_PANIC_NOTIFIER_H, 1,
			[linux/panic_notifier.h is present])
	])
]) # LIBCFS_HAVE_PANIC_NOTIFIER_HEADER

#
# LIBCFS_PARAM_SET_UINT_MINMAX
#
# Kernel 5.15-rc1 commit 2a14c9ae15a38148484a128b84bff7e9ffd90d68
# moved param_set_uint_minmax to common code
#
AC_DEFUN([LIBCFS_SRC_PARAM_SET_UINT_MINMAX],[
	LB2_LINUX_TEST_SRC([param_set_uint_minmax], [
		#include <linux/moduleparam.h>
	],[
		param_set_uint_minmax(NULL, NULL, 0, 0);
	], [])
])
AC_DEFUN([LIBCFS_PARAM_SET_UINT_MINMAX],[
	LB2_MSG_LINUX_TEST_RESULT([if function 'param_set_uint_minmax' exist],
	[param_set_uint_minmax], [
		AC_DEFINE(HAVE_PARAM_SET_UINT_MINMAX, 1,
			['param_set_uint_minmax' is available])
	])
]) # LIBCFS_PARAM_SET_UINT_MINMAX

#
# LIBCFS_LINUX_BLK_INTEGRITY_HEADER
#
# Kernel 5.15-rc6 commit fe45e630a1035aea94c29016f2598bbde149bbe3
# block: move integrity handling out of <linux/blkdev.h>
#
AC_DEFUN([LIBCFS_SRC_LINUX_BLK_INTEGRITY_HEADER], [
	LB2_CHECK_LINUX_HEADER_SRC([linux/blk-integrity.h], [-Werror])
])
AC_DEFUN([LIBCFS_LINUX_BLK_INTEGRITY_HEADER], [
	LB2_CHECK_LINUX_HEADER_RESULT([linux/blk-integrity.h], [
		AC_DEFINE(HAVE_LINUX_BLK_INTEGRITY_HEADER, 1,
			[linux/blk-integrity.h is present])
	])
]) # LIBCFS_LINUX_BLK_INTEGRITY_HEADER

#
# LIBCFS_PDE_DATA_EXISTS
#
# Linux commit v5.16-11573-g6dfbbae14a7b
#    introduce pde_data()
# Linux commit v5.16-11574-g359745d78351
#    remove PDE_DATA()
#
AC_DEFUN([LIBCFS_SRC_PDE_DATA_EXISTS],[
	LB2_LINUX_TEST_SRC([pde_data], [
		#include <linux/proc_fs.h>
	],[
		struct inode *inode = NULL;
		void *data =pde_data(inode);
		(void)data;
	],[])
])
AC_DEFUN([LIBCFS_PDE_DATA_EXISTS],[
	LB2_MSG_LINUX_TEST_RESULT([if function 'pde_data' exist],
	[pde_data], [
		AC_DEFINE(HAVE_pde_data, 1, [function pde_data() available])
	],[
		AC_DEFINE(pde_data(inode), PDE_DATA(inode),
			  [function pde_data() unavailable])
	])
]) # LIBCFS_PDE_DATA_EXISTS

#
# LIBCFS_BIO_ALLOC_WITH_BDEV
#
# Linux commit v5.17-rc2-21-g07888c665b40
#   block: pass a block_device and opf to bio_alloc
#
AC_DEFUN([LIBCFS_SRC_BIO_ALLOC_WITH_BDEV],[
	LB2_LINUX_TEST_SRC([bio_alloc_with_bdev], [
		#include <linux/bio.h>
	],[
		struct block_device *bdev = NULL;
		unsigned short nr_vecs = 1;
		gfp_t gfp = GFP_KERNEL;
		struct bio *bio = bio_alloc(bdev, nr_vecs, REQ_OP_WRITE, gfp);
		(void) bio;
	],[])
])
AC_DEFUN([LIBCFS_BIO_ALLOC_WITH_BDEV],[
	LB2_MSG_LINUX_TEST_RESULT([if bio_alloc() takes a struct block_device],
	[bio_alloc_with_bdev], [
		AC_DEFINE(HAVE_BIO_ALLOC_WITH_BDEV, 1,
			[bio_alloc() takes a struct block_device])
	])
]) # LIBCFS_BIO_ALLOC_WITH_BDEV

#
# LIBCFS_TIMER_DELETE_SYNC
#
# Linux commit v6.1-rc1-7-g9a5a30568697
#   timers: Get rid of del_singleshot_timer_sync()
# Linux commit v6.1-rc1-11-g9b13df3fb64e
#   timers: Rename del_timer_sync() to timer_delete_sync()
#
AC_DEFUN([LIBCFS_SRC_TIMER_DELETE_SYNC],[
	LB2_LINUX_TEST_SRC([timer_delete_sync], [
		#include <linux/timer.h>
	],[
		struct timer_list *timer = NULL;
		(void)timer_delete_sync(timer);
	],[])
])
AC_DEFUN([LIBCFS_TIMER_DELETE_SYNC],[
	LB2_MSG_LINUX_TEST_RESULT([if timer_delete_sync() is available],
	[timer_delete_sync], [
		AC_DEFINE(HAVE_TIMER_DELETE_SYNC, 1,
			[timer_delete_sync() is available])
	],[
		AC_DEFINE(timer_delete_sync(t), del_timer_sync(t),
			[timer_delete_sync() not is available])
	])
]) # LIBCFS_TIMER_DELETE_SYNC

#
# LIBCFS_TIMER_DELETE_SYNC
#
# Linux commit v6.1-rc1-12-gbb663f0f3c39
#   timers: Rename del_timer() to timer_delete()
#
AC_DEFUN([LIBCFS_SRC_TIMER_DELETE],[
	LB2_LINUX_TEST_SRC([timer_delete], [
		#include <linux/timer.h>
	],[
		struct timer_list *timer = NULL;
		(void)timer_delete(timer);
	],[])
])
AC_DEFUN([LIBCFS_TIMER_DELETE],[
	LB2_MSG_LINUX_TEST_RESULT([if timer_delete() is available],
	[timer_delete], [
		AC_DEFINE(HAVE_TIMER_DELETE, 1,
			[timer_delete() is available])
	],[
		AC_DEFINE(timer_delete(t), del_timer(t),
			[timer_delete() not is available])
	])
]) # LIBCFS_TIMER_DELETE

#
# LIBCFS_CONSTIFY_CTR_TABLE
#
# Linux commit v6.10-12269-g78eb4ea25cd5
#   sysctl: treewide: constify the ctl_table argument of proc_handlers
#
AC_DEFUN([LIBCFS_SRC_CONSTIFY_CTR_TABLE],[
	LB2_LINUX_TEST_SRC([constify_struct_ctl_table], [
		#include <linux/sysctl.h>

		static int handler(const struct ctl_table *table, int write,
				   void __user *buf, size_t *lenp, loff_t *ppos)
		{
			return 0;
		}
	],[
		static struct ctl_table ctl_tbl __attribute__ ((unused)) = {
			.proc_handler	= &handler,
		};
	],[-Werror])
])
AC_DEFUN([LIBCFS_CONSTIFY_CTR_TABLE],[
	LB2_MSG_LINUX_TEST_RESULT(
	[if struct ctl_table argument to proc_handler() is const],
	[constify_struct_ctl_table], [
		AC_DEFINE(HAVE_CONST_CTR_TABLE, 1,
			[struct ctl_table argument to proc_handler() is const])
	])
]) # LIBCFS_CONSTIFY_CTR_TABLE

#
# LIBCFS_BLK_INTEGRITY_NOVERIFY
#
# Linux commit v6.10-rc3-25-g9f4aa46f2a74
#   block: invert the BLK_INTEGRITY_{GENERATE,VERIFY} flags
#
AC_DEFUN([LIBCFS_SRC_BLK_INTEGRITY_NOVERIFY], [
	LB2_LINUX_TEST_SRC([blk_integrity_noverify], [
		#include <linux/blk-integrity.h>
	],[
		int flag __attribute__ ((unused)) = BLK_INTEGRITY_NOVERIFY;
	],[-Werror])
])
AC_DEFUN([LIBCFS_BLK_INTEGRITY_NOVERIFY], [
	LB2_MSG_LINUX_TEST_RESULT([if BLK_INTEGRITY_NOVERIFY is available],
	[blk_integrity_noverify], [
		AC_DEFINE(HAVE_BLK_INTEGRITY_NOVERIFY, 1,
			[BLK_INTEGRITY_NOVERIFY is available])
	])
]) # LIBCFS_BLK_INTEGRITY_NOVERIFY

#
# LIBCFS_LINUX_BIO_INTEGRITY_HEADER
#
# Linux commit v6.10-rc6-157-gda042a365515
#   block: split integrity support out of bio.h
#
AC_DEFUN([LIBCFS_SRC_LINUX_BIO_INTEGRITY_HEADER], [
	LB2_CHECK_LINUX_HEADER_SRC([linux/bio-integrity.h], [-Werror])
])
AC_DEFUN([LIBCFS_LINUX_BIO_INTEGRITY_HEADER], [
	LB2_CHECK_LINUX_HEADER_RESULT([linux/bio-integrity.h], [
		AC_DEFINE(HAVE_LINUX_BIO_INTEGRITY_HEADER, 1,
			[linux/bio-integrity.h is present])
	])
]) # LIBCFS_LINUX_BIO_INTEGRITY_HEADER

dnl #
dnl # Generate and compile all of the kernel API test cases to determine
dnl # which interfaces are available.  By invoking the kernel build system
dnl # only once the compilation can be done in parallel significantly
dnl # speeding up the process.
dnl #
AC_DEFUN([LIBCFS_PROG_LINUX_SRC], [
	# 5.2
	LIBCFS_SRC_KOBJ_TYPE_DEFAULT_GROUPS
	LIBCFS_SRC_USER_UID_KEYRING
	# 5.3
	LIBCFS_SRC_LOOKUP_USER_KEY
	LIBCFS_SRC_CACHE_DETAIL_WRITERS
	# 5.4
	LIBCFS_SRC_GENL_DUMPIT_INFO_FAMILY
	# 5.6
	LIBCFS_SRC_HAVE_PROC_OPS
	# 5.7
	LIBCFS_SRC_TCP_SOCK_SET_QUICKACK
	LIBCFS_SRC_TCP_SOCK_SET_KEEPINTVL
	LIBCFS_SRC_TCP_SOCK_SET_KEEPCNT
	# 5.8
	LIBCFS_SRC_IP6_SET_PREF
	LIBCFS_SRC_IP_SET_TOS
	LIBCFS_SRC_VMALLOC_2ARGS
	LIBCFS_SRC_HAVE_NR_UNSTABLE_NFS
	LIBCFS_SRC_KERNEL_SETSOCKOPT
	LIBCFS_SRC_KEY_NEED_UNLINK
	LIBCFS_SRC_SEC_RELEASE_SECCTX
	# 5.10
	LIBCFS_SRC_HAVE_KMAP_LOCAL
	LIBCFS_SRC_HAVE_KFREE_SENSITIVE
	LIBCFS_SRC_HAVE_CRYPTO_SHA2_HEADER
	LIBCFS_SRC_HAVE_LIST_CMP_FUNC_T
	LIBCFS_SRC_NLA_STRLCPY
	# 5.12
	LIBCFS_SRC_RB_FIND
	LIBCFS_SRC_LINUX_FORTIFY_STRING_HEADER
	LIBCFS_SRC_HAVE_CIPHER_HEADER
	# 5.13
	LIBCFS_SRC_HAVE_TASK_IS_RUNNING
	# 5.14
	LIBCFS_SRC_LINUX_STDARG_HEADER
	LIBCFS_SRC_HAVE_PANIC_NOTIFIER_HEADER
	# 5.15
	LIBCFS_SRC_PARAM_SET_UINT_MINMAX
	# 5.17
	LIBCFS_SRC_PDE_DATA_EXISTS
	LIBCFS_SRC_BIO_ALLOC_WITH_BDEV
	# 6.2
	LIBCFS_SRC_TIMER_DELETE_SYNC
	LIBCFS_SRC_TIMER_DELETE
	# 6.11
	LIBCFS_SRC_CONSTIFY_CTR_TABLE
	LIBCFS_SRC_BLK_INTEGRITY_NOVERIFY
])

dnl #
dnl # Check results of kernel interface tests.
dnl #
AC_DEFUN([LIBCFS_PROG_LINUX_RESULTS], [
	# 5.2
	LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS
	LIBCFS_USER_UID_KEYRING
	# 5.3
	LIBCFS_LOOKUP_USER_KEY
	LIBCFS_CACHE_DETAIL_WRITERS
	# 5.4
	LIBCFS_GENL_DUMPIT_INFO_FAMILY
	# 5.6
	LIBCFS_HAVE_PROC_OPS
	# 5.7
	LIBCFS_TCP_SOCK_SET_QUICKACK
	LIBCFS_TCP_SOCK_SET_KEEPINTVL
	LIBCFS_TCP_SOCK_SET_KEEPCNT
	# 5.8
	LIBCFS_IP6_SET_PREF
	LIBCFS_IP_SET_TOS
	LIBCFS_VMALLOC_2ARGS
	LIBCFS_HAVE_NR_UNSTABLE_NFS
	LIBCFS_NR_UNSTABLE_NFS_DEPRECATED
	LIBCFS_KERNEL_SETSOCKOPT
	LIBCFS_KEY_NEED_UNLINK
	LIBCFS_SEC_RELEASE_SECCTX
	# 5.10
	LIBCFS_HAVE_KMAP_LOCAL
	LIBCFS_HAVE_KFREE_SENSITIVE
	LIBCFS_HAVE_CRYPTO_SHA2_HEADER
	LIBCFS_HAVE_LIST_CMP_FUNC_T
	LIBCFS_NLA_STRLCPY
	# 5.12
	LIBCFS_RB_FIND
	LIBCFS_LINUX_FORTIFY_STRING_HEADER
	LIBCFS_HAVE_CIPHER_HEADER
	# 5.13
	LIBCFS_HAVE_TASK_IS_RUNNING
	# 5.14
	LIBCFS_LINUX_STDARG_HEADER
	LIBCFS_HAVE_PANIC_NOTIFIER_HEADER
	# 5.15
	LIBCFS_PARAM_SET_UINT_MINMAX
	# 5.17
	LIBCFS_PDE_DATA_EXISTS
	LIBCFS_BIO_ALLOC_WITH_BDEV
	# 6.2
	LIBCFS_TIMER_DELETE_SYNC
	LIBCFS_TIMER_DELETE
	# 6.11
	LIBCFS_CONSTIFY_CTR_TABLE
	LIBCFS_BLK_INTEGRITY_NOVERIFY
])

#
# LIBCFS_PROG_LINUX
#
# LibCFS linux kernel checks
#
AC_DEFUN([LIBCFS_PROG_LINUX], [
AC_MSG_NOTICE([LibCFS kernel checks
==============================================================================])
LIBCFS_CONFIG_PANIC_DUMPLOG

# 5.7 - Export Check
LIBCFS_KALLSYMS_LOOKUP
]) # LIBCFS_PROG_LINUX

#
# LIBCFS_PATH_DEFAULTS
#
# default paths for installed files
#
AC_DEFUN([LIBCFS_PATH_DEFAULTS], [
]) # LIBCFS_PATH_DEFAULTS

#
# LIBCFS_CONFIGURE
#
# other configure checks
#
AC_DEFUN([LIBCFS_CONFIGURE], [
AC_MSG_NOTICE([LibCFS core checks
==============================================================================])

# libcfs/libcfs/util/nidstrings.c
AC_CHECK_HEADERS([netdb.h asm/types.h endian.h])

# --------  Check for required packages  --------------

AC_MSG_NOTICE([LibCFS required packages checks
==============================================================================])

AC_MSG_CHECKING([whether to enable readline support])
AC_ARG_ENABLE(readline,
	AS_HELP_STRING([--disable-readline],
		[disable readline support]),
	[], [enable_readline="yes"])
AC_MSG_RESULT([$enable_readline])

LIBREADLINE=""
AS_IF([test "x$enable_readline" = xyes], [
	AC_CHECK_LIB([readline], [readline], [
		LIBREADLINE="-lreadline"
		AC_DEFINE(HAVE_LIBREADLINE, 1,
			[readline library is available])
	])

	AC_SUBST(ENABLE_READLINE, yes)
], [
	AC_SUBST(ENABLE_READLINE, no)
])
AC_SUBST(LIBREADLINE)

AC_MSG_CHECKING([whether to use libpthread for libcfs library])
AC_ARG_ENABLE([libpthread],
	AS_HELP_STRING([--disable-libpthread],
		[disable libpthread]),
	[], [enable_libpthread="yes"])
AC_MSG_RESULT([$enable_libpthread])

PTHREAD_LIBS=""
AS_IF([test "x$enable_libpthread" = xyes], [
	AC_CHECK_LIB([pthread], [pthread_create], [
		PTHREAD_LIBS="-lpthread"
		AC_DEFINE([HAVE_LIBPTHREAD], 1,
			[use libpthread for libcfs library])
	])

	AC_SUBST(ENABLE_LIBPTHREAD, yes)
], [
	AC_SUBST(ENABLE_LIBPTHREAD, no)
	AC_MSG_WARN([Using libpthread for libcfs library is disabled explicitly])
])
AC_SUBST(PTHREAD_LIBS)
]) # LIBCFS_CONFIGURE