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 0000000000..d6be8c4185 --- /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 7330c00e1b..098c437007 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 1a986c9b97..312415b7bc 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