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

Commit 487b25bc authored by Deepa Dinamani's avatar Deepa Dinamani
Browse files

fs: affs: Initialize filesystem timestamp ranges



Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.

Also fix timestamp calculation to avoid overflow
while converting from days to seconds.

Signed-off-by: default avatarDeepa Dinamani <deepa.kernel@gmail.com>
Acked-by: default avatarDavid Sterba <dsterba@suse.com>
Acked-by: default avatarJeff Layton <jlayton@kernel.org>
Cc: dsterba@suse.com
parent c0da64f6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -375,7 +375,7 @@ affs_secs_to_datestamp(time64_t secs, struct affs_date *ds)
	u32	 minute;
	s32	 rem;

	secs -= sys_tz.tz_minuteswest * 60 + ((8 * 365 + 2) * 24 * 60 * 60);
	secs -= sys_tz.tz_minuteswest * 60 + AFFS_EPOCH_DELTA;
	if (secs < 0)
		secs = 0;
	days    = div_s64_rem(secs, 86400, &rem);
+3 −0
Original line number Diff line number Diff line
@@ -32,6 +32,9 @@

#define AFFS_ROOT_BMAPS		25

/* Seconds since Amiga epoch of 1978/01/01 to UNIX */
#define AFFS_EPOCH_DELTA ((8 * 365 + 2) * 86400LL)

struct affs_date {
	__be32 days;
	__be32 mins;
+2 −2
Original line number Diff line number Diff line
@@ -150,10 +150,10 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino)
	}

	inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec
		       = (be32_to_cpu(tail->change.days) * (24 * 60 * 60) +
		       = (be32_to_cpu(tail->change.days) * 86400LL +
		         be32_to_cpu(tail->change.mins) * 60 +
			 be32_to_cpu(tail->change.ticks) / 50 +
			 ((8 * 365 + 2) * 24 * 60 * 60)) +
			 AFFS_EPOCH_DELTA) +
			 sys_tz.tz_minuteswest * 60;
	inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_atime.tv_nsec = 0;
	affs_brelse(bh);
+4 −0
Original line number Diff line number Diff line
@@ -355,6 +355,10 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
	sb->s_op                = &affs_sops;
	sb->s_flags |= SB_NODIRATIME;

	sb->s_time_gran = NSEC_PER_SEC;
	sb->s_time_min = sys_tz.tz_minuteswest * 60 + AFFS_EPOCH_DELTA;
	sb->s_time_max = 86400LL * U32_MAX + 86400 + sb->s_time_min;

	sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL);
	if (!sbi)
		return -ENOMEM;