Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 105877
b: refs/heads/master
c: b271e06
h: refs/heads/master
i:
  105875: e888d0b
v: v3
  • Loading branch information
Joe Peterson authored and Linus Torvalds committed Jul 25, 2008
1 parent d901bac commit db630b1
Show file tree
Hide file tree
Showing 7 changed files with 36 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e8938a62a85d1f487e02c3b01955b47c9598f6d2
refs/heads/master: b271e067c896ad4082b15e96077675d08db40625
2 changes: 1 addition & 1 deletion trunk/fs/fat/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1101,7 +1101,7 @@ int fat_alloc_new_dir(struct inode *dir, struct timespec *ts)
goto error_free;
}

fat_date_unix2dos(ts->tv_sec, &time, &date);
fat_date_unix2dos(ts->tv_sec, &time, &date, sbi->options.tz_utc);

de = (struct msdos_dir_entry *)bhs[0]->b_data;
/* filling the new directory slots ("." and ".." entries) */
Expand Down
27 changes: 20 additions & 7 deletions trunk/fs/fat/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -591,11 +594,14 @@ static int fat_write_inode(struct inode *inode, int wait)
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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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 = {
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
10 changes: 6 additions & 4 deletions trunk/fs/fat/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ static int day_n[] = {
};

/* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */
int date_dos2unix(unsigned short time, unsigned short date)
int date_dos2unix(unsigned short time, unsigned short date, int tz_utc)
{
int month, year, secs;

Expand All @@ -156,16 +156,18 @@ int date_dos2unix(unsigned short time, unsigned short date)
((date & 31)-1+day_n[month]+(year/4)+year*365-((year & 3) == 0 &&
month < 2 ? 1 : 0)+3653);
/* days since 1.1.70 plus 80's leap day */
secs += sys_tz.tz_minuteswest*60;
if (!tz_utc)
secs += sys_tz.tz_minuteswest*60;
return secs;
}

/* Convert linear UNIX date to a MS-DOS time/date pair. */
void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date)
void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date, int tz_utc)
{
int day, year, nl_day, month;

unix_date -= sys_tz.tz_minuteswest*60;
if (!tz_utc)
unix_date -= sys_tz.tz_minuteswest*60;

/* Jan 1 GMT 00:00:00 1980. But what about another time zone? */
if (unix_date < 315532800)
Expand Down
3 changes: 2 additions & 1 deletion trunk/fs/msdos/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ static int msdos_add_entry(struct inode *dir, const unsigned char *name,
int is_dir, int is_hid, int cluster,
struct timespec *ts, struct fat_slot_info *sinfo)
{
struct msdos_sb_info *sbi = MSDOS_SB(dir->i_sb);
struct msdos_dir_entry de;
__le16 time, date;
int err;
Expand All @@ -246,7 +247,7 @@ static int msdos_add_entry(struct inode *dir, const unsigned char *name,
if (is_hid)
de.attr |= ATTR_HIDDEN;
de.lcase = 0;
fat_date_unix2dos(ts->tv_sec, &time, &date);
fat_date_unix2dos(ts->tv_sec, &time, &date, sbi->options.tz_utc);
de.cdate = de.adate = 0;
de.ctime = 0;
de.ctime_cs = 0;
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/vfat/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -621,7 +621,7 @@ static int vfat_build_slots(struct inode *dir, const unsigned char *name,
memcpy(de->name, msdos_name, MSDOS_NAME);
de->attr = is_dir ? ATTR_DIR : ATTR_ARCH;
de->lcase = lcase;
fat_date_unix2dos(ts->tv_sec, &time, &date);
fat_date_unix2dos(ts->tv_sec, &time, &date, sbi->options.tz_utc);
de->time = de->ctime = time;
de->date = de->cdate = de->adate = date;
de->ctime_cs = 0;
Expand Down
8 changes: 5 additions & 3 deletions trunk/include/linux/msdos_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@ struct fat_mount_options {
numtail:1, /* Does first alias have a numeric '~1' type tail? */
flush:1, /* write things quickly */
nocase:1, /* Does this need case conversion? 0=need case conversion*/
usefree:1; /* Use free_clusters for FAT32 */
usefree:1, /* Use free_clusters for FAT32 */
tz_utc:1; /* Filesystem timestamps are in UTC */
};

#define FAT_HASH_BITS 8
Expand Down Expand Up @@ -434,8 +435,9 @@ extern int fat_flush_inodes(struct super_block *sb, struct inode *i1,
extern void fat_fs_panic(struct super_block *s, const char *fmt, ...);
extern void fat_clusters_flush(struct super_block *sb);
extern int fat_chain_add(struct inode *inode, int new_dclus, int nr_cluster);
extern int date_dos2unix(unsigned short time, unsigned short date);
extern void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date);
extern int date_dos2unix(unsigned short time, unsigned short date, int tz_utc);
extern void fat_date_unix2dos(int unix_date, __le16 *time, __le16 *date,
int tz_utc);
extern int fat_sync_bhs(struct buffer_head **bhs, int nr_bhs);

int fat_cache_init(void);
Expand Down

0 comments on commit db630b1

Please sign in to comment.