dnl # 4.14-rc3 API change dnl # https://lwn.net/Articles/735887/ dnl # dnl # Check if timer_list.func get passed a timer_list or an unsigned long dnl # (older kernels). Also sanity check the from_timer() and timer_setup() dnl # macros are available as well, since they will be used in the same newer dnl # kernels that support the new timer_list.func signature. dnl # dnl # Also check for the existence of flags in struct timer_list, they were dnl # added in 4.1-rc8 via 0eeda71bc30d. AC_DEFUN([ZFS_AC_KERNEL_TIMER_SETUP], [ AC_MSG_CHECKING([whether timer_setup() is available]) tmp_flags="$EXTRA_KCFLAGS" EXTRA_KCFLAGS="-Werror" ZFS_LINUX_TRY_COMPILE([ #include struct my_task_timer { struct timer_list timer; int data; }; void task_expire(struct timer_list *tl) { struct my_task_timer *task_timer = from_timer(task_timer, tl, timer); task_timer->data = 42; } ],[ struct my_task_timer task_timer; timer_setup(&task_timer.timer, task_expire, 0); ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_KERNEL_TIMER_SETUP, 1, [timer_setup() is available]) ],[ AC_MSG_RESULT(no) ]) AC_MSG_CHECKING([whether timer function expects timer_list]) ZFS_LINUX_TRY_COMPILE([ #include void task_expire(struct timer_list *tl) {} ],[ struct timer_list tl; tl.function = task_expire; ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_KERNEL_TIMER_FUNCTION_TIMER_LIST, 1, [timer_list.function gets a timer_list]) ],[ AC_MSG_RESULT(no) ]) AC_MSG_CHECKING([whether struct timer_list has flags]) ZFS_LINUX_TRY_COMPILE([ #include ],[ struct timer_list tl; tl.flags = 2; ],[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_KERNEL_TIMER_LIST_FLAGS, 1, [struct timer_list has a flags member]) ],[ AC_MSG_RESULT(no) ]) EXTRA_KCFLAGS="$tmp_flags" ])