diff --git a/config/kernel-stdarg.m4 b/config/kernel-stdarg.m4 new file mode 100644 index 000000000000..5bc8dd859d6b --- /dev/null +++ b/config/kernel-stdarg.m4 @@ -0,0 +1,32 @@ +dnl # +dnl # Linux 5.15 gets rid of -isystem and external inclusion +dnl # and ships its own . Check if this header file does +dnl # exist and provide all necessary definitions for variable argument +dnl # functions. Adjust the inclusion of according to the +dnl # results. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG], [ + ZFS_LINUX_TEST_SRC([has_standalone_linux_stdarg], [ + #include + + #if !defined(va_start) || !defined(va_end) || \ + !defined(va_arg) || !defined(va_copy) + #error " is invalid" + #endif + ],[]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG], [ + dnl # + dnl # Linux 5.15 ships its own stdarg.h and doesn't allow to + dnl # include compiler headers. + dnl # + AC_MSG_CHECKING([whether standalone exists]) + ZFS_LINUX_TEST_RESULT([has_standalone_linux_stdarg], [ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_STANDALONE_LINUX_STDARG, 1, + [standalone exists]) + ],[ + AC_MSG_RESULT([no]) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index 5ea2286dbcc3..0b94f3bd9cb6 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -133,6 +133,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ ZFS_AC_KERNEL_SRC_SIGINFO ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS + ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG AC_MSG_CHECKING([for available kernel interfaces]) ZFS_LINUX_TEST_COMPILE_ALL([kabi]) @@ -239,6 +240,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ ZFS_AC_KERNEL_SIGINFO ZFS_AC_KERNEL_SET_SPECIAL_STATE ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS + ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG ]) dnl # diff --git a/include/os/linux/spl/sys/cmn_err.h b/include/os/linux/spl/sys/cmn_err.h index 79297067c17d..d2088371c6bc 100644 --- a/include/os/linux/spl/sys/cmn_err.h +++ b/include/os/linux/spl/sys/cmn_err.h @@ -24,7 +24,11 @@ #ifndef _SPL_CMN_ERR_H #define _SPL_CMN_ERR_H +#if defined(_KERNEL) && defined(HAVE_STANDALONE_LINUX_STDARG) +#include +#else #include +#endif #define CE_CONT 0 /* continuation */ #define CE_NOTE 1 /* notice */