Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 161645 Details for
Bug 233307
gentoo-sources-2.6.26: new kernel patch to add tz=UTC fat mount option
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch that will apply to gentoo-sources-2.6.26 (or .25)
gentoo-sources-2.6.26-fat-utc-option.patch (text/plain), 7.59 KB, created by
Joe Peterson (RETIRED)
on 2008-07-29 18:43:35 UTC
(
hide
)
Description:
Patch that will apply to gentoo-sources-2.6.26 (or .25)
Filename:
MIME Type:
Creator:
Joe Peterson (RETIRED)
Created:
2008-07-29 18:43:35 UTC
Size:
7.59 KB
patch
obsolete
>New mount option ("tz=UTC") for FAT (vfat/msdos) filesystems allowing >timestamps to be in coordinated universal time (UTC) rather than >local time in applications where doing this is advantageous (like >digital cameras, etc.) > >Signed-off-by: Joe Peterson <joe@skyrush.com> >Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> >--- > >diff -puNr a/fs/fat/dir.c b/fs/fat/dir.c >--- a/fs/fat/dir.c 2008-06-25 08:53:35.676901351 -0600 >+++ b/fs/fat/dir.c 2008-06-26 12:58:56.096272279 -0600 >@@ -1082,7 +1082,7 @@ int fat_alloc_new_dir(struct inode *dir, > 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) */ >diff -puNr a/fs/fat/inode.c b/fs/fat/inode.c >--- a/fs/fat/inode.c 2008-06-25 08:53:35.676901351 -0600 >+++ b/fs/fat/inode.c 2008-06-26 14:57:07.087942764 -0600 >@@ -382,17 +382,20 @@ static int fat_fill_inode(struct inode * > 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; >@@ -592,11 +595,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_f > } > 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, > 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, > case Opt_flush: > opts->flush = 1; > break; >+ case Opt_tz_utc: >+ opts->tz_utc = 1; >+ break; > > /* msdos specific */ > case Opt_dots: >diff -puNr a/fs/fat/misc.c b/fs/fat/misc.c >--- a/fs/fat/misc.c 2008-06-25 08:53:35.676901351 -0600 >+++ b/fs/fat/misc.c 2008-06-26 12:59:08.627376422 -0600 >@@ -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; > >@@ -156,16 +156,18 @@ int date_dos2unix(unsigned short time, u > ((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) >diff -puNr a/fs/msdos/namei.c b/fs/msdos/namei.c >--- a/fs/msdos/namei.c 2008-06-25 08:53:35.696902410 -0600 >+++ b/fs/msdos/namei.c 2008-06-26 12:58:42.255055811 -0600 >@@ -243,6 +243,7 @@ static int msdos_add_entry(struct inode > 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; >@@ -252,7 +253,7 @@ static int msdos_add_entry(struct inode > 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; >diff -puNr a/fs/vfat/namei.c b/fs/vfat/namei.c >--- a/fs/vfat/namei.c 2008-06-25 08:53:35.686902663 -0600 >+++ b/fs/vfat/namei.c 2008-06-26 12:58:27.073724049 -0600 >@@ -621,7 +621,7 @@ shortname: > 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; >diff -puNr a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h >--- a/include/linux/msdos_fs.h 2008-06-25 08:53:17.435303045 -0600 >+++ b/include/linux/msdos_fs.h 2008-06-26 14:58:40.626135522 -0600 >@@ -205,7 +205,8 @@ struct fat_mount_options { > atari:1, /* Use Atari GEMDOS variation of MS-DOS fs */ > 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 >@@ -428,8 +429,9 @@ extern int fat_flush_inodes(struct super > 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);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 233307
: 161645 |
161646