fat: create a function to calculate the timezone offest

Patch series "fat: timestamp updates", v5.

fat/msdos timestamps are stored on-disk with several different
granularities, some of them lower resolution than timespec64_trunc() can
provide.  In addition, they are only truncated as they are written to
disk, so the timestamps in-memory for new or modified files/directories
may be different from the same timestamps after a remount, as the
now-truncated times are re-read from the on-disk format.

These patches allow finer granularity for the timestamps where possible
and add fat-specific ->update_time inode operation and fat_truncate_time
functions to truncate each timestamp correctly, giving consistent times
across remounts.

This patch (of 4):

Move the calculation of the number of seconds in the timezone offset to a
common function.

Link: http://lkml.kernel.org/r/3671ff8cff5eeedbb85ebda5e4de0728920db4f6.1538363961.git.sorenson@redhat.com
Signed-off-by: Frank Sorenson <sorenson@redhat.com>
Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Frank Sorenson 2018-10-30 15:06:50 -07:00 committed by Linus Torvalds
parent eceb8902be
commit d9f4d94261

View File

@ -185,6 +185,13 @@ static long days_in_year[] = {
0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 0, 0, 0, 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 0, 0, 0,
}; };
static inline int fat_tz_offset(struct msdos_sb_info *sbi)
{
return (sbi->options.tz_set ?
-sbi->options.time_offset :
sys_tz.tz_minuteswest) * SECS_PER_MIN;
}
/* Convert a FAT time/date pair to a UNIX date (seconds since 1 1 70). */ /* Convert a FAT time/date pair to a UNIX date (seconds since 1 1 70). */
void fat_time_fat2unix(struct msdos_sb_info *sbi, struct timespec64 *ts, void fat_time_fat2unix(struct msdos_sb_info *sbi, struct timespec64 *ts,
__le16 __time, __le16 __date, u8 time_cs) __le16 __time, __le16 __date, u8 time_cs)
@ -210,10 +217,7 @@ void fat_time_fat2unix(struct msdos_sb_info *sbi, struct timespec64 *ts,
+ days_in_year[month] + day + days_in_year[month] + day
+ DAYS_DELTA) * SECS_PER_DAY; + DAYS_DELTA) * SECS_PER_DAY;
if (!sbi->options.tz_set) second += fat_tz_offset(sbi);
second += sys_tz.tz_minuteswest * SECS_PER_MIN;
else
second -= sbi->options.time_offset * SECS_PER_MIN;
if (time_cs) { if (time_cs) {
ts->tv_sec = second + (time_cs / 100); ts->tv_sec = second + (time_cs / 100);
@ -229,9 +233,7 @@ void fat_time_unix2fat(struct msdos_sb_info *sbi, struct timespec64 *ts,
__le16 *time, __le16 *date, u8 *time_cs) __le16 *time, __le16 *date, u8 *time_cs)
{ {
struct tm tm; struct tm tm;
time64_to_tm(ts->tv_sec, time64_to_tm(ts->tv_sec, -fat_tz_offset(sbi), &tm);
(sbi->options.tz_set ? sbi->options.time_offset :
-sys_tz.tz_minuteswest) * SECS_PER_MIN, &tm);
/* FAT can only support year between 1980 to 2107 */ /* FAT can only support year between 1980 to 2107 */
if (tm.tm_year < 1980 - 1900) { if (tm.tm_year < 1980 - 1900) {