From f9ae26d3d17599b9966e6b0f2d04e77952e86176 Mon Sep 17 00:00:00 2001 From: Joe Gorse Date: Mon, 2 Jul 2018 20:36:04 +0000 Subject: [PATCH] LINUX: Update to Linux struct iattr->ia_ctime to timespec64 with 4.18 With 4.18+ Linux kernels we see a transition to 64-bit time stamps by default. current_kernel_time() returns the 32-bit struct timespec. current_kernel_time64() returns the 64-bit struct timespec64. struct iattr->ia_ctime expects struct timespec64 as of 4.18+. Timestamps greater than 31-bit rollover after 2147483647 or January 19, 2038 03:14:07 UTC. This is the same approach taken by the Linux developers for converting between timepsec64 and timespec. Reviewed-on: https://gerrit.openafs.org/13241 Reviewed-by: Stephan Wiesand Tested-by: BuildBot Reviewed-by: Benjamin Kaduk (cherry picked from commit 0bc5c15029cf7e720731f1415fcf9dc972d57ef4) Reviewed-on: https://gerrit.openafs.org/13268 Tested-by: BuildBot Reviewed-by: Mark Vitale Reviewed-by: Benjamin Kaduk (cherry picked from commit 554176bd236d772d670df9bdd2496facd5a4209a) Change-Id: I0804e05f2a0004669b8b089e4f2f23d1df6c9133 Reviewed-on: https://gerrit.openafs.org/13269 Reviewed-by: Mark Vitale Reviewed-by: Michael Meffie Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Stephan Wiesand --- src/afs/LINUX/osi_file.c | 6 +++++- src/cf/linux-kernel-assorted.m4 | 1 + src/cf/linux-test4.m4 | 12 +++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/afs/LINUX/osi_file.c b/src/afs/LINUX/osi_file.c index a028ee740e..5db54de4c7 100644 --- a/src/afs/LINUX/osi_file.c +++ b/src/afs/LINUX/osi_file.c @@ -23,7 +23,11 @@ #include "osi_compat.h" #ifndef CURRENT_TIME -#define CURRENT_TIME (current_kernel_time()) +# ifdef IATTR_TAKES_64BIT_TIME +# define CURRENT_TIME (current_kernel_time64()) +# else +# define CURRENT_TIME (current_kernel_time()) +# endif #endif int cache_fh_type = -1; diff --git a/src/cf/linux-kernel-assorted.m4 b/src/cf/linux-kernel-assorted.m4 index 990b2a2e71..40210332c2 100644 --- a/src/cf/linux-kernel-assorted.m4 +++ b/src/cf/linux-kernel-assorted.m4 @@ -9,6 +9,7 @@ LINUX_KMEM_CACHE_CREATE_CTOR_TAKES_VOID LINUX_D_PATH_TAKES_STRUCT_PATH LINUX_NEW_EXPORT_OPS LINUX_INODE_SETATTR_RETURN_TYPE +LINUX_IATTR_64BIT_TIME LINUX_IOP_I_CREATE_TAKES_NAMEIDATA LINUX_IOP_I_LOOKUP_TAKES_NAMEIDATA LINUX_IOP_I_PERMISSION_TAKES_FLAGS diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 5a53f98189..8667b4f3e9 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -197,7 +197,17 @@ AC_DEFUN([LINUX_INODE_SETATTR_RETURN_TYPE], [ []) ]) - +AC_DEFUN([LINUX_IATTR_64BIT_TIME], [ + AC_CHECK_LINUX_BUILD([whether struct iattr->ia_ctime takes struct timespec64 or 32-bit struct timespec], + [ac_cv_linux_func_iattr_ctime_takes_timespec64], + [#include + #include ], + [struct iattr _attrs; + _attrs.ia_ctime = current_kernel_time64();], + [IATTR_TAKES_64BIT_TIME], + [define if struct iattr->ia_ctime takes struct timespec64], + []) +]) AC_DEFUN([LINUX_AOP_WRITEBACK_CONTROL], [ AC_CHECK_LINUX_BUILD([whether aop.writepage takes a writeback_control],