* local time (HPFS) to GMT (Unix)
  */
 
-static inline time_t local_to_gmt(struct super_block *s, time32_t t)
+static inline time64_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 time32_t gmt_to_local(struct super_block *s, time_t t)
+static inline time32_t gmt_to_local(struct super_block *s, time64_t t)
 {
        extern struct timezone sys_tz;
-       return t - sys_tz.tz_minuteswest * 60 - hpfs_sb(s)->sb_timeshift;
+       t = t - sys_tz.tz_minuteswest * 60 - hpfs_sb(s)->sb_timeshift;
+
+       return clamp_t(time64_t, t, 0, U32_MAX);
+}
+
+static inline time32_t local_get_seconds(struct super_block *s)
+{
+       return gmt_to_local(s, ktime_get_real_seconds());
 }
 
 /*
 
 
 static void hpfs_update_directory_times(struct inode *dir)
 {
-       time_t t = get_seconds();
+       time64_t t = local_to_gmt(dir->i_sb, local_get_seconds(dir->i_sb));
        if (t == dir->i_mtime.tv_sec &&
            t == dir->i_ctime.tv_sec)
                return;
        /*dee.archive = 0;*/
        dee.hidden = name[0] == '.';
        dee.fnode = cpu_to_le32(fno);
-       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds()));
+       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
        result = new_inode(dir->i_sb);
        if (!result)
                goto bail2;
        dnode->root_dnode = 1;
        dnode->up = cpu_to_le32(fno);
        de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0);
-       de->creation_date = de->write_date = de->read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds()));
+       de->creation_date = de->write_date = de->read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
        if (!(mode & 0222)) de->read_only = 1;
        de->first = de->directory = 1;
        /*de->hidden = de->system = 0;*/
        dee.archive = 1;
        dee.hidden = name[0] == '.';
        dee.fnode = cpu_to_le32(fno);
-       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds()));
+       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
 
        result = new_inode(dir->i_sb);
        if (!result)
        dee.archive = 1;
        dee.hidden = name[0] == '.';
        dee.fnode = cpu_to_le32(fno);
-       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds()));
+       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
 
        result = new_inode(dir->i_sb);
        if (!result)
        dee.archive = 1;
        dee.hidden = name[0] == '.';
        dee.fnode = cpu_to_le32(fno);
-       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds()));
+       dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(local_get_seconds(dir->i_sb));
 
        result = new_inode(dir->i_sb);
        if (!result)