From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Create a real struct timespec64 that supports 64-bit seconds counts. The C library struct timespec doesn't support this on 32-bit architectures and we cannot lose the upper bits in the incore inode. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- include/libxfs.h | 1 - include/xfs_inode.h | 22 +++++++++++----------- libxfs/libxfs_api_defs.h | 7 +++++++ libxfs/libxfs_priv.h | 2 -- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index b9370139becc..2667d3b77084 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -41,7 +41,6 @@ struct iomap; #define __round_mask(x, y) ((__typeof__(x))((y)-1)) #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) #define unlikely(x) (x) -#define timespec64 timespec /* * This mirrors the kernel include for xfs_buf.h - it's implicitly included in diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 588d8c7258f4..12676cb30bf2 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -31,17 +31,17 @@ struct xfs_inode_log_item; * metadata. */ struct inode { - mode_t i_mode; - uint32_t i_uid; - uint32_t i_gid; - uint32_t i_nlink; - xfs_dev_t i_rdev; /* This actually holds xfs_dev_t */ - unsigned long i_state; /* Not actually used in userspace */ - uint32_t i_generation; - uint64_t i_version; - struct timespec i_atime; - struct timespec i_mtime; - struct timespec i_ctime; + mode_t i_mode; + uint32_t i_uid; + uint32_t i_gid; + uint32_t i_nlink; + xfs_dev_t i_rdev; /* This actually holds xfs_dev_t */ + unsigned long i_state; /* Not actually used in userspace */ + uint32_t i_generation; + uint64_t i_version; + struct timespec64 i_atime; + struct timespec64 i_mtime; + struct timespec64 i_ctime; }; static inline uint32_t i_uid_read(struct inode *inode) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index a3eef04db419..99bc5b936da7 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -7,6 +7,13 @@ #ifndef __LIBXFS_API_DEFS_H__ #define __LIBXFS_API_DEFS_H__ +typedef long long int time64_t; + +struct timespec64 { + time64_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; + /* * This file defines all the kernel based functions we expose to userspace * via the libxfs_* namespace. This is kept in a separate header file so diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index eb485e7375b1..808b78180b06 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -64,8 +64,6 @@ extern kmem_zone_t *xfs_buf_zone; extern kmem_zone_t *xfs_inode_zone; extern kmem_zone_t *xfs_trans_zone; -#define timespec64 timespec - /* fake up iomap, (not) used in xfs_bmap.[ch] */ #define IOMAP_F_SHARED 0x04 #define xfs_bmbt_to_iomap(a, b, c, d) ((void) 0)