summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/kernel-ktime_get_coarse_real_ts64.m418
-rw-r--r--config/kernel.m41
-rw-r--r--include/spl/sys/time.h12
3 files changed, 31 insertions, 0 deletions
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 <linux/mm.h>
+ ], [
+ 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