Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b62b293 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Theodore Ts'o
Browse files

ext4: use timespec64 for all inode times



This is the last missing piece for the inode times on 32-bit systems:
now that VFS interfaces use timespec64, we just need to stop truncating
the tv_sec values for y2038 compatibililty.

Reviewed-by: default avatarAndreas Dilger <adilger@dilger.ca>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 5ffff834
Loading
Loading
Loading
Loading
+9 −13
Original line number Diff line number Diff line
@@ -789,17 +789,16 @@ struct move_extent {
 * affected filesystem before 2242.
 */

static inline __le32 ext4_encode_extra_time(struct timespec *time)
static inline __le32 ext4_encode_extra_time(struct timespec64 *time)
{
	u32 extra = sizeof(time->tv_sec) > 4 ?
		((time->tv_sec - (s32)time->tv_sec) >> 32) & EXT4_EPOCH_MASK : 0;
	u32 extra =((time->tv_sec - (s32)time->tv_sec) >> 32) & EXT4_EPOCH_MASK;
	return cpu_to_le32(extra | (time->tv_nsec << EXT4_EPOCH_BITS));
}

static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra)
static inline void ext4_decode_extra_time(struct timespec64 *time,
					  __le32 extra)
{
	if (unlikely(sizeof(time->tv_sec) > 4 &&
			(extra & cpu_to_le32(EXT4_EPOCH_MASK)))) {
	if (unlikely(extra & cpu_to_le32(EXT4_EPOCH_MASK))) {

#if 1
		/* Handle legacy encoding of pre-1970 dates with epoch
@@ -821,9 +820,8 @@ static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra)
do {										\
	(raw_inode)->xtime = cpu_to_le32((inode)->xtime.tv_sec);		\
	if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra))     {\
		struct timespec ts = timespec64_to_timespec((inode)->xtime);	\
		(raw_inode)->xtime ## _extra =					\
				ext4_encode_extra_time(&ts);			\
				ext4_encode_extra_time(&(inode)->xtime);	\
		}								\
} while (0)

@@ -840,10 +838,8 @@ do { \
do {										\
	(inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime);	\
	if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) {	\
		struct timespec ts = timespec64_to_timespec((inode)->xtime);	\
		ext4_decode_extra_time(&ts,					\
		ext4_decode_extra_time(&(inode)->xtime,				\
				       raw_inode->xtime ## _extra);		\
		(inode)->xtime = timespec_to_timespec64(ts);			\
		}								\
	else									\
		(inode)->xtime.tv_nsec = 0;					\
@@ -993,9 +989,9 @@ struct ext4_inode_info {

	/*
	 * File creation time. Its function is same as that of
	 * struct timespec i_{a,c,m}time in the generic inode.
	 * struct timespec64 i_{a,c,m}time in the generic inode.
	 */
	struct timespec i_crtime;
	struct timespec64 i_crtime;

	/* mballoc */
	struct list_head i_prealloc_list;
+1 −1
Original line number Diff line number Diff line
@@ -1086,7 +1086,7 @@ struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,
	/* This is the optimal IO size (for stat), not the fs block size */
	inode->i_blocks = 0;
	inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
	ei->i_crtime = timespec64_to_timespec(inode->i_mtime);
	ei->i_crtime = inode->i_mtime;

	memset(ei->i_data, 0, sizeof(ei->i_data));
	ei->i_dir_start_lookup = 0;