From 5cb46f6a664db913f0ef2bf8e929c3f8d8cbfc5b Mon Sep 17 00:00:00 2001 From: Tony Hutter Date: Wed, 9 Jan 2019 13:16:39 -0800 Subject: [PATCH] Linux 4.18 compat: Use ktime_get_coarse_real_ts64() Newer kernels remove current_kernel_time64(). Use ktime_get_coarse_real_ts64() in its place. Reviewed-by: Brian Behlendorf Signed-off-by: Tony Hutter Closes #8258 --- config/kernel-ktime_get_coarse_real_ts64.m4 | 18 ++++++++++++++++++ config/kernel.m4 | 1 + include/spl/sys/time.h | 12 ++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 config/kernel-ktime_get_coarse_real_ts64.m4 diff --git a/config/kernel-ktime_get_coarse_real_ts64.m4 b/config/kernel-ktime_get_coarse_real_ts64.m4 new file mode 100644 index 000000000..d6be8c418 --- /dev/null +++ b/config/kernel-ktime_get_coarse_real_ts64.m4 @@ -0,0 +1,18 @@ +dnl # +dnl # 4.18: ktime_get_coarse_real_ts64() added. Use it in place of +dnl # current_kernel_time64(). +dnl # +AC_DEFUN([ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64], + [AC_MSG_CHECKING([whether ktime_get_coarse_real_ts64() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include + ], [ + struct timespec64 ts; + ktime_get_coarse_real_ts64(&ts); + ], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_KTIME_GET_COARSE_REAL_TS64, 1, [ktime_get_coarse_real_ts64() exists]) + ], [ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index 7330c00e1..098c43700 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -161,6 +161,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_ACL_HAS_REFCOUNT ZFS_AC_KERNEL_USERNS_CAPABILITIES ZFS_AC_KERNEL_IN_COMPAT_SYSCALL + ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64 AS_IF([test "$LINUX_OBJ" != "$LINUX"], [ KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ" diff --git a/include/spl/sys/time.h b/include/spl/sys/time.h index 1a986c9b9..312415b7b 100644 --- a/include/spl/sys/time.h +++ b/include/spl/sys/time.h @@ -73,7 +73,13 @@ static inline void gethrestime(inode_timespec_t *ts) { #if defined(HAVE_INODE_TIMESPEC64_TIMES) + +#if defined(HAVE_KTIME_GET_COARSE_REAL_TS64) + ktime_get_coarse_real_ts64(ts); +#else *ts = current_kernel_time64(); +#endif /* HAVE_KTIME_GET_COARSE_REAL_TS64 */ + #else *ts = current_kernel_time(); #endif @@ -83,7 +89,13 @@ static inline time_t gethrestime_sec(void) { #if defined(HAVE_INODE_TIMESPEC64_TIMES) +#if defined(HAVE_KTIME_GET_COARSE_REAL_TS64) + inode_timespec_t ts; + ktime_get_coarse_real_ts64(&ts); +#else inode_timespec_t ts = current_kernel_time64(); +#endif /* HAVE_KTIME_GET_COARSE_REAL_TS64 */ + #else inode_timespec_t ts = current_kernel_time(); #endif