|
@@ -382,17 +382,20 @@ static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
|
|
|
inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1))
|
|
|
& ~((loff_t)sbi->cluster_size - 1)) >> 9;
|
|
|
inode->i_mtime.tv_sec =
|
|
|
- date_dos2unix(le16_to_cpu(de->time), le16_to_cpu(de->date));
|
|
|
+ date_dos2unix(le16_to_cpu(de->time), le16_to_cpu(de->date),
|
|
|
+ sbi->options.tz_utc);
|
|
|
inode->i_mtime.tv_nsec = 0;
|
|
|
if (sbi->options.isvfat) {
|
|
|
int secs = de->ctime_cs / 100;
|
|
|
int csecs = de->ctime_cs % 100;
|
|
|
inode->i_ctime.tv_sec =
|
|
|
date_dos2unix(le16_to_cpu(de->ctime),
|
|
|
- le16_to_cpu(de->cdate)) + secs;
|
|
|
+ le16_to_cpu(de->cdate),
|
|
|
+ sbi->options.tz_utc) + secs;
|
|
|
inode->i_ctime.tv_nsec = csecs * 10000000;
|
|
|
inode->i_atime.tv_sec =
|
|
|
- date_dos2unix(0, le16_to_cpu(de->adate));
|
|
|
+ date_dos2unix(0, le16_to_cpu(de->adate),
|
|
|
+ sbi->options.tz_utc);
|
|
|
inode->i_atime.tv_nsec = 0;
|
|
|
} else
|
|
|
inode->i_ctime = inode->i_atime = inode->i_mtime;
|
|
@@ -591,11 +594,14 @@ retry:
|
|
|
raw_entry->attr = fat_attr(inode);
|
|
|
raw_entry->start = cpu_to_le16(MSDOS_I(inode)->i_logstart);
|
|
|
raw_entry->starthi = cpu_to_le16(MSDOS_I(inode)->i_logstart >> 16);
|
|
|
- fat_date_unix2dos(inode->i_mtime.tv_sec, &raw_entry->time, &raw_entry->date);
|
|
|
+ fat_date_unix2dos(inode->i_mtime.tv_sec, &raw_entry->time,
|
|
|
+ &raw_entry->date, sbi->options.tz_utc);
|
|
|
if (sbi->options.isvfat) {
|
|
|
__le16 atime;
|
|
|
- fat_date_unix2dos(inode->i_ctime.tv_sec,&raw_entry->ctime,&raw_entry->cdate);
|
|
|
- fat_date_unix2dos(inode->i_atime.tv_sec,&atime,&raw_entry->adate);
|
|
|
+ fat_date_unix2dos(inode->i_ctime.tv_sec, &raw_entry->ctime,
|
|
|
+ &raw_entry->cdate, sbi->options.tz_utc);
|
|
|
+ fat_date_unix2dos(inode->i_atime.tv_sec, &atime,
|
|
|
+ &raw_entry->adate, sbi->options.tz_utc);
|
|
|
raw_entry->ctime_cs = (inode->i_ctime.tv_sec & 1) * 100 +
|
|
|
inode->i_ctime.tv_nsec / 10000000;
|
|
|
}
|
|
@@ -836,6 +842,8 @@ static int fat_show_options(struct seq_file *m, struct vfsmount *mnt)
|
|
|
}
|
|
|
if (sbi->options.flush)
|
|
|
seq_puts(m, ",flush");
|
|
|
+ if (opts->tz_utc)
|
|
|
+ seq_puts(m, ",tz=UTC");
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -848,7 +856,7 @@ enum {
|
|
|
Opt_charset, Opt_shortname_lower, Opt_shortname_win95,
|
|
|
Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes,
|
|
|
Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes,
|
|
|
- Opt_obsolate, Opt_flush, Opt_err,
|
|
|
+ Opt_obsolate, Opt_flush, Opt_tz_utc, Opt_err,
|
|
|
};
|
|
|
|
|
|
static match_table_t fat_tokens = {
|
|
@@ -883,6 +891,7 @@ static match_table_t fat_tokens = {
|
|
|
{Opt_obsolate, "cvf_options=%100s"},
|
|
|
{Opt_obsolate, "posix"},
|
|
|
{Opt_flush, "flush"},
|
|
|
+ {Opt_tz_utc, "tz=UTC"},
|
|
|
{Opt_err, NULL},
|
|
|
};
|
|
|
static match_table_t msdos_tokens = {
|
|
@@ -947,6 +956,7 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug,
|
|
|
opts->utf8 = opts->unicode_xlate = 0;
|
|
|
opts->numtail = 1;
|
|
|
opts->usefree = opts->nocase = 0;
|
|
|
+ opts->tz_utc = 0;
|
|
|
*debug = 0;
|
|
|
|
|
|
if (!options)
|
|
@@ -1036,6 +1046,9 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug,
|
|
|
case Opt_flush:
|
|
|
opts->flush = 1;
|
|
|
break;
|
|
|
+ case Opt_tz_utc:
|
|
|
+ opts->tz_utc = 1;
|
|
|
+ break;
|
|
|
|
|
|
/* msdos specific */
|
|
|
case Opt_dots:
|