}
        }
 
-       dir->i_mtime = dir->i_atime = current_time(dir);
+       fat_truncate_time(dir, NULL, S_ATIME|S_MTIME);
        if (IS_DIRSYNC(dir))
                (void)fat_sync_inode(dir);
        else
 
        if (err)
                goto out;
 
-       inode->i_ctime = inode->i_mtime = current_time(inode);
+       fat_truncate_time(inode, NULL, S_CTIME|S_MTIME);
        mark_inode_dirty(inode);
        if (IS_SYNC(inode)) {
                int err2;
                MSDOS_I(inode)->i_logstart = 0;
        }
        MSDOS_I(inode)->i_attrs |= ATTR_ARCH;
-       inode->i_ctime = inode->i_mtime = current_time(inode);
+       fat_truncate_time(inode, NULL, S_CTIME|S_MTIME);
        if (wait) {
                err = fat_sync_inode(inode);
                if (err) {
 
        if (err < len)
                fat_write_failed(mapping, pos + len);
        if (!(err < 0) && !(MSDOS_I(inode)->i_attrs & ATTR_ARCH)) {
-               inode->i_mtime = inode->i_ctime = current_time(inode);
+               fat_truncate_time(inode, NULL, S_CTIME|S_MTIME);
                MSDOS_I(inode)->i_attrs |= ATTR_ARCH;
                mark_inode_dirty(inode);
        }
                                  de->cdate, de->ctime_cs);
                fat_time_fat2unix(sbi, &inode->i_atime, 0, de->adate, 0);
        } else
-               inode->i_ctime = inode->i_atime = inode->i_mtime;
+               fat_truncate_time(inode, &inode->i_mtime, S_ATIME|S_CTIME);
 
        return 0;
 }
 
        if (err)
                return err;
 
-       dir->i_ctime = dir->i_mtime = *ts;
+       fat_truncate_time(dir, ts, S_CTIME|S_MTIME);
        if (IS_DIRSYNC(dir))
                (void)fat_sync_inode(dir);
        else
                err = PTR_ERR(inode);
                goto out;
        }
-       inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+       fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME);
        /* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
        d_instantiate(dentry, inode);
        drop_nlink(dir);
 
        clear_nlink(inode);
-       inode->i_ctime = current_time(inode);
+       fat_truncate_time(inode, NULL, S_CTIME);
        fat_detach(inode);
 out:
        mutex_unlock(&MSDOS_SB(sb)->s_lock);
                goto out;
        }
        set_nlink(inode, 2);
-       inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+       fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME);
        /* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
        d_instantiate(dentry, inode);
        if (err)
                goto out;
        clear_nlink(inode);
-       inode->i_ctime = current_time(inode);
+       fat_truncate_time(inode, NULL, S_CTIME);
        fat_detach(inode);
 out:
        mutex_unlock(&MSDOS_SB(sb)->s_lock);
                                mark_inode_dirty(old_inode);
 
                        inode_inc_iversion(old_dir);
-                       old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
+                       fat_truncate_time(old_dir, NULL, S_CTIME|S_MTIME);
                        if (IS_DIRSYNC(old_dir))
                                (void)fat_sync_inode(old_dir);
                        else
        if (err)
                goto error_dotdot;
        inode_inc_iversion(old_dir);
-       old_dir->i_ctime = old_dir->i_mtime = ts;
+       fat_truncate_time(old_dir, &ts, S_CTIME|S_MTIME);
        if (IS_DIRSYNC(old_dir))
                (void)fat_sync_inode(old_dir);
        else
                drop_nlink(new_inode);
                if (is_dir)
                        drop_nlink(new_inode);
-               new_inode->i_ctime = ts;
+               fat_truncate_time(new_inode, &ts, S_CTIME);
        }
 out:
        brelse(sinfo.bh);
 
                goto cleanup;
 
        /* update timestamp */
-       dir->i_ctime = dir->i_mtime = dir->i_atime = *ts;
+       fat_truncate_time(dir, ts, S_CTIME|S_MTIME);
        if (IS_DIRSYNC(dir))
                (void)fat_sync_inode(dir);
        else
                goto out;
        }
        inode_inc_iversion(inode);
-       inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+       fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME);
        /* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
        d_instantiate(dentry, inode);
        drop_nlink(dir);
 
        clear_nlink(inode);
-       inode->i_mtime = inode->i_atime = current_time(inode);
+       fat_truncate_time(inode, NULL, S_ATIME|S_MTIME);
        fat_detach(inode);
        vfat_d_version_set(dentry, inode_query_iversion(dir));
 out:
        if (err)
                goto out;
        clear_nlink(inode);
-       inode->i_mtime = inode->i_atime = current_time(inode);
+       fat_truncate_time(inode, NULL, S_ATIME|S_MTIME);
        fat_detach(inode);
        vfat_d_version_set(dentry, inode_query_iversion(dir));
 out:
        }
        inode_inc_iversion(inode);
        set_nlink(inode, 2);
-       inode->i_mtime = inode->i_atime = inode->i_ctime = ts;
+       fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME);
        /* timestamp is already written, so mark_inode_dirty() is unneeded. */
 
        d_instantiate(dentry, inode);
        if (err)
                goto error_dotdot;
        inode_inc_iversion(old_dir);
-       old_dir->i_ctime = old_dir->i_mtime = ts;
+       fat_truncate_time(old_dir, &ts, S_CTIME|S_MTIME);
        if (IS_DIRSYNC(old_dir))
                (void)fat_sync_inode(old_dir);
        else
                drop_nlink(new_inode);
                if (is_dir)
                        drop_nlink(new_inode);
-               new_inode->i_ctime = ts;
+               fat_truncate_time(new_inode, &ts, S_CTIME);
        }
 out:
        brelse(sinfo.bh);