Loading fs/inode.c +6 −27 Original line number Diff line number Diff line Loading @@ -1554,37 +1554,17 @@ sector_t bmap(struct inode *inode, sector_t block) } EXPORT_SYMBOL(bmap); /* * Update times in overlayed inode from underlying real inode */ static void update_ovl_inode_times(struct dentry *dentry, struct inode *inode, bool rcu) { if (!rcu) { struct inode *realinode = d_real_inode(dentry); if (unlikely(inode != realinode) && (!timespec64_equal(&inode->i_mtime, &realinode->i_mtime) || !timespec64_equal(&inode->i_ctime, &realinode->i_ctime))) { inode->i_mtime = realinode->i_mtime; inode->i_ctime = realinode->i_ctime; } } } /* * With relative atime, only update atime if the previous atime is * earlier than either the ctime or mtime or if at least a day has * passed since the last atime update. */ static int relatime_need_update(const struct path *path, struct inode *inode, struct timespec now, bool rcu) static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, struct timespec now) { if (!(path->mnt->mnt_flags & MNT_RELATIME)) if (!(mnt->mnt_flags & MNT_RELATIME)) return 1; update_ovl_inode_times(path->dentry, inode, rcu); /* * Is mtime younger than atime? If yes, update atime: */ Loading Loading @@ -1655,8 +1635,7 @@ static int update_time(struct inode *inode, struct timespec64 *time, int flags) * This function automatically handles read only file systems and media, * as well as the "noatime" flag and inode specific "noatime" markers. */ bool __atime_needs_update(const struct path *path, struct inode *inode, bool rcu) bool atime_needs_update(const struct path *path, struct inode *inode) { struct vfsmount *mnt = path->mnt; struct timespec64 now; Loading @@ -1682,7 +1661,7 @@ bool __atime_needs_update(const struct path *path, struct inode *inode, now = current_time(inode); if (!relatime_need_update(path, inode, timespec64_to_timespec(now), rcu)) if (!relatime_need_update(mnt, inode, timespec64_to_timespec(now))) return false; if (timespec64_equal(&inode->i_atime, &now)) Loading @@ -1697,7 +1676,7 @@ void touch_atime(const struct path *path) struct inode *inode = d_inode(path->dentry); struct timespec64 now; if (!__atime_needs_update(path, inode, false)) if (!atime_needs_update(path, inode)) return; if (!sb_start_write_trylock(inode->i_sb)) Loading fs/internal.h +0 −7 Original line number Diff line number Diff line Loading @@ -133,13 +133,6 @@ extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc); extern void inode_add_lru(struct inode *inode); extern int dentry_needs_remove_privs(struct dentry *dentry); extern bool __atime_needs_update(const struct path *, struct inode *, bool); static inline bool atime_needs_update_rcu(const struct path *path, struct inode *inode) { return __atime_needs_update(path, inode, true); } /* * fs-writeback.c */ Loading fs/namei.c +1 −1 Original line number Diff line number Diff line Loading @@ -1015,7 +1015,7 @@ const char *get_link(struct nameidata *nd) if (!(nd->flags & LOOKUP_RCU)) { touch_atime(&last->link); cond_resched(); } else if (atime_needs_update_rcu(&last->link, inode)) { } else if (atime_needs_update(&last->link, inode)) { if (unlikely(unlazy_walk(nd))) return ERR_PTR(-ECHILD); touch_atime(&last->link); Loading include/linux/fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -2088,6 +2088,7 @@ enum file_time_flags { S_VERSION = 8, }; extern bool atime_needs_update(const struct path *, struct inode *); extern void touch_atime(const struct path *); static inline void file_accessed(struct file *file) { Loading Loading
fs/inode.c +6 −27 Original line number Diff line number Diff line Loading @@ -1554,37 +1554,17 @@ sector_t bmap(struct inode *inode, sector_t block) } EXPORT_SYMBOL(bmap); /* * Update times in overlayed inode from underlying real inode */ static void update_ovl_inode_times(struct dentry *dentry, struct inode *inode, bool rcu) { if (!rcu) { struct inode *realinode = d_real_inode(dentry); if (unlikely(inode != realinode) && (!timespec64_equal(&inode->i_mtime, &realinode->i_mtime) || !timespec64_equal(&inode->i_ctime, &realinode->i_ctime))) { inode->i_mtime = realinode->i_mtime; inode->i_ctime = realinode->i_ctime; } } } /* * With relative atime, only update atime if the previous atime is * earlier than either the ctime or mtime or if at least a day has * passed since the last atime update. */ static int relatime_need_update(const struct path *path, struct inode *inode, struct timespec now, bool rcu) static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, struct timespec now) { if (!(path->mnt->mnt_flags & MNT_RELATIME)) if (!(mnt->mnt_flags & MNT_RELATIME)) return 1; update_ovl_inode_times(path->dentry, inode, rcu); /* * Is mtime younger than atime? If yes, update atime: */ Loading Loading @@ -1655,8 +1635,7 @@ static int update_time(struct inode *inode, struct timespec64 *time, int flags) * This function automatically handles read only file systems and media, * as well as the "noatime" flag and inode specific "noatime" markers. */ bool __atime_needs_update(const struct path *path, struct inode *inode, bool rcu) bool atime_needs_update(const struct path *path, struct inode *inode) { struct vfsmount *mnt = path->mnt; struct timespec64 now; Loading @@ -1682,7 +1661,7 @@ bool __atime_needs_update(const struct path *path, struct inode *inode, now = current_time(inode); if (!relatime_need_update(path, inode, timespec64_to_timespec(now), rcu)) if (!relatime_need_update(mnt, inode, timespec64_to_timespec(now))) return false; if (timespec64_equal(&inode->i_atime, &now)) Loading @@ -1697,7 +1676,7 @@ void touch_atime(const struct path *path) struct inode *inode = d_inode(path->dentry); struct timespec64 now; if (!__atime_needs_update(path, inode, false)) if (!atime_needs_update(path, inode)) return; if (!sb_start_write_trylock(inode->i_sb)) Loading
fs/internal.h +0 −7 Original line number Diff line number Diff line Loading @@ -133,13 +133,6 @@ extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc); extern void inode_add_lru(struct inode *inode); extern int dentry_needs_remove_privs(struct dentry *dentry); extern bool __atime_needs_update(const struct path *, struct inode *, bool); static inline bool atime_needs_update_rcu(const struct path *path, struct inode *inode) { return __atime_needs_update(path, inode, true); } /* * fs-writeback.c */ Loading
fs/namei.c +1 −1 Original line number Diff line number Diff line Loading @@ -1015,7 +1015,7 @@ const char *get_link(struct nameidata *nd) if (!(nd->flags & LOOKUP_RCU)) { touch_atime(&last->link); cond_resched(); } else if (atime_needs_update_rcu(&last->link, inode)) { } else if (atime_needs_update(&last->link, inode)) { if (unlikely(unlazy_walk(nd))) return ERR_PTR(-ECHILD); touch_atime(&last->link); Loading
include/linux/fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -2088,6 +2088,7 @@ enum file_time_flags { S_VERSION = 8, }; extern bool atime_needs_update(const struct path *, struct inode *); extern void touch_atime(const struct path *); static inline void file_accessed(struct file *file) { Loading