summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepa Dinamani <deepa.kernel@gmail.com>2019-03-22 19:42:54 -0400
committerDeepa Dinamani <deepa.kernel@gmail.com>2019-08-30 10:27:18 -0400
commitc0da64f6bb674d20a8e84bcd30679c1483668fb2 (patch)
tree4b8b97bde36749aea9882b36cfbfb2bed22531dc
parentcb7a69e605908c34aad47644afeb26a765ade8d7 (diff)
fs: fat: 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. Some FAT variants indicate that the years after 2099 are not supported. Since commit 7decd1cb0305 ("fat: Fix and cleanup timestamp conversion") we support the full range of years that can be represented, up to 2107. Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com> Acked-by: Jeff Layton <jlayton@kernel.org> Cc: hirofumi@mail.parknet.co.jp
-rw-r--r--fs/fat/inode.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index 05689198f5af..5f04c5c810fb 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -31,6 +31,11 @@
31 31
32#define KB_IN_SECTORS 2 32#define KB_IN_SECTORS 2
33 33
34/* DOS dates from 1980/1/1 through 2107/12/31 */
35#define FAT_DATE_MIN (0<<9 | 1<<5 | 1)
36#define FAT_DATE_MAX (127<<9 | 12<<5 | 31)
37#define FAT_TIME_MAX (23<<11 | 59<<5 | 29)
38
34/* 39/*
35 * A deserialized copy of the on-disk structure laid out in struct 40 * A deserialized copy of the on-disk structure laid out in struct
36 * fat_boot_sector. 41 * fat_boot_sector.
@@ -1605,6 +1610,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
1605 int debug; 1610 int debug;
1606 long error; 1611 long error;
1607 char buf[50]; 1612 char buf[50];
1613 struct timespec64 ts;
1608 1614
1609 /* 1615 /*
1610 * GFP_KERNEL is ok here, because while we do hold the 1616 * GFP_KERNEL is ok here, because while we do hold the
@@ -1698,6 +1704,12 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat,
1698 sbi->free_clus_valid = 0; 1704 sbi->free_clus_valid = 0;
1699 sbi->prev_free = FAT_START_ENT; 1705 sbi->prev_free = FAT_START_ENT;
1700 sb->s_maxbytes = 0xffffffff; 1706 sb->s_maxbytes = 0xffffffff;
1707 fat_time_fat2unix(sbi, &ts, 0, cpu_to_le16(FAT_DATE_MIN), 0);
1708 sb->s_time_min = ts.tv_sec;
1709
1710 fat_time_fat2unix(sbi, &ts, cpu_to_le16(FAT_TIME_MAX),
1711 cpu_to_le16(FAT_DATE_MAX), 0);
1712 sb->s_time_max = ts.tv_sec;
1701 1713
1702 if (!sbi->fat_length && bpb.fat32_length) { 1714 if (!sbi->fat_length && bpb.fat32_length) {
1703 struct fat_boot_fsinfo *fsinfo; 1715 struct fat_boot_fsinfo *fsinfo;