Chung-Chiang Cheng <cccheng@xxxxxxxxxxxx> writes: > FAT supports creation time but not change time, and there was no > corresponding timestamp for creation time in previous VFS. The > original implementation took the compromise of saving the in-memory > change time into the on-disk creation time field, but this would lead > to compatibility issues with non-linux systems. > > To address this issue, this patch changes the behavior of ctime. It > will no longer be loaded and stored from the creation time on disk. > Instead of that, it'll be consistent with the in-memory mtime and share > the same on-disk field. All updates to mtime will also be applied to > ctime in memory, while all updates to ctime will be ignored. Acked-by: OGAWA Hirofumi <hirofumi@xxxxxxxxxxxxxxxxxx> Thanks. > Signed-off-by: Chung-Chiang Cheng <cccheng@xxxxxxxxxxxx> > --- > fs/fat/inode.c | 11 ++++------- > fs/fat/misc.c | 9 ++++++--- > 2 files changed, 10 insertions(+), 10 deletions(-) > > diff --git a/fs/fat/inode.c b/fs/fat/inode.c > index bf6051bdf1d1..16d5a52116d3 100644 > --- a/fs/fat/inode.c > +++ b/fs/fat/inode.c > @@ -567,12 +567,11 @@ int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de) > & ~((loff_t)sbi->cluster_size - 1)) >> 9; > > fat_time_fat2unix(sbi, &inode->i_mtime, de->time, de->date, 0); > - if (sbi->options.isvfat) { > - fat_time_fat2unix(sbi, &inode->i_ctime, de->ctime, > - de->cdate, de->ctime_cs); > + inode->i_ctime = inode->i_mtime; > + if (sbi->options.isvfat) > fat_time_fat2unix(sbi, &inode->i_atime, 0, de->adate, 0); > - } else > - fat_truncate_time(inode, &inode->i_mtime, S_ATIME|S_CTIME); > + else > + inode->i_atime = fat_truncate_atime(sbi, &inode->i_mtime); > > return 0; > } > @@ -888,8 +887,6 @@ static int __fat_write_inode(struct inode *inode, int wait) > &raw_entry->date, NULL); > if (sbi->options.isvfat) { > __le16 atime; > - fat_time_unix2fat(sbi, &inode->i_ctime, &raw_entry->ctime, > - &raw_entry->cdate, &raw_entry->ctime_cs); > fat_time_unix2fat(sbi, &inode->i_atime, &atime, > &raw_entry->adate, NULL); > } > diff --git a/fs/fat/misc.c b/fs/fat/misc.c > index 63160e47be00..85bb9dc3af2d 100644 > --- a/fs/fat/misc.c > +++ b/fs/fat/misc.c > @@ -341,10 +341,13 @@ int fat_truncate_time(struct inode *inode, struct timespec64 *now, int flags) > > if (flags & S_ATIME) > inode->i_atime = fat_truncate_atime(sbi, now); > - if (flags & S_CTIME) > - inode->i_ctime = fat_truncate_crtime(sbi, now); > + /* > + * ctime and mtime share the same on-disk field, and should be > + * identical in memory. all mtime updates will be applied to ctime, > + * but ctime updates are ignored. > + */ > if (flags & S_MTIME) > - inode->i_mtime = fat_truncate_mtime(sbi, now); > + inode->i_mtime = inode->i_ctime = fat_truncate_mtime(sbi, now); > > return 0; > } -- OGAWA Hirofumi <hirofumi@xxxxxxxxxxxxxxxxxx>