@@ -1837,27 +1837,29 @@ EXPORT_SYMBOL(bmap);
18371837static int relatime_need_update (struct vfsmount * mnt , struct inode * inode ,
18381838 struct timespec64 now )
18391839{
1840- struct timespec64 ctime ;
1840+ struct timespec64 atime , mtime , ctime ;
18411841
18421842 if (!(mnt -> mnt_flags & MNT_RELATIME ))
18431843 return 1 ;
18441844 /*
18451845 * Is mtime younger than or equal to atime? If yes, update atime:
18461846 */
1847- if (timespec64_compare (& inode -> i_mtime , & inode -> i_atime ) >= 0 )
1847+ atime = inode_get_atime (inode );
1848+ mtime = inode_get_mtime (inode );
1849+ if (timespec64_compare (& mtime , & atime ) >= 0 )
18481850 return 1 ;
18491851 /*
18501852 * Is ctime younger than or equal to atime? If yes, update atime:
18511853 */
18521854 ctime = inode_get_ctime (inode );
1853- if (timespec64_compare (& ctime , & inode -> i_atime ) >= 0 )
1855+ if (timespec64_compare (& ctime , & atime ) >= 0 )
18541856 return 1 ;
18551857
18561858 /*
18571859 * Is the previous atime value older than a day? If yes,
18581860 * update atime:
18591861 */
1860- if ((long )(now .tv_sec - inode -> i_atime .tv_sec ) >= 24 * 60 * 60 )
1862+ if ((long )(now .tv_sec - atime .tv_sec ) >= 24 * 60 * 60 )
18611863 return 1 ;
18621864 /*
18631865 * Good, we can skip the atime update:
@@ -1888,12 +1890,13 @@ int inode_update_timestamps(struct inode *inode, int flags)
18881890
18891891 if (flags & (S_MTIME |S_CTIME |S_VERSION )) {
18901892 struct timespec64 ctime = inode_get_ctime (inode );
1893+ struct timespec64 mtime = inode_get_mtime (inode );
18911894
18921895 now = inode_set_ctime_current (inode );
18931896 if (!timespec64_equal (& now , & ctime ))
18941897 updated |= S_CTIME ;
1895- if (!timespec64_equal (& now , & inode -> i_mtime )) {
1896- inode -> i_mtime = now ;
1898+ if (!timespec64_equal (& now , & mtime )) {
1899+ inode_set_mtime_to_ts ( inode , now ) ;
18971900 updated |= S_MTIME ;
18981901 }
18991902 if (IS_I_VERSION (inode ) && inode_maybe_inc_iversion (inode , updated ))
@@ -1903,8 +1906,10 @@ int inode_update_timestamps(struct inode *inode, int flags)
19031906 }
19041907
19051908 if (flags & S_ATIME ) {
1906- if (!timespec64_equal (& now , & inode -> i_atime )) {
1907- inode -> i_atime = now ;
1909+ struct timespec64 atime = inode_get_atime (inode );
1910+
1911+ if (!timespec64_equal (& now , & atime )) {
1912+ inode_set_atime_to_ts (inode , now );
19081913 updated |= S_ATIME ;
19091914 }
19101915 }
@@ -1963,7 +1968,7 @@ EXPORT_SYMBOL(inode_update_time);
19631968bool atime_needs_update (const struct path * path , struct inode * inode )
19641969{
19651970 struct vfsmount * mnt = path -> mnt ;
1966- struct timespec64 now ;
1971+ struct timespec64 now , atime ;
19671972
19681973 if (inode -> i_flags & S_NOATIME )
19691974 return false;
@@ -1989,7 +1994,8 @@ bool atime_needs_update(const struct path *path, struct inode *inode)
19891994 if (!relatime_need_update (mnt , inode , now ))
19901995 return false;
19911996
1992- if (timespec64_equal (& inode -> i_atime , & now ))
1997+ atime = inode_get_atime (inode );
1998+ if (timespec64_equal (& atime , & now ))
19931999 return false;
19942000
19952001 return true;
@@ -2106,17 +2112,18 @@ static int inode_needs_update_time(struct inode *inode)
21062112{
21072113 int sync_it = 0 ;
21082114 struct timespec64 now = current_time (inode );
2109- struct timespec64 ctime ;
2115+ struct timespec64 ts ;
21102116
21112117 /* First try to exhaust all avenues to not sync */
21122118 if (IS_NOCMTIME (inode ))
21132119 return 0 ;
21142120
2115- if (!timespec64_equal (& inode -> i_mtime , & now ))
2121+ ts = inode_get_mtime (inode );
2122+ if (!timespec64_equal (& ts , & now ))
21162123 sync_it = S_MTIME ;
21172124
2118- ctime = inode_get_ctime (inode );
2119- if (!timespec64_equal (& ctime , & now ))
2125+ ts = inode_get_ctime (inode );
2126+ if (!timespec64_equal (& ts , & now ))
21202127 sync_it |= S_CTIME ;
21212128
21222129 if (IS_I_VERSION (inode ) && inode_iversion_need_inc (inode ))
0 commit comments