[PATCH][BIONIC] UBUNTU: SAUCE: (noup) Update spl with 4.15 compat fix (LP:#1737761)

Colin King colin.king at canonical.com
Tue Dec 12 14:59:44 UTC 2017


From: Colin Ian King <colin.king at canonical.com>

Add a 4.15 spl compat fix to detect and use timer_setup instead of the deprecated
init_timer.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---

Note: This patch does not enable ZFS builds by re-enabling do_zfs in debian/rules

---
 spl/config/spl-build.m4    |  25 +++++++++
 spl/configure              | 128 +++++++++++++++++++++++++++++++++++++++++++++
 spl/module/spl/spl-taskq.c |  20 +++++++
 spl/spl_config.h.in        |   3 ++
 4 files changed, 176 insertions(+)

diff --git a/spl/config/spl-build.m4 b/spl/config/spl-build.m4
index accf675..3b1a495 100644
--- a/spl/config/spl-build.m4
+++ b/spl/config/spl-build.m4
@@ -56,6 +56,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
 	SPL_AC_WAIT_QUEUE_HEAD_ENTRY
 	SPL_AC_KERNEL_WRITE
 	SPL_AC_KERNEL_READ
+	SPL_AC_TIMER_SETUP
 ])
 
 AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
@@ -1755,3 +1756,27 @@ AC_DEFUN([SPL_AC_KERNEL_READ], [
 	])
 	EXTRA_KCFLAGS="$tmp_flags"
 ])
+
+dnl #
+dnl # 4.16 new API
+dnl # new timer_setup()
+dnl #
+AC_DEFUN([SPL_AC_TIMER_SETUP], [
+	AC_MSG_CHECKING([whether timer_setup() exists])
+	tmp_flags="$EXTRA_KCFLAGS"
+        EXTRA_KCFLAGS="-Werror"
+	SPL_LINUX_TRY_COMPILE([
+                #include <linux/timer.h>
+        ],[
+		struct timer_list timer;
+
+		timer_setup(&timer, NULL, 0);
+        ],[
+                AC_MSG_RESULT(yes)
+                AC_DEFINE(HAVE_KERNEL_TIMER_SETUP, 1,
+                    [use timer_setup() for timer initialization])
+        ],[
+                AC_MSG_RESULT(no)
+        ])
+        EXTRA_KCFLAGS="$tmp_flags"
+])
diff --git a/spl/configure b/spl/configure
index c7a7c43..7c99417 100755
--- a/spl/configure
+++ b/spl/configure
@@ -15654,6 +15654,70 @@ fi
 
 	EXTRA_KCFLAGS="$tmp_flags"
 
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether timer_setup() exists" >&5
+$as_echo_n "checking whether timer_setup() exists... " >&6; }
+	tmp_flags="$EXTRA_KCFLAGS"
+        EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+                #include <linux/timer.h>
+
+int
+main (void)
+{
+
+		struct timer_list timer;
+
+		timer_setup(&timer, NULL, 0);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_KERNEL_TIMER_SETUP 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+        EXTRA_KCFLAGS="$tmp_flags"
+
  ;;
 		user)      ;;
 		all)
@@ -18919,6 +18983,70 @@ fi
 	EXTRA_KCFLAGS="$tmp_flags"
 
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether timer_setup() exists" >&5
+$as_echo_n "checking whether timer_setup() exists... " >&6; }
+	tmp_flags="$EXTRA_KCFLAGS"
+        EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+                #include <linux/timer.h>
+
+int
+main (void)
+{
+
+		struct timer_list timer;
+
+		timer_setup(&timer, NULL, 0);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+	rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+	echo "obj-m := conftest.o" >build/Makefile
+	modpost_flag=''
+	test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+	if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_KERNEL_TIMER_SETUP 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+	rm -Rf build
+
+
+        EXTRA_KCFLAGS="$tmp_flags"
+
+
 		           ;;
 		srpm)                        ;;
 		*)
diff --git a/spl/module/spl/spl-taskq.c b/spl/module/spl/spl-taskq.c
index 86915e6..4b7b3f7 100644
--- a/spl/module/spl/spl-taskq.c
+++ b/spl/module/spl/spl-taskq.c
@@ -209,9 +209,17 @@ task_done(taskq_t *tq, taskq_ent_t *t)
  * add it to the priority list in order for immediate processing.
  */
 static void
+#ifdef HAVE_KERNEL_TIMER_SETUP
+task_expire(struct timer_list *tl)
+#else
 task_expire(unsigned long data)
+#endif
 {
+#ifdef HAVE_KERNEL_TIMER_SETUP
+	taskq_ent_t *w, *t = (taskq_ent_t *)from_timer(t, tl, tqent_timer);
+#else
 	taskq_ent_t *w, *t = (taskq_ent_t *)data;
+#endif
 	taskq_t *tq = t->tqent_taskq;
 	struct list_head *l;
 	unsigned long flags;
@@ -590,8 +598,12 @@ taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t flags)
 	t->tqent_func = func;
 	t->tqent_arg = arg;
 	t->tqent_taskq = tq;
+#ifdef HAVE_KERNEL_TIMER_SETUP
+	timer_setup(&t->tqent_timer, NULL, 0);
+#else
 	t->tqent_timer.data = 0;
 	t->tqent_timer.function = NULL;
+#endif
 	t->tqent_timer.expires = 0;
 	t->tqent_birth = jiffies;
 
@@ -640,8 +652,12 @@ taskq_dispatch_delay(taskq_t *tq, task_func_t func, void *arg,
 	t->tqent_func = func;
 	t->tqent_arg = arg;
 	t->tqent_taskq = tq;
+#ifdef HAVE_KERNEL_TIMER_SETUP
+	timer_setup(&t->tqent_timer, task_expire, 0);
+#else
 	t->tqent_timer.data = (unsigned long)t;
 	t->tqent_timer.function = task_expire;
+#endif
 	t->tqent_timer.expires = (unsigned long)expire_time;
 	add_timer(&t->tqent_timer);
 
@@ -732,7 +748,11 @@ taskq_init_ent(taskq_ent_t *t)
 {
 	spin_lock_init(&t->tqent_lock);
 	init_waitqueue_head(&t->tqent_waitq);
+#ifdef HAVE_KERNEL_TIMER_SETUP
+	timer_setup(&t->tqent_timer, NULL, 0);
+#else
 	init_timer(&t->tqent_timer);
+#endif
 	INIT_LIST_HEAD(&t->tqent_list);
 	t->tqent_id = 0;
 	t->tqent_func = NULL;
diff --git a/spl/spl_config.h.in b/spl/spl_config.h.in
index 6f2249d..7d2a4d9 100644
--- a/spl/spl_config.h.in
+++ b/spl/spl_config.h.in
@@ -81,6 +81,9 @@
 /* kernel_read() take loff_t pointer */
 #undef HAVE_KERNEL_READ_PPOS
 
+/* use timer_setup() for timer initialization */
+#undef HAVE_KERNEL_TIMER_SETUP
+
 /* kernel_write() take loff_t pointer */
 #undef HAVE_KERNEL_WRITE_PPOS
 
-- 
2.7.4





More information about the kernel-team mailing list