diff options
author | Brian Behlendorf <[email protected]> | 2018-08-12 18:22:03 -0400 |
---|---|---|
committer | Tony Hutter <[email protected]> | 2018-07-06 02:46:51 -0700 |
commit | f79c0de208ad1a4effd5b0a9afc426922b12918a (patch) | |
tree | faf14cee4ba888106c23bdbb5a12cd23c45768dd /include/sys/zfs_znode.h | |
parent | 166781608941be963d7b0ffd40c4a785cea5a97f (diff) |
Linux 4.18 compat: inode timespec -> timespec64
Commit torvalds/linux@95582b0 changes the inode i_atime, i_mtime,
and i_ctime members form timespec's to timespec64's to make them
2038 safe. As part of this change the current_time() function was
also updated to return the timespec64 type.
Resolve this issue by introducing a new inode_timespec_t type which
is defined to match the timespec type used by the inode. It should
be used when working with inode timestamps to ensure matching types.
The timestruc_t type under Illumos was used in a similar fashion but
was specified to always be a timespec_t. Rather than incorrectly
define this type all timespec_t types have been replaced by the new
inode_timespec_t type.
Finally, the kernel and user space 'sys/time.h' headers were aligned
with each other. They define as appropriate for the context several
constants as macros and include static inline implementation of
gethrestime(), gethrestime_sec(), and gethrtime().
Reviewed-by: Chunwei Chen <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #7643
Backported-by: Richard Yao <[email protected]>
Diffstat (limited to 'include/sys/zfs_znode.h')
-rw-r--r-- | include/sys/zfs_znode.h | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/include/sys/zfs_znode.h b/include/sys/zfs_znode.h index c292f0373..26d1eb375 100644 --- a/include/sys/zfs_znode.h +++ b/include/sys/zfs_znode.h @@ -270,19 +270,36 @@ typedef struct znode_hold { extern unsigned int zfs_object_mutex_size; -/* Encode ZFS stored time values from a struct timespec */ +/* + * Encode ZFS stored time values from a struct timespec / struct timespec64. + */ #define ZFS_TIME_ENCODE(tp, stmp) \ -{ \ +do { \ (stmp)[0] = (uint64_t)(tp)->tv_sec; \ (stmp)[1] = (uint64_t)(tp)->tv_nsec; \ -} +} while (0) -/* Decode ZFS stored time values to a struct timespec */ +#if defined(HAVE_INODE_TIMESPEC64_TIMES) +/* + * Decode ZFS stored time values to a struct timespec64 + * 4.18 and newer kernels. + */ #define ZFS_TIME_DECODE(tp, stmp) \ -{ \ - (tp)->tv_sec = (time_t)(stmp)[0]; \ - (tp)->tv_nsec = (long)(stmp)[1]; \ -} +do { \ + (tp)->tv_sec = (time64_t)(stmp)[0]; \ + (tp)->tv_nsec = (long)(stmp)[1]; \ +} while (0) +#else +/* + * Decode ZFS stored time values to a struct timespec + * 4.17 and older kernels. + */ +#define ZFS_TIME_DECODE(tp, stmp) \ +do { \ + (tp)->tv_sec = (time_t)(stmp)[0]; \ + (tp)->tv_nsec = (long)(stmp)[1]; \ +} while (0) +#endif /* HAVE_INODE_TIMESPEC64_TIMES */ /* * Timestamp defines |