From: Max Alekseyev <relf@os2.ru>

The provided patch fixes HPFS filesystem support under 64-bit Linux kernel
and closes the bugreport http://bugme.osdl.org/show_bug.cgi?id=4333

The problem is in 'time_t' size which is 8 bytes on 64-bit systems
(comparing to 4 bytes on 32-bit systems).  The patch introduces local
'time32_t' type of the fixed size 4 and uses it where required.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/fs/hpfs/hpfs.h    |   12 +++++++-----
 25-akpm/fs/hpfs/hpfs_fn.h |    4 ++--
 2 files changed, 9 insertions(+), 7 deletions(-)

diff -puN fs/hpfs/hpfs_fn.h~fs-hpfs-fix-hpfs-support-under-64-bit-kernel fs/hpfs/hpfs_fn.h
--- 25/fs/hpfs/hpfs_fn.h~fs-hpfs-fix-hpfs-support-under-64-bit-kernel	2005-03-21 23:02:32.000000000 -0800
+++ 25-akpm/fs/hpfs/hpfs_fn.h	2005-03-21 23:02:32.000000000 -0800
@@ -325,13 +325,13 @@ unsigned hpfs_count_one_bitmap(struct su
  * local time (HPFS) to GMT (Unix)
  */
 
-static inline time_t local_to_gmt(struct super_block *s, time_t t)
+static inline time_t local_to_gmt(struct super_block *s, time32_t t)
 {
 	extern struct timezone sys_tz;
 	return t + sys_tz.tz_minuteswest * 60 + hpfs_sb(s)->sb_timeshift;
 }
 
-static inline time_t gmt_to_local(struct super_block *s, time_t t)
+static inline time32_t gmt_to_local(struct super_block *s, time_t t)
 {
 	extern struct timezone sys_tz;
 	return t - sys_tz.tz_minuteswest * 60 - hpfs_sb(s)->sb_timeshift;
diff -puN fs/hpfs/hpfs.h~fs-hpfs-fix-hpfs-support-under-64-bit-kernel fs/hpfs/hpfs.h
--- 25/fs/hpfs/hpfs.h~fs-hpfs-fix-hpfs-support-under-64-bit-kernel	2005-03-21 23:02:32.000000000 -0800
+++ 25-akpm/fs/hpfs/hpfs.h	2005-03-21 23:02:32.000000000 -0800
@@ -27,6 +27,8 @@ typedef secno dnode_secno;		/* sector nu
 typedef secno fnode_secno;		/* sector number of an fnode */
 typedef secno anode_secno;		/* sector number of an anode */
 
+typedef u32 time32_t;		/* 32-bit time_t type */
+
 /* sector 0 */
 
 /* The boot block is very like a FAT boot block, except that the
@@ -84,9 +86,9 @@ struct hpfs_super_block
   unsigned zero1;			/* 0 */
   secno badblocks;			/* bad block list */
   unsigned zero3;			/* 0 */
-  time_t last_chkdsk;			/* date last checked, 0 if never */
+  time32_t last_chkdsk;			/* date last checked, 0 if never */
   /*unsigned zero4;*/			/* 0 */
-  time_t last_optimize;			/* date last optimized, 0 if never */
+  time32_t last_optimize;			/* date last optimized, 0 if never */
   secno n_dir_band;			/* number of sectors in dir band */
   secno dir_band_start;			/* first sector in dir band */
   secno dir_band_end;			/* last sector in dir band */
@@ -287,10 +289,10 @@ struct hpfs_dirent {
   unsigned not_8x3: 1;			/* name is not 8.3 */
   unsigned flag15: 1;
   fnode_secno fnode;			/* fnode giving allocation info */
-  time_t write_date;			/* mtime */
+  time32_t write_date;			/* mtime */
   unsigned file_size;			/* file length, bytes */
-  time_t read_date;			/* atime */
-  time_t creation_date;			/* ctime */
+  time32_t read_date;			/* atime */
+  time32_t creation_date;			/* ctime */
   unsigned ea_size;			/* total EA length, bytes */
   unsigned char no_of_acls : 3;		/* number of ACL's */
   unsigned char reserver : 5;
_