| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * linux/fs/vfat/namei.c |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 678 | 679 | goto cleanup; |
|---|
| 679 | 680 | |
|---|
| 680 | 681 | /* update timestamp */ |
|---|
| 681 | | - dir->i_ctime = dir->i_mtime = dir->i_atime = *ts; |
|---|
| 682 | + fat_truncate_time(dir, ts, S_CTIME|S_MTIME); |
|---|
| 682 | 683 | if (IS_DIRSYNC(dir)) |
|---|
| 683 | 684 | (void)fat_sync_inode(dir); |
|---|
| 684 | 685 | else |
|---|
| .. | .. |
|---|
| 779 | 780 | goto out; |
|---|
| 780 | 781 | } |
|---|
| 781 | 782 | inode_inc_iversion(inode); |
|---|
| 782 | | - inode->i_mtime = inode->i_atime = inode->i_ctime = ts; |
|---|
| 783 | + fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME); |
|---|
| 783 | 784 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ |
|---|
| 784 | 785 | |
|---|
| 785 | 786 | d_instantiate(dentry, inode); |
|---|
| .. | .. |
|---|
| 810 | 811 | drop_nlink(dir); |
|---|
| 811 | 812 | |
|---|
| 812 | 813 | clear_nlink(inode); |
|---|
| 813 | | - inode->i_mtime = inode->i_atime = current_time(inode); |
|---|
| 814 | + fat_truncate_time(inode, NULL, S_ATIME|S_MTIME); |
|---|
| 814 | 815 | fat_detach(inode); |
|---|
| 815 | 816 | vfat_d_version_set(dentry, inode_query_iversion(dir)); |
|---|
| 816 | 817 | out: |
|---|
| .. | .. |
|---|
| 836 | 837 | if (err) |
|---|
| 837 | 838 | goto out; |
|---|
| 838 | 839 | clear_nlink(inode); |
|---|
| 839 | | - inode->i_mtime = inode->i_atime = current_time(inode); |
|---|
| 840 | + fat_truncate_time(inode, NULL, S_ATIME|S_MTIME); |
|---|
| 840 | 841 | fat_detach(inode); |
|---|
| 841 | 842 | vfat_d_version_set(dentry, inode_query_iversion(dir)); |
|---|
| 842 | 843 | out: |
|---|
| .. | .. |
|---|
| 876 | 877 | } |
|---|
| 877 | 878 | inode_inc_iversion(inode); |
|---|
| 878 | 879 | set_nlink(inode, 2); |
|---|
| 879 | | - inode->i_mtime = inode->i_atime = inode->i_ctime = ts; |
|---|
| 880 | + fat_truncate_time(inode, &ts, S_ATIME|S_CTIME|S_MTIME); |
|---|
| 880 | 881 | /* timestamp is already written, so mark_inode_dirty() is unneeded. */ |
|---|
| 881 | 882 | |
|---|
| 882 | 883 | d_instantiate(dentry, inode); |
|---|
| .. | .. |
|---|
| 969 | 970 | if (err) |
|---|
| 970 | 971 | goto error_dotdot; |
|---|
| 971 | 972 | inode_inc_iversion(old_dir); |
|---|
| 972 | | - old_dir->i_ctime = old_dir->i_mtime = ts; |
|---|
| 973 | + fat_truncate_time(old_dir, &ts, S_CTIME|S_MTIME); |
|---|
| 973 | 974 | if (IS_DIRSYNC(old_dir)) |
|---|
| 974 | 975 | (void)fat_sync_inode(old_dir); |
|---|
| 975 | 976 | else |
|---|
| .. | .. |
|---|
| 979 | 980 | drop_nlink(new_inode); |
|---|
| 980 | 981 | if (is_dir) |
|---|
| 981 | 982 | drop_nlink(new_inode); |
|---|
| 982 | | - new_inode->i_ctime = ts; |
|---|
| 983 | + fat_truncate_time(new_inode, &ts, S_CTIME); |
|---|
| 983 | 984 | } |
|---|
| 984 | 985 | out: |
|---|
| 985 | 986 | brelse(sinfo.bh); |
|---|
| .. | .. |
|---|
| 1032 | 1033 | .rename = vfat_rename, |
|---|
| 1033 | 1034 | .setattr = fat_setattr, |
|---|
| 1034 | 1035 | .getattr = fat_getattr, |
|---|
| 1036 | + .update_time = fat_update_time, |
|---|
| 1035 | 1037 | }; |
|---|
| 1036 | 1038 | |
|---|
| 1037 | 1039 | static void setup(struct super_block *sb) |
|---|
| .. | .. |
|---|
| 1075 | 1077 | } |
|---|
| 1076 | 1078 | |
|---|
| 1077 | 1079 | MODULE_LICENSE("GPL"); |
|---|
| 1080 | +MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY); |
|---|
| 1078 | 1081 | MODULE_DESCRIPTION("VFAT filesystem support"); |
|---|
| 1079 | 1082 | MODULE_AUTHOR("Gordon Chaffee"); |
|---|
| 1080 | 1083 | |
|---|